Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
aa0fb08
fix(wallet-toolbox): send and return BEEF as bytes so negotiated bina…
shruggr Oct 3, 2026
3c6cdac
fix(wallet-toolbox): size the BRC-177 anchor to cover the reclaim
shruggr Oct 3, 2026
ae6923a
refactor(wallet-toolbox): use an explicit surplusToFee planner flag
shruggr Oct 3, 2026
ad4920c
refactor(wallet-toolbox): replace nested ternary in the change cap
shruggr Oct 3, 2026
9e2fe18
fix(wallet-toolbox): return find rows as bytes over negotiated binary…
shruggr Oct 3, 2026
9273371
fix(wallet-toolbox): StorageIdb treats empty array filters as no filter
shruggr Oct 4, 2026
03e92cf
Merge branch 'main' into fix/brc177-anchor-covers-reclaim
ty-everett Oct 10, 2026
5efd597
Merge branch 'main' into fix/storage-binary-beef
ty-everett Oct 10, 2026
7201f5e
Merge remote-tracking branch 'origin/main' into review/david-775
ty-everett Oct 10, 2026
06a6df4
fix(wallet-toolbox): qualify BRC-177 reclaim funding release
ty-everett Oct 10, 2026
a442327
Merge branch 'review/david-775' into review/david-774
ty-everett Oct 10, 2026
7b060de
test(wallet-toolbox): qualify compact BEEF transport and compatibility
ty-everett Oct 10, 2026
d75d1dc
Merge branch 'review/david-774' into review/david-792
ty-everett Oct 10, 2026
9c28e50
Merge remote-tracking branch 'origin/main' into review/david-774
ty-everett Oct 10, 2026
c5f6a97
test(wallet-toolbox): qualify empty IndexedDB filters and ownership
ty-everett Oct 10, 2026
2560fa0
Merge branch 'review/david-774' into review/david-792
ty-everett Oct 10, 2026
3cc18d8
test(wallet-toolbox): verify filter parity across IndexedDB and SQLite
ty-everett Oct 10, 2026
c59d6d8
Merge qualified binary BEEF main before IndexedDB qualification
ty-everett Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/packages/wallet/wallet-toolbox-client.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ negotiated compact binary JSON codec. Legacy peers retain numeric-array JSON
and identical transaction/proof bytes. Authentication and payload ceilings
remain unchanged; upgrade both clients and active storage for the savings.

IndexedDB treats empty certificate certifier/type, transaction status and
output-tag ID arrays like omitted optional filters, matching Knex. Nonempty
arrays, partial predicates and user ownership remain enforced. No API, wire
or database migration is required.

## Backup and recovery

Recover both key material and wallet records; a manager snapshot or device
Expand Down
5 changes: 5 additions & 0 deletions docs/packages/wallet/wallet-toolbox.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ negotiated compact binary JSON codec. Legacy peers retain numeric-array JSON
and identical transaction/proof bytes. Authentication and payload ceilings
remain unchanged; upgrade both clients and active storage for the savings.

IndexedDB treats empty certificate certifier/type, transaction status and
output-tag ID arrays like omitted optional filters, matching Knex. Nonempty
arrays, partial predicates and user ownership remain enforced. No API, wire
or database migration is required.

## Optional registry descriptions

