This guide covers upgrading from v0.9.x to v0.10.x. The main breaking changes come from the Anchor v1 / Solana CLI 3 toolchain bump, removed key-recovery helper APIs, and a few Arcium helper signature changes. v0.10.x also adds close-account commands, an interruptibleDocumentation Index
Fetch the complete documentation index at: https://docs.arcium.com/llms.txt
Use this file to discover all available pages before exploring further.
migrate-cluster, Arcis match / if let / matches! support, and an update-notification banner.
Before you start
v0.10.x is a code-and-toolchain upgrade. Existing v0.9.x MXE, cluster, and key-recovery accounts remain compatible. Computation definitions initialized withfinalization_authority = None remain layout-compatible. In v0.9.x, this was the third argument to init_comp_def. Recreate or validate any v0.9.x computation definition that used Some(finalization_authority) before relying on it. Only redeploy your app program if you rebuild or change it for v0.10.x.
1. Update Arcium tooling
0.10.3.
2. Update Solana and Anchor toolchains
Both toolchains have major version bumps. Install them before rebuilding. Solana CLI 3.1.10 (was 2.3.0):avm source moved from coral-xyz/anchor to solana-foundation/anchor:
3. Update Rust dependencies
In your program’sCargo.toml:
If your
encrypted-ixs/Cargo.toml pins blake3 or proc-macro-crate, you can drop those pins — they were Anchor 0.32 workarounds and are no longer needed.resolver, direct solana-* crates, LiteSVM, SPL Token interface crates, and external cross-program invocation (CPI) dependencies.
4. Update TypeScript dependencies
The Anchor npm package was renamed:^5.7.3 (was ^4.3.5) — update if you pin it.
5. Anchor program changes
This section covers the Anchor v1 changes that commonly show up in Arcium programs. It is not a full Anchor v1 migration checklist.Instructions sysvar address constant
anchor_lang::solana_program::sysvar::instructions no longer exists. Use the constant re-exported by arcium-anchor, and switch AccountInfo to UncheckedAccount (Anchor 1 no longer accepts AccountInfo<'info> in account structs):
Box-wrap heavy accounts on the queue side
Anchor 1 tightened stack-frame limits. Large Arcium accounts (MXEAccount, Cluster, ComputationDefinitionAccount) blow the stack on the queue path unless boxed. Wrap them in Box<...> in your #[queue_computation_accounts] struct:
#[callback_accounts]) can stay un-boxed — the callback path has less stack pressure.
Computation-definition helper changes
Replace deprecatedinit_comp_def calls with init_computation_def. The old third finalization_authority argument was removed:
init*CompDef TypeScript methods also no longer take a finalizationAuth argument:
ErrorCode::ClusterNotSet now use one-argument forms. The MXE cluster is non-optional in v0.10.x, so the macros read mxe_account.cluster directly and no longer need a caller-supplied local error:
ErrorCode::ClusterNotSet was the only reason your #[error_code] enum defined it, you can remove the variant to keep the IDL clean and avoid a dead-code warning. (The variant still exists in Arcium’s core error enum; this is purely about your own program’s local enum.)
SPL token CPI: pass Pubkey, not AccountInfo
CpiContext::new / new_with_signer now expect a Pubkey for the program argument:
6. TypeScript client changes
Beyond the package rename:initMxePart2 argument order changed
recoveryPeers moved from position 4 to position 6. Positional callers will silently pass wrong values — review every call site.
@arcium-hq/client — key recovery now runs through CLI flows (arcium init-mxe --resume and arcium migrate-cluster --resume):
queueKeyRecoveryInitrecoverMxeinitKeyRecoveryExecutionsubmitKeyRecoverySharefinalizeKeyRecoveryExecution
@arcium-hq/reader code subscribes to computation events, the callback parameter type narrowed from ArciumEventData to ComputationEventData. The runtime shape is unchanged; update annotations only.
Avoid asserting a fixed number of cluster accounts in tests. Localnet runs without a recovery cluster can return only the primary cluster account:
7. CLI changes
init-key-recovery-material and migrate-cluster --skip-recovery have been removed. Their replacements are split by lifecycle:
- interrupted MXE initialization / key-recovery-material setup: rerun
arcium init-mxe --resume - interrupted cluster migration: use
arcium migrate-cluster --resumeor--abort
--cluster-offset is required on the initial call only; with --resume/--abort the CLI infers it from on-chain state.
init-mxe --resume now covers key-recovery material
arcium init-mxe --resume existed in v0.9.x. In v0.10.x it also resumes the key-recovery-material step that used to live behind init-key-recovery-material.
Keep passing --recovery-set-size <N>. The minimum is 4, but larger clusters may require more. If the value does not match on-chain state, the CLI prints the expected --cluster-offset and --recovery-set-size.
arcium test --detach skips the auto-snapshot
Non-detached arcium test runs now auto-call arcium snapshot-mxe-keygen at the end so subsequent --skip-keygen runs can reuse cached MXE keys. With --detach this step is skipped — the validator outlives the CLI, so you must call arcium snapshot-mxe-keygen --rpc-url l yourself before tearing the validator down:
--skip-keygen exports ARCIUM_SKIP_KEY_RECOVERY_INIT=1
When arcium test --skip-keygen or arcium localnet --skip-keygen reuses cached MXE keys, the CLI also sets ARCIUM_SKIP_KEY_RECOVERY_INIT=1 in the test environment. Use it to skip legacy key-recovery-init setup when the MXE starts in a post-keygen state. Custom tests that always queue key-recovery-init will fail on --skip-keygen reruns without honoring this flag.
arcium test --test-name rewrites Anchor.toml
--test-name <name> runs only tests/<name>.ts by temporarily rewriting the [scripts] test glob in Anchor.toml from *.ts to <name>.ts. The CLI reverts the file on success — if a run terminates abnormally (Ctrl-C, SIGKILL), the rewrite may persist. Restore the original glob manually if so.
arcium mxe-info output changes
Two cosmetic shifts in mxe-info output: Ed25519 verifying key was renamed to ArcisEd25519 pubkey, and a new Key recovery material status: Ok|Not finalized line was added. Scripts parsing mxe-info output need updating.
For closing MXEs and computation definitions, see Account lifecycle and closing.
8. Anchor.toml cleanup
The[registry] block was stale in v0.9.x scaffolds and can be removed:
[test.validator] startup_wait = 10000 block is optional and scaffold-dependent — the v0.10.3 example programs drop it, but arcium init still appends it for new projects. Leave it in place if your tests need the longer validator startup wait. Some v0.10.3 examples include an empty [hooks] section; matching it is optional.
9. Arcis circuit changes
Item shadowing of a let-binding is now rejected. Code like this used to compile and won’t anymore:let can still shadow a previous let — only mixing items (fn, const) with same-named values is rejected.
Arcis also gained match, if let, and matches! support. Let chains require edition = "2024" in encrypted-ixs/Cargo.toml. See Operations.
10. Node operators
Update your Docker image tag indocker-compose.yml:
[dealer] section, local_addr was renamed to local_ip, and a new required master_seed_path was added. Treat master_seed_path as the highest-sensitivity host secret — leaking it compromises all keyshares. See Node Setup.
11. Troubleshooting
- Anchor/sysvar compile errors: check Anchor program changes.
init_comp_defnot found: useinit_computation_def(ctx.accounts, None)or theOffChainform in Computation Definition Accounts.- PDA helper macro arity errors: remove the second
ErrorCode::ClusterNotSetargument. init-key-recovery-materialmissing: rerunarcium init-mxe --resume.migrate-cluster --skip-recoverymissing: use--resumeor--abort.- Other Anchor v1 compile errors: run through the Anchor v0.32 to v1 checklist linked in Before you start.
- Close-account errors: see Account lifecycle and closing.
12. Verify migration
Before deploying, complete the Anchor v1 checklist linked in Before you start, including legacy IDL cleanup if your program publishes an on-chain IDL.13. Changes summary
| Change | v0.9.x | v0.10.x |
|---|---|---|
| Solana CLI | 2.3.0 | 3.1.10 |
| Anchor CLI | 0.32.1 | 1.0.2 |
avm source | coral-xyz/anchor | solana-foundation/anchor |
anchor-lang / anchor-spl | 0.32.1 | 1.0.2 |
| npm Anchor package | @coral-xyz/anchor | @anchor-lang/core |
| TypeScript | ^4.3.5 | ^5.7.3 |
| Instructions sysvar | ::anchor_lang::solana_program::sysvar::instructions::ID | ::arcium_anchor::solana_instructions_sysvar::ID |
| Sysvar field type | AccountInfo<'info> | UncheckedAccount<'info> |
| Queue-side MXE accounts | Account<'info, MXEAccount> | Box<Account<'info, MXEAccount>> (same for Cluster, CompDef) |
| SPL CPI program arg | token_program.to_account_info() | token_program.key() |
| Comp-def init helper | init_comp_def(ctx.accounts, None, None) | init_computation_def(ctx.accounts, None) |
| Generated comp-def TS | initFooCompDef(finalizationAuth) | initFooCompDef() |
| PDA helper arity | derive_*_pda!(..., ErrorCode::ClusterNotSet) | derive_*_pda!(...) |
initMxePart2 arg order | recoveryPeers at position 4 | recoveryPeers at position 6 |
| Key recovery TS helpers | recoverMxe, queueKeyRecoveryInit, submitKeyRecoveryShare, … | Removed — driven by init-mxe --resume / migrate-cluster --resume |
migrate-cluster flags | --skip-recovery | --resume / --abort state machine |
init-key-recovery-material | CLI subcommand | Removed (folded into init-mxe --resume) |
| Arx Node Docker | v0.9.7 | v0.10.3 |
| Arcium Rust crates | 0.9.x | 0.10.3 |
| TypeScript clients | @arcium-hq/{client,reader}@0.9.x | @arcium-hq/{client,reader}@0.10.3 |
New in v0.10.x
These features are new in v0.10.x. See the linked documentation for details:- Close MXE / computation definition:
arcium deactivate-computation-definition→ TTL →close-computation-definitionandclose-mxereclaim rent from accounts you no longer need. See Account lifecycle and closing. - Interruptible cluster migration:
arcium migrate-cluster --resume/--abortreplace--skip-recovery.arcium init-mxe --resumealso resumes key-recovery-material setup. See Deployment. - Faster localnet reruns:
arcium snapshot-mxe-keygen --rpc-url l+arcium localnet --skip-keygen/arcium test --skip-keygenreuse cached MXE keys between runs. - Run a single test:
arcium test --test-name <name>restricts the run totests/<name>.ts. - Arcis pattern matching:
match,if let, and thematches!macro are now supported. Let chains requireedition = "2024"inencrypted-ixs/Cargo.toml. See Operations. - Update-notification banner:
arciumandarcupshow a one-line banner when a new release is available. Suppress withARCIUM_NO_UPDATE_CHECK=1; the banner is automatically silent in CI. - Better callback failure errors: callback failures now report a
CircuitFailureReason(off-chain fetch failed, hash mismatch, CU mismatch, serialization, …) instead of a single generic error. arcup version: prints the currently-active toolchain version (aliasarcup v).
What’s next?
Deployment
Deploy and manage your MXE.
Arcis Operations
Use the new pattern-matching syntax in your circuits.