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.
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/6, program key: bounty.antibody.testnet/6 - Phase
- Open round 0this round since
- Created
- 99uBeRv7…, NEAR transaction: 99uBeRv7HFCpARobTcwdRu2MBW6PJhANtVZpwLdvtFfh, opens an explorer in a new tab
- Opened
- 3gdnQrPH…, NEAR transaction: 3gdnQrPHBNRuiRdNCWgasKVn5qgQvxLfo6bNrwXdybxQ, opens an explorer in a new tab
- Terms sha256
- 2a714747a7fe11e7…, terms sha256: 2a714747a7fe11e7c534424ec7c9f9b2baca7cb04928aa3aa3b69c32aeffae67
- Manifest sha256
- e275b02e2cb1d88f…, manifest sha256: e275b02e2cb1d88f47b51c2a93ea71a0ae8ba43851d3d6b262bfb690aca5b347Uploaded in NEAR transaction DTXZYpH5Lp…, NEAR transaction: DTXZYpH5Lp51qtCdYkJgPLjBucHmM7zeuPhxqXhtAcJd, opens an explorer in a new tab by antibody.testnet
- Sealing key
- ea66fa087c57c5b3…, sealing public key: ea66fa087c57c5b32066c97a9791b0c1d5cfa2e96db22ea33cc693d0a91b764fProofs are sealed to it. It counts only once its activation run (run 52) is attested on NEAR: BnH55CpC…, NEAR transaction: BnH55CpC9ew1bCWRkoVM8femdKyDMN8axJyvmc4Q7tFd, opens an explorer in a new tab
Its record
- At stake
- 0.0202wNEAR available now
- Verified attempts
- 12
- Paid findings
- 10
- First claim
- 47 safter it opened
- Claimed in the first hour
- 6.66%of the escrow
- Open for
- 120.8 h
Holds if: the manifest hash shown here, as near-antibody stores it
antibody judge --program 6Try 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
- factory0x3811928b…a3d3, factory address: 0x3811928b0cf5326adcd7d1937e645835d130a3d3, opens an explorer in a new tab
- vault-00xa7b45e6d…654e, vault-0 address: 0xa7b45e6d1e7d9f488e219e273836d17f9489654e, opens an explorer in a new tab
- vault-10x90c1b227…c811, vault-1 address: 0x90c1b2271452a26b58b612467f0b25f102d6c811, opens an explorer in a new tab
- vault-20x43689b96…a6cd, vault-2 address: 0x43689b969e15fe77db867266edc2e028f3c6a6cd, opens an explorer in a new tab
- vault-30xce0e5e7b…edd5, vault-3 address: 0xce0e5e7be89913778ee2250f6e51da4e1bbeedd5, opens an explorer in a new tab
- vault-40x185d4f6a…e56a, vault-4 address: 0x185d4f6a747091760f39adbe66a3a414ce8fe56a, opens an explorer in a new tab
- vault-50x3c93d9ef…c1c1, vault-5 address: 0x3c93d9efa9322b7e61f1203eeb02ae6f105dc1c1, opens an explorer in a new tab
- vault-60xec83ccd2…91a9, vault-6 address: 0xec83ccd28e904b9773aea89d66d06cd614a491a9, opens an explorer in a new tab
- vault-70xc321c950…ebd9, vault-7 address: 0xc321c95007818fd00f74b8ac2099a00267ecebd9, opens an explorer in a new tab
- vault-80x48f155b1…bf76, vault-8 address: 0x48f155b18bd0fdce9e73c018dbec32fbf5e2bf76, opens an explorer in a new tab
- vault-90x5ed35bd3…5b94, vault-9 address: 0x5ed35bd3e2586aa3ea288b9dd72e5093496e5b94, opens an explorer in a new tab
- vault-100x8aecbf27…a8b6, vault-10 address: 0x8aecbf2766de14405a1ff69978cac08b8c61a8b6, opens an explorer in a new tab
- vault-110x3fdcf28f…340a, vault-11 address: 0x3fdcf28f87c8d5214517f3775bd588f79416340a, opens an explorer in a new tab
- vault-120xc7eb957e…3594, vault-12 address: 0xc7eb957ea47c1bfef6260465d5d9018532423594, opens an explorer in a new tab
- vault-130xb37f3f2c…5684, vault-13 address: 0xb37f3f2cae77ddce3e3d55fc04ba2ba373885684, opens an explorer in a new tab
- vault-140xfe8c0d8f…2071, vault-14 address: 0xfe8c0d8fed4d283d3d5c5d36bb75141da8fc2071, opens an explorer in a new tab
- vault-150x012849ff…9ea6, vault-15 address: 0x012849ff2ab346fef70a86f2923b45d5c0cc9ea6, opens an explorer in a new tab
- vault-160x51e66035…90b7, vault-16 address: 0x51e660357de82b8fb6e33af6cca7f24ad04a90b7, opens an explorer in a new tab
- vault-170xe0f9e4ab…8669, vault-17 address: 0xe0f9e4abcd980c94a86f4ceec61d73b3adef8669, opens an explorer in a new tab
- vault-180xa828ec08…44b9, vault-18 address: 0xa828ec08588df5b71c5a027bac2bbb68ddc844b9, opens an explorer in a new tab
- vault-190x83cb21ef…9ae4, vault-19 address: 0x83cb21ef40d1b7f7eb895818513163180ed19ae4, opens an explorer in a new tab
- vault-200x27bce7d1…3a7c, vault-20 address: 0x27bce7d176b7103fc76b37a2f44706cb7f9b3a7c, opens an explorer in a new tab
- vault-210x198b8abf…652f, vault-21 address: 0x198b8abf4fb07d9fb7074012e5227b5106ee652f, opens an explorer in a new tab
- vault-220x40c8ae46…2f72, vault-22 address: 0x40c8ae46d71df902c8e7f3e5681ab67a4fed2f72, opens an explorer in a new tab
- vault-230x6712ab45…734a, vault-23 address: 0x6712ab453c36edaac5d19cb147dd68c67608734a, 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
- 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): 99uBeRv7…, NEAR transaction: 99uBeRv7HFCpARobTcwdRu2MBW6PJhANtVZpwLdvtFfh, 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.bed565c109e123dd…, base witness sha256: bed565c109e123ddc1b7bce134e15bd8ad95a1bed94d3f6fd2a631e05ab0ed39Uploaded in NEAR transaction Hzdxw2Ai4x…, NEAR transaction: Hzdxw2Ai4xCwEmMgfL3ktdvkNTMG5Ym6yC644wzYLZmq, 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 6antibody anchor-check --block 12063269Known issues
The chains
The tries
| Commit | Who | When | State | Verdict | Keys | Payout |
|---|---|---|---|---|---|---|
Commit 20#0 · round 0 | judge-1-p6. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ethercc52c19a…, tag of vault_keeps_its_ether: cc52c19a12305290fa0b15741d08f4ec325bacf4242cdef37f4b153e13c33e51 | ||
Commit 21#1 · round 0 | judge-2-p6. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether799a12eb…, tag of vault_keeps_its_ether: 799a12eb298b584978405584ad1c7e40b7dfe278333a7b29b13815821ddb75b1 | ||
Commit 23#2 · round 0 | pcs-rehearsal. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether9990e991…, tag of vault_keeps_its_ether: 9990e991d8bcee767113d2bfb18a2100da8db6f5f1be40db08339fb7ce91453c | ||
Commit 24#3 · round 0 | judge-lrb2. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether3d033ead…, tag of vault_keeps_its_ether: 3d033ead15c63a63185e5b4535711b803aeb7bc41a65009f713c584be316f78b | ||
Commit 25#4 · round 0 | site-check. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether3819758f…, tag of vault_keeps_its_ether: 3819758f5bf9959a08ac811a8848d42799527427ce06f861e61e8c225c68e906 | ||
Commit 26#5 · round 0 | cli-check-t0. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether8f7cd6c8…, tag of vault_keeps_its_ether: 8f7cd6c86c1bedbfffcd681acd957641755c479f48eb7b6e75a02dcedbe5f35d | ||
Commit 27#6 · round 0 | byo-alpha. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether94f9aa81…, tag of vault_keeps_its_ether: 94f9aa81ba1a5a2316e0c856a2a2d5dd498aff858bd921a91909ff8dd50f49c3 | ||
Commit 28#7 · round 0 | byo-beta. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether8be58560…, tag of vault_keeps_its_ether: 8be585601aa3caa6b91f5701ead5e7b232fa0c11f6b95ec69bec3196b5997421 | ||
Commit 29#8 · round 0 | byo-wrong. | No violation · bond forfeited | No violationAttested on NEAR | no rule broken | — | |
Commit 30#9 · round 0 | byo-invalid. | No violation · bond forfeited | InvalidPoCAttested on NEAR | no rule broken | — | |
Commit 31#10 · round 0 | rel-linux-check. | Paid | ViolationEnclave verdict | vault_keeps_its_etherb1831ae6…, tag of vault_keeps_its_ether: b1831ae630301d8ff80e357f3cab1488ed6df2af4be300868bb17ebf78df9d14 | ||
Commit 32#11 · round 0 | scrn-k7q2-1107. | Paid | ViolationEnclave verdict | vault_keeps_its_ether0dcba24f…, tag of vault_keeps_its_ether: 0dcba24fe1693d9b35e78967d7a6817a02325aceaa5eacc697209bab8692800a |
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 6Rounds and the release gate
The ledger
Where the escrow is
| Available | 0.0202 |
|---|---|
| Reserved | 0.0000 |
| Paid | 0.0100 |
| Fees | 0.0000 |
| Returned | 0.0000 |
| Funded | 0.0302 |
What came in
| Deposits | 0.0300 |
|---|---|
| Forfeited bonds | 0.0002 |
| Challenge bonds | 0.0000 |
| Funded | 0.0302 |
Forfeited bonds go to this program's escrow, where they pay future findings: never to us. Here, 0.0002 wNEAR came in that way.
The audit
- Accounted
- 0.0302
- 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":6}'