Summary
Introduce monitoring typestates, replyable error handling, async
persistence, WASM target support, and other updates for more robust
session lifecycle management.
What's Changed
- Rename FFI error types to avoid naming conflicts by @spacebear21 in #830
- Serve a page on / for payjoin-directory by @zealsham in #824
- Shift cargo mutants inclusion files to be within the core module by @benalleng in #833
- Bump payjoin-ffi version to 0.24 by @arminsabouri in #842
- Bump payjoin-cli version to 0.2.0 by @arminsabouri in #838
- Remove to/from json methods on typestates by @arminsabouri in #835
- Bump payjoin-directory version to 0.0.3 by @arminsabouri in #840
- Bump payjoin-test-utils version to 0.0.1 by @arminsabouri in #841
- Add initial warnings against OHTTP request reuse by @0xZaddyy in #828
- Add bug issue templates (#758) by @thebrandonlucas in #784
- Fix ffi fmt and run
fmt --checkin CI by @arminsabouri in #832 - Remove python-bitcoinlib dependency for ffi by @benalleng in #849
- Session persister mutants by @benalleng in #791
- Helper method for optional parameters with docstring by @zealsham in #853
- Fix minor typo in README by @Mshehu5 in #858
- Setup Lint workflows for payjoin-ffi by @arminsabouri in #846
- Add
expected_weightfield toInputPairby @arturgontijo in #772 - Fragment parameter fixes by @nothingmuch in #852
- Update receiver typestate documentation for functions shared between v1 and v2 (and some InputPair documentation) by @mehmetefeumit in #769
- Prevent concurrent lockfile conflicts using flock and add backup by @0xZaddyy in #851
- Remove unnecessary payjoin-ffi dependencies by @spacebear21 in #866
- Remove redundant clones by @shinghim in #845
- Add mutant catch for incompatible mixed fragment by @benalleng in #871
- Fix
pjoshandling in v2 receiver and sender by @spacebear21 in #847 - Use tempfile for temporary e2e test directories by @spacebear21 in #868
- Clarify request construction methods for sender and receiver by @0xZaddyy in #814
- Derive weight from witness for p2wsh inputs by @arminsabouri in #862
- Uniffi dart by @spacebear21 in #829
- Remove commented out ffi reciever unit test by @arminsabouri in #887
- Enforce nightly rust toolchain by @spacebear21 in #885
- Separate out fee application into own typestate by @arminsabouri in #881
- Replaces 'flock' with mkdir locking by @Johnosezele in #886
- Add PartialEq/Eq to errors for easier comparison by @w3irdrobot in #768
- Add Feature Request, Good First Issue, and General Issue Templates by @thebrandonlucas in #891
- Use FnMut closures for receiver typestate checks by @benalleng in #883
- Abstract common sender functionality, not heirarchy by @DanGould in #884
- Remove mod/uni payjoin-ffi distinction by @DanGould in #899
- Cargo mutants version update by @benalleng in #882
- Remove unneeded PSBT fields when extracting request by @arminsabouri in #907
- Restore PSBT input field
witness_scriptby @arminsabouri in #908 - Restore original psbt output fields by @arminsabouri in #909
- Diff based cargo-mutants by @benalleng in #910
- e2e test concurrency fixes by @nothingmuch in #913
- refactor: introduce payjoin_directory::Service by @nothingmuch in #914
- Check ntxid after proposal finalization by @arminsabouri in #905
- Stale mutant exclusions by @benalleng in #918
- Remove NS1R from master by @arminsabouri in #923
- Add default directory to payjoin-cli by @zealsham in #874
- Reduce visibility of
JsonReply::newby @arminsabouri in #931 - Add coverage converting impl error to jsonreply by @arminsabouri in #936
- Remove
change_voutfromProvisionalProposalby @arminsabouri in #939 - Reduce FFI transition save boilerplate via macros by @arminsabouri in #944
- Add amount to recv session context by @arminsabouri in #920
- Decapsulate v1 provisional and payjoin typestate from v2 typestate by @arminsabouri in #938
- Rename
contexttosession_contextby @arminsabouri in #953 - Full mutant coverage by @benalleng in #928
- Replace bitcoincore-rpc with custom reqwest client by @bc1cindy in #945
- Reduce visibility of state transition types by @arminsabouri in #955
- Bump MSRV to 1.85.0 by @benalleng in #957
- Tests: optimize clone usage in integration tests by @bc1cindy in #960
- chore: Enhance JsonReply leakage test by @Prabhat1308 in #961
- Add Pull Request Review Template by @DanGould in #967
- Upgrade testcontainers by @spacebear21 in #970
- Optimize SessionPersister trait for better ownership semantics by @bc1cindy in #962
- Fix RPC error message regression in reqwest client by @bc1cindy in #971
- Decoupling v2 receiver typestates from v1 typestates by @arminsabouri in #951
- Add test cov for
WantsFeeRangeser/deserialization by @arminsabouri in #975 - Add dart github workflow by @spacebear21 in #876
- Add test to enforce v1 output substitution disabling in v2 by @Johnosezele in #963
- Add documentation builder to pre-commit hook recommendation by @mehmetefeumit in #820
- Remove redundant Vec clones in HPKE encrypt functions by @bc1cindy in #982
- Rename _danger-local-https to _manual-tls by @0xZaddyy in #763
- Enforce 1.85 toolchain in Dart/Python workflows by @spacebear21 in #986
- Optimize clone usage in receive module by @bc1cindy in #972
- Replace String clones with references in CLI RPC methods by @bc1cindy in #977
- Refactor sender to validate PjParam by version by @DanGould in #901
- Optimize the workflow for dart CI by @benalleng in #988
- Optimize the workflow for python CI by @benalleng in #989
- Reduce visibility of
session_contextmethod by @arminsabouri in #991 - Introduce metrics Collection via prometheus for payjoin directory by @zealsham in #848
- Migrate payjoin-cli from sled to rusqlite by @Mshehu5 in #873
- Simplify session id pj cli by @arminsabouri in #999
- Remove apt commands from bindings generate script by @arminsabouri in #1000
- Add missing uniffi exports by @spacebear21 in #1001
- Remove duplicate short id calculation code by @arminsabouri in #1004
- Update msrv deps by @benalleng in #959
- Fetching ohttp-keys should time out quickly by @zealsham in #1005
- Take advantage of MSRV 1.85.0 in
payjoin-ffiby @DanGould in #1006 - Separate receiver::{v1,v2} abstraction cleanly by @DanGould in #998
- Use default dev profile for development in ffi by @benalleng in #1011
- Enforce new AI Disclosure in PR Checklist by @DanGould in #1012
- Add receiver pk to session metadata by @arminsabouri in #995
- Refactor
WantsFeeRangeby @DanGould in #1010 - Add receiver builder by @arminsabouri in #1002
- Supertrait seal
{send,receive}::..Statetraits by @DanGould in #994 - Use reply key for replyable errors to v2 senders by @nothingmuch in #981
- not all integration tests depend on both v1 and v2 support by @nothingmuch in #1018
- flake.lock: Update by @nothingmuch in #1015
- Configure directory with config & clap by @nothingmuch in #927
- use tracing crate instead of log by @nothingmuch in #1020
- remove duplicate short CLI flag by @nothingmuch in #1024
- Improve
receiveerror heirarchy by @DanGould in #1031 - Save max fee rate in receiver session context by @arminsabouri in #1033
- Render PR checklist in details to hide it by @DanGould in #1037
- Change
from_idreturn type toSelfby @arminsabouri in #1040 - Update directory and ffi toml files where deps were incorrect by @benalleng in #1044
- Replace bitcoind with corepc_node by @spacebear21 in #1041
- One expiration error: Separate session replay & protocol operation by @DanGould in #1036
- Name multi-field SessionEvent variants by @spacebear21 in #1051
- Oneline
ProtocolError::V1JsonReplyconversion by @spacebear21 in #1052 - Change return type of
apply_unchecked_from_payloadby @arminsabouri in #1053 - Pull session context out of receiver state by @arminsabouri in #1054
- Remove uninitialized session state by @arminsabouri in #1014
- Remove references to ReplyableError in tests by @spacebear21 in #1059
- Enforce
handle_fatal_rejecttype safety by @arminsabouri in #1058 - Remove optional return types from session history methods by @0xZaddyy in #1055
- Enforce that
SessionHistoryis created internally by @arminsabouri in #1062 - Make payjoin::uri module public by @Johnosezele in #1048
- Remove use of payjoin::Url and url::Url in public Api by @benalleng in #1057
- Replace custom RPC client with bitcoind-async-client by @arminsabouri in #1063
- InvalidFormat instead of DecodeBech32 & InvalidHrp by @nothingmuch in #1074
- Display session history in payjoin-cli by @arminsabouri in #1039
- Rename
V2GetContexttoPollingForProposalby @arminsabouri in #1072 - Update Receiver State transition methods to consume self by @arminsabouri in #1076
- Consume
selfinPollingForProposal::process_resby @arminsabouri in #1080 - Reduce OhttpKeys' public API by @nothingmuch in #1069
- trivial: use expect instead of unwrap for const Hrp::parse by @nothingmuch in #1083
- Remove OptionalTransitionOutcome helper methods by @arminsabouri in #1081
- Remove unnecessary URI accessors from public api by @nothingmuch in #1082
- Add dart to flake devshells by @nothingmuch in #1086
- Use "expiration" instead of "expiry" by @arminsabouri in #1087
- Remove mut ohttp keyconfig by @arminsabouri in #1085
- Remove extraneous clones in
create_poll_requestby @arminsabouri in #1089 - Replace SystemTime with bitcoin::absolute::Time by @nothingmuch in #1047
- Reduce visibility of ohttp methods by @arminsabouri in #1088
- Sanitize sensitive data from log messages to prevent privacy leaks by @0xZaddyy in #950
- remove redundant .to_string() to fix lint.sh by @nothingmuch in #1093
- Remove redundant fields from
WantsFeeRangeevent by @arminsabouri in #1092 - Replace redis with file based mailbox storage by @nothingmuch in #915
- Run all tests in macOS CI by @spacebear21 in #1094
- Exclude static mutation on default expiration time const by @benalleng in #1090
- Add lockfile backup to update-lock-files script by @benalleng in #1043
- Remove redundant fields from
WantsOutputsevent by @arminsabouri in #1102 - Introduce SessionEvent::Closed by @spacebear21 in #1078
- Process res error handling by @arminsabouri in #1075
- Simply return replay error on expiration by @spacebear21 in #1107
- Reduce visibility of common recv abstractions by @arminsabouri in #1109
- Bump uniffi-dart revision by @spacebear21 in #1110
- Remove mailbox from receiver session context by @arminsabouri in #1112
- Remove redundant fields from
WantsInputsevent by @arminsabouri in #1106 - Remove the url crate dep from payjoin-test-utils by @benalleng in #1111
- FFI: tighten error conversions by @chavic in #1029
- Fix apply_fee_range error handling by @spacebear21 in #1108
- Rename session events by @spacebear21 in #1116
- Use String type instead of Url on Request Struct by @benalleng in #1122
- Replace
pipwithuvin payjoin-ffi/python by @thebrandonlucas in #1073 - HPKE encrypt error response by @arminsabouri in #1115
- Replace
psbt_with_fee_contributionswith pub fn by @arminsabouri in #1120 - Depend on
url/serdewith no default features by @DanGould in #1126 - Update sender
process_resto parse and process error response by @arminsabouri in #1114 - Remove
PollingForProposalfrom session event by @arminsabouri in #1128 - Handle fatal errors in receiver state machine by @spacebear21 in #1060
- Use
HasReplyableErrorTransitionin reply error typestate by @arminsabouri in #1130 - Fix typo in payjoin/Cargo.toml by @arminsabouri in #1133
- Sender closed variant by @benalleng in #1129
- Receiever Monitor Typestate by @arminsabouri in #1061
- Return closed session state during replays by @arminsabouri in #1136
- Rename sender session events. by @zealsham in #1125
- Remove redundant
try_for_eachin history method by @arminsabouri in #1139 - Remove terminal_error method for sender and receiver by @benalleng in #1123
- Rename ffi exported receiver session history struct by @arminsabouri in #1142
- Expose missing sender session history FFI methods by @arminsabouri in #1140
- Expose receiver status off FFI session history by @spacebear21 in #1145
- Abstract V2 Sender over SenderContext and remove public Url by @benalleng in #1141
- Bump payjoin version to 1.0.0-rc.0 by @arminsabouri in #1148
- Don't pub use Duration by @DanGould in #1150
- Assert reply_key for RetrievedOriginalPayload by @benalleng in #1152
- Directory cli fixes by @nothingmuch in #1157
- Support requesting certificates using ACME by @nothingmuch in #1026
- Update corepc-node to v0.10.0 by @benalleng in #1155
- FFI: Eliminate string fallbacks in error wrappers by @chavic in #1127
- Remove Docker mention in dart README by @spacebear21 in #1161
- Fix identify_receiver_outputs by @spacebear21 in #1168
- Use full_relay_url in sender GET request by @spacebear21 in #1166
- Add directory health check github action by @spacebear21 in #1170
- Fix directory metrics by @spacebear21 in #1173
- Fix rpc-error due to quick transaction lookup by @zealsham in #1159
- Force ffi workflow to use certain python version by @benalleng in #1176
- Remove
ReceivedProposalPsbtinfavor of session outcome by @arminsabouri in #1171 - Remove public /metrics endpoint from directory by @spacebear21 in #1178
- Remove extraneous destructuring by @arminsabouri in #1182
- Bump payjoin version to 1.0.0-rc.1 by @spacebear21 in #1186
- Resume command should not fail for expired sessions by @zealsham in #1175
- Add javascript language bindings by @spacebear21 in #1190
- Use nixos stable for nix flake by @benalleng in #1194
- Sort session events by auto-incrementing id by @arminsabouri in #1202
- Clean up FFI package names by @spacebear21 in #1207
- docs(payjoin): highlight {v1,v2}::{send,receive} as primary API entry by @Mshehu5 in #1183
- Cargo mutants filter diff only for rust files by @benalleng in #1212
- Switch dart bindings to use native assets by @spacebear21 in #1208
- Check for spendable UTXOs before payjoin operations by @0xZaddyy in #1071
- Nixos stable 25.11 by @benalleng in #1210
- Receiver integration tests for different script patterns and sender behaviors by @mehmetefeumit in #1211
- Fold ohttp-relay into rust-payjoin monorepo by @spacebear21 in #1215
- Make nginx available in nix flake check test runs by @nothingmuch in #1219
- Specify --tree-root to treefmt flake check by @nothingmuch in #1225
- Unused dependency flaged by nix check by @Mshehu5 in #1222
- Flake toolchain and check improvements by @nothingmuch in #1226
- Remove nightly toolchain flag from recommended precommit by @mehmetefeumit in #1220
- Introduce treefmt-nix as a universal formatter infra by @benalleng in #1221
- Skip check_payment in Receiver if the sender is using non-segwit address by @mehmetefeumit in #1218
- remove unnecessary #[inline] directives by @nothingmuch in #1229
- Stop suggesting broadcast-only check in check_payment docstrings by @mehmetefeumit in #1230
- Fix CONTRIBUTING.md formatting by @spacebear21 in #1233
- Derive P2TR input weight from witness data by @Mshehu5 in #1200
- Move the Default Payjoin FFI API to primitives by @chavic in #1191
- Update issue templates to include ohttp-relay by @benalleng in #1238
- Specifi nginx via environment variable or skip test by @zealsham in #1237
- Fix clippy lint warnings by @spacebear21 in #1251
- Upgrade
bitcoind-async-clientto 0.8.1 by @arminsabouri in #1252 - Audit serialization trait implementations by @0xZaddyy in #1223
- Refine Repo README and payjoin lib.rs by @mehmetefeumit in #1248
- Deduplicate PSBT inputs in contribute_inputs by @Mshehu5 in #1254
- flake: build dev profile instead of release by @nothingmuch in #1228
- Adding flake check and weekly flake.lock maintence job in git workflow by @Mshehu5 in #1224
- Async persistence by @spacebear21 in #1235
- Support ipv6 in the ohttp nginx config template by @zealsham in #1260
- Implement
replay_event_log_asyncby @spacebear21 in #1266 - Change GitHub token for flake maintenance workflow by @spacebear21 in #1278
- chore: update flake.lock by @spacebear21 in #1279
- Remove nix caching on flake checks by @benalleng in #1268
- Return error on duplicate input contribution by @Mshehu5 in #1257
- Print reverse proxy reminder in v1 CLI by @mehmetefeumit in #1255
- Unified payjoin service by @spacebear21 in #1232
- Add testing coverage for payjoin-service by @benalleng in #1285
- Add nix2container for reproducible Docker builds by @Mshehu5 in #1289
- Upgrade wheel to 0.46.3 by @spacebear21 in #1292
- Add data directory to gitignore by @zealsham in #1295
- Update uv lockfile by @spacebear21 in #1293
- chore: update flake.lock by @spacebear21 in #1299
- Pin
timedependency by @spacebear21 in #1302 - Fix failing cargo machete check by @spacebear21 in #1304
- chore: update flake.lock by @spacebear21 in #1309
- Add minimal fuzzer for payjoin by @benalleng in #1310
- Add standalone metrics service to Payjoin-service by @zealsham in #1296
- Add ACME certificate management to payjoin-service by @spacebear21 in #1315
- Fix metrics spawn in
serve_acmeby @spacebear21 in #1317 - Add library package to have missing packages available at runtime by @benalleng in #1281
- chore: update flake.lock by @spacebear21 in #1319
- Fuzzing enhancements: clean up README and add CI job by @DanGould in #1322
- Don't skip python integration test by @spacebear21 in #1301
- Expose async persistence in FFI by @spacebear21 in #1287
- Add nix2container workflows for creating payjoin-service docker images by @benalleng in #1321
- Allow container images for pull requests in fork branches by @benalleng in #1326
- Aggregated metrics for payjoin-service (with native OTLP) by @spacebear21 in #1327
- Rename payjoin-service to payjoin-mailroom by @spacebear21 in #1329
- Validate FFI primitive inputs + refresh bindings/tests by @chavic in #1263
- Add AGENTS.md for AI and contributor guidance by @DanGould in #1333
- Add treefmt and codespell (CI requirements) to nix dev shells by @DanGould in #1334
- Add support for release tags when publishing a docker image by @benalleng in #1331
- Add payjoin-mailroom to test_local.sh by @spacebear21 in #1339
- Use nix fmt instead of treefmt in devshell by @benalleng in #1341
- Add new ignores in codespell for local runs by @benalleng in #1340
- Fix flaky test_prune by using deterministic timestamp manipulation by @DanGould in #1338
- Clarify directory gateway handler by @spacebear21 in #1343
- Clear V1 payload from memory after first read by @DanGould in #1335
- Improve AGENTS.md guidance by @DanGould in #1344
- Gate V1 protocol behind runtime feature flag by @DanGould in #1336
- Remove ignored v1 fallback code by @benalleng in #1345
- Add GeoIP region filtering and address blocklist by @DanGould in #1337
- Add C# language bindings for payjoin-ffi by @chavic in #1318
- Add supported versions to /health response by @spacebear21 in #1348
- Update FFI readme by @spacebear21 in #1347
- Add async weekly standup automation by @DanGould in #1346
- test: add csharp integration test by @ValeraFinebits in #1350
- Pin wasm-bindgen-cli to 0.2.108 by @spacebear21 in #1349
- Bump payjoin version to 1.0.0-rc.2 by @spacebear21 in #1358
- Bump payjoin-mailroom version to 0.1.0 by @spacebear21 in #1359
- Disable fail-on-error for coveralls workflow by @benalleng in #1360
- test: fetch ohttp keys by @ValeraFinebits in #1354
- Pin crane to fix weekly flake lock update by @benalleng in #1363
- Update uniffi-dart with named params by @spacebear21 in #1364
- Switch to upstream uniffi-bindgen-react-native by @spacebear21 in #1367
- Don't wait for workflows to publish Docker image by @spacebear21 in #1369
- Use tagged releases for uniffi dart and JS bindings by @spacebear21 in #1368
- chore: update flake.lock by @spacebear21 in #1375
- Add NixOS module for payjoin-mailroom by @spacebear21 in #1366
- Audit public API to take arguments by reference where possible by @DanGould in #1373
- Add ACME section for mailroom example config by @spacebear21 in #1382
- Add safe catch-all for secp256k1::Error conversion in HpkeError by @Mshehu5 in #1298
- Expose OHTTP key fetch for Python by @Mshehu5 in #1386
- Db service by @zealsham in #1361
- Add an example
systemdservice forpayjoin-mailroomby @luisschwab in #1393 - chore: update flake.lock by @spacebear21 in #1397
- Update mailroom README description by @spacebear21 in #1402
- Mailroom landing page by @spacebear21 in #1401
- Remove sequence param from InputPair constructors by @spacebear21 in #1405
- Add Python devshell by @Mshehu5 in #1400
- Allow publishing the mailroom image with a master tag pointing to a rev by @benalleng in #1407
- Fetch ohttp relay once before poll loop by @bc1cindy in #1398
- Make git commit hash optional in landing page by @spacebear21 in #1408
- Fix
avoid_uihmethod comment by @arminsabouri in #1411 - Fold ohttp relay into mailroom by @spacebear21 in #1409
- Bump payjoin-mailroom version to 0.1.1 by @spacebear21 in #1415
- Ensure random relay selection with fixed ohttp-keys config by @benalleng in #1390
- chore: update flake.lock by @spacebear21 in #1418
- Async standup v2 by @DanGould in #1387
- Refactor OhttpKeysClient by @ValeraFinebits in #1371
- Cover missing C# FFI validation paths by @chavic in #1423
- Async client bitcoind network parsing by @benalleng in #1426
- Unpin the nix crane dip from a specific commit by @benalleng in #1419
- chore: update flake.lock by @spacebear21 in #1436
- Use contrib/test.sh in all language bindings by @Mshehu5 in #1416
- Pin unicode-segmentation in payjoin-mailroom by @benalleng in #1439
- Bump payjoin version to 0.25.0 by @spacebear21 in #1438
New Contributors
- @Mshehu5 made their first contribution in #858
- @arturgontijo made their first contribution in #772
- @Johnosezele made their first contribution in #886
- @w3irdrobot made their first contribution in #768
- @bc1cindy made their first contribution in #945
- @Prabhat1308 made their first contribution in #961
- @chavic made their first contribution in #1029
- @ValeraFinebits made their first contribution in #1350
- @luisschwab made their first contribution in #1393
Full Changelog: payjoin-0.24.0...payjoin-0.25.0