Testnet: tokens have no value, and the vulnerable contracts are our own test fixtures. Limits

Acme Lend v1 — pre-launch (testnet)

Acme Lend: our deliberately vulnerable fixtureOpenround 2light-client confirmedrecorded run, 2026-11-04
Acme Lend is our deliberately vulnerable fixture: a fictional lending protocol whose planted bugs are textbook classes, labelled in its code. Nothing here is a finding in a real protocol, and wNEAR on testnet has no value.
The one moment happened here: agent A's sealed proof was verified, paid, and paused the fixture on both chains. It is recorded, not live. Every step, timed.

Overview

The program as near-antibody stores it. Its manifest hash commits the anchor, the targets, the rules and the terms; once it is open, the deployment's owner can change nothing it depends on.
Project
acme.antibody.testnet, account: acme.antibody.testnet · our fixture project
Description
Fictional lending protocol with planted bugs (DELIBERATELY VULNERABLE TEST FIXTURE).
as written in the committed manifest
Program key
bounty.antibody.testnet/5, program key: bounty.antibody.testnet/5
Phase
Open round 2this round since
Created
B2qDDspG…, NEAR transaction: B2qDDspGkqVy8GQSgF15YCAnGhkPET386j9kAjZ55mL8, opens an explorer in a new tab
Opened
9RHsnERo…, NEAR transaction: 9RHsnERoeBcsPW98Kv3whVerjcHxz51MNNmSt6pzG2Xj, opens an explorer in a new tab
Terms sha256
3a9c40175b7ae46a…, terms sha256: 3a9c40175b7ae46a342566111ba65ca4a420c8ff2289eb7b08c8759b5125a34d
Manifest sha256
be42d0c87d995331…, manifest sha256: be42d0c87d995331f0b3f9f912cc3aad8537eedc56adc39bc088c2dcaf079518The manifest, as uploaded
Sealing key
3ec2215a7331f2bb…, sealing public key: 3ec2215a7331f2bba02408458c8bbbcdefecde7d1c2a8e45e4b928fcb9686b25Proofs are sealed to it. It counts only once its activation run (run 31) is attested on NEAR: 5dhfsAVL…, NEAR transaction: 5dhfsAVLoSzpJ52oLQ7D9aWX8kwX1hDFAZahDrd95jB3, opens an explorer in a new tab

Its record

At stake
0.161wNEAR available now
Verified attempts
7
Paid findings
4
First claim
99 safter it opened
Claimed in the first hour
60%of the escrow
Open for
120.8 h
view bounty.antibody.testnet.get_program({"program_id":5})

Holds if: the manifest hash shown here, as near-antibody stores it

antibody judge --program 5

The rules as code

Each rule is one bit of the program's invariants contract. After a proof's calls, at the anchor, the verifier runs its check(): a set bit is a broken rule, paid by its severity. The verifier never reads a report.
The program's rules
RuleSeverityPayoutBudget per roundSource
solvencybit 0an attested proof pauses

Lender claims are covered at the committed reference price.

Critical
0.1 wNEAR
0.4 wNEAR
fees_to_treasurybit 1

Accrued fees plus the treasury balance never decrease.

High
0.03 wNEAR
0.4 wNEAR
share_pricebit 2

The vault's share price never falls for the remaining holders.

Medium
0.01 wNEAR
0.4 wNEAR
protected_balancesbit 3added by a round

The protected saver's acUSD never falls in a transaction the saver did not send.

Medium
0.01 wNEAR
0.4 wNEAR

The budget caps what one rule pays per round, so many entry points into one root cause cannot drain the escrow. A finding's key is the rule and the entry point that broke it (by default, the target and function): the first proof of each key is paid.

The targets (9) on Sepolia

The terms

Committed in the manifest with the rules, their text fixed by the terms sha256, and enforced by near-antibody: no person decides a payout.

Payouts

The payout table
SeverityPayoutRules
Critical0.1 wNEARsolvency
High0.03 wNEARfees_to_treasury
Medium0.01 wNEARshare_price, protected_balances
Lownonenone
Bond per commit
0.001 wNEAR · refunded, or forfeited to this program's escrow when the proof breaks nothing
Instant payments
up to 0.1 wNEAR
When a payout is instant

