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/13, program key: bounty.antibody.testnet/13 - Phase
- Open round 0this round since
- Created
- 6K9hzKNX…, NEAR transaction: 6K9hzKNXYRUPegzG5PsV4NLBW4xRwC4pUS2xPh5ST1ny, opens an explorer in a new tab
- Opened
- CKwr4PoX…, NEAR transaction: CKwr4PoXg2XETc1GgKzH7wnmVjJo95KmQcwuZEfbV7Qa, opens an explorer in a new tab
- Terms sha256
- 2a714747a7fe11e7…, terms sha256: 2a714747a7fe11e7c534424ec7c9f9b2baca7cb04928aa3aa3b69c32aeffae67
- Manifest sha256
- 83e8be42079439ec…, manifest sha256: 83e8be42079439ecbf8d631eba198e86cbd3a2f9e32ea79413d9c8841b0be68cUploaded in NEAR transaction CRA3qw5uyL…, NEAR transaction: CRA3qw5uyL6TGQErcos4gcXbX4ZygJecTCua8otxJ9SB, opens an explorer in a new tab by antibody.testnet
- Sealing key
- 15833510b2b630f5…, sealing public key: 15833510b2b630f53bda29fd43aab31caac40f1abe3d80d2b8d974ef3ce0662bProofs are sealed to it. It counts only once its activation run (run 142) is attested on NEAR: DAZqDExn…, NEAR transaction: DAZqDExnca5SWukXfeSCBd6Y2GU48vWhkszPnoZAxYkN, opens an explorer in a new tab
Its record
- At stake
- 0.0132wNEAR available now
- Verified attempts
- 21
- Paid findings
- 17
- First claim
- 39 safter it opened
- Claimed in the first hour
- 6.66%of the escrow
- Open for
- 20.1 h
Holds if: the manifest hash shown here, as near-antibody stores it
antibody judge --program 13Try 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
- 12092947 (opens an explorer)
- Hash
- 0xca36846a27e063823e6f06075d50e324f25fa77207dabc096ba8bd2bb1376eb8
- Its check
- confirmed by the light clientnear-antibody compared the hash with client-eth2.sepolia.testnet when the program was created.anchor_checked (LightClient): 6K9hzKNX…, NEAR transaction: 6K9hzKNXYRUPegzG5PsV4NLBW4xRwC4pUS2xPh5ST1ny, 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.278f2e64643326d6…, base witness sha256: 278f2e64643326d667657c14aab5d9a1c37d453a559052a123f55161c32fd14eUploaded in NEAR transaction HkDdRwxvK1…, NEAR transaction: HkDdRwxvK1brLPphH9GyvSnxDaq4Yvaxut2vAd59gwkK, 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 13antibody anchor-check --block 12092947Known issues
The chains
The tries
| Commit | Who | When | State | Verdict | Keys | Payout |
|---|---|---|---|---|---|---|
Commit 63#0 · round 0 | judge-1-p13. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ether1c4489f7…, tag of vault_keeps_its_ether: 1c4489f727ea0e851d7c5f3ff1c4054966e5649ae4da6dde6315a8ccc588ad9f | ||
Commit 64#1 · round 0 | judge-2-p13. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etherabbae26a…, tag of vault_keeps_its_ether: abbae26af73f217688e8ade9bde510baded8467efc6bcda8d5f5ce3874a5a5b7 | ||
Commit 65#2 · round 0 | e9c6c01dadc. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etherba3b7b9d…, tag of vault_keeps_its_ether: ba3b7b9d03ffc9856d37b1a69139b982862175d907616e3c191c9294998fbeb7 | ||
Commit 66#3 · round 0 | j4nqsy. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ether3f12a6a8…, tag of vault_keeps_its_ether: 3f12a6a819737feed8b50e34f544c36191802bb12fef2118a6d0dc6cef14cc4e | ||
Commit 67#4 · round 0 | j3qzvk. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etherf669b028…, tag of vault_keeps_its_ether: f669b028d5773d33f0c64679a83f82c6759eb5af5feed36be40614616b98dc58 | ||
Commit 68#5 · round 0 | j8wmtr. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etherdab41779…, tag of vault_keeps_its_ether: dab41779bf12ccf4ab34fca75f7bbc767dd2bdb006094963b926cc6cfbe8d92f | ||
Commit 69#6 · round 0 | v061resume. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etheref4d2b7b…, tag of vault_keeps_its_ether: ef4d2b7b7a153bf30ed4a02f46be81385eab5ce7de343b80e083310186f1dd63 | ||
Commit 70#7 · round 0 | j5kvrd. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ether6d35725a…, tag of vault_keeps_its_ether: 6d35725a9481e02e85bcfd26d22404a9e66bede56fbebb53f59542257138cb99 | ||
Commit 71#8 · round 0 | Duplicate | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_etheref4d2b7b…, tag of vault_keeps_its_ether: ef4d2b7b7a153bf30ed4a02f46be81385eab5ce7de343b80e083310186f1dd63 | — | ||
Commit 72#9 · round 0 | j3qzkx. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ether02309fff…, tag of vault_keeps_its_ether: 02309fffb4ad3eb1686ed0411dd7af07b50c1fb4334e2590f9807224160806b4 | ||
Commit 73#10 · round 0 | j1rqkj. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ether14dc54d9…, tag of vault_keeps_its_ether: 14dc54d95f44660e6fbe4a306dbd6d9e6724a770f9b989671415139fc4ed39af | ||
Commit 74#11 · round 0 | j2qvzk. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ether8344b677…, tag of vault_keeps_its_ether: 8344b67732c5e5040528f9c33ec834e5c8c2c09720c00f85980bdc609a70d563 | ||
Commit 75#12 · round 0 | j3hqvw. | No violation · bond forfeited | No violationAttested on NEARZero-knowledge proof | no rule broken | — | |
Commit 76#13 · round 0 | j1rqkjh. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ether30a5fcd7…, tag of vault_keeps_its_ether: 30a5fcd74cc3d87a5fab817cea28cb045c9d9e818d3e6745b8916f672465647f | ||
Commit 77#14 · round 0 | j4rkhr. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ethera3c0d269…, tag of vault_keeps_its_ether: a3c0d2692a201d4af08c36c276959b9ac50988f1a0b111cdfde39e775acfe3e5 | ||
Commit 78#15 · round 0 | j7qzvk. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherd5448518…, tag of vault_keeps_its_ether: d544851866135513fbfe5d7c351963a877e4f42a65197ed53accc08e5bd9a032 | ||
Commit 79#16 · round 0 | j6kqzv. | Duplicate | ViolationAttested on NEAR | vault_keeps_its_ether1c4489f7…, tag of vault_keeps_its_ether: 1c4489f727ea0e851d7c5f3ff1c4054966e5649ae4da6dde6315a8ccc588ad9f | — | |
Commit 80#17 · round 0 | j5wmzr. | Expired | no verdict yetno verdict yet | — | — | |
Commit 81#18 · round 0 | j5wmzr. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether1568ab47…, tag of vault_keeps_its_ether: 1568ab47dd59a48c2077d851953043147c18db9c57ccdd5b82c2c65870c7e23a | ||
Commit 82#19 · round 0 | j5qxkv. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether0b0e6bea…, tag of vault_keeps_its_ether: 0b0e6beae181ed57dfcc97c2d0c9547139c950136710cdaae2c9bb4e490dc5a2 | ||
Commit 83#20 · round 0 | j8vnqd. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherf233779d…, tag of vault_keeps_its_ether: f233779d6b38b7e1790211d2cde9aee159c8950ae695121e2eef85527cc48914 | ||
Commit 84#21 · round 0 | j5hpta. | Duplicate | ViolationAttested on NEAR | vault_keeps_its_etherba3b7b9d…, tag of vault_keeps_its_ether: ba3b7b9d03ffc9856d37b1a69139b982862175d907616e3c191c9294998fbeb7 | — |
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 13Rounds and the release gate
The ledger
Where the escrow is
| Available | 0.0102 |
|---|---|
| Reserved | 0.0030 |
| Paid | 0.0170 |
| 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.003 · 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":13}'