Skip to content
Skip article header Engineering

Smart Contract Deployment Checklist: From Testnet to Mainnet

Authorize a mainnet release through a versioned manifest and ordered checks. The runbook assigns owners, required evidence and stop conditions before deployment and before enabling user activity.

Updated 7 min read 18 views
A modular assembly on a rail beside blue inspection gates and connected units
Skip key takeaways

Key takeaways 4

  • Deployment start and permission to open user activity are distinct decisions
  • Verification records the actual source/build match result
  • Temporary authority needs a documented removal or transfer check
  • Recovery options depend on the deployed architecture and current state

A smart contract deployment is ready when the approved candidate, target network, transaction inputs and operating authority agree. A successful testnet demonstration alone does not establish those conditions for mainnet.

Use the runbook below to authorize one EVM release. Each row needs evidence and an owner. It is a proposed process, not a record of a completed launch or a universal set of deployment commands. Extend it for chain-specific behavior, dependencies and the architecture actually being deployed.

The release runbook

Follow the dependency order. Post-deployment checks cannot be completed before transactions exist, so distinguish permission to begin deployment from permission to enable user activity.

Step Check Evidence required Owner Stop condition
DEP-01 Freeze the candidate and acceptance scope Source revision, requirement results and known limitations Engineering lead Candidate differs from the reviewed version without an approved review path
DEP-02 Capture build inputs Compiler, settings, dependency locks, artifact digests and build instructions Release engineer Build cannot be reproduced from the approved inputs
DEP-03 Review target and configuration Network and chain ID, dependency addresses, constructor or initializer arguments Engineering reviewer An address or value is unverified for the target network
DEP-04 Rehearse the sequence Script revision, ordered transactions, results and failure handling Release engineer A required step or permission change has not been exercised
DEP-05 Approve review findings Audit scope, fix review and accepted residual risks Release approver A release-blocking finding remains unresolved
DEP-06 Confirm signing and funding Authorized signing process, fee allowance and role plan Signing owner Wrong signer, missing approval or insufficient agreed funding
DEP-07 Authorize deployment start Recorded decision against the manifest Release approver Approval does not name this candidate and configuration
DEP-08 Deploy and initialize as designed Transaction receipts, deployed addresses and initialization checks Release engineer Unexpected transaction outcome, address or state
DEP-09 Verify source correspondence Verification result for every relevant deployed component Engineering reviewer Missing or unexplained source/build match
DEP-10 Establish intended authority On-chain owner and role readback, transfer/revocation evidence Operations owner Intended controller lacks access or temporary authority remains unexplained
DEP-11 Check integrations and monitoring Address/configuration readback, constrained smoke test and delivered alert Integration and operations owners Application points at the wrong deployment or alerts have no recipient
DEP-12 Authorize user activity and handoff Signed launch decision, live manifest, incident contacts and limitations Release approver Post-deployment evidence is incomplete

The owner column names responsibilities. Assign actual people before using the runbook.

A wallet can execute a transaction. It cannot resolve an unanswered product decision or assume responsibility for operating the result.

What belongs in the release manifest

The manifest identifies the release's inputs and resulting deployment. Record the source revision, dependency versions and compiler configuration, including optimizer and target settings when relevant. Store build artifacts with digests so a later investigation can identify which outputs were used.

Review constructor arguments or initializer inputs against the specification. Asset addresses, fee recipients and governance controllers should come from an approved target-network configuration. Compare human-readable names with the actual encoded values before signing. A testnet token address is not evidence of the correct mainnet asset.

After deployment, append transaction references and the address register. For a proxy deployment, identify the user-facing proxy and its implementation, plus any administrative component the chosen architecture uses. Do not reduce a multi-contract release to one explorer link.

Source verification checks correspondence between source/build inputs and deployed bytecode. Ethereum's verification documentation explains that compilation metadata and matching methods affect the result. Record the verifier's actual match status and any limitation. A source match does not itself assess the safety of the contract's business logic.

Rehearse failures, not just the successful sequence

Run the intended deployment and role transitions in an appropriate rehearsal environment. Record which production conditions the rehearsal does not represent, such as live governance availability or a dependency state that may change.

Include interruptions. If implementation deployment succeeds but a later initialization or configuration step fails, the operator needs to know what was already created and what remains incomplete. Review the current chain state before resuming. Blindly repeating a transaction sequence can create a different release or attempt an action that is no longer valid.

For an upgradeable design, confirm the initialization protections and compatibility checks appropriate to it. OpenZeppelin's upgradeable-contract guidance explains why proxy state initialization differs from constructor initialization. Use the project's chosen tooling and versioned process rather than copying an unrelated command from a tutorial.

