Testnet: tokens have no value, and the vulnerable contracts are our own test fixtures. Limits

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.

Try the practice program (14)

Practice program: a tutorialOpenround 0light-client confirmed

Overview

The program as near-antibody stores it. Its manifest hash commits the anchor, the targets, the rules and the terms; once it is open, the deployment's owner can change nothing it depends on.
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
view bounty.antibody.testnet.get_program({"program_id":13})

Holds if: the manifest hash shown here, as near-antibody stores it

antibody judge --program 13

Try it

A tutorial: its bug and its proof are public. Anyone can run the whole loop on testnet in a few minutes, with no account and no key; nothing here is a real vulnerability.

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

  1. Vends you a practice account for a key your browser (or the CLI) generates; the key cannot withdraw or transfer.
  2. Builds the tutorial proof against the vault assigned to you, seals it to the program's key, commits and reveals it.
  3. Waits for the verdict and its attestation on NEAR.
  4. 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

Each rule is one bit of the program's invariants contract. After a proof's calls, at the anchor, the verifier runs its check(): a set bit is a broken rule, paid by its severity. The verifier never reads a report.
The program's rules
RuleSeverityPayoutBudget per roundSource
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

The terms

Committed in the manifest with the rules, their text fixed by the terms sha256, and enforced by near-antibody: no person decides a payout.

Payouts

The payout table
SeverityPayoutRules
Criticalnonenone
Highnonenone
Mediumnonenone
Low0.001 wNEARvault_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

10.2×the largest payout
0.0102 available / 0.001 wNEAR largest

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

The program's windows
WindowLengthWhat 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

Every proof runs on the state proven at one block. A pause ticket, and the verdict guard, act only on an anchor the light client confirmed: on a project-attested anchor a verdict is about state the project chose.
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

view client-eth2.sepolia.testnet.block_hash_safe(12092947 as 8 little-endian bytes: 0x1386b80000000000)

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 13
antibody anchor-check --block 12092947

Known issues

Declared sealed before open; a later proof with the same tag is not paid again. Their count, rules and severities are public; their content stays sealed for good.
0 sealed
No known issue declared: every key this program prices was open to the first proof.

The chains

Per chain: the program's adapter, the proxies it may pause or upgrade, and every permit near-guardian asked the MPC network to sign, with the transaction that carried it there.
No chains: a practice program pauses nothing and ships no fix. Its proofs are verified and paid; no permit is ever asked for.

The tries

