Skip to content

Releases: 0xMiden/rust-sdk

v0.15.3

Choose a tag to compare

@gabrielbosio gabrielbosio released this 03 Jul 00:06
e12598f

Features

  • [FEATURE][cli] miden-cli call now accepts advice map entries supplied via --inputs-path/-i <FILE.toml> in the same TOML format as exec (#2244).
  • [FEATURE][rust] The gRPC client now accepts responses up to 15% above the node's 4 MiB payload budget by default, and GrpcClient::with_max_decoding_message_size lets callers raise the decode ceiling further. The CLI raises its own ceiling to 6 MiB to cover large SyncTransactions responses. This prevents syncs from failing with a "decoded message length too large" error when a node response slightly exceeds the previous hard 4 MiB limit (#2298).

v0.15.2

Choose a tag to compare

@igamigo igamigo released this 19 Jun 01:50
aac4350

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

Choose a tag to compare

@igamigo igamigo released this 16 Jun 21:06
a8072a2

v0.15.1

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

v0.15.0

Choose a tag to compare

@igamigo igamigo released this 12 Jun 20:04
02a3212

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

Choose a tag to compare

@igamigo igamigo released this 19 May 14:20
6a5ac53

0.14.9 (2026-05-19)

Enhancements

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

v0.14.8

Choose a tag to compare

@WiktorStarczewski WiktorStarczewski released this 11 May 17:09
5928fc2

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

Choose a tag to compare

@SantiagoPittella SantiagoPittella released this 06 May 17:22
f66c50f

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

Choose a tag to compare

@SantiagoPittella SantiagoPittella released this 05 May 20:44
9bbb052

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

Choose a tag to compare

@SantiagoPittella SantiagoPittella released this 27 Apr 23:15
4786b53

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

Choose a tag to compare

@WiktorStarczewski WiktorStarczewski released this 20 Apr 15:54
18d921f

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).