The testing and acceptance matrix covers contract behavior. Rehearsal adds evidence about the concrete release sequence, configuration and operators. Both need to reference the approved candidate.

Verify who controls the deployed system

List every privileged action and its controller: upgrade, pause, fee change, mint, asset rescue or other product-specific authority. Some releases have only a subset. The register must describe what the deployed contracts can actually do.

Verify authority after transfer through the applicable on-chain reads and agreed non-destructive checks. Record the new controller's ability to perform its role and the removal of temporary privileges. The safe order of grant, transfer and revocation depends on the access-control model. Review that sequence before signing.

OpenZeppelin's access-control guidance describes the responsibilities of owners, roles and timelock participants. A governance configuration also needs available operators. A multi-signature wallet and a delay do not resolve an unavailable proposer or an unclear incident approval process.

Keep production signing keys within the approved custody arrangement. Give the deployment team only the authority the scope requires, with its duration and removal evidence recorded. Source-code handoff and administrative handoff should have separate completion checks.

Monitor the release before opening it to users

Confirm the application, indexer and operational dashboards use the address register for this network. Reconcile a constrained smoke test with the expected events and state changes. Use an approved exposure limit and transaction plan. Do not improvise a production test with unrestricted user funds.

Deliver an alert to the person expected to handle it.

Agree which events or conditions matter, how alerts are routed and what happens if the primary recipient is unavailable. Monitoring that produces a dashboard but no actionable notification does not complete DEP-11.

External dependencies need their own operating checks. If the product relies on an oracle, bridge or keeper, define the dependency's health criteria and response owner. These checks are additions to the runbook, not evidence supplied by an ordinary contract deployment receipt.

OpenZeppelin's mainnet preparation guide treats key management, governance and ongoing operations as production concerns. The runbook assigns those concerns to release-specific evidence and people.

Recovery must fit the deployed architecture

Separate pausing a feature, updating permitted configuration, upgrading logic and migrating to a new deployment. Only use a mechanism the reviewed architecture actually exposes. A product with fixed code may still have mutable parameters or external dependencies. State its recovery limits at that level.

Returning a proxy to an older implementation is not automatically a safe rollback. The current state and any changed layout or initialization must be compatible with the code being restored. A migration may need a new address, asset movement and user coordination. Neither approach reverses transactions that have already changed balances elsewhere.

For each incident action, identify the authority, preconditions, effect on users and point at which the action is complete. Leave unimplemented recovery options marked unavailable. The upgradeability decision guide helps establish those boundaries before development.

Use Pharos smart contract development to scope release preparation and handoff alongside implementation. At handoff, the receiving owner should be able to locate the live manifest, reproduce the build and identify who can authorize the next production change.

I work with startup founders who need a dedicated software development team but don’t want to gamble on hiring, random outsourcing, or opaque delivery.
Most founders face the same problem sooner or later.
Early technical and team decisions lock the product into tech debt, slow delivery, missed milestones and constant re-hiring. By the time this becomes visible, fixing it is already expensive.

As a CTO and software architect, I help founders design, build and run dedicated development teams that work as a true extension of the startup. Not as a black-box vendor.

My focus is on complex products where mistakes are costly:

  • Web3 and blockchain platforms
  • FinTech and regulated products
  • High-load startup systems
  • MVP → scale transitions

We don’t do body-shopping.
We don’t sell generic outsourcing.

Instead, we help founders:

  • build the right team structure from day one
  • keep technical ownership and transparency
  • scale delivery without losing control
  • avoid vendor lock-in and hidden risks

Teams are aligned with the product roadmap, business goals and long-term architecture. Not just short-term velocity.

Dmytro Nasyrov, Founder and CTO at Pharos Production
Dmytro Nasyrov Founder & CTO Let's work together!

Your business results matter

Achieve them with minimized risk through our bespoke innovation capabilities

Your contact details
Please enter your name
Please enter a valid email address
Please enter your message

We use your details only to reply to your request. Data Privacy and Legal Notice

We typically reply within 24 hours

What happens next?

  1. Contact us

    Contact us today to discuss your project. We're ready to review your request promptly and guide you on the best next steps for collaboration

    Same day
  2. NDA

    We're committed to keeping your information confidential, so we'll sign a Non-Disclosure Agreement

    1 day
  3. Plan the Goals

    After we chat about your goals and needs, we'll craft a comprehensive proposal detailing the project scope, team, timeline and budget

    3-5 days
  4. Finalize the Details

    Let's connect on Google Meet to go through the proposal and confirm all the details together!

    1-2 days
  5. Sign the Contract

    As soon as the contract is signed, our dedicated team will jump into action on your project!

    Same day