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/10, program key: bounty.antibody.testnet/10 - Phase
- Open round 0this round since
- Created
- gJsienFk…, NEAR transaction: gJsienFknEiJ9KTJ3BTTfDo61nYWCadCZa8VPpQEnn1, opens an explorer in a new tab
- Opened
- Ccruyr4L…, NEAR transaction: Ccruyr4LxtRdGsKXdx2ncjxnrp6MWEdouik7thDC3SGF, opens an explorer in a new tab
- Terms sha256
- 2a714747a7fe11e7…, terms sha256: 2a714747a7fe11e7c534424ec7c9f9b2baca7cb04928aa3aa3b69c32aeffae67
- Manifest sha256
- 526e4d5274449d70…, manifest sha256: 526e4d5274449d7048ea608f02169488549ca7e8f5e8b3c7bbd684f5ea292756Uploaded in NEAR transaction A6wBAHk4Nm…, NEAR transaction: A6wBAHk4Nme51fcJaWQfRyYrxxVJw44K8QWzMBe9DmhM, opens an explorer in a new tab by antibody.testnet
- Sealing key
- 2a3af0cb17da8b3b…, sealing public key: 2a3af0cb17da8b3bd3580a661aef9f05c017c76e415479fe76b2867f06023e72Proofs are sealed to it. It counts only once its activation run (run 72) is attested on NEAR: GBg56RY4…, NEAR transaction: GBg56RY4DSxfCJC5rQkPKyPYTZB8t51Zw1Kp6r9MJmnx, opens an explorer in a new tab
Its record
- At stake
- 0.01wNEAR available now
- Verified attempts
- 20
- Paid findings
- 20
- First claim
- 44 safter it opened
- Claimed in the first hour
- 46.66%of the escrow
- Open for
- 32.8 h
Holds if: the manifest hash shown here, as near-antibody stores it
antibody judge --program 10Try 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
- 12089348 (opens an explorer)
- Hash
- 0x59f9880611cab3ba91102b11f01373c761bf5f23f1437a0b0b53c20982090762
- Its check
- confirmed by the light clientnear-antibody compared the hash with client-eth2.sepolia.testnet when the program was created.anchor_checked (LightClient): gJsienFk…, NEAR transaction: gJsienFknEiJ9KTJ3BTTfDo61nYWCadCZa8VPpQEnn1, 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.fabfae18046d84a9…, base witness sha256: fabfae18046d84a980776a07b58a1ce5deb47f68fc5117af45b63071de0c3be9Uploaded in NEAR transaction 9xMMerJUZo…, NEAR transaction: 9xMMerJUZojupXuaUvwfE53ryRe2nk9RpmweionLYiQt, 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 10antibody anchor-check --block 12089348Known issues
The chains
The tries
| Commit | Who | When | State | Verdict | Keys | Payout |
|---|---|---|---|---|---|---|
Commit 36#0 · round 0 | judge-1-p10. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether1ed22db0…, tag of vault_keeps_its_ether: 1ed22db050433d873244ff02d63f61705235d6c903a3fd1ecc84b5a82b7184cf | ||
Commit 37#1 · round 0 | judge-2-p10. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherccf8c519…, tag of vault_keeps_its_ether: ccf8c5191bb97d757c6c88c1d7c3a6b2fd20bc0c47018a3f4c564c23d97eb543 | ||
Commit 38#2 · round 0 | m11080904-00. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether1bde8d8b…, tag of vault_keeps_its_ether: 1bde8d8bc0f4729b399d611ba635eff8471d064bc729ad88c9c11f3f687365bb | ||
Commit 39#3 · round 0 | m11080904-01. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether683215c3…, tag of vault_keeps_its_ether: 683215c3927d5aa76c8ef5ed7d78e7ac0208b25456eeab5692ed54c1bf601c06 | ||
Commit 40#4 · round 0 | m11080904-02. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether57d0a221…, tag of vault_keeps_its_ether: 57d0a221757991adb38f5d45d42af422ad92c5801d4f06d689de651b1fa5a707 | ||
Commit 41#5 · round 0 | m11080904-03. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether0fe4a23a…, tag of vault_keeps_its_ether: 0fe4a23afba19da52860b442b7e556d84added7b2720aa955092f160514afaa7 | ||
Commit 42#6 · round 0 | m11080904-04. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether237c5048…, tag of vault_keeps_its_ether: 237c5048a958cdca08d2b3243cdaae09d77527db0c17e0f9b814a4604c9fd7b6 | ||
Commit 43#7 · round 0 | m11080904-05. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether46b4382c…, tag of vault_keeps_its_ether: 46b4382c82f61db7c2e900a59a86c514d02ad6bebfc6714103539d898dcff7d9 | ||
Commit 44#8 · round 0 | m11080904-06. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherf86b1358…, tag of vault_keeps_its_ether: f86b1358e6663a4f5bd3bb60ab64fa88eb2120a8eb5d052f85e9437cce9a90c4 | ||
Commit 45#9 · round 0 | m11080904-07. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherb6c39c37…, tag of vault_keeps_its_ether: b6c39c3713ffa4ebdf96325d0dc460fc7aaad713f7b0bbd07afbc7b3ffd093cd | ||
Commit 46#10 · round 0 | m11080904-08. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherc90c44b3…, tag of vault_keeps_its_ether: c90c44b3b9f90130e24410fb977a1ad7d9a08e31c1844ddc0ac3a1cfc69ed356 | ||
Commit 47#11 · round 0 | m11080904-09. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether3dc9b3fb…, tag of vault_keeps_its_ether: 3dc9b3fbc56fb5d89b1fb1a957760631e1381b9cb66c93e3621521d020fd109b | ||
Commit 48#12 · round 0 | m11080919-00. | Paid | ViolationAttested on NEAR | vault_keeps_its_ethere3c3a593…, tag of vault_keeps_its_ether: e3c3a593960fc9842b0015436490c6fef0d577752fdec46318adfaafbd651e33 | ||
Commit 49#13 · round 0 | m11080919-01. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether29672889…, tag of vault_keeps_its_ether: 29672889e2cf714a1e42b13c81e90ffe120c87d075cca910a68d0c73ed7d9d4e | ||
Commit 50#14 · round 0 | m11080919-02. | Paid | ViolationAttested on NEAR | vault_keeps_its_ethere2dbc5d6…, tag of vault_keeps_its_ether: e2dbc5d6f125c8db6e7cf3245315b24edddd5b6fc1523e2bfabfc69ee139471f | ||
Commit 51#15 · round 0 | m11080919-03. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherfc75e439…, tag of vault_keeps_its_ether: fc75e43995c70c12e98fa8d4f96c7dc68ed68df88c2b122522bc5adf1ab96965 | ||
Commit 52#16 · round 0 | m11080919-04. | Paid | ViolationAttested on NEAR | vault_keeps_its_etherac21c9a3…, tag of vault_keeps_its_ether: ac21c9a375fa2479488765e2116ed277d0196f3faf79da5718831b898b5313ea | ||
Commit 53#17 · round 0 | m11080919-05. | Paid | ViolationAttested on NEAR | vault_keeps_its_ether55db494b…, tag of vault_keeps_its_ether: 55db494bc9bf545b117d8bced5a9cb4fa1ba5e6680f03af357c868e2011f7a55 | ||
Commit 54#18 · round 0 | scrn8k2qz1108. | Paid | ViolationAttested on NEARZero-knowledge proof | vault_keeps_its_ethere785acba…, tag of vault_keeps_its_ether: e785acba2b52668fee0a29acc2dd146b01f367b798636fdcacd66c15b4502924 | ||
Commit 62#19 · round 0 | pcs-check. | Paid | ViolationEnclave verdictZero-knowledge proof | vault_keeps_its_etherd6dc341d…, tag of vault_keeps_its_ether: d6dc341d7e4a15f3f2cb66266a12099c27838232d7c678e84b6dde21eb84602a |
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 10Rounds and the release gate
The ledger
Where the escrow is
| Available | 0.010 |
|---|---|
| Reserved | 0.000 |
| Paid | 0.020 |
| 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":10}'