Skip to content
Attack results

We attacked it. Nothing got through.

First, 30 payments of 0.1 USDC fired at the same moment at a 1 USDC budget: against an ordinary contract, and against Scrip. Then 1,999 recorded attacks, from fake recipients to stolen keys.

An ordinary contract paid out1.40 USDC0.40 USDC over a 1.00 USDC budget
Scrip paid out1.00 USDCexactly the 1.00 USDC budget, the rest refused
Network
testnet
Run
2026-10-28 19:15 UTC
Burst
30 transactions, 80 ms apart
Status
Testnet run verified

The burst, line by line

MetricOrdinary contractChecks the balance after payingScripReserves the amount before paying
Transactions30 broadcast (10073 ms)30 broadcast (9784 ms)
Budget cap1.00 USDC1.00 USDC
Merchant received1.40 USDC1.00 USDC
Budget exceededEXCEEDED (+0.40 USDC)HELD (0.00 USDC over)
Payments completed14 payments10 payments
Spent (contract)1.40 USDC1.00 USDC
Pending reservations0.00 USDC (0 open)0.00 USDC (0 open)
Defense verdictVULNERABLE (drain bypasses cap)PRESERVED

Attack catalog 1,999 cases, 12 categories, 5 layers

Source: results/attack-catalog.json. 1999 recorded cases; PASS, FAIL, SKIPPED and BREACH labels are shown exactly as the catalog records them.

CategoryLayer ALayer BLayer CLayer DLayer ETotal
1. RecipientPASS 75not runPASS 36PASS 15PASS 24SKIPPED 11PASS 150SKIPPED 11
2. AmountPASS 77not runPASS 36PASS 15PASS 56SKIPPED 19PASS 184SKIPPED 19
3. Budget & parallelPASS 75not runnot runPASS 10PASS 49SKIPPED 26PASS 134SKIPPED 26
4. Approval & noncePASS 75not runPASS 68PASS 21PASS 41SKIPPED 19PASS 205SKIPPED 19
5. Access & identityPASS 86PASS 111not runPASS 12PASS 88SKIPPED 12PASS 297SKIPPED 12
6. Delegate & keysnot runnot runPASS 77PASS 10PASS 34SKIPPED 11PASS 121SKIPPED 11
7. Gas & resourcesnot runPASS 71not runPASS 26PASS 30SKIPPED 5PASS 127SKIPPED 5
8. Format & parsingnot runPASS 60PASS 74PASS 24not runPASS 158
9. Facilitator operationsnot runPASS 98not runPASS 27not runPASS 125
10. Mandate lifecyclePASS 75not runnot runnot runPASS 59SKIPPED 1PASS 134SKIPPED 1
11. Token & accountingPASS 102not runnot runnot runPASS 24SKIPPED 1PASS 126SKIPPED 1
12. Outside the guarantee (absurd)PASS 62PASS 45PASS 26not runnot runPASS 133
All categoriesPASS 627PASS 385PASS 317PASS 160PASS 405SKIPPED 1051999

Legend: ✓ PASS · ✕ FAIL · – SKIPPED · ⚠ BREACH · – no cases

Outside the guarantee 45 cases

Scenarios outside the Scrip threat model (for example a leaked owner full-access key, a malicious token contract, or a lying RPC). Scrip does not claim to prevent these; they are recorded on purpose as stated limits.

Show all 45 out-of-scope cases (every one labelled as expected)
ID / CategoryLayerExpected labelActual labelVerdict
KAT-A-12-33
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-34
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-35
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-36
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-37
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-38
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-49
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-50
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-51
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-52
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-53
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-54
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-55
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-56
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-57
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-58
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-59
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-60
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-61
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-A-12-62
12. Outside the guarantee (absurd)
AOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-136
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-137
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-138
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-139
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-140
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-141
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-142
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-143
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-144
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-B-12-145
12. Outside the guarantee (absurd)
BOUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-01
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-02
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-03
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-04
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-05
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-06
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-07
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-08
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-19
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-20
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-21
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-22
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-23
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-24
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS
KAT-C2-12-25
12. Outside the guarantee (absurd)
COUT_OF_SCOPEOUT_OF_SCOPEPASS