Normal behavior: for a good-faith CORRUPTED outcome the entire pool (stake + bonus) is the named attacker's bounty (docs/DESIGN.md §12), paid in one claimAttackerBounty call. To protect against a mis-named attacker, the moderator may re-flag before the first claim; docs/DESIGN.md §4 states this exists so the moderator can "fix a typo'd outcome/attacker before any participant locks in the wrong distribution", and justifies first-claim finality because "a staker claiming first is exercising a correct outcome, not usurping one."
Specific issue: for good-faith CORRUPTED, the only party that can latch finality is the named attacker itself — claimAttackerBounty requires msg.sender == attacker, and claimCorrupted is gated (MustClaimBountyFirst) until the bounty is claimed, so no one else can close the window. A wrongly-named attacker therefore calls claimAttackerBounty in the same block as the flag, takes the whole pool, and latches claimsStarted; the moderator's correction to the real whitehat then reverts with OutcomeAlreadySet. The correction window §4 documents for a typo'd attacker is unenforceable in exactly the scenario it was designed for. §4's assumption that "the first claimer is exercising a correct outcome" is false here: the first — and only possible — claimer is the wrong recipient. This does not require a malicious moderator: the moderator behaves correctly (attempts the documented correction); the harmful step is the named attacker's own permissionless claim.
Root cause (src/ConfidencePool.sol):
Likelihood:
Occurs when the moderator flags good-faith CORRUPTED with the wrong attacker address — the exact "typo'd attacker" case docs/DESIGN.md §4's correction is documented to handle — and that address is adversarial.
Occurs because nothing gates the claim's timing: once named, the attacker calls claimAttackerBounty in the same block as the flag, before any correction transaction can be mined, so the documented correction window is effectively zero.
Impact:
The wrongly-named attacker receives the entire pool (stake + bonus); the correct whitehat receives nothing.
The moderator's documented remedy for a mis-named attacker (§4) cannot be applied — the correction reverts with OutcomeAlreadySet. A supported safety mechanism is unenforceable precisely where it is meant to protect.
Add as test/poc/WrongAttackerFinality.t.sol; run forge test --match-path test/poc/WrongAttackerFinality.t.sol -vvv. Forward-only, reachable registry transitions.
Output:
Give the documented attacker-correction an actual window the named attacker cannot foreclose. For example, gate claimAttackerBounty behind a short delay after the good-faith CORRUPTED flag, during which the moderator may still re-flag the attacker:
Alternatively, allow the moderator to re-flag only the attacker address for a good-faith CORRUPTED outcome while bountyClaimed == 0, so a mis-name stays correctable until value actually moves.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.