v2.29.0
Release date: Oct 16, 2025
New features
Anchor forwarding strategies
Added new ledger configuration options for anchor forwarding, providing fine-grained control over how anchor operations are forwarded:
forward.anchor.strategy: Global forwarding strategy for anchors. Supported values:none,proxy,fallback,validate.- Per-operation forwarding strategies:
forward.anchor.create.strategy,forward.anchor.update.strategy,forward.anchor.drop.strategy,forward.anchor.get.strategy,forward.anchor.sign.strategy,forward.anchor.findAll.strategy.
These options enable proxying, fallback, or validation-based interoperability with other external alias directories proxied via bridges.
Described in detail at About Anchor Forwarding
Balance reservation and release in DTC
Added balance reservation and release in DTC. Balances are reserved for all source wallets when intent is pending and kept reserved until intent is cleared or aborted. A newly created core signer appends a proof for each resolution proof and signs intent when being cleared or aborted.
Controlled by flags:
dtc.intentInfoResolutionFromProofsdtc.claimResolutionProofsdtc.balancesMovementWhenCommitteddtc.balancesReservation(NEW!)
Described in detail at About Balance Reservations
Background webhook delivery (STG)
Effects can now be scheduled for delivery in a different transaction from the request. Added scheduler handler for effect delivery and allow effects to be processed in background. This behavior is controlled through the effect.scheduleWebhookDeliveries flag, which is now enabled for staging environments.
Bridge authentication header support
Added support for header schema in bridges' secure property, defining one or more auth headers to be sent on requests to bridge.
Described in detail at Header Authentication chapter of About Bridges
Access Policies redesign
Redesigned access policies page in Studio, for now the feature is on technical preview and will be further extended and then released to all clients.
Improvements
Documentation
- Restructured documentation URLs - removed
/ledgerprefix from all routes. Documentation now serves directly from root path/instead of/ledger/*. - Removed
/solutionsdocumentation route and all related pages. - Removed mentions of deprecated Intents
config.commit = manual. - Added comprehensive reporting bridge documentation:
Studio UX
- Show proper feedback for combobox assignation component when it's empty, instead of showing a blank space.
- Added "Add bridge" button in wallets table for wallets without an assigned bridge. Button is only visible to users with wallet update permissions.
- Added security feature where accounts get locked after x amount of failed logins in a row.
- Allow any signer schema to be used for creating "signer" when creating a bridge in the "Wizard". Previously it was hardcoded to "bridge".
- Added base record schema for different record types to render default form when schema is not defined.
CLI
- Changed
wallet balancecommand to present the reserved amount for each symbol (omitted when it's 0). - Changed
ledger updatecommand to allow migration frompolicy-basedtorecord-basedaccess strategy. - Changed
ledger createcommand to allow selecting ledger's access strategy.record-basedis the default.
Ledger
- Changed API spec to constrain the absolute value of
amountof intent claims to be lower than Number.MAX_SAFE_INTEGER (9007199254740991), to provide better feedback to API users in case of errors. - Changed ledger to allow migration from
policy-basedtorecord-basedaccess strategy. See more at Policy based ledgers - Support to filter anchors by
data.schema.
BigQuery Reporting Bridge
- Enabled BQRB in all PRD environments.
Fixes
Studio
- Fixed breadcrumb navigation in detail pages (Intents, Policies, Reports) to be clickable and preserve filters, pagination, and schema selection when navigating back to list pages.
- Properly filter anchors by
data.schemawhen schema from tabs is specified.
Layouts
- Remove
AccessRecord.Serverfrom RTP layouts. This record was assigned to access rules because layouts were using$in: AccessRecord.filter((r) => [...FORBIDDEN_RECORDS].includes(r)), andAccessRecord.Serverwas not blacklisted. Now, layouts are using$nin: [FORBIDDEN_RECORDS]withAccessRecord.Serverexplicitly forbidden.
Ledger
- Fixed intent resolution logic to throw when source, routed source, target or routed target doesn't resolve to a wallet in ledger.
- Fixed race conditions in status/labels resolution of records by locking the record before calculations. This makes concurrent requests await for lock releasing before appending proofs and making status/labels changes derived from proofs.
- Fixed performance issue with
$regexoperator forclaims.target.handleandclaims.source.handleproperties when filtering intents. - Many non-client-facing fixes