- Fix a reconciliation livelock on slow wallets, in every engine (JS, Ruby,
Python, PHP). A wallet-history page still in flight at the 9 s scan deadline
failed the whole pass, and the pass threw away its resume offset. A walk too
long for one slice then restarted at offset 0 on every pass: nothing settled,
every pass logged
reconciliation failed (will retry): … execution expired, and the repeated walks used up the wallet's request budget (RATE_LIMITED). A cut page now ends the slice like a page answered late: the completed pages keep their progress, and the next pass resumes after them. A slice whose first page is cut still fails the pass, so a wallet that never answers stays visible in the logs. - Give host-clock attempts their own scan cohort. An attempt whose creation
time came from the host clock (a legacy row, or a wallet whose
make_invoicereply has nocreated_at) is scanned over the whole wallet history. One such row used to widen the window of every wallet-timed attempt pending with it to that full walk. Wallet-timed attempts now keep their bounded window. - Raise the reconcile gate's floor from 2 s to 3 s
(
OPENRECEIVE_MIN_RECONCILE_INTERVAL_SECONDS, and the first invoice-age tier in every engine). This cuts settlement-scan volume by about a third, at the cost of at most one extra second before a payment is seen. - Two new
spec/test-vectors/reconcile-progress.jsonvectors pin both fixes for every engine. PHP'sReconcilertakes an optional scan timeout in seconds, mirroring JSscanTimeoutMs, so tests can drive a short deadline. - Security updates in the lockfiles: next 16.3.8, fastify 5.12.5, devalue
5.9.4, brace-expansion 5.0.12, piscina 5.3.2 and fast-uri 3.1.8 (npm);
urllib3 2.8.0 (Django demo); league/commonmark 2.10.3 (
openreceive/laraveland the Laravel demo). The Laravel demo's path packages had stayed pinned at 0.4.3, so nocomposer updatecould resolve there;release:preparenow moves them with every release. rubyzip stays at 2.4.1: rbsecp256k1 6.0.0, the latest release, pins~> 2.3, and it runs rubyzip only at gem install, on a SHA-256-verified archive (already on the Rails demo's bundler-audit ignore list). - BTCPay Server plugin source 0.4.12 closes the same exposure in its scan
memo. A failed wallet walk resumes instead of restarting at offset 0. A
host-clock invoice no longer forces a full-history walk on every refresh. A
failed walk counts toward the cadence. The fastest cadence is 3 s. See
packages/dotnet/CHANGELOG.md.
OpenReceive Files
Open-source Bitcoin checkout, paid to your own wallet
Brought to you by:
openreceive