Paid in seconds when the verdict is attested on NEAR, within 0.15 wNEAR per 1 h. Otherwise a payout waits the challenge window; above the cap it also needs an agreeing second run.

Challenge bond
0.005 wNEAR
Protocol fee
none · pinned at 0 for this program
Release fee
none · pinned at 0 for this program
Verification deposit
0.03 NEAR per run, paid by whoever asks for it; OutLayer refunds the unused part

The escrow against the largest payout

1.61×the largest payout
0.161 available / 0.1 wNEAR largest

The available escrow over the largest payout. Below 1× the status page raises an alert; a payout the escrow cannot cover is queued as debt, in commit order.

Pauses
An attested proof of solvency, on a light-client anchor, pauses the protocol on every chain the project registered (one pause ticket per round), with no minimum impact.
Known issues
At most 4, sealed before open, their base payouts at most 50% of the escrow.
Gap lane
A proof that breaks no rule but harms a declared protected account by more than $100 is refunded and recorded as a gap claim, with 0.01 wNEAR reserved. It is paid if a later round adds a rule its proof breaks.
Unevaluable
A proof the rules cannot evaluate (check() reverts or runs out of gas) is refunded.

The windows

The program's windows
WindowLengthWhat it bounds
Reveal
10 min
A commit is revealed within this, or it expires and its bond goes to the escrow.
Challenge window
60 s
A verdict that is not paid instantly is final after this; anyone may challenge it within it, with the challenge bond.
Resolve
5 min
A challenge with no attested result within this voids the verdict; both bonds are refunded.
Run timeout
4 min
A run that never answered is void after this.
Infrastructure grace
10 min
An infrastructure failure is retried this long, then the commit closes with a refund.
Round minimum
2 min
A round runs at least this long before the next one opens.
Re-run window
10 min
Re-runs at a proposed fix may be asked for within this of its confirmed check.
Disclosure delay
10 min
A paid proof becomes public at most this long after its claim.
Exit grace
60 s
After the deadline plus this, anyone may settle the program (exit).
Deadline
No commit is accepted after it.

The anchor

Every proof runs on the state proven at one block. A pause ticket, and the verdict guard, act only on an anchor the light client confirmed: on a project-attested anchor a verdict is about state the project chose.
Chain
Sepolia (11155111)
Block
12063269 (opens an explorer)
Hash
0x16662a318858fe75ac73c5ffc61dd184b0069ce90148470fff821b16d373f2c2
Its check
confirmed by the light clientnear-antibody compared the hash with client-eth2.sepolia.testnet when the program was created.anchor_checked (LightClient): B2qDDspG…, NEAR transaction: B2qDDspGkqVy8GQSgF15YCAnGhkPET386j9kAjZ55mL8, opens an explorer in a new tab
Base witness
The anchor state the rules and the round-0 checks read, proven against the anchor and pinned at activation.200cc7e636e7bd4f…, base witness sha256: 200cc7e636e7bd4fe9056cd2d4707d1eccadc3f656d4e9e3d61e68c9ffaba621Uploaded in NEAR transaction 2KJNqGZ2J3…, NEAR transaction: 2KJNqGZ2J3wMLt2PePNauvZXmC5fgme6b2T6qcTViZiQ, opens an explorer in a new tab by acme.antibody.testnet

Check the hash yourself

view client-eth2.sepolia.testnet.block_hash_safe(12063269 as 8 little-endian bytes: 0x2512b80000000000)

Expected: byte 0 is 1 (the client holds the block), then 32 bytes equal to the anchor hash.

The same check from a terminal, and the one that also hashes the block header from a Sepolia RPC:

antibody judge --program 5
antibody anchor-check --block 12063269

Known issues

Declared sealed before open; a later proof with the same tag is not paid again. Their count, rules and severities are public; their content stays sealed for good.
1 sealed

Known issue 1

Mediumnot fixed: still breaks
Rules
share_price (slot 2)
Tags
45b2dc90a6a1182d…, known issue tag: 45b2dc90a6a1182df8596d4205f3d0e69771aa87dcd0fb7e9d9e1e5505f6d8c5
Verified by
run 32 · 3svDpwQA…, NEAR transaction: 3svDpwQAHveAB3CrmBvvQYGQw5HmBZ7SJspj9fTbBvZS, opens an explorer in a new tab
Later proofs
commit 17 (our fixture agent E): matched the known issue, not paid