Every proof committed to this tutorial, practice tries labelled as such: who, when, the state, the verdict and the payout; never the proof.
15 with a zero-knowledge proof
The tries, in commit order
CommitWhoWhenStateVerdictKeysPayout
Commit 63#0 · round 0
judge-1-p13.practice.antibody.testnet, account: judge-1-p13.practice.antibody.testnetour check of a fresh practice programpaid to practice.antibody.testnet (the practice vending contract)
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.practice.antibody.testnet, account: judge-2-p13.practice.antibody.testnetour check of a fresh practice programpaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_etherabbae26a…, tag of vault_keeps_its_ether: abbae26af73f217688e8ade9bde510baded8467efc6bcda8d5f5ce3874a5a5b7
Commit 65#2 · round 0
e9c6c01dadc.practice.antibody.testnet, account: e9c6c01dadc.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_etherba3b7b9d…, tag of vault_keeps_its_ether: ba3b7b9d03ffc9856d37b1a69139b982862175d907616e3c191c9294998fbeb7
Commit 66#3 · round 0
j4nqsy.practice.antibody.testnet, account: j4nqsy.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_ether3f12a6a8…, tag of vault_keeps_its_ether: 3f12a6a819737feed8b50e34f544c36191802bb12fef2118a6d0dc6cef14cc4e
Commit 67#4 · round 0
j3qzvk.practice.antibody.testnet, account: j3qzvk.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_etherf669b028…, tag of vault_keeps_its_ether: f669b028d5773d33f0c64679a83f82c6759eb5af5feed36be40614616b98dc58
Commit 68#5 · round 0
j8wmtr.practice.antibody.testnet, account: j8wmtr.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_etherdab41779…, tag of vault_keeps_its_ether: dab41779bf12ccf4ab34fca75f7bbc767dd2bdb006094963b926cc6cfbe8d92f
Commit 69#6 · round 0
v061resume.practice.antibody.testnet, account: v061resume.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_etheref4d2b7b…, tag of vault_keeps_its_ether: ef4d2b7b7a153bf30ed4a02f46be81385eab5ce7de343b80e083310186f1dd63
Commit 70#7 · round 0
j5kvrd.practice.antibody.testnet, account: j5kvrd.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
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.practice.antibody.testnet, account: j3qzkx.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_ether02309fff…, tag of vault_keeps_its_ether: 02309fffb4ad3eb1686ed0411dd7af07b50c1fb4334e2590f9807224160806b4
Commit 73#10 · round 0
j1rqkj.practice.antibody.testnet, account: j1rqkj.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_ether14dc54d9…, tag of vault_keeps_its_ether: 14dc54d95f44660e6fbe4a306dbd6d9e6724a770f9b989671415139fc4ed39af
Commit 74#11 · round 0
j2qvzk.practice.antibody.testnet, account: j2qvzk.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_ether8344b677…, tag of vault_keeps_its_ether: 8344b67732c5e5040528f9c33ec834e5c8c2c09720c00f85980bdc609a70d563
Commit 75#12 · round 0
j3hqvw.practice.antibody.testnet, account: j3hqvw.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
No violation · bond forfeited
No violationAttested on NEARZero-knowledge proof
no rule broken
—
Commit 76#13 · round 0
j1rqkjh.practice.antibody.testnet, account: j1rqkjh.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_ether30a5fcd7…, tag of vault_keeps_its_ether: 30a5fcd74cc3d87a5fab817cea28cb045c9d9e818d3e6745b8916f672465647f
Commit 77#14 · round 0
j4rkhr.practice.antibody.testnet, account: j4rkhr.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEARZero-knowledge proof
vault_keeps_its_ethera3c0d269…, tag of vault_keeps_its_ether: a3c0d2692a201d4af08c36c276959b9ac50988f1a0b111cdfde39e775acfe3e5
Commit 78#15 · round 0
j7qzvk.practice.antibody.testnet, account: j7qzvk.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEAR
vault_keeps_its_etherd5448518…, tag of vault_keeps_its_ether: d544851866135513fbfe5d7c351963a877e4f42a65197ed53accc08e5bd9a032
Commit 79#16 · round 0
j6kqzv.practice.antibody.testnet, account: j6kqzv.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Duplicate
ViolationAttested on NEAR
vault_keeps_its_ether1c4489f7…, tag of vault_keeps_its_ether: 1c4489f727ea0e851d7c5f3ff1c4054966e5649ae4da6dde6315a8ccc588ad9f
—
Commit 80#17 · round 0
j5wmzr.practice.antibody.testnet, account: j5wmzr.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Expired
no verdict yetno verdict yet
—
—
Commit 81#18 · round 0
j5wmzr.practice.antibody.testnet, account: j5wmzr.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEAR
vault_keeps_its_ether1568ab47…, tag of vault_keeps_its_ether: 1568ab47dd59a48c2077d851953043147c18db9c57ccdd5b82c2c65870c7e23a
Commit 82#19 · round 0
j5qxkv.practice.antibody.testnet, account: j5qxkv.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEAR
vault_keeps_its_ether0b0e6bea…, tag of vault_keeps_its_ether: 0b0e6beae181ed57dfcc97c2d0c9547139c950136710cdaae2c9bb4e490dc5a2
Commit 83#20 · round 0
j8vnqd.practice.antibody.testnet, account: j8vnqd.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
Paid
ViolationAttested on NEAR
vault_keeps_its_etherf233779d…, tag of vault_keeps_its_ether: f233779d6b38b7e1790211d2cde9aee159c8950ae695121e2eef85527cc48914
Commit 84#21 · round 0
j5hpta.practice.antibody.testnet, account: j5hpta.practice.antibody.testneta visitor's practice trypaid to practice.antibody.testnet (the practice vending contract)
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 13

Rounds and the release gate

A round ships a fix as code overrides at the same anchor. The enclave checks it, every paid proof is re-run against it, and a release permit is signed only for code that every paid proof fails against.
No round yet: this program still runs its round-0 code. A round is how a fix ships, and only a fix every paid proof fails against is released.

The ledger

Every movement of the escrow keeps funded equal to available + reserved + paid + fees + returned. Amounts in wNEAR, which has no value on testnet.
balances

Where the escrow is

Available0.0102
Reserved0.0030
Paid0.0170
Fees0.0000
Returned0.0000
Funded0.0302

What came in

Deposits0.0300
Forfeited bonds0.0002
Challenge bonds0.0000
Funded0.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
view bounty.antibody.testnet.audit({"program_id":13})

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}'