Skip to content

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 Option<Account>. No longer returns data for private accounts; instead use NodeRpcClient::get_account to fetch private account's commitment. (#2215).
  • [BREAKING] Removed the account storage-layout sync hints; StateSyncInput::accounts now takes a Vec<AccountHeader> (#2215).
  • [BREAKING][type][rust] BasicFungibleFaucet is now a unit struct; token symbol/decimals/max-supply moved to a new FungibleTokenMetadata component built via FungibleTokenMetadata::builder. (#2145)
  • [BREAKING][behavior][cli] account new-faucet now requires a [fungible-faucet-metadata] block (typed symbol, decimals, max_supply, optional name) in the init data file passed via -i, replacing the previous ["miden::standards::fungible_faucets::metadata"] section with stringly-typed values. (#2145)
  • [BREAKING][behavior][all] Note scripts must now use the package-style header @note_script + pub proc main … end instead of the bare begin … end, following the upstream protocol bump. (#2145)
  • [BREAKING][type][rust] Token-policy components in account::component were redesigned: removed MintAuthControlled, MintOwnerControlled, BurnAuthControlled, BurnOwnerControlled (and their *Config variants); faucets now install a single TokenPolicyManager configured with PolicyAuthority + MintPolicyConfig / BurnPolicyConfig, plus standalone MintAllowAll / MintOwnerOnly / BurnAllowAll / BurnOwnerOnly policy components. Construct via AccountBuilder::with_components(TokenPolicyManager::new(...)). (#2145)
  • [BREAKING][type][rust] NoteScript::root() now returns NoteScriptRoot instead of Word. Use Word::from(root) (or root.into()) where a Word is required. NoteScriptRoot is re-exported from miden_client::note. (#2145)
  • [BREAKING][rename][rust] FeeParameters::native_asset_id() renamed to fee_faucet_id(). (#2145)
  • [BREAKING][rust] Removed NodeRpcClient::check_nullifiers, RpcEndpoint::CheckNullifiers, EndpointError::CheckNullifiers, and CheckNullifiersError after the upstream node dropped the CheckNullifiers gRPC method. Use NodeRpcClient::sync_nullifiers to retrieve nullifier updates. (#2145)
  • [BREAKING][behavior][cli] token_symbol_map.toml requires the id field to be a bech32 address; hex AccountIds are no longer accepted. Convert existing entries by copying the bech32 address from account list. (#2159)
  • Added a Client::import_watched_account_by_id method to track an external account state without syncing notes (#2143).
  • Removed limit on accounts and note tags that can be tracked by the client (#2170).
  • [BREAKING] Updated the sync_notes and sync_transactions to return directly the fetched updates. Removed TransactionsInfo and NoteSyncInfo structs (#2170).
  • [BREAKING][param][rust,store] InputNoteRecord::new takes a NoteAttachments argument; input notes persist attachments (new attachments column on input_notes) (#2203).
  • [BREAKING][param][rust] build_wallet_id dropped its trailing is_mutable: bool (code mutability isn't encoded in the account ID) (#2203).
  • [BREAKING][behavior][cli] new-account/new-wallet --account-type (-t) now accepts only private/public; legacy faucet/mutability values and --mutable are removed. Faucet-vs-regular is derived from packages — a FungibleFaucet component yields a fungible faucet with an implicit TokenPolicyManager (#2203).
  • [BREAKING][type][rust] Client::import_notes returns Vec<NoteDetailsCommitment> (was Vec<NoteId>), since metadata-less imports have no NoteId yet — resolve via Client::get_input_note_by_commitment (#2203, #2235).
  • [BREAKING] Reworked the GetAccount surface on NodeRpcClient: replaced get_account_proof with get_account(account_id, GetAccountRequest) and added resolve_oversize_vault / resolve_oversize_storage_maps helpers. GetAccountRequest bundles the previous positional args (#2202).
  • [BREAKING][rust] NodeRpcClient::get_note_script_by_root now returns Option<NoteScript> (None when the node has no script for the requested root) instead of erroring when the script is absent (#1840).
  • [BREAKING] miden_client::note re-exports updated to match the protocol's split of attachment data off NoteMetadata: removed NoteAttachmentKind and NoteMetadataHeader, added NoteAttachmentHeader, NoteAttachments, and PartialNoteMetadata. (#2185)
  • [BREAKING] CommittedNoteMetadata simplified to a single Full(NoteMetadata) variant; the Header { sender, note_type, tag, attachment_kind } variant is removed because sync responses now always carry full metadata (attachment content is still fetched separately via GetNotesById, but is no longer part of NoteMetadata). Callers no longer need to handle the header-only case. (#2185)
  • [BREAKING] TransactionRequestBuilder::build_pswap_create now takes note_attachment: Option<NoteAttachment> instead of NoteAttachment. Pass None when there is nothing to attach (previously NoteAttachment::default()). (#2185)
  • [BREAKING] account list, account show, and account new-faucet now read and build the new FungibleFaucet component (multi-slot) instead of the standalone TokenMetadata storage item. Faucet accounts created with the previous component layout are no longer recognized; new faucets are constructed via FungibleFaucet::builder rather than the basic-fungible-faucet package. (#2185)
  • [BREAKING] Note attachments are no longer carried on the note-transport wire format (only NoteHeader + serialized NoteDetails). (#2185)
  • [BREAKING][rust] Removed the top-level miden_client::standards alias. Use the curated client paths as before, or the new raw upstream namespaces miden_client::account::standards::*, miden_client::note::standards::*, and miden_client::testing::standards::*. (#2185)
  • Added a blanket implementation for NodeRpcClient::get_account_details (#2196).
  • [BREAKING][param][rust] NodeRpcClient::sync_storage_maps and NodeRpcClient::sync_account_vault now take a required block_to: BlockNumber instead of Option<BlockNumber>. The node rejects ranges that extend beyond the chain tip, so callers must pass an explicit upper bound (e.g. the client's sync height). (#2229)
  • Replaced node-builder crate with a leaner test-node-genesis crate and removed the testing-remote-prover crate; the testing node now runs the node's own miden-remote-prover (#2232).