Practice program in fork mode — a tutorial (testnet)
The practice program in fork mode: its vaults exist only inside the verifier, which deploys them from the manifest on the anchor's state.
locked: false. The recorded run on the locked deployment (2026-11-04) is programs 5 (Acme Lend), 6 (practice) and 7 (fork mode).Overview
- Project
- antibody.testnet, account: antibody.testnet · ours
- Description
TUTORIAL TARGET deployed only inside the verifier (fork mode): 24 vaults with one textbook bug (docs/fork-mode.md).
as written in the committed manifest- Program key
- bounty.
antibody. testnet/3, program key: bounty.antibody.testnet/3 - Phase
- Open round 0this round since
- Created
- Opened
- 3wSMtaFV…, NEAR transaction: 3wSMtaFVwwXUuaP8AqHRsYwfAvpKhZTYgXTQKEfiLaFq, opens an explorer in a new tab
- Terms sha256
- 2a714747a7fe11e7…, terms sha256: 2a714747a7fe11e7c534424ec7c9f9b2baca7cb04928aa3aa3b69c32aeffae67
- Manifest sha256
- 5c0fe5c6afb48740…, manifest sha256: 5c0fe5c6afb48740a91463fc39d7c8b5c687c848374636061fc745e2fbd85763Uploaded in NEAR transaction GJSxJH4aUM…, NEAR transaction: GJSxJH4aUMPoqU6k9od2KEerwCYmTwHgBQoMYRjX5SLi, opens an explorer in a new tab by antibody.testnet
- Sealing key
- 888d0fb0a5a26cc2…, sealing public key: 888d0fb0a5a26cc2e3f332c03c15780a1b1431aa1b35742a3a30b9fa2cc11e43Proofs are sealed to it. It counts only once its activation run (run 25) is attested on NEAR: b8Xo1cCF…, NEAR transaction: b8Xo1cCFB1HzAoQjqgSioPEa6JWfqfquxD6uKujVF3u, opens an explorer in a new tab
Its record
- At stake
- 0.029wNEAR available now
- Verified attempts
- 1
- Paid findings
- 1
- First claim
- 12 minafter it opened
- Claimed in the first hour
- 3.33%of the escrow
- Open for
- 147.2 h
Holds if: the manifest hash shown here, as near-antibody stores it
antibody judge --program 3Try it
One rule, one textbook bug
Each of 24 small vaults holds a little ether, and its sweep(to) has no access check: anyone can send a vault's ether anywhere. The proof is one call to your vault; at the anchor the vault loses its ether, so vault_keeps_its_ether breaks. Each vault is its own target, so each try is its own finding.
antibody try --name <you>The browser try and the CLI use the practice vending contract's program, program 14.
Fork mode: the vaults exist only inside the verifier
The manifest commits the transactions that deploy the factory, its 24 vaults and the rule. The verifier runs them in its own copy of the chain, on the anchor's state, before any proof: no staging deployment. So a vault's address has no code on Sepolia, and the proof was still verified, attested on NEAR and paid.
Holds if: "0x": no code at 0xfa35e1e9… on Sepolia
curl -s https://ethereum-sepolia-rpc.publicnode.com -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_getCode","params":["0xfa35e1e99bd69719f57045409e19555f0147cf44","latest"]}'The rules as code
| Rule | Severity | Payout | Budget per round | Source |
|---|---|---|---|---|
vault_keeps_its_etherbit 0 No practice vault loses its ether. | Low | 0.001 wNEAR | 0.03 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 (25) on Sepolia: deployed only inside the verifier
- factory0x69eca311…909e, factory address: 0x69eca3119e9e7e076a060e87155e80a9d777909e
- vault-00xc1bd97d2…22fa, vault-0 address: 0xc1bd97d27c29f6a653581dda4cdb2809fc1222fa
- vault-10x6924428a…f906, vault-1 address: 0x6924428aed4dd44c5b754f962a7f31b50b80f906
- vault-20x6f4c61b8…d7fa, vault-2 address: 0x6f4c61b849faae5fa4ef1de84767a5ef8f53d7fa
- vault-30xfa35e1e9…cf44, vault-3 address: 0xfa35e1e99bd69719f57045409e19555f0147cf44
- vault-40x85cef399…0d5c, vault-4 address: 0x85cef39992fa490e433ad25d1a4c1034632d0d5c
- vault-50x74a5e315…4a5f, vault-5 address: 0x74a5e315647cc0e4668811fa2e6894746dae4a5f
- vault-60x888ce025…932c, vault-6 address: 0x888ce0250d4811f147395c46b535041f485d932c
- vault-70xbb5c4d1a…3ad7, vault-7 address: 0xbb5c4d1af776d3c4b3bd5f6b0585d4b4cba63ad7
- vault-80x5c3eee84…9c36, vault-8 address: 0x5c3eee8456682a70bf848d929c1bb25509939c36
- vault-90x61bfd687…8ef3, vault-9 address: 0x61bfd687ab0103bfea2329d50632bc4821f28ef3
- vault-100x3f6285d8…887e, vault-10 address: 0x3f6285d839787cd684a88af18bc30944b118887e
- vault-110xd6205af7…14d5, vault-11 address: 0xd6205af77080b12bc6012c3b82ef4bf72fae14d5
- vault-120x92fb6550…602c, vault-12 address: 0x92fb6550caf158b358ca7940a1515b7d06eb602c
- vault-130x70a753fb…da72, vault-13 address: 0x70a753fbbf56856e27da28f8da51c2f410c0da72
- vault-140xb6b41dce…6b04, vault-14 address: 0xb6b41dced232b3211597a72080ffcfa987016b04
- vault-150xea9c9ee0…2fe0, vault-15 address: 0xea9c9ee0ebc2e6a7526dced66edf8911d7f02fe0
- vault-160xe1ca474b…7708, vault-16 address: 0xe1ca474bfae0d91b2604b8c0d2c544f064387708
- vault-170xa80baf4c…754a, vault-17 address: 0xa80baf4c0d85dede9621edfec5d515e8da64754a
- vault-180x59143608…6a2e, vault-18 address: 0x59143608af450528f2bddc60c7ffa32664b06a2e
- vault-190x8894e2cc…29d8, vault-19 address: 0x8894e2ccadb840f0e53527254fed92e69b1729d8
- vault-200x02854dcd…d68d, vault-20 address: 0x02854dcd3553361c4c4ef41b9177f25bdd66d68d
- vault-210x43b6d414…325d, vault-21 address: 0x43b6d41487dea6f50ac68c37a8d60494ae50325d
- vault-220x0c6a6715…586d, vault-22 address: 0x0c6a67159614135d743dc3d15e0a7a99f6de586d
- vault-230x8707a59a…0dea, vault-23 address: 0x8707a59ae327e436878dc4d853058b63822b0dea
The terms
Payouts
| Severity | Payout | Rules |
|---|---|---|
| Critical | none | none |
| High | none | none |
| Medium | none | none |
| Low | 0.001 wNEAR | vault_keeps_its_ether |
- Bond per commit
- 0.0001 wNEAR · refunded, or forfeited to this program's escrow when the proof breaks nothing
- Instant payments
- up to 0.001 wNEAR
When a payout is instant
Paid in seconds when the verdict is attested on NEAR, within 0.024 wNEAR per 1 h. Otherwise a payout waits the challenge window; above the cap it also needs an agreeing second run.
- Challenge bond
- 0.001 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
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
- No rule pauses anything.
- Known issues
- None allowed.
- Gap lane
- Off.
- Unevaluable
- A proof the rules cannot evaluate (check() reverts or runs out of gas) is refunded.
The windows
| Window | Length | What 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
- Chain
- Sepolia (11155111)
- Block
- 12055610 (opens an explorer)
- Hash
- 0x7abf2c838e6b13585937c0373c749dfebb710e8f02415fafe380ff087bb29d08
- Its check
- confirmed by the light clientnear-antibody compared the hash with client-eth2.sepolia.testnet when the program was created.
- Base witness
- The anchor state the rules and the round-0 checks read, proven against the anchor and pinned at activation.b8ec861518480974…, base witness sha256: b8ec861518480974ecc79cb177be655c2d571d4418a0dae50ee238a34d873b2dUploaded in NEAR transaction HMkZzsf76u…, NEAR transaction: HMkZzsf76uh6Ef4WhZVEUwKFGDm3ioKQ7hL2ECf7dgaa, opens an explorer in a new tab by antibody.testnet
Check the hash yourself
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 3antibody anchor-check --block 12055610Known issues
The chains
The sealed feed
| Commit | Who | When | State | Verdict | Keys | Payout |
|---|---|---|---|---|---|---|
Commit 10#0 · round 0 | agent-c.antibody.testnet, account: agent-c.antibody.testnetour fixture agent C | Paid | ViolationAttested on NEAR | vault_keeps_its_ether6d9e7d2a…, tag of vault_keeps_its_ether: 6d9e7d2adef216f045725f0eb34522d8bbf878fca4c60c7515a9af5396ff1a60 |
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 3Rounds and the release gate
The ledger
Where the escrow is
| Available | 0.029 |
|---|---|
| Reserved | 0.000 |
| Paid | 0.001 |
| Fees | 0.000 |
| Returned | 0.000 |
| Funded | 0.030 |
What came in
| Deposits | 0.030 |
|---|---|
| Forfeited bonds | 0.000 |
| Challenge bonds | 0.000 |
| Funded | 0.030 |
Forfeited bonds go to this program's escrow, where they pay future findings: never to us.
The audit
- Accounted
- 0.03
- Reservations
- 0 · held by the commits; equals reserved when it balances
- Debt
- 0 · owed and not yet funded, queued in commit order
- Defaulted
- 0
Holds if: ok: true (funded equals accounted, and reserved equals the commits' reservations)
antibody view --contract bounty.antibody.testnet --method audit --args '{"program_id":3}'