Declared before open (opened with 1 known: 9RHsnERo…, NEAR transaction: 9RHsnERoeBcsPW98Kv3whVerjcHxz51MNNmSt6pzG2Xj, opens an explorer in a new tab). A round may never add one, and a known issue blocks no release.

view bounty.antibody.testnet.get_program({"program_id":5})

Holds if: the first known issue's tag, as committed before open

antibody status --program 5

The chains

Per chain: the program's adapter, the proxies it may pause or upgrade, and every permit near-guardian asked the MPC network to sign, with the transaction that carried it there.
Reading the chains…

The sealed feed

Every commit in order: who, when, the state, the verdict and the payout; never the proof. A proof stays sealed until disclosure, and the project reads only the proofs it pays for.
3 with a zero-knowledge proof
The sealed feed, in commit order
CommitWhoWhenStateVerdictKeysPayout
Commit 13#0 · round 0
Paid
ViolationAttested on NEARZero-knowledge proof
solvency32570322…, tag of solvency: 325703227266ea4d3828142c490819fbc957bef5065a5ce0daeb03ee75242199
Commit 14#1 · round 0
Paid
ViolationAttested on NEAR
fees_to_treasuryae7e21c8…, tag of fees_to_treasury: ae7e21c8af1b96023b13ae1daff4bcd1076b5b282e4f6ce6fb91e6fdae5f6de4
Commit 15#2 · round 0
No violation · bond forfeited
No violationAttested on NEARZero-knowledge proof
no rule broken
—
Commit 16#3 · round 0
Duplicate · confirmed at the fix
ViolationAttested on NEARZero-knowledge proof
solvency32570322…, tag of solvency: 325703227266ea4d3828142c490819fbc957bef5065a5ce0daeb03ee75242199
—
Commit 17#4 · round 0
Known issue
ViolationAttested on NEAR
share_price45b2dc90…, tag of share_price: 45b2dc90a6a1182df8596d4205f3d0e69771aa87dcd0fb7e9d9e1e5505f6d8c5
—
Commit 18#5 · round 0
Paid
ViolationAttested on NEAR
solvencya74dddb6…, tag of solvency: a74dddb61406f343a53af7298ef64be2f9334763dfcd23f17ca3b85547e53b8c
Commit 19#6 · round 0
Paid
No violationAttested on NEAR
no rule brokenpromoted in round 1: its re-run at that round's code broke a rule, so it is paid at its original priority

A key is a rule and the entry point that broke it: the first proof of each key is paid; a later one is a duplicate that keeps its own proof record. Each commit's page shows its proof card and how to check it.

antibody status --program 5

Rounds and the release gate

A round ships a fix as code overrides at the same anchor. The enclave checks it, every paid proof is re-run against it, and a release permit is signed only for code that every paid proof fails against.

Round 1

release gate shut

In plain words

  • Fixed by this round's code (1 key, released from its holder)
    • solvency32570322…, tag: 325703227266ea4d3828142c490819fbc957bef5065a5ce0daeb03ee75242199 proven by commit 13 (our fixture agent A); duplicate commit 16 (our fixture agent D)
  • Still breaks (2 keys carried to the same holder)
    • fees_to_treasuryae7e21c8…, tag: ae7e21c8af1b96023b13ae1daff4bcd1076b5b282e4f6ce6fb91e6fdae5f6de4 proven by commit 14 (our fixture agent B)
    • solvencya74dddb6…, tag: a74dddb61406f343a53af7298ef64be2f9334763dfcd23f17ca3b85547e53b8c proven by commit 18 (our fixture agent F)
  • Promoted: commit 19 (our fixture agent G): a duplicate or gap claim whose re-run broke a rule at this code, paid at its original priority
  • A paid proof still breaks a rule at this fix, so no release permit was asked for: this code does not ship.
