Skip to content

Releases: 0xMiden/rust-sdk

v0.15.2

19 Jun 01:50
aac4350

Choose a tag to compare

0.15.2

Features

  • [FEATURE][rust] Added PSWAP chain tracking: the client now follows a local creator's partial-swap order across foreign partial fills during sync, surfacing each reconstructed payback as a consumable input note and letting the creator reclaim the current tip. New Client API: pswap_lineages, pswap_lineages_for, pswap_active_lineages, pswap_lineage, and build_pswap_cancel_by_order (#2231).
  • [FEATURE][rust] Added Client::send_private_note_with_block_hint, which relays a sender-provided after_block_num so recipients get deterministic delivery instead of relying on receiving side lookback. (#2262)

Changes

  • [rust] Bumped miden-note-transport-proto-build to 0.4.1. Notes imported from the note transport layer now use the provided after_block_num when present, falling back to the 20-block lookback window otherwise. NoteInfo gained a block_hint: Option<BlockNumber> field (plus a NoteInfo::new constructor) and NoteTransportClient gained a send_note_with_block_hint method (defaulting to send_note, so existing implementors keep compiling). (#2262)

v0.15.1

16 Jun 21:06
a8072a2

Choose a tag to compare

v0.15.1

  • Re-exported miden-agglayer as miden_client::agglayer.

v0.15.0

12 Jun 20:04
02a3212

Choose a tag to compare

v0.15.0

Enhancements

  • [FEATURE][rust] Added Client::sync_chain() (on-chain sync only) and Client::sync_note_transport() (Note Transport Layer fetch only) for callers needing finer-grained control over sync. (#2091)
  • [FEATURE][rust] Added GrpcClient::with_bearer_auth(token) to attach an authorization: Bearer <token> header to every outbound gRPC call, for use behind authenticating gateways. Tokens are validated at connection time and preserved across set_genesis_commitment updates (#2101).
  • Made new-account construction use merged storage schema commitment (build_with_schema_commitment), re-exported AccountBuilderSchemaCommitmentExt, added WASM buildWithoutSchemaCommitment(), and fixed contract accounts.create() to require explicit components (#1996).
  • Fixed the faucet token symbol display when showing account details (#1985 (#2158)).
  • [FEATURE][rust,cli,web] Added get_network_note_status to NodeRpcClient trait for querying the processing status of notes submitted to the network (pending, nullifier-inflight, discarded, nullifier-committed), along with attempt count and error details. Exposed as miden-client network-note-status <note_id> CLI command and RpcClient.getNetworkNoteStatus() in the web client. (#1981)
  • Remove MMR peaks from the blocks table and store them alongside the sync height in a new blockchain_checkpoint table (#2100).
  • Added miden-cli call command for invoking account procedures directly from the CLI (#1943).
  • [FEATURE][rust,store] Added BatchBuilder for stacking multiple transactions against multiple local accounts and submitting them as one proven batch via SubmitProvenBatch. Also adds Store::apply_transaction_batch (atomic multi-tx apply) with a SqliteStore implementation. (#2109, #2160)
  • Made TransactionStoreUpdate serialization lossless (#2112).
  • [FEATURE][cli] Added address encode <ACCOUNT_ID> <INTERFACE> [TAG_LEN] subcommand that prints the bech32 encoding of an address built from the given fields (useful for producing the input to address add). (#2115)
  • [FEATURE][cli] On asset display, the CLI now lazily fetches on-chain TokenMetadata for untracked public faucets via RPC and persists the result in the client's settings store. (#2159)
  • [FEATURE][cli] Faucet/account IDs in human-facing CLI output (account list, notes -s, transaction summaries) are now rendered as bech32 addresses using the configured network instead of hex IDs. Hex remains in error messages and debug output. (#2159)
  • Added an integration test for network-transaction public output note creation (#2073).
  • [FEATURE][rust,cli] Added DAP-backed transaction execution support through DapProgramExecutor/ProgramExecutor, and made miden-client exec --start-debug-adapter compile source scripts so DAP clients can resolve source locations. (#2189, #2245)
  • [FEATURE][web] Added StorageView JS wrapper over WASM AccountStorage. account.storage() now returns a StorageView that makes getItem() work intuitively for both Value and StorageMap slots. WASM primitives are unchanged; the raw AccountStorage is accessible via .raw (#1955).
  • [FEATURE][web] Added wordToBigInt() utility export for losslessly converting a Word's first felt to a BigInt. StorageResult.toString() is BigInt-backed, and valueOf() returns a JS number for values fitting in Number.MAX_SAFE_INTEGER and throws RangeError for larger u64 values — use .toBigInt() for exact access (#1955).
  • [FEATURE][rust,cli] Added partial swap (PSWAP) support: TransactionRequestBuilder::build_pswap_create / build_pswap_consume / build_pswap_cancel and a miden-client pswap CLI command (create, consume, cancel) for partially-fillable fungible swaps (#2162).
  • Added verification of MMR responses during state sync: validated the returned block range matches the requested range and checked that post-delta MMR peaks match the block header's chain commitment (#1887).

Fixes

  • [FIX][rust] Client::execute_transaction no longer writes to the store before execution: the request's input notes and output note scripts are persisted only after the transaction executes successfully and is applied, so a failed execution leaves the store unchanged (#2222).
  • [FIX][rust] Client::send_private_note is now durable across transient NTL failures: the relay payload is persisted to a durable outbox (a Vec<NoteInfo> under the note_transport_outbox settings key) before the transport call, so a failed or interrupted send_note no longer drops the note. Client::sync_note_transport retries the outbox on each sync (the receiver dedupes by note id) and a failing relay no longer blocks the sync; the new Client::flush_relay_outbox() lets callers drive retries directly (#2127).
  • [FIX] Fixed derive_account_commitments to return the final account commitment when multiple transactions for the same account are committed in the same block (#2164).
  • [FIX] Stopped state sync from aborting when the node reports a stale (non-monotonic) header for a rapidly-advancing account: such updates are now skipped instead of failing with a nonce error (#2216).
  • [FIX] Preserve a fungible asset's callback flag when the store replays a vault delta, fixing a ConflictingRoots error when consuming callback-bearing (e.g. agglayer-minted) assets (#2225).
  • [FIX] Fixed the sync_notes_with_details to fetch the attachments for private notes (#2214).
  • [rust] Expanded validation for output notes before executing a TransactionRequest. (#89)
  • [FIX][rust] Client::fetch_all_private_notes now drains the full backlog across multiple server-paginated responses instead of returning after a single batch. Needed once the note-transport server (0xMiden/note-transport-service#77) caps each fetch_notes response at FETCH_NOTES_BATCH_SIZE rows — previously the function silently returned only the first batch, contradicting its documented "fetches all notes" semantics. Companion deterministic regression test (fetch_all_private_notes_drains_across_batches) uses a new MockNoteTransportNode::with_max_batch(n) constructor to exercise multi-batch drain. (#2095)
  • [FIX][rust] Fixed the dap feature build by bumping miden-debug/miden-debug-engine to 0.8.1 and miden-core to 0.23.2, aligning the debugger crates with the miden-core APIs they call. (#2189)

Changes

  • [BREAKING][rust] Added a Subscription(Word) variant to NoteTagSource. (#2248)
  • [rust] Added Store::apply_settings_mutations for batched settings writes. (#2248)
  • [BREAKING][param][rust] NodeRpcClient::get_block_by_number() now takes an include_proof: bool parameter to control whether the block proof is included in the response. (#1991)
  • [BREAKING][param][rust] NodeRpcClient::sync_chain_mmr() replaced block_to: Option<BlockNumber> with upper_bound: SyncTarget to match the RPC definition. Use SyncTarget::CommittedChainTip for previous default behavior (None), or SyncTarget::BlockNumber(num) for a specific block number. (#1991)
  • [BREAKING][rust] Added submit_proven_batch to NodeRpcClient trait. (#2075)
  • [BREAKING][param][cli] address add now takes <ACCOUNT_ID> <BECH32_ADDRESS> instead of <ACCOUNT_ID> <INTERFACE> [TAG_LEN]. Use the new address encode subcommand to build a bech32 string from <ACCOUNT_ID> <INTERFACE> [TAG_LEN]. (#2115)
  • [BREAKING][rust] StateSync no longer takes an Option<Arc<dyn Store>>. StateSyncInput::accounts is now a Vec<AccountSyncHint> (header + AccountStorageHeader); when hints cover the account's map slots StateSync issues a single get_account_proof for non-oversized accounts, and when new map slots appear on-chain it only fetches the missing ones. The Store trait method get_account_map_slot_names was replaced with get_account_storage_header. (#2132)
  • [BREAKING] NodeRpcClient::get_account_details now fetches a public account's storage maps in a single /GetAccount request and returns `O...
Read more

v0.14.9

19 May 14:20
6a5ac53

Choose a tag to compare

0.14.9 (2026-05-19)

Enhancements

  • Bumped miden-vm workspace dependencies from 0.22.1 to 0.22.4.

v0.14.8

11 May 17:09
5928fc2

Choose a tag to compare

0.14.8 (2026-05-11)

Enhancements

  • [FEATURE][rust] Surfaced concurrent as a top-level miden-client feature, independent of std. wasm32 consumers using default-features = false (notably the @miden-sdk/miden-sdk MT WASM bundle and the new miden-mobile-prover native plugin for iOS/Android wallets) can now opt into rayon-parallel proving via miden-tx/concurrent + miden-prover/concurrent without also pulling in the miden-client/std deps (dep:tokio, dep:tempfile, tonic's transport/tls-* features). Native std-using consumers get this transitively through std; the duplication in the std feature list is intentional so each consumer can pick the smallest feature set they need. Note that miden-tx's own concurrent feature is defined upstream as ["miden-prover/concurrent", "std"], so this does activate std on the protocol crates (miden-tx, miden-prover, miden-protocol) — that std is unavoidable for parallel proving and is cheap on wasm32 (#2169).

v0.14.7

06 May 17:22
f66c50f

Choose a tag to compare

0.14.7 (2026-06-05)

Enhancements

  • [FEATURE][rust] Added GrpcClient::with_bearer_auth(token) to attach an authorization: Bearer <token> header to every outbound gRPC call, for use behind authenticating gateways. Tokens are validated at connection time and preserved across set_genesis_commitment updates (#2101).

v0.14.6

05 May 20:44
9bbb052

Choose a tag to compare

0.14.6 (2026-05-05)

Fixes

  • [FIX] When the client submits a network note and it is also tracking the recipient network account, now the InputNoteReader detects the consumed note (#2113).
  • Changed note transport integration tests to validate note ids and avoid matching with existing notes when running against testnet (#2148).

v0.14.5

27 Apr 23:15
4786b53

Choose a tag to compare

0.14.5 (2026-04-27)

Enhancements

  • Added ClientBuilder::source_manager() to override the SourceManager used by the client. When not set, the client defaults to DefaultSourceManager. Set this when compiling scripts outside the client with an external Assembler, so source spans resolve against the same manager (#2047).

Fixes

  • [BREAKING][behavior][rust,web] CodeBuilder::compile_note_script now expects a library module with a single procedure annotated @note_script (e.g. @note_script\npub proc main\n ...\nend) instead of a begin..end program. Inherited from miden-standards 0.14.5, which switched the underlying call from assemble_program to assemble_library (#2128).
  • [FIX][web] Stopped the wasm-bindgen-generated array constructors (NoteArray, OutputNoteArray, NoteAndArgsArray, NoteRecipientArray, StorageSlotArray, TransactionScriptInputPairArray, FeltArray, AccountIdArray, AccountArray, ForeignAccountArray, NoteIdAndArgsArray) from silently moving each input element's underlying Rust value out of the caller's JS handle. The default pub fn new(elements: Option<Vec<T>>) path took every element by value via wasm-bindgen's Vec<T> ABI: the JS handle's __wbg_ptr was left unchanged so the object looked fine, but any subsequent method on it panicked inside WASM with the opaque "null pointer passed to rust" error. The auto-generated array exports are now overridden in js/index.js with thin wrappers that build the same array via push(&T) (which already borrows + clones) so callers can keep using the originals after construction. Same pattern applied to replaceAt on the Rust side, which now takes elem: &T instead of elem: T. Repro: const note = new Note(...); new NoteArray([note]); note.id(); — used to panic, now succeeds (#2121).
  • [FIX][rust] Fixed source manager mismatch panic (invalid source span: starting byte is out of bounds) in tests that compiled scripts with a standalone SourceManager and then executed them through the client. Test helpers now use TransactionKernel::assembler_with_source_manager() and the client's shared source manager (#2047).
  • [FIX][react] Fixed initializeSignerAccount (the external-keystore init path used by MidenFiSignerProvider, Para, Turnkey, etc.) throwing "invalid enum value passed" on first connect. The code reached for AuthScheme.AuthEcdsaK256Keccak, which only exists on the internal wasm-bindgen AuthScheme enum, not on the public string-valued AuthScheme constant exported from @miden-sdk/miden-sdk/lazy — at runtime it resolved to undefined, and passing undefined to AccountComponent.createAuthComponentFromCommitment failed at the wasm boundary. initializeSignerAccount now calls resolveAuthScheme(AuthScheme.ECDSA), where resolveAuthScheme is a newly-public helper from @miden-sdk/miden-sdk that converts the string constants to the numeric wasm-bindgen variant (#2088).
  • [FIX][react] DEFAULTS.AUTH_SCHEME was being initialized to AuthScheme.AuthRpoFalcon512 — another nonexistent key on the public AuthScheme, silently resolving to undefined. Now set to AuthScheme.Falcon. The four hooks that read this default (useCreateWallet, useCreateFaucet, useImportAccount, useSessionAccount) now pipe the value through resolveAuthScheme(...) before handing it to the wasm-bindgen newWallet / newFaucet / importPublicAccountFromSeed calls. The public hook option types stay authScheme?: AuthScheme, which now correctly means "falcon" | "ecdsa" (#2088).

v0.14.4

20 Apr 15:54
18d921f

Choose a tag to compare

0.14.4 (2026-04-20)

Features

  • [FEATURE][web] Serialize all async WebClient JS methods — both the explicit wrappers and every async call that falls through createClientProxy to the underlying WASM client (e.g. getAccount, importAccountById, getAccountStorage) — via an internal _serializeWasmCall chain. Prevents "recursive use of an object detected" panics when an unwrapped read/write races the auto-sync timer or any explicitly-wrapped method. Expose waitForIdle() on MidenClient so callers can drain in-flight work before mutating non-WASM state (#2057).
  • [FEATURE][web] Split @miden-sdk/miden-sdk into eager and lazy entry points. The default entry (import from "@miden-sdk/miden-sdk") now awaits WASM at module top level via a small shim (js/eager.js) — consumers don't need await MidenClient.ready() / isReady before constructing wasm-bindgen types. The lazy entry (import from "@miden-sdk/miden-sdk/lazy") preserves the previous behavior and is required for Capacitor WKWebView hosts (the custom-scheme handler hangs on TLA) and Next.js SSR. Verified empirically against the Miden Wallet's iOS E2E suite on devnet. @miden-sdk/react imports from /lazy internally and manages readiness via isReady.
  • [FEATURE][web] Expose lastAuthError() on MidenClient for typed sign-callback failure recovery — preserves the raw thrown value from the JS signCallback so consumers can distinguish locked/rejected/IO-error failure modes (#2058).
  • [FEATURE][web] Added "custom" operation to preview() so users can dry-run any pre-built TransactionRequest, not just send/mint/consume/swap (#2052).
  • [FEATURE][web] Exposed BlockHeader.nativeAssetId() so JavaScript consumers can read the native fungible-faucet account ID from a block header. The field already rides the RPC wire and is decoded into the Rust BlockHeader, but no WASM accessor existed, forcing wallets and dApps to hardcode the native faucet per network (#2070).

Fixes

  • [FIX][web] proveTransactionWithProver now takes &TransactionProver by reference instead of consuming by value — the old signature invalidated the JS handle after one use, silently falling back to local proving on subsequent calls (#2062).

v0.14.3

16 Apr 15:45
bbf574c

Choose a tag to compare

0.14.3 (2026-04-16)

Fixes

  • Integrated node 0.14.7 and implemented detection for notes created and consumed on the same block that got erased from the node in order to mark them as consumed (#2008).