Making Programs Immutable
Revoking upgrade authority makes program bytecode permanent on-chain. Users gain confidence that logic cannot change, but you lose the ability to patch bugs without deploying a new program ID and migrating state.
Search across all documentation pages
Revoking upgrade authority makes program bytecode permanent on-chain. Users gain confidence that logic cannot change, but you lose the ability to patch bugs without deploying a new program ID and migrating state.
Quick-reference recipe card - copy-paste ready.
# Irreversible - confirm program ID and hash first
solana program set-upgrade-authority <PROGRAM_ID> --final
solana program show <PROGRAM_ID> | grep AuthorityWhen to reach for this:
PROGRAM_ID=YourProgram1111111111111111111111111111111
# 1. Verify hash matches published attestation
solana-verify get-program-hash "$PROGRAM_ID" --url mainnet-beta
# compare to README attestation
# 2. Confirm multisig intended finality (if applicable)
# squads proposal: "Revoke upgrade authority"
# 3. Revoke authority (FINAL)
solana program set-upgrade-authority "$PROGRAM_ID" --final
# 4. Confirm immutable
solana program show "$PROGRAM_ID"
# Authority: (none)What this demonstrates:
--final sets upgrade authority to null permanently.| Aspect | Immutable | Upgradeable |
|---|---|---|
| Trust | Highest code stability | Governance risk |
| Bug fix | New program + migrate | Same ID deploy |
| Authority | None | Multisig recommended |
| Timing | After audit + bake period | Default dev pattern |
# There is no CLI undo - only deploy new program if bug found
echo "Ensure incident playbooks cover migration to new program ID"--final.program show output.solana-verify match before revoke.| Alternative | Use When | Don't Use When |
|---|---|---|
| Multisig upgrade authority | Operational patch window | Absolute immutability marketing |
| Timelock + governance | Community oversight | Need instant bug fix |
| New versioned program | Breaking changes planned | Same-ID convenience |
No - on-chain permanent. Only deploy new program with new ID.
After audits, production bake, verifiable hash publication, and governance vote.
Program-owned accounts remain - only code changes are blocked.
Not on-chain - either authority exists or null. Use multisig as practical middle ground.
Best practice - users verify hash then see immutable authority on explorer.
None if program ID unchanged - clients continue same pubkey.
Create proposal executing set-upgrade-authority --final via multisig instruction.
Practice revoke on devnet disposable program before mainnet ceremony.
Immutability statements should match on-chain authority field - verify in audits.
Deploy v2 program, migration instructions, user comms - no upgrade path on v1.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.
Reviewed by Chris St. John·Last updated Jul 16, 2026