Repository navigation
v0.18.1
Patch release on the Miden 0.17 line, covering everything since v0.18.0. It publishes the server image (ghcr.io/openzeppelin/guardian:v0.18.1), the Rust crates and the npm packages (dist-tag latest). Accounts and stored data carry over from v0.18.0: no reset, no database migration.
⚠️ SDK upgrade notes
- Upgrade every cosigner of an account together. Proposals now record the block their summary binds as
bound_block_numinstead of achain_anchor(#541). 0.18.1 clients accept proposals made by 0.18.0 clients, but 0.18.0 clients refuse proposals made by 0.18.1 clients, so a cosigner left on 0.18.0 cannot sign or execute them. - Removed APIs (#541). TypeScript:
executeForSummary(useexecuteForSummaryAtTip),executeForSummaryAt,SummaryAnchorMismatchError,chainAnchorToBase64,chainAnchorFromBase64,chainAnchorBlockNum. Rust: thechain_anchorfields ofProposalMetadataPayloadandExportedMetadata,ProposalMetadata::chain_anchor_b64andProposalMetadata::chain_anchor(),ProposalPayload::with_chain_anchor, andMultisigError::SummaryAnchorMismatch. New:bound_block_num/boundBlockNumon the metadata types. - TypeScript:
create*Proposallabels proposals with the account's next nonce (store nonce plus one, as the Rust SDK does) instead ofDate.now()(#486).options.noncestill overrides it. Rows written with timestamp labels are not migrated; see Upgrading from 0.18.0 to 0.18.1 for how they order in/delta/sinceand the history. - TypeScript: execution refuses a proposal GUARDIAN pinned to a state the client does not hold (#486), before anything is pushed or executed, for every proposal type.
- Miden patch pins.
miden-protocol/miden-standards0.17.1,miden-client0.17.3,@miden-sdk/miden-sdk0.17.3. Theauth_txprocedure root is unchanged, so accounts carry over. A customNodeRpcClientimplementation must addis_invitation_code_valid. Browser clients that share a store name now share one IndexedDB connection: release aMidenClientwithawait client[Symbol.asyncDispose]()before deleting or reopening its store. - Note transport cursors. miden-client 0.17.3 keeps one transport cursor per note tag and does not carry the 0.17.0 cursor over, so a store upgraded from 0.18.0 re-reads transport history it already holds on its first syncs (imports dedupe). The recovery flow's transport drain gets past it in one call: it now keeps fetching until a fetch moves no tag's cursor.
- Install pins.
npm install @openzeppelin/miden-multisig-client@0.18.1 @miden-sdk/miden-sdk@0.17.3. Rust:miden-multisig-client = "=0.18.1"withmiden-client = "=0.17.3".
Highlights
- Miden account sessions with a delegated signer (#537). A wallet signs one session grant; a client-held P-256 key then signs session-eligible requests, so hardware and remote wallets stop prompting on every read and proposal request. Approvals over transaction summaries stay with the wallet. Rust:
start_session/end_session/revoke_all_sessions; TypeScript:startSession/resumeSession/endSession/revokeAllSessions. See Session authentication. - Chained candidate queue (#486). An account can hold up to
GUARDIAN_MAX_PENDING_CANDIDATES_PER_ACCOUNTin-flight candidates, so a wallet can push back-to-back transactions without waiting for each to canonicalize. Off by default. - Proposal approvals are verified (#526). Falcon, raw ECDSA and EIP-712 approvals are checked against the transaction summary and the signer's identity on
PUTandPOST /delta/proposal;POSTaccepts at most the proposer's own approval. Rejections use400 invalid_proposal_signature. - Proposals bound to an older block can be created (#541, fixes #538). A request a dApp built at block N no longer fails with
SummaryAnchorMismatchErroronce the proposer has synced past N.
Guardian operations
Required: deploy the v0.18.1 image. There is no database migration and no new required setting; the defaults keep v0.18.0 behaviour. Deploy the server before rolling out SDK features that need it: sessions only work against a v0.18.1 server.
Check after the upgrade:
- Proposal signature verification (#526). A client that posts another cosigner's approval at proposal creation, or an approval that does not verify, now gets
400 invalid_proposal_signature. The repository's SDKs already comply; watch for this code from custom or third-party clients after the rollout. EIP-712 failures onPUT /delta/proposalused to returninvalid_delta, and a signer mismatchauthentication_failed. - Sessions are always on (#537). Optional
GUARDIAN_SESSION_MAX_TTL_SECONDScaps a session's lifetime (default28800, 8 h; it can only be shortened, and a value outside361to28800stops startup). With Postgres, sessions live in the existingauth_sessionstable and survive restarts; the in-memory store loses them on restart and clients start a new session.GET /statusadvertisessessions.max_ttl_seconds. New error codes:401 session_expired,401 session_revoked,403 wallet_signature_required. - Candidate queue (#486), opt-in. Leave
GUARDIAN_MAX_PENDING_CANDIDATES_PER_ACCOUNTunset (default1) until every TypeScript client runs 0.18.1: older TypeScript clients label proposals with timestamps and execute proposals pinned to states they do not hold, which can leave GUARDIAN behind the chain on a queueing server. Values2to16opt in; above16stops startup. On AWS, set the Terraform variableguardian_max_pending_candidates_per_account.GET /dashboard/inforeports the effectivemax_pending_candidates_per_account. - Monitoring. Retained candidates gain the reason
orphaned(a queued successor whose predecessor left the queue): new metric outcome, log eventcandidate_retained reason=orphaned, and dashboardstatus_reason. Update any alert or dashboard that matches on retained reasons. - Networks. Devnet runs node 0.17.0 and accepts these pins (checked 2026-10-12). Testnet still runs Miden 0.16 and stays on v0.17.0.
What's Changed
- feat(server): queue chained candidate deltas per account by @haseebrabbani in #486
- fix(server): verify proposal signatures against the transaction summary by @VAIBHAVJINDAL3012 in #526
- fix(multisig-client): replace the proposal chain anchor with bound_block_num by @WiktorStarczewski in #541
- docs(speckit): specify Miden account sessions (#219) by @VAIBHAVJINDAL3012 in #527
- feat: Miden account sessions with a delegated signer by @VAIBHAVJINDAL3012 in #537
- chore(release): v0.18.1 by @zeljkoX in #545
Full Changelog: v0.18.0...v0.18.1