Proposed
7JJuBeTs…, NEAR transaction: 7JJuBeTsMAAkv3jPT1u7ZzWZjqk2HS5seShyRw7uciRF, opens an explorer in a new tab · the enclave checked the fix in run 41
Opened
ZDHuT1j6…, NEAR transaction: ZDHuT1j6QKdeLBYtJ1cwqasd4ohiYnKuaCjgSATVQug, opens an explorer in a new tab
Round manifest
d38c239590cc529c…, round 1 manifest sha256: d38c239590cc529c73d58de483823ecb3a4ecf2586261e5e673b4f2d2f18fc07Uploaded in NEAR transaction 9cjFNqM8Vh…, NEAR transaction: 9cjFNqM8VhD6V1q3zUebnKoTqswKhnPmXSTjifyegkUC, opens an explorer in a new tab by acme.antibody.testnet
The fix proposed
AcmeLend to implementation0x1E021a90…F915, round 1 implementation: 0x1E021a909Ee25b75fBcd0cE09229A0462a40F915, opens an explorer in a new tabcode hash 0x3919a37d…, code hash: 0x3919a37dd5b5dee0f49d0942b655bfe440e9d78d1a43dfe17ce7af8a6446dbe4

Re-runs at this fix

Reading the re-runs…

Release permits

None: the gate stayed shut.

view bounty.antibody.testnet.get_program({"program_id":5})

Holds if: round 1's release gate is false

antibody status --program 5

Round 2

release gate holds

In plain words

  • Fixed by this round's code (2 keys, released from their holders)
    • fees_to_treasuryae7e21c8…, tag: ae7e21c8af1b96023b13ae1daff4bcd1076b5b282e4f6ce6fb91e6fdae5f6de4 proven by commit 14 (our fixture agent B)
    • solvencya74dddb6…, tag: a74dddb61406f343a53af7298ef64be2f9334763dfcd23f17ca3b85547e53b8c proven by commit 18 (our fixture agent F)
  • Still breaksnothing: every paid proof fails at this code
  • Promoted: none
  • Every paid proof was re-run at this fix and fails: near-antibody asked for a release permit per proxy and chain.
Proposed
HbfLgvjk…, NEAR transaction: HbfLgvjkwRffLH1j5sKd98CeSyVrAY4jMcMHqKYE3gfB, opens an explorer in a new tab · the enclave checked the fix in run 47
Opened
6zEDmeiC…, NEAR transaction: 6zEDmeiCA8SGn89XYGY4GgjsKnhE4np3uvA85eoZeNj1, opens an explorer in a new tab
Round manifest
56eb8e1efb58561a…, round 2 manifest sha256: 56eb8e1efb58561a81db55686939b8bbe90707b883220ebdd87df917404aedb5Uploaded in NEAR transaction 4AMgLXSgtb…, NEAR transaction: 4AMgLXSgtbriDifGtobMHPaYJYL6NxQowdQwAs24Fum1, opens an explorer in a new tab by acme.antibody.testnet
The fix proposed
AcmeLend to implementation0x74E75477…17a9, round 2 implementation: 0x74E75477Af2d649FFe8037a37014dD8c7bd217a9, opens an explorer in a new tabcode hash 0x7deb43a5…, code hash: 0x7deb43a5fd8a6aac5aee95c158e0e552f6e866407b3f4c62442b39c6c6092adbAcmeVault to implementation0x32e8cd1D…34d0, round 2 implementation: 0x32e8cd1D58736310340d5103dEd748e3d8f434d0, opens an explorer in a new tabcode hash 0x8281ee18…, code hash: 0x8281ee18b7bd2f40337fe01767721ae85dcd4f0a2b1d8b331732baf81180ec4e

Re-runs at this fix

Reading the re-runs…

Release permits

Reading the release permits…
view bounty.antibody.testnet.get_program({"program_id":5})

Holds if: round 2's release gate is true

antibody status --program 5

The released code, on each chain

recorded 2026-11-04, checkable now

After round 2 the relayer submitted the release permits. Each proxy's implementation slot (EIP-1967) now names the final fix, and B's fee-sweep exploit (commit 14) reverts against it. Recorded in the results file under release.checks.

Recorded post-release checks
ChainCheckRecorded
Sepolia
true
Sepolia
true
Sepolia
B's exploit reverts against the released code
true
Base Sepolia
true
Base Sepolia
true
Base Sepolia
B's exploit reverts against the released code
true

Read each slot now, from your browser

Sepolia, AcmeLend

eth_getStorageAt on chain 11155111

Holds if: the slot ends with 74e75477af2d649ffe8037a37014dd8c7bd217a9

curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_getStorageAt","params":["0xCa1FAFbCFC14d665d76045A018B215987f39f8A7","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","latest"]}'

Sepolia, AcmeVault

eth_getStorageAt on chain 11155111

