Reviewers / Economics
A reviewer's role is to sign verdicts that survive challenge. This page is the math behind that role: what they earn, what they post, what gets slashed, and where the slashed share goes.
Numbers tagged "working schedule" source from the public table on /staking, where they are explicitly marked "subject to change." Numbers tagged "constant" are written into the v0.1 contract and locked behind admin upgrade. Both kinds will be re-affirmed at deploy.
What a reviewer earns
| Item | Amount | Asset | Source |
|---|---|---|---|
| Reviewer fee on accepted bounty | 3% of payout_max | USDC | SettlementModule.REVIEWER_FEE_BPS = 300 (constant) |
| Slashed-submission share (reviewer cut) | 40% of slashed bonds on the bounty | BOUNTY | SLASH_REVIEWER_BPS = 4000 (constant) |
Reviewer fee is paid only when the bounty pays a hunter. If every
submission is rejected (i.e., winningSubmissionId == 0) or
the verdict is overturned in dispute, the reviewer fee is not paid and
the sponsor is refunded.
What a reviewer puts at risk
To take any verdict assignment, a reviewer must hold a registered
bond in BOUNTY. The bond is locked in VerdictModule and
cannot be moved while assigned to an active bounty.
| Parameter | Value | Source |
|---|---|---|
| Minimum bond floor | 1,000,000 BOUNTY | MIN_REVIEWER_BOND (constant) |
| Scaling rate | 1% of payout_max | BOND_RATIO_BPS = 100 (constant) |
| Required bond formula | max(MIN_REVIEWER_BOND, payout_max × BOND_RATIO_BPS / 10_000) | VerdictModule.requiredBondForBounty(payoutMax) |
The bond is at risk if a verdict is challenged and overturned. The challenge dispatch contract is the upgrade hook; v0.1 ships the hook surface and admin-only resolution; v0.2 plugs in a Chainlink Functions resolver for permissionless, oracle-attested challenge resolution. The reviewer's locked bond covers the dispute slash even if the reviewer is offline.
Scaling stake floor
A reviewer assigned to a $1,000 bounty needs the floor (1M BOUNTY)
posted. A reviewer assigned to a $1,000,000 bounty needs at least
1,000,000 × 100 / 10_000 = 10,000 USDC equivalent in
BOUNTY — but this number is denominated in the BOUNTY token at its
market price at registration. A reviewer with the floor can take any
bounty up to the point where 1% scaling exceeds 1M BOUNTY; beyond that,
they must top up.
VerdictModule.requiredBondForBounty(payoutMax) is a pure
helper that returns the floor or the scaled value, whichever is larger.
Tools and indexers can read this on-chain to display "you need X more
BOUNTY to take this assignment."
Slashed-submission share
When a hunter submission is judged spam, gibberish, or sufficiently
bad-faith that it should not be returned, the reviewer marks it
slashed in the verdict. The slashed hunter's base bond
(paid in BOUNTY at submission time) is then split:
| Recipient | Share of slashed bond | Source |
|---|---|---|
| Reviewer | 40% | SLASH_REVIEWER_BPS = 4000 (constant) |
| Treasury (fee recipient) | 30% | SLASH_TREASURY_BPS = 3000 (constant) |
Burn (0xdEaD) | 30% | SLASH_BURN_BPS = 3000 (constant) |
The reviewer share is the incentive to actually filter spam. The burn share keeps spam from being a net-positive game for the protocol. Honest hunters whose submissions are not slashed get their base bond back at settlement — the above-base portion (the EIP-1559 escalator surcharge) is burned at submission time regardless.
Pool reviewers and the 12-hour window
Sponsors propose a specific reviewer when they create a bounty. That
reviewer has a 12-hour window to accept or reject. If they reject, or
if 12 hours pass without action, the bounty becomes poolable:
any registered reviewer with sufficient bond can call
claimPoolBounty(bountyId) and become the assigned reviewer.
This means the protocol does not stall when a proposed reviewer is
offline or declines, and reviewers who watch the pool can earn fees
even without sponsor pre-selection. The 12-hour window is a constant
— BountyEscrow.REVIEWER_REJECT_WINDOW = 12 hours.
Worked example
A sponsor creates a $1,000 bounty (payout_max = 1,000 USDC,
baseBond = 100 BOUNTY). Five hunters submit; the reviewer
accepts hunter #3, slashes hunter #5 for spam, returns hunters #1, #2,
and #4's base bonds. After the challenge window passes:
| Recipient | USDC | BOUNTY |
|---|---|---|
| Hunter #3 (winner) | 960 | + base bond 100 returned |
| Reviewer | 30 | + 40 (slash share) |
| Treasury (fee recipient) | 5 | + 30 (slash share) |
| Burn address | 5 | + 30 (slash share) |
| Hunters #1, #2, #4 | 0 | + base bond 100 each returned |
| Hunter #5 (slashed) | 0 | full base bond lost |
The 1% protocol fee on the $1,000 payout is split 50/50: 5 USDC burned
at 0xdEaD, 5 USDC routed to the fee recipient. The 50/50
split is constant in v0.1 (PROTOCOL_FEE_BURN_BPS = 5000).
Hunters #2 to #5 also paid an above-base BOUNTY surcharge at submission
(the EIP-1559 escalator), all of which was burned at submission time;
the example shows only the base bond returns.
Withdrawal
A reviewer can call unregisterReviewer() at any time when
they are not the assigned reviewer on an active (Funded / InReview /
Queued / Disputed) bounty. Their full locked bond returns to their
wallet immediately — there is no cooldown or vesting on the bond
itself. The economic gate on leaving is: any active assignment must be
completed first.
Working schedule
All reviewer-facing percentages on this page (3% reviewer fee, 1% bond scaling, 40 / 30 / 30 slash split, 1M BOUNTY floor, 12-hour reject window, 50/50 protocol-fee burn) are encoded as constants in v0.1 and will be re-confirmed at deploy. The fee router downstream of the protocol fee (60% stakers / 25% team / 15% treasury) is the working schedule on /staking, marked "subject to change" on that page; ratification at Cautio deploy.