Imports & Dependencies
The protocol crates, miden-client and the Web SDK move to 0.17.0, and the VM crates, miden-crypto included, jump 0.29.2 → 0.35.0. Packages, proofs, local stores, and account and note files written by 0.16 do not load in 0.17, and a 0.17 client talks only to a 0.17 node.
Quick Fix
# Replace these (0.16)
miden-client = "0.16.1"
miden-client-sqlite-store = "0.16.1"
miden-protocol = "0.16.1"
miden-standards = "0.16.1"
miden-tx = "0.16.1"
miden-tx-batch = "0.16.1"
miden-testing = "0.16.1" # dev-dependency
miden-assembly = "0.29.2"
miden-core = "0.29.2"
miden-core-lib = "0.29.2"
miden-processor = "0.29.2"
miden-prover = "0.29.2"
miden-verifier = "0.29.2"
miden-crypto = "0.29.2"
# With these (0.17)
miden-client = "0.17.0"
miden-client-sqlite-store = "0.17.0"
miden-protocol = "0.17.0"
miden-standards = "0.17.0"
miden-tx = "0.17.0"
miden-tx-batch = "0.17.0"
miden-testing = "0.17.0" # dev-dependency
miden-objects = "0.17.0" # new: AccountFile / NoteFile and the Protobuf encodings
miden-assembly = "0.35.0"
miden-core = "0.35.0"
miden-core-lib = "0.35.0"
miden-processor = "0.35.0"
miden-prover = "0.35.0"
miden-verifier = "0.35.0"
miden-crypto = "0.35.0"
{
"@miden-sdk/miden-sdk": "0.17.0",
"@miden-sdk/react": "0.17.0"
}
Then run:
cargo update && cargo build
cargo install miden-client-cli --version 0.17.0 --locked # the CLI binary is still `miden-client`
npm install @miden-sdk/[email protected] @miden-sdk/[email protected]
If you encounter errors, continue reading for detailed migration steps.
Re-assemble every .masp package (format 6.0.0 → 7.0.0), discard stored proofs, and recreate your local store. Do not count on exporting accounts or notes first: files exported by 0.16 do not import into 0.17, so consume private notes before you upgrade. In the browser, back up the default keystore's secret keys on 0.16.3: the IndexedDB reset deletes them. See 0.16 artifacts do not carry over.
Summary
Every layer of the stack moves:
- The protocol crates (
miden-protocol,miden-standards,miden-tx,miden-tx-batch,miden-testing,miden-block-prover,miden-agglayer) go0.16.1→0.17.0. None was renamed. Four crates are new:miden-objects,miden-protobuf,miden-protobuf-deriveandmiden-usdcx. - The VM crates go
0.29.2→0.35.0, six minor releases of breaking changes: see VM & Assembler Changes and MASM Changes.miden-cryptoshares the VM version; its API changes are on Hashing & Crypto Changes. miden-client,miden-client-sqlite-store,miden-client-cliandmiden-web3signer-authenticatorgo0.16.1→0.17.0.miden-client-protois new.- The Web SDK packages go
0.16.3→0.17.0. - The contract toolchain goes to
miden0.15.0andmidenc/cargo-miden0.11.0. - The Rust toolchains do not change.
The dependency changes that fail loudly are the removed serde and bus-debugger Cargo features, the move of AccountFile / NoteFile, and a mismatched direct p3-* dependency. The ones that fail at run time are every 0.16 artifact (packages, proofs, stores, exported files), a custom MastForestStore / DataStore that does not serve StandardsLib, and every client, prover and node pairing that mixes 0.16 and 0.17.
Version Bumps
| Crate | v0.16 | v0.17 |
|---|---|---|
miden-client, miden-client-sqlite-store, miden-client-cli | 0.16.1 | 0.17.0 |
miden-web3signer-authenticator (keys held in a Web3Signer) | 0.16.1 | 0.17.0 |
miden-client-proto (Protobuf encoding of client types, used by the stores) | - | 0.17.0 (new) |
miden-protocol, miden-standards, miden-tx, miden-tx-batch | 0.16.1 | 0.17.0 |
miden-testing (dev-dependency) | 0.16.1 | 0.17.0 |
miden-block-prover (nodes and block producers) | 0.16.1 | 0.17.0 |
miden-agglayer (Agglayer components; miden-client depends on it) | 0.16.1 | 0.17.0 |
miden-objects | - | 0.17.0 (new) |
miden-protobuf, miden-protobuf-derive | - | 0.17.0 (new, used by miden-objects) |
miden-usdcx (USDCx components) | - | 0.17.0 (new) |
miden-vm, miden-assembly, miden-assembly-syntax, miden-core, miden-core-lib, miden-processor, miden-prover, miden-verifier, miden-mast-package, miden-project, miden-package-registry, miden-air, miden-field, miden-serde-utils, miden-precompiles, miden-precompiles-prover | 0.29.2 | 0.35.0 |
miden-crypto, miden-crypto-derive | 0.29.2 | 0.35.0 |
miden-precompiles-air, miden-precompiles-verifier | - | 0.35.0 (new in VM 0.31) |
midenc-hir-type (compiler authors) | 0.10.1 | 0.17.0 |
Plonky3 p3-* (direct users only) | 0.6 | 0.8 |
rand, rand_chacha | 0.10 | 0.10 (unchanged) |
miden-client-web, miden-idxdb-store (Rust crates of the Web SDK) | 0.16.3 | 0.17.0 |
| npm package | v0.16 | v0.17 |
|---|---|---|
@miden-sdk/miden-sdk | 0.16.3 | 0.17.0 |
@miden-sdk/react | 0.16.3 | 0.17.0 |
@miden-sdk/vite-plugin, wallet adapter, para, turnkey, telemetry and create packages | 0.16.3 | 0.17.0 |
Protocol 0.16.1 required VM 0.29.1 and its lockfile resolved 0.29.4; 0.29.3 and 0.29.4 only fixed bundle and wasm32, so 0.29.2 stands for the whole 0.29 line here. The changelog's cumulative VM entry reads "from v0.29.4 to v0.32.0", followed by separate entries for 0.33, 0.34 and 0.35; for a 0.16.1 user the move is 0.29.x to 0.35.0.
Feature flags of miden-protocol, miden-standards, miden-tx, miden-tx-batch and miden-testing are unchanged. miden-block-prover's testing feature now also enables miden-processor/testing and miden-protocol/testing. The VM features that were removed are covered below.
MASM projects bump their package dependencies the same way. The protocol's own standards packages declare:
# Before (0.16)
miden-core = { linkage = "dynamic", version = "0.29" }
miden-protocol = { linkage = "dynamic", version = "0.16.0" }
miden-standards = { linkage = "static", version = "0.16.0" }
# After (0.17)
miden-core = { linkage = "dynamic", version = "0.35" }
miden-protocol = { linkage = "dynamic", version = "0.17.0" }
miden-standards = { linkage = "dynamic", version = "0.17.0" }
Standard component packages now link miden-standards dynamically: they call the standards library by procedure root instead of embedding it. Two consequences:
- Anything that executes these components through its own
MastForestStoreorDataStoremust also serveStandardsLib(andagglayer_package()for AggLayer accounts), asTransactionMastStore::new()does. Otherwise execution fails withprocedure with root digest {root_digest} could not be found. - The auth procedure roots of the standard singlesig, multisig and network-account components change, so the code commitments and IDs of accounts that use them change (see Account Changes).
A package that still requires miden-core 0.33, or depends on one assembled against it, fails dependency resolution against 0.35: set version = "0.35" and re-assemble dependencies before dependents.
Two features released on the 0.16 line after 0.17 branched were replaced or dropped:
- Protocol 0.16.0 / 0.16.1:
fee::estimate_fee,fee::assert_fee_bound,multisig::pay_bounded_feeand the related fee helpers. 0.17 pins every standard fee payment to the native fee asset at 1/1 insidefee::pay_fee, so a separate estimate and bound are no longer needed (see Transaction Changes). - Web SDK 0.16.1:
ForeignAccount.prefetched(),AccountInputs,client.transactions.foreignAccountInputs()andWebClient.getForeignAccountInputs()are removed. 0.17 resolves a foreign account's vault and storage-map entries during execution against the reference block, so declare it withForeignAccount.public(...)orForeignAccount.private(...)(see Client Changes). The Rust client keepsForeignAccount::PrefetchedandClient::get_foreign_account_inputsunchanged from 0.16.1.
New crates and the miden-objects name trap
Summary
miden-objectsholds the canonical Protobuf representations of protocol objects, and is the new home ofAccountFileandNoteFile(see below).miden-protobufandmiden-protobuf-deriveare the Protobuf conversion frameworkmiden-objectsis built on.miden-usdcxholds the USDCx (xUSDC on Miden) faucet components and note encodings.miden-client-protois the Protobuf encoding of client types (encode,decode,decode_unchecked) thatmiden-client-sqlite-storeandmiden-idxdb-storenow write. You need it only to read store data yourself.
Use the Protobuf encodings in miden-objects for anything you store or send, and the Serializable / Deserializable byte formats as little as possible: they are to be removed before public mainnet. miden-client depends on miden-objects and re-exports the file types, so client users who only handle account and note files do not need it directly.
crates.io already has miden-objects 0.12.x. That was the old name of the protocol crate (today's miden-protocol). The 0.17 miden-objects is an unrelated, new Protobuf crate. Do not "restore" an old miden-objects = "0.12" dependency, and do not look for miden_objects::account::Account: protocol types stay in miden-protocol.
Migration Steps
- Depend on
miden-objects = "0.17.0"where you useAccountFile,NoteFileor the Protobuf types, and move stored or transmitted protocol objects fromSerializablebytes to those Protobuf encodings. - Keep importing
Account,Note,TransactionInputsand every other protocol type frommiden-protocol.
Web SDK packages
Summary
All 20 published @miden-sdk/* packages share one version and move 0.16.3 → 0.17.0 together. Every first-party peer range is now ^0.17.0, so a 0.16 package's peer range does not accept 0.17 and vice versa. Since 0.16.2, @miden-sdk/miden-sdk and @miden-sdk/react ship in lockstep at the same version (the 0.16 guide pinned 0.16.1 / 0.16.0).
Affected Code
- "@miden-sdk/miden-sdk": "0.16.3",
- "@miden-sdk/react": "0.16.3",
- "@miden-sdk/vite-plugin": "0.16.3"
+ "@miden-sdk/miden-sdk": "0.17.0",
+ "@miden-sdk/react": "0.17.0",
+ "@miden-sdk/vite-plugin": "0.17.0"
npm install @miden-sdk/[email protected] @miden-sdk/[email protected]
Migration Steps
- Bump every
@miden-sdk/*package you use in one change:miden-sdk,react,vite-plugin, themiden-wallet-adapterpackages,para/para-react,turnkey/turnkey-react, and the telemetry packages. Move each to0.17.0. - Do not add
@miden-sdk/node-darwin-arm64,node-darwin-x64ornode-linux-x64-gnuyourself. On Node,@miden-sdk/miden-sdkpulls the matching native package throughoptionalDependenciespinned to its own exact version. - If you consume the Web SDK's Rust crates (
miden-client-web,miden-idxdb-store), move them to0.17.0.miden-client-webrequiresmiden-client0.17.0andmiden-protocol0.17.0;miden-idxdb-storerequiresmiden-client0.17.0and the newmiden-client-proto0.17.0.
Contract toolchain
Summary
Contract crates move to miden 0.15.0 and the tools to midenc / cargo-miden 0.11.0. Every SDK crate moves with miden (miden-base, miden-base-macros, miden-base-sys, miden-stdlib-sys, miden-sdk-alloc, miden-field-repr and its derive crate, miden-tx-script-args, miden-sdk-build-script-support, midenc-frontend-wasm-metadata). The compiler writes package format 7.0.0, so every contract must be rebuilt. The details are in Rust Contract SDK & Compiler.
Affected Code
# Before (0.16)
[dependencies]
miden = "0.14"
[build-dependencies]
miden-sdk-build-script-support = "0.14"
# After (0.17)
[dependencies]
miden = "0.15.0"
[build-dependencies]
miden-sdk-build-script-support = "0.15.0"
[toolchain]
channel = "0.17.0" # was "0.16.0"
profile = "empty"
components = ["midenc", "cargo-miden", "core", "protocol"]
midenup install 0.17.0
cargo miden build
Migration Steps
- Install the
0.17.0toolchain channel withmidenup install 0.17.0, orcargo install cargo-miden --version 0.11.0. The channel shipsmidenc/cargo-miden0.11.0and core and VM0.35.0, with the 0.17 protocol, client and node. It no longer lists a separatemiden-precompiles.maspartifact. - Bump
midenandmiden-sdk-build-script-supportto"0.15.0"in every contract crate. - Rebuild every package, dependencies before dependents, and every host-side fixture that loads a
.masp. - In host-side test crates, such as the scaffold's
integrationcrate, movemiden-client,miden-standardsandmiden-testingto0.17.0, andmiden-mast-packageto0.35.0, the VM line client0.17.0uses.
MSRV and toolchains
No Rust toolchain changes for a 0.16.1 user:
| Component | rust-version (v0.16 → v0.17) | Pinned toolchain |
|---|---|---|
| protocol crates | 1.98.1 → 1.98.1 | rust-toolchain.toml moved 1.98 → 1.98.1 |
miden-client | 1.98.1 → 1.98.1 | 1.98.1 at both tags |
| Miden VM | 1.96.1 → 1.96.1 | repository dev pin moved 1.96.1 → 1.98.1 in 0.33 |
| Web SDK (building from source) | 1.98.1 → 1.98.1 | nightly-2026-08-06 at both tags |
| contract SDK / compiler | 1.99 → 1.99 | nightly-2026-09-01 at both tags |
Keep rust-toolchain.toml at 1.98.1 for client and protocol work, and at the compiler's nightly when you build Rust contracts.
The protocol changelog lists "[BREAKING] Incremented the MSRV to 1.98.1" in the 0.17 section. rust-version = "1.98.1" is already set at v0.16.1 (and v0.16.0); only rust-toolchain.toml changed.
AccountFile and NoteFile moved to miden-objects and switched to Protobuf
Summary
miden_protocol::account::AccountFile and miden_standards::note::{NoteFile, NoteSyncHint} now live in miden-objects and are encoded as Protobuf. AccountFile's fields became private, read / write return AccountFileError / NoteFileError instead of std::io::Result, and the Serializable / Deserializable impls are gone in favour of inherent to_bytes() / try_from_bytes(). miden-objects has no reader for the 0.16 layout, so files written by 0.16 cannot be read by 0.17. NoteFile's variants are unchanged, and NoteSyncHint only changed crates.
Affected Code
// Before (0.16)
use miden_protocol::account::AccountFile;
use miden_protocol::utils::serde::{Deserializable, Serializable};
use miden_standards::note::NoteFile;
let file = AccountFile::read("account.mac")?; // std::io::Result<AccountFile>
let account = file.account; // public fields
let keys = file.auth_secret_keys;
let bytes = note_file.to_bytes(); // Serializable
let note_file = NoteFile::read_from_bytes(&bytes)?; // Deserializable
// After (0.17)
use miden_objects::account_file::AccountFile; // + AccountFileError
use miden_objects::note_file::NoteFile; // + NoteFileError, NoteSyncHint
let file = AccountFile::read("account.mac")?; // Result<AccountFile, AccountFileError>
let (account, keys) = file.into_parts(); // or file.account(), file.auth_secret_keys()
let bytes = note_file.to_bytes(); // Protobuf bytes
let note_file = NoteFile::try_from_bytes(&bytes)?; // Result<NoteFile, NoteFileError>
miden-client users keep their import paths: the client re-exports the types as miden_client::account::{AccountFile, AccountFileError} and miden_client::note::{NoteFile, NoteFileError, NoteSyncHint}. The old miden_client::notes module and the CLI's import behaviour are covered in Client Changes.
(Web) NoteFile.serialize() / AccountFile.serialize() bytes from 0.16 do not decode either:
// After (0.17): a note file exported by 0.16
NoteFile.deserialize(bytesFrom016);
// Error: notefile deserialization failed: failed to decode the note file:
// failed to decode Protobuf message: invalid wire type value: 6 ...
The 0.17 crates/miden-objects/README.md says each file "is a 4-byte marker (acct or note) followed by one Protobuf message". The code writes no marker: to_bytes() is the encoded, versioned Protobuf message only. 0.16 files did start with an acct / note marker followed by the native serialization.
Migration Steps
- Add
miden-objects = "0.17.0", or import throughmiden_client::account/miden_client::note. - Change imports to
miden_objects::account_file::AccountFileandmiden_objects::note_file::{NoteFile, NoteSyncHint}. - Replace
file.account/file.auth_secret_keyswithfile.account()/file.auth_secret_keys()orfile.into_parts(). - Replace
Serializable::to_bytes/Deserializable::read_from_byteswith the inherentto_bytes()/try_from_bytes(), and mapAccountFileError/NoteFileErrorwhere you expectedstd::io::Error. - Re-export every account and note file with a 0.17 client. There is no converter for 0.16 files.
Common Errors
| Error Message | Cause | Solution |
|---|---|---|
error[E0432]: unresolved import `miden_protocol::account::AccountFile` | Type moved | use miden_objects::account_file::AccountFile; |
error[E0432]: unresolved import `miden_standards::note::NoteFile` | Type moved | use miden_objects::note_file::NoteFile; |
error[E0616]: field `account` of struct `miden_objects::account_file::AccountFile` is private | Fields made private | Use account() or into_parts(). |
error[E0599]: no associated function or constant named `read_from_bytes` found for struct `miden_objects::account_file::AccountFile` in the current scope | Deserializable impl removed | Use try_from_bytes(). |
failed to decode the account file | A 0.16 account file (or any non-Protobuf bytes) | Re-export the account with a 0.17 client. |
failed to decode the note file | A 0.16 note file | Re-export the note with a 0.17 client. |
notefile deserialization failed: failed to decode the note file: ... (Web) | Note file bytes from 0.16 | Re-export with a 0.17 client. |
account file deserialization failed: ... (Web) | Account file bytes from 0.16 | Re-export with a 0.17 client. |
serde and bus-debugger features removed from the VM crates
Summary
miden-core no longer has a serde feature, so MastForest, Program, KernelDescriptor, EventId, Operation, AssemblyOp, AdviceMap, ExecutionProof, StarkProof and HashFunction no longer implement Serialize / Deserialize. miden-mast-package keeps its serde feature, but only PackageId and TargetType still implement serde; PackageManifest, Dependency, Section, SectionId and the manifest's module entries lost it (Package itself never implemented serde), and most miden-assembly-syntax AST types lost it too. miden-processor lost its bus-debugger feature (and miden-air its trace bus-balance debugging helpers). Word and the Merkle types lost serde as well: see Hashing & Crypto Changes.
Affected Code
# Before (0.16)
miden-core = { version = "0.29", features = ["serde"] }
miden-processor = { version = "0.29", features = ["bus-debugger"] }
# After (0.17): both features are gone
miden-core = { version = "0.35" }
miden-processor = { version = "0.35" }
// After (0.17): binary encoding (hex- or base64-encode the bytes if you need text)
use miden_core::serde::{Deserializable, Serializable};
let bytes = program.to_bytes();
let program = Program::read_from_bytes(&bytes)?;
The VM changelog lists this change as "Removed unused Serde support", not marked [BREAKING]. It deletes the miden-core serde Cargo feature and the public serde impls listed above.
Migration Steps
- Drop
features = ["serde"]frommiden-coreandfeatures = ["bus-debugger"]frommiden-processor. Neither protocol 0.16.1 nor 0.17.0 enables them; remove them where your own manifests do. - Replace
serde_json/bincodeencodings of VM types. For anything you store or send, prefer the Protobuf messages inmiden_objects::protowhere one exists (MastForest,ExecutionProof,AdviceInputs,AdviceMap); useto_bytes()/read_from_bytes()for the rest, such asProgram.
Common Errors
| Error Message | Cause | Solution |
|---|---|---|
error[E0277]: the trait bound `AdviceMap: serde::Serialize` is not satisfied (same for Program, ExecutionProof, PackageManifest, ...) | serde impls removed | Use the binary encoding. |
Cargo rejects the manifest because miden-core has no serde feature (or miden-processor has no bus-debugger feature) | Feature removed | Remove the feature from the dependency. |
Direct Plonky3 dependencies must match
Summary
Felt implements the p3-field traits of the Plonky3 version the VM builds against: 0.6 for VM 0.29, 0.8 for VM 0.35. A crate that depends on p3-* directly must use the same minor version, or Felt will not satisfy its trait bounds. miden_crypto::stark::dft also stopped re-exporting NaiveDft; it now re-exports Radix2DFTSmallBatch next to Radix2DitParallel and TwoAdicSubgroupDft.
Affected Code
# Before (0.16)
p3-field = "0.6"
# After (0.17)
p3-field = "0.8"
// Before (0.16)
use miden_crypto::stark::dft::NaiveDft;
// After (0.17): pick one of the remaining DFTs
use miden_crypto::stark::dft::Radix2DitParallel;
The VM changelog describes the change only as a faster DFT for PeriodicLde. The same change removed the public miden_crypto::stark::dft::NaiveDft re-export.
Migration Steps
- Prefer importing field traits through
miden_crypto::field::{Field, PrimeField64, ...}so they always match the VM's Plonky3. - If you depend on
p3-*crates directly, bump them together to0.8. - Replace
NaiveDftwithRadix2DitParallelorRadix2DFTSmallBatch.
Common Errors
| Error Message | Cause | Solution |
|---|---|---|
error[E0277]: the trait bound `Felt: p3_field::Field` is not satisfied (or another p3_field trait), with the note "there are multiple different versions of crate p3_field in the dependency graph" | Two p3-field versions in the dependency graph | Align your p3-* version, or import the traits through miden_crypto::field. |
error[E0432]: unresolved import naming miden_crypto::stark::dft::NaiveDft | Re-export removed | Use Radix2DitParallel or Radix2DFTSmallBatch. |
0.16 artifacts do not carry over
Summary
Nothing below has a converter. Regenerate each artifact from its source with 0.17 tooling, and move every component that exchanges these bytes (client, CLI, Web SDK, remote prover, node) to 0.17 together.
| Artifact | What happens in 0.17 | What to do | Details |
|---|---|---|---|
.masp packages | Format 6.0.0 → 7.0.0; readers accept exactly 7.0.0. The MAST forest wire format stays [0, 0, 4], so a bare serialized MastForest still loads, but roots of changed procedures differ. A package that links miden-core 0.33 dynamically fails dependency resolution | Re-assemble every package from source, including the CLI's .miden/packages and contract packages | VM & Assembler Changes, Client Changes, Rust Contract SDK & Compiler |
Proofs (ExecutionProof, and ProvenTransaction / ProvenBatch / ProvenBlock serialized by 0.16) | Every proof must start with transport format 2; 0.16 proofs fail to decode. Proofs made with VM 0.33 (client 0.17.0-rc.4 or earlier) decode, then fail verification | Discard them and re-prove | VM & Assembler Changes, Transaction Changes |
BlockHeader bytes | 8-bit version, no fee faucet, new fields | Discard and re-fetch | Transaction Changes |
TransactionInputs bytes | Now carry a ProtocolConfig | Discard and rebuild | Transaction Changes |
| Account, header, asset, note and delta bytes | Lead with a version byte or use a new layout; derived commitments, IDs and standard script roots change | Re-fetch or rebuild; recompute hardcoded values | Account Changes, Note Changes |
AccountCode, NoteScript and TransactionScript bytes | Written in the hashless MAST format; reading rebuilds and checks the node hashes. Roots and commitments are unchanged, but a trusted MastForest reader rejects the embedded forest | Decode through the type's read_from_bytes, or read the forest with UntrustedMastForest | Transaction Changes |
| Protobuf messages written by a 0.17 release candidate | PartialAccount fields were renumbered around a new version field, AccountPatch.code became an AccountCodePatch, and MastForest carries the hashless format | Re-encode with 0.17.0 | Account Changes |
Account and note files (.mac, .mno, Web serialize() bytes) | Protobuf only; 0.16 files fail to decode | Re-export with a 0.17 client; consume private notes before upgrading | above, Client Changes |
| SQLite store | Rejected at open with store is at schema version 2, which is newer than the highest version this client supports (1), although the store is older. Stores from every 0.17 release candidate fail the same way (version 3 from rc.5) | Delete the store file with its -wal and -shm files and re-sync; the keystore directory and miden-client.toml carry over | Client Changes |
| IndexedDB store | A 0.16.3 store is deleted automatically on first open by 0.17, together with the secret keys of the default browser keystore, which lives in the same database. A store created by a 0.17 release candidate is kept and then fails when the client is built | Back those keys up first, then re-sync; delete a release-candidate database yourself before the first 0.17.0 open; recover accounts from the keys, not from old exports | Client Changes |
Serialized TransactionRequest | Always carries block numbers, ends with an account-code-upgrade field and holds hashless scripts; bytes from 0.16 or from 0.17.0-rc.4 and earlier do not deserialize | Rebuild the request; every party that exchanges requests (dApp, wallet, co-signers) must run 0.17.0 | Client Changes |
PartialSmt bytes | 0.16 bytes with empty-subtree markers fail to decode | Rebuild from source data | Hashing & Crypto Changes |
The same holds for the network side. A 0.17.0 client is accepted only by a 0.17 node (the node matches major.minor and the pre-release label, so a 0.17 release-candidate node rejects it too), the remote prover wire format changed, and the note transport service moved. For a local node, use node 0.17.0, the release the 0.17.0 client is built against. See Client Changes.
The 0.16 guide advised exporting private note files before recreating the store. That does not survive this upgrade: 0.16 exports do not import into 0.17. Consume private notes on 0.16 before upgrading, or have the sender re-send them once both sides run 0.17. 0.16 secret keys survive in a filesystem keystore, which loads unchanged in 0.17, but not in the default browser keystore: the IndexedDB reset deletes them, so back them up on 0.16.3 first.
Migration Steps
- Re-assemble every
.masppackage from source with the 0.17 toolchain, and drop persisted packages built with VM 0.29. - Discard cached proofs, proven transactions, batches and blocks, block headers, transaction inputs and serialized requests written by 0.16 or by a 0.17 release candidate.
- Consume private notes and, in the browser, back up the default keystore's secret keys on 0.16.3. Then delete the local SQLite store with its
-waland-shmfiles, or let the Web SDK reset a 0.16.3 IndexedDB store (delete one created by a 0.17 release candidate), and re-sync against a 0.17 node. - Re-create or re-export account and note files with 0.17 tooling.
- Upgrade the client, the CLI, the Web SDK, any remote prover and the node together.
Common Errors
| Error Message | Cause | Solution |
|---|---|---|
invalid value: unsupported version. Got '[6, 0, 0]', but only '[7, 0, 0]' is supported | A package written by VM 0.29 (0.16 init, midenc 0.10, or your own build) | Re-assemble the package. |
invalid value: unsupported execution proof format {format} | Proof bytes from an older VM release | Re-prove with 0.17. |
execution proof does not name a compatible VM verifier | Proof made with VM 0.33 (client 0.17.0-rc.4 or earlier) | Re-prove with 0.17.0. |
store is at schema version 2, which is newer than the highest version this client supports (1) | A SQLite store written by a 0.16 client or a 0.17 release candidate (3 from rc.5) | Delete the store with its -wal and -shm files and re-sync. |
procedure with root digest {root_digest} could not be found | A custom MastForestStore / DataStore that does not serve StandardsLib, or a package linked against an older core library | Serve StandardsLib; re-assemble the package. |
dependency resolution failed: Because there is no version of miden-core in >= 0.33.0 and < 0.34.0 ... | The package, or one of its dependencies, requires miden-core 0.33 | Set version = "0.35" and re-assemble, dependencies first. |
HASHLESS flag is set; use UntrustedMastForest for untrusted input | A trusted MastForest reader on the forest inside 0.17 code or script bytes | Use the type's read_from_bytes, or UntrustedMastForest. |
failed to decode the account file / failed to decode the note file | A 0.16 account or note file | Re-export with 0.17. |
server rejected request - please check your version and network settings (client version: 0.17.0, genesis commitment: ...) | Client and node differ in major.minor or pre-release label | Use node 0.17.0 with client 0.17.0. |
Migration Steps
- Bump every Miden crate per the Version Bumps table.
- Keep every protocol crate on
0.17.0, and every VM crate (includingmiden-crypto) on0.35.0. - Add
miden-objectsforAccountFile/NoteFileand the Protobuf encodings, and never the unrelatedmiden-objects0.12.x. - Drop the
serdefeature frommiden-coreandbus-debuggerfrommiden-processor; align any directp3-*dependency to0.8. - Bump every
@miden-sdk/*package to0.17.0together, withnpm install <package>@0.17.0. - Move contract projects to
miden0.15.0and the0.17.0toolchain channel, and rebuild them. - Keep your Rust toolchains: nothing changes for a 0.16.1 user.
- Regenerate every 0.16 artifact per 0.16 artifacts do not carry over, and upgrade client, prover and node together.
- If you execute transactions through your own
MastForestStore/DataStore, serveStandardsLibfrom it.
Common Errors
| Error Message | Cause | Solution |
|---|---|---|
error[E0432]: unresolved import `miden_protocol::account::AccountFile` | Type moved to miden-objects | use miden_objects::account_file::AccountFile; or miden_client::account::AccountFile. |
error[E0277]: the trait bound `AdviceMap: serde::Serialize` is not satisfied | miden-core lost its serde impls | Use to_bytes() / read_from_bytes(). |
error[E0277]: the trait bound `Felt: p3_field::Field` is not satisfied (note: multiple different versions of crate p3_field) | Direct p3-* dependency on a different Plonky3 minor | Bump p3-* to 0.8, or import traits through miden_crypto::field. |
invalid value: unsupported version. Got '[6, 0, 0]', but only '[7, 0, 0]' is supported | Package built with a 0.16 (VM 0.29) toolchain | Re-assemble from source. |
invalid value: unsupported execution proof format {format} | Proof serialized by 0.16 | Re-prove with 0.17. |
store is at schema version 2, which is newer than the highest version this client supports (1) | 0.16 or 0.17 release-candidate SQLite store | Delete the store with its -wal and -shm files and re-sync. |
procedure with root digest {root_digest} could not be found | Custom MastForestStore / DataStore without StandardsLib | Serve StandardsLib from it. |
failed to decode the account file / failed to decode the note file | 0.16 export | Re-export with a 0.17 client. |
server rejected request - please check your version and network settings (...) | Client and node from different lines | Run matching versions. |