Skip to the content
nullroute
Browse the docs

The vector files

Each file has the same header:

Field Meaning
format, version signer-profile-vectors, 1.
profile The profile version the file was written against.
requirements The requirement ids the file covers.
operations The adapter functions it calls.
description What the file checks, in a sentence or two.
contexts Wallets referred to by cases, where needed.
cases The cases.

Each case has an id, an operation, the requirements it checks, a level, a description, an input and an expected value, and sources, which says where each expected value came from. Review cases also carry bitcoinCore: what Bitcoin Core said about the same PSBT (its computed fee, its sighash names, the error it gave, its mempool's replaceability verdict), recorded for a reader to compare, not used by the runner.

Amounts are decimal strings of satoshis. PSBTs are base64. Keys, values and digests are lowercase hex. Text is UTF-8.

Where the expected values come from

No expected value was produced by running nullroute. Each comes from a source that shares no code with it.

File Cases Requirements Source of the expected values
dice-to-entropy.json 17 SP-ENT-1 to 4, 7, 10, SP-HW-9 Digest from printf '%s' ROLLS | shasum -a 256 and sha256sum. Mnemonic from the BIP-39 algorithm and the English list in bitcoin/bips, written for the generator and checked against the 24 Trezor vectors first. Seed from PBKDF2-HMAC-SHA512 as BIP-39 defines it. Refusals from the requirement text.
dice-accounting.json 25 SP-ENT-5 The largest k with 2^k <= 6^n, by exact integer comparison.
review-fee-and-amounts.json 7 SP-REV-2, 4, 13 PSBTs built by Bitcoin Core 31.1 on regtest. Fee from decodepsbt. Change from the path getaddressinfo reports. Addresses from the scriptPubKey with the BIP-173/350 reference encoder. A negative fee rejected by testmempoolaccept.
review-input-amounts.json 7 SP-REV-3 Core PSBTs with UTXO records removed or altered. Verdicts from the requirement text, BIP-174 and BIP-341. Core's decodepsbt error for the mismatched TXID is recorded.
review-change.json 9 SP-REV-6, 7, 14 Core PSBTs. Change and path from getaddressinfo. The wallet key is the published BIP-84 and BIP-86 test key; the generator stops unless Core derives the addresses those BIPs print. Derivation claims use the public keys those BIPs print.
review-sighash.json 13 SP-REV-8, 23 Core PSBTs with PSBT_IN_SIGHASH_TYPE set. Meaning from BIP-143 and BIP-341; Core's names recorded.
review-timelocks.json 9 SP-REV-9 Core PSBTs. Height or time from LOCKTIME_THRESHOLD in Bitcoin Core's source. Not enforced from IsFinalTx in Core's source, and from Core accepting that transaction into its mempool far below its locktime. Replaceability from BIP-125, and from Core's own mempool (getmempoolentry) for every case it could broadcast.
review-unknown-fields.json 2 SP-REV-11 A Core PSBT with pairs added. Core's decodepsbt lists them as unknown or proprietary. Preservation from BIP-174.
sign-override.json 3 SP-REV-22 Core PSBTs blocked by SIGHASH_NONE, by an unconfirmed segwit v0 amount, and by owning no input. Each is signed without an override, with one, and without one again; the expected verdicts are the requirement text.
review-ownership.json 5 SP-REV-24, 25 Core PSBTs from a second wallet (the BIP-32 test vector 1 key), with derivation records naming the signer's fingerprint. Verdicts from the requirement text.
manifest-root.json 2 SP-ATT-2 LC_ALL=C sort -z | xargs -0 sha256sum over the files, and sha256sum of the result. The forbidden roots are from LC_ALL=en_US.UTF-8 sort and from ICU's en-US collation.
bbqr-psbt.json 12 SP-TX-2 to 6 Frames from Coinkite's reference splitter (coinkite/BBQr, python/bbqr), and a real Coldcard camera scan from that repository's test data. Decoded payloads cross-checked with Python's base32 and zlib.
ur-psbt.json 5 SP-TX-7 Frames written by SeedSigner's own UR encoder (SeedSigner/seedsigner, src/seedsigner/helpers/ur2) around PSBT bodies from selfcustody/urtypes, and read back by SeedSigner's own decoder. Optional: only for a signer that implements UR.

Every external document was fetched at a pinned commit: bitcoin/bips at 7c7cb232, coinkite/BBQr at 8dc7ef07, sipa/bech32 at 7a7d7ab1, SeedSigner/seedsigner at 088b144e, and selfcustody/urtypes at 7fb280ea.

Levels

A case's level is MUST or SHOULD. Some MUST cases also carry a SHOULD part, written as { "should": ... } in expected (a high fee SHOULD warn; an output the transaction falsely claimed SHOULD be reported as claimed). A missed SHOULD is printed as an advisory and never fails a run.

Rendered from conformance/README.md, the same bytes that ship with the code. SHA-256 d0c681a5e7b7f55bcc96ecd33bb0ab07dd944b4fe2bb50f640ee79a85db3917e