A Litecoin wallet can sign a payment without sending it — experiment v1.0.0

ACTUAL RUN
20 October 2026, 22:26:47–22:26:53 UTC; 21 October 00:26 Europe/Warsaw.
Pinned Litecoin Core 0.21.5.8, one fresh regtest node, two fresh wallet roles.
Peer networking was disabled and RPC bound only to loopback. The test mined
102 fixture blocks to obtain two mature coinbase outputs; the payment and
separate self-spend control each required one further block (final height 104).
The own process exited 0 and the resolved fresh directory was removed, as
recorded. 43 experiment assertions passed. All coins are valueless regtest coins.

WHAT WAS OBSERVED
Preparing an unsigned PSBT, processing it with sign=true, extracting its raw
transaction and testing local mempool acceptance left the selected input
unspent, the sender's recorded balances unchanged, the mempool empty and the
recipient receipt zero. In this Core release walletprocesspsbt also finalizes
the single input while signing; the experiment does not invent a separate
partial-signature-only stage. finalizepsbt extraction is still separate.

Explicit sendrawtransaction inserted the approved transaction into this local
node's mempool. The recipient then saw 0.25 LTC with zero confirmations; one
fixture block confirmed it. No peer received it because there were no peers.
The approved payment had one P2WPKH input, two outputs, 141 vB and 1000 litoshi fee.

Six policy calls:
P01 exact approved candidate before submission: allowed=true.
P02 different recipient with original witness/signature: allowed=false.
P03 recipient +1 litoshi/change −1, same fee and original signature: allowed=false.
P04 separately held signed candidate before its input was spent: allowed=true.
P05 alternative controlled self-spend of that input: allowed=true, then submitted
    and confirmed. It paid the sender, not the article's recipient.
P06 identical held candidate after that confirmed input spend: allowed=false,
    reject-reason=missing-inputs. Explicit submission also failed, although
    finalizepsbt still returned complete=true for its signatures.

OFFLINE VERIFIER
Python 3.10+ standard library only; no node, wallet, network, keys or dependencies:
  python verify.py.txt
It first checks a strict curated SHA256 manifest. It parses ordinary transparent
transactions and PSBT maps, derives txid/wtxid/weight/vsize and fees from bytes,
and verifies the five public candidates' compressed-key secp256k1 ECDSA
signatures over witness-v0 SIGHASH_ALL digests. Original/held/control signatures
verify; changed-output signatures do not. It compares the recorded policy
outcomes, stage CSV/JSON, exact held bytes before/after, RPC order and cleanup.
It checks former cleanup RECORDS, not the remote process/filesystem now.
The codec and crypto are educational, unaudited and deliberately fixture-bounded.
This is not a consensus validator or a tool for authorizing real transactions.
SHA consistency is not an authenticity certificate or security audit.

FRESH REPRODUCTION
Disposable Linux environment only, with the exact pinned binaries:
  python reproduce.py.txt /path/litecoind /path/litecoin-cli new-output-directory
fixture-codec.py.txt must be adjacent. Output directory must not already exist.
No existing datadir, wallet, seed, configuration or RPC credential is accepted.
The program creates its own temporary data directory and ephemeral loopback
RPC port, disables peers/listening/discovery, uses 32 MiB cache and one worker.
A 75-second work alarm allows controlled shutdown; the private execution wrapper
adds an 85-second outer timeout plus a 5-second kill grace. Fresh addresses,
funding hashes, signatures, timestamps and occasionally exact signature size
may differ. The published verifier checks the frozen original evidence, not
byte identity of a later experiment.

BINARY SHA256
litecoind 63fb440cdc5e2e7d46144b8e3a47dab4725fa9c056a77b8b12b11854504f4838
litecoin-cli d185011cc0dbb5d2dd20611e9dc060dbb0a5d9be31a03f57da5dbd3dad4c3769
Pinned bytes identify the tested runtime, not a reproducible-build claim.

SCOPE AND PRIVACY
One node/two wallet RPC roles is a logical workflow demonstration, NOT a
physically air-gapped setup, hardware-wallet or USB/QR transfer security test.
No mainnet payment, external service credit, latency, cancellation, replacement,
multisig, MWEB, custom sighash mode or general wallet compatibility was tested.
The changed-output result applies to these default ALL signatures. Other
signature modes can authorize different commitments and were not tested.
A valid signature does not prove the referenced output remains unspent.

The package has generated public regtest addresses, public raw transactions,
signatures, transaction-history/UTXO metadata and BIP32 public derivation paths
and fingerprints from fresh wallets. It has no seed, private key, wallet file,
private descriptor, authentication cookie or real user's records. Public PSBT
metadata can still be sensitive when it belongs to a real wallet. Signed raw
transactions are spending authorizations; holders may submit them if valid.
Do not upload real PSBTs or signed files to public support posts or checkers.
Never fund any fixture address. A PSBT is not a substitute for a wallet backup.

FILES
results.json: original 43 assertions, eight snapshots, PSBTs and six policy cases.
candidates.json: five public raw candidates and exact input/output arithmetic.
stages.csv / cases.csv: compact downloadable views; mempool counts are derived
directly from the recorded snapshot arrays, not separate observations.
rpc-trace.json / rpc-help.json / cleanup.json: actual operations/help and records.
reproduce.py.txt / fixture-codec.py.txt / verify.py.txt: public experiment/code.
payment-review-checklist.txt: blank useful authorization/submission checklist.
sources.json / psbt-howto.md.txt / source-excerpts.txt: primary source provenance;
exact versioned excerpts omit unrelated examples, especially private fixtures.
LICENSE.txt retains the official tagged Core MIT license and source copyrights.
SHA256SUMS.txt: exact curated integrity hashes. Optional publisher artwork file:
artwork-provenance.json, which must also be hashed when included.
Private remote wrapper, full source scratch copies and failed setup attempt
are deliberately outside the curated package. The failed setup was cleaned;
only the completed 43-assertion run supplies the article's measurements.
