Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions conformance/META.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@
},
"stats": {
"total_files": 77,
"total_vectors": 6699,
"last_updated": "2026-09-23"
"total_vectors": 6700,
"last_updated": "2026-09-24"
},
"regression_index": {
"beef-v2-txid-panic": "go-sdk#306",
Expand Down
12 changes: 6 additions & 6 deletions conformance/PARITY_MATRIX.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{
"schema_version": "1.0",
"generated_at": "2026-09-23",
"generated_at": "2026-09-24",
"source": "ts-stack conformance corpus",
"description": "Machine-readable parity status for cross-language SDK implementations (Go, Rust, Python). Use this to track and drive conformance.",
"summary": {
"total_files": 77,
"total_vectors": 6699,
"total_vectors": 6700,
"fully_required_files": 58,
"files_with_intended": 17,
"files_with_mixed_status": 15,
"vectors_by_status": {
"required": 6495,
"required": 6496,
"intended": 204,
"skipped": 7
},
Expand All @@ -20,7 +20,7 @@
"historical_regression": 36,
"partial_ts_behavioral_difference": 5116,
"intended_parity_work": 24,
"wallet_stateful_harness_required": 190
"wallet_stateful_harness_required": 191
}
},
"files": [
Expand Down Expand Up @@ -793,10 +793,10 @@
{
"path": "wallet/brc100/listactions.json",
"id": "wallet.brc100.listactions",
"total_vectors": 16,
"total_vectors": 17,
"file_level_parity": "required",
"effective_status": "mixed",
"required_count": 15,
"required_count": 16,
"intended_count": 1,
"skipped_count": 0,
"reason_category": "wallet_stateful_harness_required",
Expand Down
34 changes: 32 additions & 2 deletions conformance/runner/reports/report.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"timestamp": "2026-09-22T04:21:47.930Z",
"totalVectors": 6694,
"timestamp": "2026-09-24T05:41:55.330Z",
"totalVectors": 6700,
"totalFiles": 77,
"parseErrors": 0,
"suites": [
Expand Down Expand Up @@ -86,6 +86,31 @@
"name": "auth.brc31-handshake.16",
"pass": true,
"error": null
},
{
"name": "auth.brc31-handshake.17",
"pass": true,
"error": null
},
{
"name": "auth.brc31-handshake.18",
"pass": true,
"error": null
},
{
"name": "auth.brc31-handshake.19",
"pass": true,
"error": null
},
{
"name": "auth.brc31-handshake.20",
"pass": true,
"error": null
},
{
"name": "auth.brc31-handshake.21",
"pass": true,
"error": null
}
]
},
Expand Down Expand Up @@ -31491,6 +31516,11 @@
"name": "wallet.brc100.listactions.16",
"pass": true,
"error": null
},
{
"name": "wallet.brc100.listactions.17",
"pass": true,
"error": null
}
]
},
Expand Down
12 changes: 9 additions & 3 deletions conformance/runner/reports/results.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="bsv-conformance" tests="6694" failures="0" errors="0" skipped="0">
<testsuite name="auth/brc31-handshake" tests="16" failures="0" errors="0" skipped="0">
<testsuites name="bsv-conformance" tests="6700" failures="0" errors="0" skipped="0">
<testsuite name="auth/brc31-handshake" tests="21" failures="0" errors="0" skipped="0">
<testcase name="auth.brc31-handshake.1" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.2" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.3" classname="auth/brc31-handshake" time="0"/>
Expand All @@ -17,6 +17,11 @@
<testcase name="auth.brc31-handshake.14" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.15" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.16" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.17" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.18" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.19" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.20" classname="auth/brc31-handshake" time="0"/>
<testcase name="auth.brc31-handshake.21" classname="auth/brc31-handshake" time="0"/>
</testsuite>
<testsuite name="broadcast/arc-submit" tests="16" failures="0" errors="0" skipped="0">
<testcase name="broadcast.arcsubmit.1" classname="broadcast/arc-submit" time="0"/>
Expand Down Expand Up @@ -6343,7 +6348,7 @@
<testcase name="wallet.brc100.isauthenticated.4" classname="wallet/brc100/isauthenticated" time="0"/>
<testcase name="wallet.brc100.isauthenticated.5" classname="wallet/brc100/isauthenticated" time="0"/>
</testsuite>
<testsuite name="wallet/brc100/listactions" tests="16" failures="0" errors="0" skipped="0">
<testsuite name="wallet/brc100/listactions" tests="17" failures="0" errors="0" skipped="0">
<testcase name="wallet.brc100.listactions.1" classname="wallet/brc100/listactions" time="0"/>
<testcase name="wallet.brc100.listactions.2" classname="wallet/brc100/listactions" time="0"/>
<testcase name="wallet.brc100.listactions.3" classname="wallet/brc100/listactions" time="0"/>
Expand All @@ -6360,6 +6365,7 @@
<testcase name="wallet.brc100.listactions.14" classname="wallet/brc100/listactions" time="0"/>
<testcase name="wallet.brc100.listactions.15" classname="wallet/brc100/listactions" time="0"/>
<testcase name="wallet.brc100.listactions.16" classname="wallet/brc100/listactions" time="0"/>
<testcase name="wallet.brc100.listactions.17" classname="wallet/brc100/listactions" time="0"/>
</testsuite>
<testsuite name="wallet/brc100/listcertificates" tests="8" failures="0" errors="0" skipped="0">
<testcase name="wallet.brc100.listcertificates.1" classname="wallet/brc100/listcertificates" time="0"/>
Expand Down
19 changes: 18 additions & 1 deletion conformance/runner/ts/dispatchers/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,12 @@ import {
LookupQuestion,
LookupResolver,
PrivateKey,
ProtoWallet
ProtoWallet,
WalletClient,
WalletWireProcessor,
WalletWireTransceiver,
type ListActionsResult,
type ListActionsArgs
} from '@bsv/sdk'

