CLASS 1 · REPLAY
Duplicate-settlement race / replay
One payment, presented many times, must serve exactly once. Hosted rail: atomic check-and-set on the transaction hash after all checks pass, a durable on-disk used-tx set loaded on boot, and 409 rejections for a used hash or a settled invoice. Paywall: a 120-second recency window plus a durable seen-tx ledger — tests 9/9.
LIVE (GO) RESTART PROOF: CODE-PATH LEVEL
Evidence: /v1/stats → · Go commit b8c22a13 → · Paywall commit cef3b1a0 →
CLASS 2 · BINDING
Cross-resource substitution
A payment proof for one resource must not spend at another. Every invoice binds endpoint, price, asset, network, destination, and a memo that is the hex of the invoice UUID; XRPL verification checks the presented transaction against that invoice, memo included. The HMAC-signed access token carries invoice, endpoint, and paying-wallet claims, and the endpoint check rejects a token minted for a different endpoint.
PARTIAL — BASE MEMO OPTIONAL · PROBE P2 PENDING
Full control text in SECURITY.md →
CLASS 3 · APPROVALS
Allowance overdraft
There is no allowance to overdraw: 402Proof's rails are discrete push payments — it never holds a transferFrom allowance or a session-wide approval. Destination, asset, and RLUSD issuer are pinned per invoice; underpayment is rejected on every rail.
XRPL EXACT AMOUNT: LIVE · BASE FLOOR: PARTIAL
The live XRPL probe rejects both underpayment and overpayment with amount_mismatch. The Xahau implementation also enforces drops-exact native XAH amounts. Base still uses a floor comparison; exact equality is not claimed for Base. SECURITY.md, Class 3 →
CLASS 4 · FINALITY
Denial of settlement
Access is issued only after on-chain verification passes — validated with tesSUCCESS on XRPL, receipt status 0x1 with a matching USDC Transfer on Base. Invoices expire in 5 minutes (410 after expiry; paid invoices stay on record so a duplicate verify returns an explicit 409). A failed attempt never burns the payer's transaction hash, so griefing cannot lock out a legitimate retry.
LIVE (GO) NO PER-PAYER VERIFY THROTTLE — NOT CLAIMED
Evidence: /health →
CLASS 5 · ISSUANCE DOS · FINDING 1
Invoice-issuance denial of service
Found in our own audit: invoice creation needed only a valid endpoint id — no throttle, no cap, no deletion. Fixed and live in production: per-IP and per-endpoint token-bucket throttle (429 + Retry-After, proven live), a 10,000 active-invoice cap, and a 30-second expiry sweep (proven live: active invoices 46 → 0).
LIVE IN PRODUCTION
Evidence: /v1/stats → · Commit b8c22a13 →
NODE SURFACES · FORTRESS
Fortress module hardening
The shared Node hardening module was rectified defect by defect: idempotency-ledger boot race removed, has() fixed in SQLite mode, event-log verification corrected past 10,000 entries, real fsync behind the durability claim, and proxy-aware rate-limit keying so clients behind Render no longer share one bucket. Selftest: 48/48.
CODE + TESTS
Paywall commit cef3b1a0 →