Recorded fixture result
- Selected inputs
- 1
- Outputs
- 4
- Estimated signed size
- 203 vB
- Fee
- 406 sats
| Entry | Amount (sats) |
|---|---|
| Input total | 10000 |
| recipient (p2wpkh) | 2000 |
| recipient (p2wpkh) | 2000 |
| recipient (p2wpkh) | 2000 |
| change (p2wpkh) | 3594 |
| Fee | 406 |
Native P2WPKH: 73-byte signature including sighash and 33-byte compressed public key per input. Conservative estimate, not a signed transaction. Requested fee rate: 2 sat/vB.
Signed fixture measurement: 203 vB, 810 weight units. Actual fee rate: 2.000 sat/vB. The build signed the synthetic transaction and verified its ECDSA signatures before measuring it. This is not a chain-acceptance result.
Signed fixture PSBT · Final raw transaction
Independent Bitcoin Core check
Verified 2026-09-11T23:08:08.502Z with Bitcoin Core daemon version v29.0.0 on a fresh, isolated regtest chain. Core signed and finalized a separate funded Workshop split, then accepted it in testmempoolaccept. The Workshop spend was not broadcast. This is local regtest evidence, not a confirmed Signet transaction.
- Core input
- 10000 sats
- Core fee
- 406 sats
- Actual signed size
- 203 vB
- Core policy result
- Accepted
The checks also compare PSBT and raw decoding with Core, preserve an unknown fee when UTXO metadata is absent, and confirm that an overspend fails with bad-txns-in-belowout. This does not establish acceptance for every fixture or script type.
Verification results and software hashes · Exact PSBTs, funding transaction, and Core responses
The question
A split is not simply input value divided by recipient count. A transaction also needs a fee, and a fixed payment amount can leave change. This experiment constructs three equally sized native SegWit recipients from one synthetic input and accounts for the remainder explicitly.
What the fixture measures
The PSBT contains the unsigned transaction and a witness UTXO record for each input. We serialize the transaction with bitcoinjs-lib. The signed-size estimate adds a conservative 73-byte signature, including its sighash byte, and a 33-byte compressed public key to every P2WPKH input. Marker, flag, and CompactSize overhead are included by serialization rather than a fixed budget coefficient.
Where the change goes
Input value equals recipient value plus change plus fee. The change output belongs to the sending wallet in a real transaction; it is not an additional fee. Adding that output also increases the transaction size. The builder first estimates the transaction with change, then verifies that the remaining output meets the assumed 294-sat P2WPKH dust threshold.
The boundary case
When the remaining value cannot pay for a change output and leave it above the policy threshold, the builder omits change and explicitly reports the remainder added to the fee. It rejects recipients that exceed available input value or fall below the selected dust policy. Dust is a relay-policy assumption, not a universal consensus minimum.
Limits of this result
These outpoints were invented for a deterministic offline test. The PSBT is real serialized data, but it has no spendable backing on Signet. The estimated signed size is not a measured live fee and the result is not a mempool-acceptance test. Never fund the example addresses.
Reproduction artifact
The full collection includes the options, transactions, and expected inspection output. The public source bundle contains the build script and automated checks used to regenerate it.
Download fixture JSON Open this example
Inspect the PSBT bytes
cHNidP8BAK8CAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAD9////BNAHAAAAAAAAFgAUFBQUFBQUFBQUFBQUFBQUFBQUFBTQBwAAAAAAABYAFBUVFRUVFRUVFRUVFRUVFRUVFRUV0AcAAAAAAAAWABQWFhYWFhYWFhYWFhYWFhYWFhYWFgoOAAAAAAAAFgAUY2NjY2NjY2NjY2NjY2NjY2NjY2MAAAAAAAEBHxAnAAAAAAAAFgAUdR526BmRltRUlBxF0bOjI/FDO9YAAAAAAA==
Specifications and implementation
BIP 174: PSBT roles and format; BIP 141: transaction weight; Bitcoin Core v30.0 dust policy; bitcoinjs-lib implementation.