- Wraps payjoin 1.3.0
- Add
classify_txto every receiver state that holds a fallback transaction
and is advancing the Payjoin protocol, fromMaybeInputsOwnedthrough
Monitor. Pass every consensus-encoded transaction the wallet receives to
classify_txon each open session, or toclassify_receiver_txwith a
session in any state. It returns aResolutionwhoseresolved_byis a
ResolvedByofPayjoin,FallbackorUnrecognized, or none for a
transaction that spends none of the sender's original inputs, and never
reportsPayjoinbeforePayjoinProposal. - Add
close_sessionto the same states, andclose_receiver_sessionfor a
session in any state. Each takes aResolutionand returns a
CloseTransitionthat ends the session once the wallet decides the
transaction has enough confirmations. Saving it fails with a transient
error, without persisting, if the resolution was classified from another
session, or, forclose_receiver_session, if the session state cannot be
closed via resolution. Closing classifies the transaction again against
the session's current state. - Remove
Monitor.check_for_transaction, with itsTransactionFinder
callback andMonitorTransition. It closed the session on first sight of
a predicted txid and never saw a spend that is neither the proposal nor
the fallback. Useclassify_txandclose_sessioninstead. - Remove
proposal_txid_is_stablefrom every receiver state. It checked
only the sender's inputs, so a legacy or P2SH-wrapped receiver input could
change the txid even when it returned true. Useclassify_txinstead. - To migrate from
Monitor.check_for_transaction:close_sessionon aMonitorrecordsPayjoinProposalSentwhichever
transaction resolved the session, wherecheck_for_transactionrecorded
Success(txid)orFallbackBroadcasted. Storeresolved_byand the
txid yourself if the app needs them.classify_txalso classifies unconfirmed transactions. Call
close_sessiononly once the transaction reaches the wallet's
confirmation depth.- Non-SegWit senders no longer need special handling.
- A
Resolutioncan't be persisted, so classify the transaction again
after a restart. classify_txraisesTransactionParseErrorfor bytes that don't decode
as a transaction.
- Deprecate
MaybeInputsOwned.extract_tx_to_schedule_broadcast. Cancel the
session when the payjoin fails and broadcast thefallback_txof the
resultingReceiverPendingFallbackinstead. - Replace
InputPairError::InvalidTransaction(String)with
InputPairError::TransactionDecode(TransactionParseError), the same error
classify_txreturns for bytes that do not decode. Bindings that match on
the old variant need to match the new one and read the nested
TransactionParseError. - Dart: the package now ships the release's prebuilt native libraries,
and the build hook uses them instead of compiling Rust, so apps no
longer need a Rust toolchain or network access at build time. Set
build: sourceunderhooks: user_defines: payjoin:in your app's
pubspec.yamlto keep compiling it. - Python: require Python 3.11+ and replace httpx with httpx2. Callers catching
HTTP errors fromfetch_ohttp_keysshould usehttpx2.HTTPErrorinstead of
httpx.HTTPError. - Python: the Linux wheel's library now needs at most glibc 2.17, and
the wheel is taggedmanylinux_2_17. The macOS wheel now supports
macOS 10.15 and later, down from 13. - The GitHub release now attaches every native library as
payjoin_ffi-<version>-<target>.<ext>, listed inSHA256SUMSand
attested.VERIFYING.mdexplains how to check one or rebuild it.