Experiment reports / Offline fixture

One input, three recipients, and the change that remains

Account for every satoshi in a native SegWit split, including the fee and a separate change output.

Published by HabibitcoinFixture generated: 2026-09-11T22:33:24ZMethod: automated byte and node checksNative SegWit / PSBT v0

Recorded fixture result

Selected inputs
1
Outputs
4
Estimated signed size
203 vB
Fee
406 sats
EntryAmount (sats)
Input total10000
recipient (p2wpkh)2000
recipient (p2wpkh)2000
recipient (p2wpkh)2000
change (p2wpkh)3594
Fee406

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.