ProtoMap, BasketMap and CertMap supply descriptive metadata, not permission grants.
Expand Down
12 changes: 6 additions & 6 deletions docs/reference/package-api-migrations.md

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions governance/package-release-notes.json
Original file line number Diff line number Diff line change
Expand Up @@ -210,15 +210,15 @@
"name": "@bsv/wallet-toolbox",
"publishedVersion": "2.14.5",
"releaseType": "patch",
"summary": "WalletPermissionsManager retires signed no-send ownership and reference aliases after createAction or signAction reports sending or unproven, including sendWith-only calls and successful members of an undelayed review error. Failed or unreported actions retain their originator binding for retry or abort. Cleanup visits only the retired transaction's references and preserves aliases reused by newer actions. Adds an SDK3 peer alternative while retaining the existing SDK2.8.0 floor. Public Argon2id declarations reference the typed hash-wasm package while retaining the same generic binary/string contract and emitted runtime bytes. Fixes WAB faucet redemption for an empty wallet when storage adds a service charge. Local signer decisions for independently validated commission and derived change are retained privately through the permissions wrapper and bound by the SDK before signing. UMP pins anchor verified token-update lineage: password and token updates supersede their pinned predecessor, while unrelated historical continuations cannot override the anchor. Explicit overlay history is linked past confirmed Merkle anchors. Updates with missing pin ancestry remain indeterminate instead of selecting an unrelated continuation. Every retained token spend proves control through its unlocking script, including confirmed updates and hash rotation; funding paths do not establish token lineage. BRC-177 anchors fund both the protected action and an economic reclaim. Protected actions pay the bounded reclaim allowance surplus as fee and produce no automatically generated wallet change; ordinary change planning and its positive output cap remain unchanged. BEEF request data and schema-declared storage response bytes use the existing negotiated compact binary JSON encoding. Legacy peers retain numeric-array JSON, existing authentication and payload bounds, and byte-for-byte transaction/proof content.",
"migration": "No public API, wire, database, or consumer migration is required. Pending no-send actions and retryable failures retain the same originator-bound abort behavior; positively queued or broadcast actions no longer retain session ownership records. Upgrade the SDK to a release exposing completeBoundAction.outputAuthorizationVersion=1 alongside wallet-toolbox 2.14.6. SDK2 peers keep their existing strict behavior; they do not obtain this fee-bearing faucet fix. The main SDK3.1 candidate retains the separate SDK3 retirement migration; SDK2 hosts require a coordinated additive backport or that migration. Serialized or cross-package-instance result adapters discard local authority and fail closed. Signup interruption/retry persistence is unchanged; reconcile any previous faucet transaction before repeating a failed signup. No API or schema migration is required for pin continuity. Retire a support pin only after unpinned lookup independently returns the verified current token. Deploy overlay 2.6.4 plus overlay-topics 2.0.1 or an equivalent history decider for confirmed ancestry. Stored WAB pins remain lineage anchors; the client follows verified descendants without needing an administrative pin rewrite. No API, wire or database migration is required for the BRC-177 funding fix. A protected action can pay the difference between its delivery need and the reclaim floor as miner fee. Funding/reclaim fees remain the wallet owner's responsibility; upgrade the active storage implementation as well as client packages. No API, database or peer migration is required for compact BEEF transport. Upgrade clients and active storage to obtain both request and response savings; older peers retain ordinary JSON. Existing payload ceilings still apply."
"summary": "WalletPermissionsManager retires signed no-send ownership and reference aliases after createAction or signAction reports sending or unproven, including sendWith-only calls and successful members of an undelayed review error. Failed or unreported actions retain their originator binding for retry or abort. Cleanup visits only the retired transaction's references and preserves aliases reused by newer actions. Adds an SDK3 peer alternative while retaining the existing SDK2.8.0 floor. Public Argon2id declarations reference the typed hash-wasm package while retaining the same generic binary/string contract and emitted runtime bytes. Fixes WAB faucet redemption for an empty wallet when storage adds a service charge. Local signer decisions for independently validated commission and derived change are retained privately through the permissions wrapper and bound by the SDK before signing. UMP pins anchor verified token-update lineage: password and token updates supersede their pinned predecessor, while unrelated historical continuations cannot override the anchor. Explicit overlay history is linked past confirmed Merkle anchors. Updates with missing pin ancestry remain indeterminate instead of selecting an unrelated continuation. Every retained token spend proves control through its unlocking script, including confirmed updates and hash rotation; funding paths do not establish token lineage. BRC-177 anchors fund both the protected action and an economic reclaim. Protected actions pay the bounded reclaim allowance surplus as fee and produce no automatically generated wallet change; ordinary change planning and its positive output cap remain unchanged. BEEF request data and schema-declared storage response bytes use the existing negotiated compact binary JSON encoding. Legacy peers retain numeric-array JSON, existing authentication and payload bounds, and byte-for-byte transaction/proof content. IndexedDB treats empty certificate certifier/type, transaction status and output-tag ID arrays as unrestricted optional filters, matching Knex. Nonempty filters, partial predicates and user ownership remain enforced.",
"migration": "No public API, wire, database, or consumer migration is required. Pending no-send actions and retryable failures retain the same originator-bound abort behavior; positively queued or broadcast actions no longer retain session ownership records. Upgrade the SDK to a release exposing completeBoundAction.outputAuthorizationVersion=1 alongside wallet-toolbox 2.14.6. SDK2 peers keep their existing strict behavior; they do not obtain this fee-bearing faucet fix. The main SDK3.1 candidate retains the separate SDK3 retirement migration; SDK2 hosts require a coordinated additive backport or that migration. Serialized or cross-package-instance result adapters discard local authority and fail closed. Signup interruption/retry persistence is unchanged; reconcile any previous faucet transaction before repeating a failed signup. No API or schema migration is required for pin continuity. Retire a support pin only after unpinned lookup independently returns the verified current token. Deploy overlay 2.6.4 plus overlay-topics 2.0.1 or an equivalent history decider for confirmed ancestry. Stored WAB pins remain lineage anchors; the client follows verified descendants without needing an administrative pin rewrite. No API, wire or database migration is required for the BRC-177 funding fix. A protected action can pay the difference between its delivery need and the reclaim floor as miner fee. Funding/reclaim fees remain the wallet owner's responsibility; upgrade the active storage implementation as well as client packages. No API, database or peer migration is required for compact BEEF transport. Upgrade clients and active storage to obtain both request and response savings; older peers retain ordinary JSON. Existing payload ceilings still apply. No API, wire or schema migration is required for the IndexedDB filter fix. Empty optional arrays now behave like omitted filters. Applications still receive only records allowed by their user and partial predicates; nonempty arrays retain their restrictions."
},
{
"name": "@bsv/wallet-toolbox-client",
"publishedVersion": "2.14.5",
"releaseType": "patch",
"summary": "WalletPermissionsManager retires signed no-send ownership and reference aliases after createAction or signAction reports sending or unproven, including sendWith-only calls and successful members of an undelayed review error. Failed or unreported actions retain their originator binding for retry or abort. Cleanup visits only the retired transaction's references and preserves aliases reused by newer actions. Fixes WAB faucet redemption for an empty wallet when storage adds a service charge. Local signer decisions for independently validated commission and derived change are retained privately through the permissions wrapper and bound by the SDK before signing. UMP pins anchor verified token-update lineage: password and token updates supersede their pinned predecessor, while unrelated historical continuations cannot override the anchor. Explicit overlay history is linked past confirmed Merkle anchors. Updates with missing pin ancestry remain indeterminate instead of selecting an unrelated continuation. Every retained token spend proves control through its unlocking script, including confirmed updates and hash rotation; funding paths do not establish token lineage. BRC-177 anchors fund both the protected action and an economic reclaim. Protected actions pay the bounded reclaim allowance surplus as fee and produce no automatically generated wallet change; ordinary change planning and its positive output cap remain unchanged. BEEF request data and schema-declared storage response bytes use the existing negotiated compact binary JSON encoding. Legacy peers retain numeric-array JSON, existing authentication and payload bounds, and byte-for-byte transaction/proof content.",
"migration": "No public API, wire, database, or consumer migration is required. Pending no-send actions and retryable failures retain the same originator-bound abort behavior; positively queued or broadcast actions no longer retain session ownership records. Upgrade the SDK to a release exposing completeBoundAction.outputAuthorizationVersion=1 alongside wallet-toolbox 2.14.6. SDK2 peers keep their existing strict behavior; they do not obtain this fee-bearing faucet fix. The main SDK3.1 candidate retains the separate SDK3 retirement migration; SDK2 hosts require a coordinated additive backport or that migration. Serialized or cross-package-instance result adapters discard local authority and fail closed. Signup interruption/retry persistence is unchanged; reconcile any previous faucet transaction before repeating a failed signup. No API or schema migration is required for pin continuity. Retire a support pin only after unpinned lookup independently returns the verified current token. Deploy overlay 2.6.4 plus overlay-topics 2.0.1 or an equivalent history decider for confirmed ancestry. Stored WAB pins remain lineage anchors; the client follows verified descendants without needing an administrative pin rewrite. No API, wire or database migration is required for the BRC-177 funding fix. A protected action can pay the difference between its delivery need and the reclaim floor as miner fee. Funding/reclaim fees remain the wallet owner's responsibility; upgrade the active storage implementation as well as client packages. No API, database or peer migration is required for compact BEEF transport. Upgrade clients and active storage to obtain both request and response savings; older peers retain ordinary JSON. Existing payload ceilings still apply."
"summary": "WalletPermissionsManager retires signed no-send ownership and reference aliases after createAction or signAction reports sending or unproven, including sendWith-only calls and successful members of an undelayed review error. Failed or unreported actions retain their originator binding for retry or abort. Cleanup visits only the retired transaction's references and preserves aliases reused by newer actions. Fixes WAB faucet redemption for an empty wallet when storage adds a service charge. Local signer decisions for independently validated commission and derived change are retained privately through the permissions wrapper and bound by the SDK before signing. UMP pins anchor verified token-update lineage: password and token updates supersede their pinned predecessor, while unrelated historical continuations cannot override the anchor. Explicit overlay history is linked past confirmed Merkle anchors. Updates with missing pin ancestry remain indeterminate instead of selecting an unrelated continuation. Every retained token spend proves control through its unlocking script, including confirmed updates and hash rotation; funding paths do not establish token lineage. BRC-177 anchors fund both the protected action and an economic reclaim. Protected actions pay the bounded reclaim allowance surplus as fee and produce no automatically generated wallet change; ordinary change planning and its positive output cap remain unchanged. BEEF request data and schema-declared storage response bytes use the existing negotiated compact binary JSON encoding. Legacy peers retain numeric-array JSON, existing authentication and payload bounds, and byte-for-byte transaction/proof content. IndexedDB treats empty certificate certifier/type, transaction status and output-tag ID arrays as unrestricted optional filters, matching Knex. Nonempty filters, partial predicates and user ownership remain enforced.",
"migration": "No public API, wire, database, or consumer migration is required. Pending no-send actions and retryable failures retain the same originator-bound abort behavior; positively queued or broadcast actions no longer retain session ownership records. Upgrade the SDK to a release exposing completeBoundAction.outputAuthorizationVersion=1 alongside wallet-toolbox 2.14.6. SDK2 peers keep their existing strict behavior; they do not obtain this fee-bearing faucet fix. The main SDK3.1 candidate retains the separate SDK3 retirement migration; SDK2 hosts require a coordinated additive backport or that migration. Serialized or cross-package-instance result adapters discard local authority and fail closed. Signup interruption/retry persistence is unchanged; reconcile any previous faucet transaction before repeating a failed signup. No API or schema migration is required for pin continuity. Retire a support pin only after unpinned lookup independently returns the verified current token. Deploy overlay 2.6.4 plus overlay-topics 2.0.1 or an equivalent history decider for confirmed ancestry. Stored WAB pins remain lineage anchors; the client follows verified descendants without needing an administrative pin rewrite. No API, wire or database migration is required for the BRC-177 funding fix. A protected action can pay the difference between its delivery need and the reclaim floor as miner fee. Funding/reclaim fees remain the wallet owner's responsibility; upgrade the active storage implementation as well as client packages. No API, database or peer migration is required for compact BEEF transport. Upgrade clients and active storage to obtain both request and response savings; older peers retain ordinary JSON. Existing payload ceilings still apply. No API, wire or schema migration is required for the IndexedDB filter fix. Empty optional arrays now behave like omitted filters. Applications still receive only records allowed by their user and partial predicates; nonempty arrays retain their restrictions."
},
{
"name": "@bsv/wallet-toolbox-mobile",
Expand Down
4 changes: 4 additions & 0 deletions packages/wallet/wallet-toolbox/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ attention to changes that materially alter behavior or extend functionality.

## wallet-toolbox 2.14.7

- IndexedDB empty certificate certifier/type, transaction status and output-tag
ID arrays mean no optional filter, matching Knex. Nonempty arrays, partial
predicates and user ownership remain enforced; no schema migration is required.

- BEEF requests and schema-declared storage response bytes use the existing
negotiated compact binary JSON codec. Legacy peers retain numeric-array
JSON and identical transaction/proof bytes. Existing authentication and
Expand Down
8 changes: 4 additions & 4 deletions packages/wallet/wallet-toolbox/src/storage/StorageIdb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -658,7 +658,7 @@ export class StorageIdb extends StorageProvider implements WalletStorageProvider
args.paged?.offset ?? 0,
args.paged?.limit,
async r => {
if (args.tagIds != null && !args.tagIds.includes(r.outputTagId)) return false
if (args.tagIds != null && args.tagIds.length > 0 && !args.tagIds.includes(r.outputTagId)) return false
if (!matchesOutputTagMapPartial(r, args.partial)) return false
if (userId !== undefined) {
const tagsForUser = await this.countOutputTags({
Expand Down Expand Up @@ -1614,8 +1614,8 @@ export class StorageIdb extends StorageProvider implements WalletStorageProvider
args.paged?.offset ?? 0,
args.paged?.limit,
r => {
if (args.certifiers != null && !args.certifiers.includes(r.certifier)) return false
if (args.types != null && !args.types.includes(r.type)) return false
if (args.certifiers != null && args.certifiers.length > 0 && !args.certifiers.includes(r.certifier)) return false
if (args.types != null && args.types.length > 0 && !args.types.includes(r.type)) return false
return matchesCertificatePartial(r, args.partial)
},
filtered
Expand Down Expand Up @@ -2014,7 +2014,7 @@ export class StorageIdb extends StorageProvider implements WalletStorageProvider
async r => {
if (args.from != null && r.created_at.getTime() < args.from.getTime()) return false
if (args.to != null && r.created_at.getTime() >= args.to.getTime()) return false
if (args.status != null && !args.status.includes(r.status)) return false
if (args.status != null && args.status.length > 0 && !args.status.includes(r.status)) return false
if (!matchesTransactionPartial(r, args.partial)) return false
if (
labelIds != null &&
Expand Down
Loading
Loading