Holds if: the slot ends with 32e8cd1d58736310340d5103ded748e3d8f434d0

curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_getStorageAt","params":["0x0433CEB84dB807402DE6642929EbF1450381CC46","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","latest"]}'

Base Sepolia, AcmeLend

eth_getStorageAt on chain 84532

Holds if: the slot ends with 74e75477af2d649ffe8037a37014dd8c7bd217a9

curl -s https://base-sepolia-rpc.publicnode.com -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_getStorageAt","params":["0xCa1FAFbCFC14d665d76045A018B215987f39f8A7","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","latest"]}'

Base Sepolia, AcmeVault

eth_getStorageAt on chain 84532

Holds if: the slot ends with 32e8cd1d58736310340d5103ded748e3d8f434d0

curl -s https://base-sepolia-rpc.publicnode.com -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_getStorageAt","params":["0x0433CEB84dB807402DE6642929EbF1450381CC46","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","latest"]}'
python3 scripts/docs/recorded.py 'release.checks.*.b_exploit_reverts' --file docs/results/testnet-2026-11-04.json

Each re-run is an enclave run with its own page: its verdict and its attestation. How rounds work: docs/rounds.md .

The ledger

Every movement of the escrow keeps funded equal to available + reserved + paid + fees + returned. Amounts in wNEAR, which has no value on testnet.
balances

Where the escrow is

Available0.161
Reserved0.000
Paid0.240
Fees0.000
Returned0.000
Funded0.401

What came in

Deposits0.400
Forfeited bonds0.001
Challenge bonds0.000
Funded0.401

Forfeited bonds go to this program's escrow, where they pay future findings: never to us. Here, 0.001 wNEAR came in that way.

The audit

Accounted
0.401
Reservations
0 · held by the commits; equals reserved when it balances
Debt
0 · owed and not yet funded, queued in commit order
Defaulted
0
view bounty.antibody.testnet.audit({"program_id":5})

Holds if: ok: true (funded equals accounted, and reserved equals the commits' reservations)

antibody view --contract bounty.antibody.testnet --method audit --args '{"program_id":5}'

Who acts on this program's verdicts

Verdicts are NEAR state: any NEAR contract can read them and act. This one is the smallest example, a treasury that freezes when the program it watches gets a verified Critical.

guard.antibody.testnet, a DAO treasury

Owned by the Acme project and locked: its full-access key is deleted. Anyone may report a commit; the guard reads near-antibody itself and trusts the reporter for nothing. It freezes only on an attested Critical of the program it watches, on a light-client anchor, and only for the first finding of its key.

  1. The owner's first transfer went through. DpX3C6aj…, NEAR transaction: DpX3C6ajzA6JMxXzqG5Ew13aNDSppMDrrxKVoUtFPC1b, opens an explorer in a new tab
  2. D's duplicate (commit 16) was reported first: not a first finding, so the report returned false and nothing froze. C63y1vnE…, NEAR transaction: C63y1vnEr2ri8nsbYjg8sjoNUU1F3e2wj6PsWjtggPac, opens an explorer in a new tab
  3. A's attested Critical (commit 13, the solvency rule) froze it. EgbrSvLD…, NEAR transaction: EgbrSvLD7Rfx8kxHEvsJHNDWx4U6usg7YznT29cu4psX, opens an explorer in a new tab
  4. Its next transfer was refused. 79wqNDoQ…, NEAR transaction: 79wqNDoQ7iLjVPkNKFCgTGGjkxDMSEu8j8BZwsC4MqsG, opens an explorer in a new tab
  5. Then its full-access key was deleted: the guard is locked (code 7Wotb7nn…). EAHLthsR…, NEAR transaction: EAHLthsR4SasEsxnUSG48PsVzfTH2zBzrQj1bx25RB4p, opens an explorer in a new tab

The guard was added on 2026-11-06, after the recorded run, and that run's commits were reported to it then: so it froze almost two days after A's verdict, not seconds after.

Recorded in the results file under verdict_consumer (its note gives the date). The decision is one pure function, critical_finding ; how it decides: docs/verdict-guard.md .

Its state now

Reading the guard…
view guard.antibody.testnet.get_state({})

Holds if: frozen on commit 13 (A's Critical, the solvency rule)

antibody view --contract guard.antibody.testnet --method get_state