Shrike 2.5.5-blake2b.16 - report the protection a transaction actually has
Shrike signing with the unified opt-in signature hash as Bitcoin Knots v29.4.1.knots20260508 defines it, on upstream Sparrow 2.5.5.
Everything in 2.5.5-blake2b.15, plus the correctness work below. This one is worth taking: four of the fixes are cases where the wallet could report replay protection a transaction did not have.
The transaction view could say protected when it was not
The status was computed when the transaction tab opened, before anything had signed, and never recomputed. Signing happens in that same tab. Where a quorum of cosigners cannot opt in, each is handed the base hash type, so a transaction that declared the opt-in can finish carrying none of it while the screen it is broadcast from still reads as replay protected. The status is now recomputed wherever signatures land.
A mixed witness could not be combined
One marked signer is enough, and an unmarked cosigner is handed the base type so it can sign alongside. Verification computed a single digest from the hash type the input declared and checked every signature against it, so the resulting witness was rejected outright. Each signature is now checked against the type it names, bounded to the types the input actually asks for.
Combining also overwrote the declared hash type with whatever came back. A reply declaring the base type left every signer that had not signed yet being asked for the legacy digest. Whether to opt in is this wallet's decision, taken from the chain it follows, and it now survives a combine in both directions: a cosigner can change the output type but not the opt-in.
Header validation required the proof of work the chain uses
A header decides for itself which proof of work its hash is taken with. Nothing checked that against the height, so a run of pre-fork headers claiming the eased target the activation height allows would satisfy the difficulty and proof of work rules while being mined with the old algorithm, at a target chosen for a network that has none of that hashrate. The header version is now required to match the height, in both directions.
Reporting
A conditional opt-in in a partially marked multisig read identically to a guarantee. It holds only if a signer that can opt in is among those that sign, and it now says so.
On an Electrum connection the multisig caveat was dropped entirely, because no Electrum server reports an activation height and only one caveat could be the headline. Both are now reported.
A server announcing a pre-fork tip at or past the activation height is named as contradicting the schedule rather than reported as the chain not having activated. Nothing authenticates that tip, so a server could otherwise hold the wallet at "not activated" indefinitely with every transaction it signed replayable.
Watch only keystores and signing
Watch only keystores can be marked, but the marking dialog listed hardware only and the send screen offered a remedy whose dialog opened empty. The private key sweep never opted in, the only signing path that did not.
Applying an unrelated change in wallet settings could write back a stale mark and silently unmark a keystore that had just been marked from the send screen.
Verification
998 unit tests. Nine end to end suites against a Bitcoin Knots v29.4.1.knots20260508 node, covering the opt-in before and after activation, a mixed multisig witness, a marked watch only wallet signed externally, and the Anyone Can Pay lift. Header validation is checked against the real mainnet chain across its activation at 961640 and against 173 testnet4 headers across its own at 150308, anchored to values this project did not produce. The fixes above are mutation checked: reverting each one fails specific tests.
Verifying this release
gpg --import privkeyio-signing-key.asc
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
Signed by Kyle Santiago kyle@privkey.io, key A47D99B6DB0D715D40C59A2023AE8A8EA7E24E38. The macOS builds are not notarized and the Windows installer is not Authenticode signed. Reproducible: see reproducible.md.
No warranty
This is unofficial, unaudited software provided as is, with no warranty and no liability, under the same Apache 2.0 license it inherits. It is not a Sparrow release and is neither affiliated with nor supported by the Sparrow project. Using it is entirely at your own risk, and you alone bear any loss of funds.