Practice program — a tutorial (testnet)
A tutorial whose bug and proof are public: anyone can run a try on testnet, with no account and no key.
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: 24 vaults with one textbook bug (sweep has no access check), published with its proof (docs/practice.md).
as written in the committed manifest- Program key
- bounty.
antibody. testnet/1, program key: bounty.antibody.testnet/1 - Phase
- Open round 0this round since
- Created
- Opened
- Terms sha256
- 2a714747a7fe11e7…, terms sha256: 2a714747a7fe11e7c534424ec7c9f9b2baca7cb04928aa3aa3b69c32aeffae67
- Manifest sha256
- 3905fb2007c91c75…, manifest sha256: 3905fb2007c91c75862dfd9ef26656ff66f2702bfc0242ff3581456cde8a2a47Uploaded in NEAR transaction J8F6cDdCLZ…, NEAR transaction: J8F6cDdCLZnsHyaacxfHZBdmNF1Mjkvfi4yAYGGQn99j, opens an explorer in a new tab by antibody.testnet
- Sealing key
- f2bfcefc7746a840…, sealing public key: f2bfcefc7746a840b350f950c5cbd072d46be5d4e845f1a9d0afbbe68f31f24fProofs are sealed to it. It counts only once its activation run (run 21) is attested on NEAR.
Its record
- At stake
- 0.03wNEAR available now
- Verified attempts
- 0
- Paid findings
- 0
- First claim
- —after it opened
- Claimed in the first hour
- 0%of the escrow
- Open for
- 148.6 h
Holds if: the manifest hash shown here, as near-antibody stores it
antibody judge --program 1Try 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.
What a try does
- Vends you a practice account for a key your browser (or the CLI) generates; the key cannot withdraw or transfer.
- Builds the tutorial proof against the vault assigned to you, seals it to the program's key, commits and reveals it.
- Waits for the verdict and its attestation on NEAR.
- Allocates and pays (both permissionless), then closes the practice account: its NEAR goes back to the vending contract.
The payout goes to the vending contract's credit, which pays the next try's bond and run.
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
- factory0x76e4ca1b…c98a, factory address: 0x76e4ca1bdff8b5b2ab5312c1fc81071fda1bc98a, opens an explorer in a new tab
- vault-00x248d6f3f…d6f3, vault-0 address: 0x248d6f3fca50950f2e30175fef24b0de78ecd6f3, opens an explorer in a new tab
- vault-10xcc2bc1dc…a2ec, vault-1 address: 0xcc2bc1dc1ed4b7780c822c179bdf097efe7da2ec, opens an explorer in a new tab
- vault-20xa65036fe…389d, vault-2 address: 0xa65036fec74240a1c85830ffad6eb11fc376389d, opens an explorer in a new tab
- vault-30x28c56f19…7d21, vault-3 address: 0x28c56f19714c3828b9a81c490e1f6de7f5d97d21, opens an explorer in a new tab
- vault-40xa3815040…8344, vault-4 address: 0xa3815040911e28b62a7f0e20685a6f528ca78344, opens an explorer in a new tab
- vault-50xb5f962ff…97c4, vault-5 address: 0xb5f962ffe021990e207b016d70b6bd11cdb397c4, opens an explorer in a new tab
- vault-60xa124542f…d74f, vault-6 address: 0xa124542ffd075f9bd141351e9ffcc281c9f0d74f, opens an explorer in a new tab
- vault-70x99076c22…9ac9, vault-7 address: 0x99076c22ac4985d1a29cfddba1a7bbb1c9bd9ac9, opens an explorer in a new tab
- vault-80xaf4b4ca5…96d5, vault-8 address: 0xaf4b4ca5d89c477bd3fe29b822f7c9f457af96d5, opens an explorer in a new tab
- vault-90x2e07791c…a240, vault-9 address: 0x2e07791c6374d2e69bebd292d99e5302e9aba240, opens an explorer in a new tab
- vault-100x43c12aaf…4f84, vault-10 address: 0x43c12aafbd9a8fa935ddf249ac0d199fce774f84, opens an explorer in a new tab
- vault-110xa06e9f4d…d0d7, vault-11 address: 0xa06e9f4d25384cf783dd468d0c171d99b21ad0d7, opens an explorer in a new tab
- vault-120x11eefcaf…70d9, vault-12 address: 0x11eefcafa11262d16eabb6555e6e4bebe79b70d9, opens an explorer in a new tab
- vault-130x2a4fb8b2…c73f, vault-13 address: 0x2a4fb8b21267199df22b6fca02695afc6993c73f, opens an explorer in a new tab
- vault-140xb5ae5237…2733, vault-14 address: 0xb5ae5237dec5a33c413a3dccd6e2c06091f22733, opens an explorer in a new tab
- vault-150xd8e4876b…2129, vault-15 address: 0xd8e4876baad9f6b1864496629213abb7531d2129, opens an explorer in a new tab
- vault-160x3feb5f7e…05c4, vault-16 address: 0x3feb5f7ec42981bfb897c8f70cb15516d39f05c4, opens an explorer in a new tab
- vault-170xe92a8ff9…63f0, vault-17 address: 0xe92a8ff9c95f7c00c03f8dffe50865fb26c263f0, opens an explorer in a new tab
- vault-180xeb0a7de5…2e66, vault-18 address: 0xeb0a7de5f61ad2a79996eb8098e831efea082e66, opens an explorer in a new tab
- vault-190xd8ade625…7ae8, vault-19 address: 0xd8ade625549e482f49cb29d97d7599c845e87ae8, opens an explorer in a new tab
- vault-200xd4b6909a…a9e8, vault-20 address: 0xd4b6909ae4626681d3522b8f9d7174230024a9e8, opens an explorer in a new tab
- vault-210x136b3a51…4171, vault-21 address: 0x136b3a519160eaf7a99a8e537912be23533c4171, opens an explorer in a new tab
- vault-220xb5a53f38…d68f, vault-22 address: 0xb5a53f38a38446f021b907e05fc18f08a509d68f, opens an explorer in a new tab
- vault-230x7497e1ce…d505, vault-23 address: 0x7497e1ce8620c24d6684527b5197f5e75514d505, opens an explorer in a new tab
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
- 12054848 (opens an explorer)
- Hash
- 0xe2d79111003fc0d38855a1fa08b0aa68bc2e912485bb99f5c548cc365777f09f
- 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.4e39866d7602af93…, base witness sha256: 4e39866d7602af93ee92ad53a961e79fe9c37faff1413869ffe3a947603b86feUploaded in NEAR transaction CagvFNMdek…, NEAR transaction: CagvFNMdekiqB4pcWbrLUsFteLLFdUA5BB8PtEy8iPam, 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 1antibody anchor-check --block 12054848Known issues
The chains
The sealed feed
Rounds and the release gate
The ledger
Where the escrow is
| Available | 0.030 |
|---|---|
| Reserved | 0.000 |
| Paid | 0.000 |
| 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":1}'