Protocol
Trust model and limits
Who holds which role on testnet, what a certificate does not protect, and the known limitations.
This is a testnet demo trust model, not a production one
One person, the author, holds every trusted role: the arbiter, the treasury and the full-access keys of the Bound and mock USDC contracts.
Trusted roles
| Role | Account | What it could do | Roadmap |
|---|---|---|---|
| Arbiter | arbiter.boundproto-nh26.testnet | Decides Harm claims. Could uphold a fake claim naming a colluding victim and drain any certificate up to its coverage. | A per-certificate arbiter named at publish, or a Sputnik DAO arbiter. |
| Treasury | treasury.boundproto-nh26.testnet | Receives the protocol fee, forfeited bonds and slash left after victims are paid. | A DAO-held treasury. |
| Contract key | bound-v3.boundproto-nh26.testnet | Keeps the deployer's full-access keys on the Bound and mock USDC accounts during judging so a bug can be fixed by deploying to a fresh account. Those keys could replace the code. | Delete the key or hand it to a DAO. |
You can check that the code on chain is the code in the repository: see Check the wasm yourself. The configuration has no setters; get_config returns the values fixed at init.
What a certificate means
- It proves committed capital, not good behaviour. Victims upheld by the arbiter are paid up to
coverage = reserve + allocation, shared pro rata by every arbitrated victim of the certificate. - Spend is not loss.
spentis gross routed flow.boundis a meter, andspentcan pass it by refilling the float. - Credit across services can be oversubscribed. Each service limits its own credit by
min(bound, coverage), but two services that each extend that much share one coverage pool. - Only the current certificate can pay.
verify(agent)returns the agent's last accepted certificate. An older one readsSupersededand cannot spend, but stays challengeable until its own settlement deadline; read it withget_certorlist_certs. - An expired certificate is not a deal. From
expires_aton, the view readsExpiredwithdeal=false, whilepaystill works until the settlement deadline and is metered as post-expiry spend.
Not protected
- Harm the arbiter cannot assess off chain.
- The float drained to allowlisted recipients by a hijacked agent. It is capped by
float_capand stopped byhalt(see Key confinement). - Storage deposits, which are not refundable in this version.
- Value: mock USDC has an open
mint. It is play money.
Known limitations
- Slot squatting depends on the arbiter. Freeing a squatted claim slot depends on the arbiter rejecting the junk claim in time. An arbiter that does not act leaves the slots full until the window closes, and after the deadline that still locks a late victim out. With an idle arbiter, 16 undecided claims cost the attacker only 16 half-bonds (80 USDC with the demo config).
- Refile race. A rejection frees its slot, but the attacker can refile into it in the same block, ahead of the victim. Each cycle costs one forfeited bond, yet a determined attacker can keep a late victim out until the window closes, at the latest
deadline + claim_window_secs. A real fix (a bond that grows with the number of claims, or a slot held for claims after a rejection) is out of scope for the hackathon build. - Hygiene bounty. It goes to whoever files the true predicate, which can be the operator's own sybil. It is paid from the operator's own reserve, so it is cost-neutral to the operator, and it no longer ends any liability.
- One settlement record. A certificate settled more than once keeps only the latest
Settlementthat moved funds in its view; thesettleevents carry every one. In hygiene modeauditor_returnedreports the allocation that stays locked, although nothing is returned at that point. - Conservation is not property-tested. It is proven for the pure waterfall, by one contract-level test across several windows and releases, and by hand review of the other paths, not by a property test over random call sequences.
- New view values.
Halted,Supersededanddeal. A client that acts only onVerifiedalready treats them as do not deal; a client that looks for specific bad statuses has to learn the two new ones. - Demo timers. 90 s claim window and 300 s post-expiry, so the demo runs in minutes.
- Gas allowance. When the agent key's allowance runs out, the agent cannot pay; the operator issues a new agent account and certificate.
Source: DESIGN.md, sections 7, 8 and 10.