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/16, program key: bounty.antibody.testnet/16 - Phase
- Open round 0this round since
- Created
- 9M3xDwx5…, NEAR transaction: 9M3xDwx5a8HmAAxXCMP47Zx9Vob8dZhhkmeSUetm5kDt, opens an explorer in a new tab
- Opened
- HN5U3zCy…, NEAR transaction: HN5U3zCyvfndxkNBNCLsVFqoFMqyTjgfW3ML9jAPBED8, opens an explorer in a new tab
- Terms sha256
- 2a714747a7fe11e7…, terms sha256: 2a714747a7fe11e7c534424ec7c9f9b2baca7cb04928aa3aa3b69c32aeffae67
- Manifest sha256
- 9ad465ab9d345d7b…, manifest sha256: 9ad465ab9d345d7b616c71e84d8eecd39b330b55fc0c86b7e1e36305334c5241Uploaded in NEAR transaction 4UkKGKuryU…, NEAR transaction: 4UkKGKuryUD3CV34oTsaUg6cbrfSECz4BXjRpgKQKQ3h, opens an explorer in a new tab by antibody.testnet
- Sealing key
- db64feb851e0b960…, sealing public key: db64feb851e0b960f466b00938d66e113b46e52aa729cf0ae0320315b28dd005Proofs are sealed to it. It counts only once its activation run (run 225) is attested on NEAR: FLcFivGU…, NEAR transaction: FLcFivGUp133U28yL9d8FupFc1aDq7E7kQWeU1wKLj9J, opens an explorer in a new tab
Its record
- At stake
- 0.026wNEAR available now
- Verified attempts
- 4
- Paid findings
- 4
- First claim
- 38 safter it opened
- Claimed in the first hour
- 10%of the escrow
- Open for
- 7.1 h
Holds if: the manifest hash shown here, as near-antibody stores it
antibody judge --program 16Try 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
- 12096733 (opens an explorer)
- Hash
- 0xb1a91ef8a112cc5af3382208589cdc78e28cf2af6e3e8b21a545b27f904adc2f
- Its check
- confirmed by the light clientnear-antibody compared the hash with client-eth2.sepolia.testnet when the program was created.anchor_checked (LightClient): 9M3xDwx5…, NEAR transaction: 9M3xDwx5a8HmAAxXCMP47Zx9Vob8dZhhkmeSUetm5kDt, 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.ceeb8c0ca8d3ca52…, base witness sha256: ceeb8c0ca8d3ca526abd700724c1e7a48de85bbdfa096cb7fc34f2ae24e31c51Uploaded in NEAR transaction 8HciUEHdct…, NEAR transaction: 8HciUEHdctrV17b9ZnsrHPZ9TSs6oUDcJQMXtuayedA8, 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 16antibody anchor-check --block 12096733Known issues
The chains
The tries
| Commit | Who | When | State | Verdict | Keys | Payout |
|---|---|---|---|---|---|---|
Commit 105#0 · round 0 | judge-1-p16. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether0c927d8f…, tag of vault_keeps_its_ether: 0c927d8f216d0e5fe0879182d31dd35e30e0725158229081dfcff474b21784f0 | ||
Commit 106#1 · round 0 | judge-2-p16. | Paid | ViolationAttested on NEAR | vault_keeps_its_ethera841faab…, tag of vault_keeps_its_ether: a841faaba0c424b249007c89a50fca0b4882825cde511c656ef0ccd415b59eea | ||
Commit 107#2 · round 0 | filmv2d-1109. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether2e09363a…, tag of vault_keeps_its_ether: 2e09363a39f00aca1ec093dfa88196080c19eaacd927255a0b8b9cc238fb5bc7 | ||
Commit 108#3 · round 0 | judge-kfiz. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether22b655fc…, tag of vault_keeps_its_ether: 22b655fcae35e97aaf54499deb4c82f0620959a5b74024cbc1dbf6bb28ab1e14 |
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 16Rounds and the release gate
The ledger
Where the escrow is
| Available | 0.026 |
|---|---|
| Reserved | 0.000 |
| Paid | 0.004 |
| 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":16}'