feat(lnurl): /session — one verified tap for a terminal visit #1
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/card-session-endpoint"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Adds GET /api/v1/session/{external_id}?p=&c= for bitSpire tap-to-enter (aiolabs/bitspire ADR-003).
A tap yields a single-use SUN, so a terminal that verified it at entry could not reuse the p/c to move sats later. /session verifies once (advancing the counter exactly like /scan), records one hit, and returns what the rest of the visit needs: the card wallet's balance + fiat equivalent (wallet currency, then the instance default; display only), the LUD-03 withdraw step (callback, k1 = hit) and the LUD-06 top-up step (callback). Both are keyed by the hit — the same single-use bearer /scan and /pay already hand out. Withdraw is withheld with a reason once the daily limit is spent, as /scan would refuse; top-up stays available.
First commit extracts the SUN check /pay and /verify each copied from /scan into one helper so the fork endpoints can't drift from upstream's rules. /scan itself is untouched.
Tests drive the real decrypt/CMAC path with a SUN encrypted under the card's keys and pin /verify + /pay behaviour across the refactor. Consumer: aiolabs/bitspire feat/boltcard-session-balance, which also carries the wire doc (docs/boltcard-session.md).
GET /api/v1/session/{external_id}?p=&c= for bitSpire tap-to-enter. A tap yields a single-use SUN, so a terminal that verified it at entry could not reuse the p/c to move sats later. This verifies once (advancing the counter like /scan), records one hit, and returns what the rest of the visit needs: the card wallet's balance + fiat equivalent (wallet currency, then the instance default; display only), the LUD-03 withdraw step (callback, k1 = hit) and the LUD-06 top-up step (callback), both keyed by the hit — the same single-use bearer /scan and /pay already hand out. Withdraw is withheld with a reason once the daily limit is spent, as /scan would refuse; top-up stays available. Tests drive the real decrypt/CMAC path with a SUN encrypted under the card's keys, and pin /verify + /pay behaviour across the helper refactor. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>