Skip to main content
Version: Devnet (v3.0.0-devnet.6-patch.1)

Contract Deployment Quick Reference

This guide helps you quickly determine which deployment steps your contract needs. For conceptual background on how contract deployment works, see Contract Deployment.

What Do I Need to Do?

Use this decision tree to determine which steps your contract needs.

No initializer?

If your contract has no #[initializer] function and was deployed with without_initializer(), it's considered initialized immediately. Skip the initialization checks above.

Checking Contract State Programmatically

Use wallet.getContractMetadata(contractAddress) to check whether a contract is registered, published, and initialized. See Verify deployment for usage examples and details on what the PXE checks automatically versus what you need to verify manually.

When Can You Skip States?

Contract TypeClass RegistrationInstance CreationInitializationPublic Deployment
Private-onlyOptionalRequiredDependsSkip
Public-onlyRequiredRequiredDependsRequired
Hybrid (private + public)RequiredRequiredDependsRequired
Stateless helperOptionalRequiredSkipDepends

"Depends" means it depends on whether your contract has a constructor marked with #[initializer].

When Functions Become Callable

StatePrivate FunctionsPublic Functions
Address computed onlyWith #[noinitcheck]No
Class registeredWith #[noinitcheck]No
Instance deployed (not initialized)With #[noinitcheck]No
InitializedYesNo
Publicly deployedYesYes

Private functions marked with #[noinitcheck] can be called as soon as you know the address, even before initialization. This enables patterns like pre-funded accounts.

Contracts without initializers

If your contract has no initializer and is deployed with without_initializer(), it's considered initialized immediately. Private functions are callable right after instance creation without needing #[noinitcheck]. Public functions still require public deployment.

Further Reading