diff options
| author | Adam Soltys <[email protected]> | 2026-05-17 23:46:58 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-05-17 23:46:58 -0700 |
| commit | dfd31ad83d24e780523f4e76d04a76aba1fa8be1 (patch) | |
| tree | ef9fc2c2732d2a34cf51896cbf74d3f53be59dc5 /lib/auth.js.map | |
| parent | ca4bdc84f1eac1859044639ffa16bac9aa8fce1b (diff) | |
| download | coinos-server-dfd31ad83d24e780523f4e76d04a76aba1fa8be1.tar.gz coinos-server-dfd31ad83d24e780523f4e76d04a76aba1fa8be1.zip | |
mirror payment records to arc + atomic /confirm lock to prevent double-credits
Apr 29 double-credit prevention, ported from master 0e368dab and adapted
to staging's hono/tigerbeetle structure. Two parallel callers of /confirm
(walletnotify, catchUp, bulk sweeps) could each read p.confirmed=false
and each run tbConfirm — doubling the pending→balance transfer.
tbConfirm itself isn't idempotent on its own, so the race materializes
as a real double-credit even with TB.
- routes/payments.ts: SET NX EX 60 lock around the confirmation block
keyed by `confirmlock:${txid}:${vout}`. Concurrent callers short-circuit
cleanly. Released on success and on every early-return.
- lib/payments.ts credit() + routes/payments.ts /confirm: mirror payment
+ invoice records and the `payment:<txid>:<vout>` / `payment:<hash>`
pointer keys into arc as soon as they're written. gf() will then find
the prior credit via arc fallback even if the main-db copy is wiped
by a future data-loss event.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Diffstat (limited to 'lib/auth.js.map')
0 files changed, 0 insertions, 0 deletions