// Wallet-toolbox imports via moduleNameMapper aliases (see jest.config.mjs).
Expand Down Expand Up @@ -695,6 +700,18 @@ async function dispatchListActions(
input: Record<string, unknown>,
expected: Record<string, unknown>
): Promise<void> {
if (input.walletResult !== undefined) {
const result = input.walletResult as ListActionsResult
const provider = await setupTestWallet()
provider.listActions = async () => result
const binary = new WalletWireTransceiver(new WalletWireProcessor(provider))
for (const substrate of [provider, binary]) {
const client = new WalletClient(substrate, 'conformance.example')
await expect(client.listActions(input.args as ListActionsArgs)).resolves.toEqual(expected)
}
return
}

// Vector 14 expects 1 action (pre-populated state) — demoted.
// All other vectors expect empty results from a fresh wallet.
const rootHex =
Expand Down
102 changes: 101 additions & 1 deletion conformance/vectors/wallet/brc100/listactions.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"brc": [
"BRC-100"
],
"version": "2.0.1",
"version": "2.0.2",
"reference_impl": "@bsv/sdk@2.0.14 + wallet-toolbox",
"parity_class": "required",
"vectors": [
Expand Down Expand Up @@ -367,6 +367,106 @@
"listActions",
"originator"
]
},
{
"id": "wallet.brc100.listactions.17",
"description": "Established wallet history preserves empty stored descriptions and unassigned baskets through validated JSON and binary boundaries",
"input": {
"args": {
"labels": [
"history"
],
"includeLabels": true,
"includeInputs": true,
"includeInputSourceLockingScripts": true,
"includeInputUnlockingScripts": true,
"includeOutputs": true,
"includeOutputLockingScripts": true
},
"walletResult": {
"totalActions": 1,
"actions": [
{
"txid": "abababababababababababababababababababababababababababababababab",
"satoshis": -1,
"status": "completed",
"isOutgoing": true,
"description": "",
"labels": [
"history"
],
"version": 1,
"lockTime": 0,
"inputs": [
{
"sourceOutpoint": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd.0",
"sourceSatoshis": 10,
"sourceLockingScript": "51",
"unlockingScript": "51",
"inputDescription": "",
"sequenceNumber": 4294967295
}
],
"outputs": [
{
"satoshis": 9,
"lockingScript": "51",
"spendable": true,
"tags": [],
"outputIndex": 0,
"outputDescription": "",
"basket": ""
}
]
}
]
}
},
"expected": {
"totalActions": 1,
"actions": [
{
"txid": "abababababababababababababababababababababababababababababababab",
"satoshis": -1,
"status": "completed",
"isOutgoing": true,
"description": "",
"labels": [
"history"
],
"version": 1,
"lockTime": 0,
"inputs": [
{
"sourceOutpoint": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd.0",
"sourceSatoshis": 10,
"sourceLockingScript": "51",
"unlockingScript": "51",
"inputDescription": "",
"sequenceNumber": 4294967295
}
],
"outputs": [
{
"satoshis": 9,
"lockingScript": "51",
"spendable": true,
"tags": [],
"outputIndex": 0,
"outputDescription": "",
"basket": ""
}
]
}
]
},
"tags": [
"brc-100",
"listActions",
"history-compatibility",
"wallet-result",
"non-empty"
]
}
]
}
16 changes: 13 additions & 3 deletions docs/packages/sdk/bsv-sdk.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ id: bsv-sdk
title: '@bsv/sdk'
kind: package
domain: sdk
version: '2.8.3'
version: '2.8.4'
npm: '@bsv/sdk'
last_updated: '2026-09-23'
last_verified: '2026-09-23'
last_updated: '2026-09-24'
last_verified: '2026-09-24'
review_cadence_days: 30
status: stable
tags: ['sdk', 'crypto', 'transactions']
Expand All @@ -15,6 +15,16 @@ repo: 'https://github.com/bsv-blockchain/ts-stack/tree/main/packages/sdk'

# @bsv/sdk

The 2.8.4 candidate also restores `listActions` responses containing empty
stored descriptions or unassigned basket names, including ordinary generated
change. The original strings are preserved; wallets need not fabricate display
metadata or rewrite history. Nonempty description limits, UTF-8 byte ceilings,
required scripts and labels, signed net values, nonnegative outputs and all
new-action request validation remain unchanged. Direct, HTTP JSON and binary
clients share the same regression coverage and a portable conformance vector.
No API, wire or account-data migration is required; only clients already bundling
the affected hardened SDK need a dependency update for this defect.

The 2.8.3 candidate repairs HTTP wallet discovery with an explicit BRC100
originator and binds the default JSON transport fetch receiver for browsers.
It restores signed `listActions` net amounts with the historical wire encoding,
Expand Down
Loading
Loading