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/14, program key: bounty.antibody.testnet/14 - Phase
- Open round 0this round since
- Created
- BKEimasH…, NEAR transaction: BKEimasHNRMSqFyJ7Q6KXuvoa1rxFpmPh6s69zFZBCm, opens an explorer in a new tab
- Opened
- EUsXjxH3…, NEAR transaction: EUsXjxH3NGUeXe5j1ajuS2BybkLswoUVpMihBHz2R1mP, opens an explorer in a new tab
- Terms sha256
- 2a714747a7fe11e7…, terms sha256: 2a714747a7fe11e7c534424ec7c9f9b2baca7cb04928aa3aa3b69c32aeffae67
- Manifest sha256
- 5561196dd6fe0e3f…, manifest sha256: 5561196dd6fe0e3f4e1a1e3c78759af72226ab53296a2a124a6a0d6e9adc4e67Uploaded in NEAR transaction 9dZ2mv22fB…, NEAR transaction: 9dZ2mv22fBH6FV7tx86MKpMMWLM9hnnao3BEjfatRYjg, opens an explorer in a new tab by antibody.testnet
- Sealing key
- a17388969a186cfc…, sealing public key: a17388969a186cfc804c5ad07b3a7f0980bc9df2a67f3ea08c0d7b8c68be880cProofs are sealed to it. It counts only once its activation run (run 184) is attested on NEAR: EWQJZruD…, NEAR transaction: EWQJZruDoXnMUdcyzQp5uNKxTEtRG17qVaMTUbdpgL7M, opens an explorer in a new tab
Its record
- At stake
- 0.0152wNEAR available now
- Verified attempts
- 18
- Paid findings
- 15
- First claim
- 47 safter it opened
- Claimed in the first hour
- 46.66%of the escrow
- Open for
- 15.7 h
Holds if: the manifest hash shown here, as near-antibody stores it
antibody judge --program 14Try 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 both use this program; each try lands in The tries, below. In the recorded run a try took about 44 s from vend to payout.
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
- 12094137 (opens an explorer)
- Hash
- 0x5915bff62e6965c7150e0879aec73f9f3d641d3a19feb0de0b8b2ca2ff2eb337
- Its check
- confirmed by the light clientnear-antibody compared the hash with client-eth2.sepolia.testnet when the program was created.anchor_checked (LightClient): BKEimasH…, NEAR transaction: BKEimasHNRMSqFyJ7Q6KXuvoa1rxFpmPh6s69zFZBCm, 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.d9a1bcaad13099ea…, base witness sha256: d9a1bcaad13099ea119b68cbd34e4ee1dc1426ab99d5956435d304e9a3728f4bUploaded in NEAR transaction 7kGFHKW678…, NEAR transaction: 7kGFHKW678dz4ABooJUiikhfn2Yn6TCVwur78AnWmjZT, 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 14antibody anchor-check --block 12094137Known issues
The chains
The tries
| Commit | Who | When | State | Verdict | Keys | Payout |
|---|---|---|---|---|---|---|
Commit 85#0 · round 0 | judge-1-p14. | Paid | ViolationAttested on NEAR | vault_keeps_its_etheraa7dfa4e…, tag of vault_keeps_its_ether: aa7dfa4ef9eb0130636a724d7952110fead0772baca6112f8fef9ea996da68b1 | ||
Commit 86#1 · round 0 | judge-2-p14. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherc5f4deaf…, tag of vault_keeps_its_ether: c5f4deaffcd593be8666be714a6fe573b0bae219c67273cfdc69f3c24f189215 | ||
Commit 87#2 · round 0 | s062a0432. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether9ed1f292…, tag of vault_keeps_its_ether: 9ed1f29229b6b302bc067c67ce98e00b67f8196b3c52dbf2e54267efb8dacfa6 | ||
Commit 88#3 · round 0 | j3qxvk. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether5fa88607…, tag of vault_keeps_its_ether: 5fa886075e1c718ffdc3e07592612ef869c6654c3ebfe90058da485d73c073d1 | ||
Commit 89#4 · round 0 | j2qzvn. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether274ab866…, tag of vault_keeps_its_ether: 274ab866afd8fb689cb7efed9d867b84fe2eeccde2745aa0d363ebf32f72959e | ||
Commit 90#5 · round 0 | j1qzkw. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether7e5310d0…, tag of vault_keeps_its_ether: 7e5310d05e0ea851ec72744aa506c6df93825d8713b379841cd9adbc2f7db290 | ||
Commit 91#6 · round 0 | j4qmzv. | Paid | ViolationAttested on NEAR | vault_keeps_its_etheracb7fe50…, tag of vault_keeps_its_ether: acb7fe5043b422c78f8e6087da759fc40471290a7301c3460a8f8af12f32cb0d | ||
Commit 92#7 · round 0 | j3hwpd. | No violation · bond forfeited | No violationAttested on NEAR | no rule broken | — | |
Commit 93#8 · round 0 | j5qvxm. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether266c3e77…, tag of vault_keeps_its_ether: 266c3e77ee70ced46b50798ed536425601f51ff10139ed9a545bbf690216cbf8 | ||
Commit 94#9 · round 0 | j5kpzr. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether4629d3c2…, tag of vault_keeps_its_ether: 4629d3c298db52525243d98b72af3d8a61960867ebb7160d0cd163e06d245068 | ||
Commit 95#10 · round 0 | j5mcph. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether62bef492…, tag of vault_keeps_its_ether: 62bef492d1a94cb597799b416174d088f222a8e72381bcf7cd4c2bc466ecb3bf | ||
Commit 96#11 · round 0 | j7bkmr. | Paid | ViolationAttested on NEAR | vault_keeps_its_ethercc8dfdd9…, tag of vault_keeps_its_ether: cc8dfdd9d152505937dabc824d0bde428c720a96a72192a59c67741ffb5ed4c8 | ||
Commit 97#12 · round 0 | j6qvzk. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether68363e48…, tag of vault_keeps_its_ether: 68363e487ef93b23a2cc22c59ded2c482044e85332e087e14b1fea8f05299236 | ||
Commit 98#13 · round 0 | j8snqk. | Paid | ViolationAttested on NEAR | vault_keeps_its_ethera0b98404…, tag of vault_keeps_its_ether: a0b98404781f6774c498ba8a64b935ce732dd5dc9d89fe0651748aff7a1517b9 | ||
Commit 99#14 · round 0 | m0630519. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether57eabd31…, tag of vault_keeps_its_ether: 57eabd3176da26015c8ba89238e92866e9ce62b011ab0de2191ec99f7ccde0c1 | ||
Commit 101#15 · round 0 | film1109. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ethere20de9c4…, tag of vault_keeps_its_ether: e20de9c416129c5c07eee6821e8c8b47af77d793e92788e7ef090470c8b7afd6 | ||
Commit 102#16 · round 0 | filmv2-1109. | Expired | no verdict yetno verdict yet | — | — | |
Commit 103#17 · round 0 | filmv2b-1109. | Duplicate | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etheraa7dfa4e…, tag of vault_keeps_its_ether: aa7dfa4ef9eb0130636a724d7952110fead0772baca6112f8fef9ea996da68b1 | — | |
Commit 104#18 · round 0 | filmv2c-1109. | Duplicate | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etherc5f4deaf…, tag of vault_keeps_its_ether: c5f4deaffcd593be8666be714a6fe573b0bae219c67273cfdc69f3c24f189215 | — |
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 14Rounds and the release gate
The ledger
Where the escrow is
| Available | 0.0132 |
|---|---|
| Reserved | 0.0020 |
| Paid | 0.0150 |
| 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.002 · 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":14}'