- Fix a 0.4.13 regression in every engine (JS, Ruby, Python, PHP): a host-clock attempt could be skipped by reconciliation indefinitely. When one of the two scan-window slots was taken, the next selection moved its cursor past the whole batch, gave the free slot to the batch's wallet-timed attempts, and dropped its host-clock attempts. Those were read again only on the next lap, which could drop them the same way. With more than one batch of mixed pending attempts, a paid host-clock attempt could stay pending indefinitely. Selection now moves the cursor only past attempts it has queued, and an attempt with no free slot is read again by the next selection.
- Let a wallet that answers only one history page per 9 s slice make progress, in every engine. A resumed slice first re-reads its last page as an overlap. When that was the only page answered before the deadline, the next slice re-read the same overlap again, forever. An overlap answered alone is now spent, and the next slice reads the unseen page first. Slices that answer more pages behave as before.
- Two new
spec/test-vectors/reconcile-progress.jsonvectors pin both fixes for every engine: mixed wallet- and host-timed batches, and one answered page per slice (run with a wallet-timed and a host-timed attempt). - BTCPay Server plugin source 0.4.13 fixes a 0.4.12 regression in its scan
memo. An unbounded walk resumed after a failed page, and ending without
finding a host-clock invoice, counted as a complete refresh. Past expiry plus
grace, the memo then stopped watching that invoice and invoice recovery could
close it as unpaid, even if it was paid while the walk was down. Such a hash
now stays watched, counts as unreached, and gets a fresh unbounded walk on
the next refresh. See
packages/dotnet/CHANGELOG.md. - Ship the standalone checkout in the
@openreceive/elementsnpm package.dist/standalone/(the no-build-stepopenreceive-checkout.jsand.cssfor plain-HTML pages) was missing from every published version since 0.4.10. The release packs each package right after its ownbuild, and the elements build'stsup --cleanemptied the directory that the standalone step had filled earlier. The standalone step is now the last step of the elements build, and the package smoke test fails if the tarball lacks it. - Fix
npx openreceive doctor --db <sqlite file>, which crashed with "Cannot find package 'sqlite'". The build dropped thenode:prefix fromnode:sqlite, a module that exists only under the prefix. On Node 22.5 to 22.12, wherenode:sqliteneeds--experimental-sqlite, the database line now says so and gives the fix instead of failing. The package smoke test runs the packageddoctor --dbagainst a migrated SQLite file. - Document the plain-HTML way back to a swap refund.
<openreceive-checkout>takessync-url,resume-path-prefix,route-reference,resumableandresume-payment-hash, and reports the swap's payment hash in theopenreceive-stateevent atevent.detail.state. Frontend checkout, Swap refunds, the API reference and every framework's agent directions now show them beside the React props. - The Buy a Button demos' Vue, Svelte and Angular tabs and the plain-HTML client
read the state event's
detailas the checkout state, so they never kept the swap's payment hash and a reload lost the way back to a refund. They now readdetail.state, and a new e2e test reloads mid-swap and expects the deposit screen back without a click. - The swap deposit screen said "Send exactly the amount shown below." while the amount sits above it. It now says "Send exactly the amount shown."
- The Node quickstarts now say to install
@openreceive/httpbefore importingpaymentsSchemaSqlfrom it on the no-ORM path, rather than relying on npm hoisting the adapter's dependency.
OpenReceive Files
Open-source Bitcoin checkout, paid to your own wallet
Brought to you by:
openreceive