function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2
require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded
sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale");
reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED);
merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds
flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check
require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1)
assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor();
IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338)
- cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only
mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner);
uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000
[PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external {
prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy");
+ require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17
forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap)
function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2
require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded
sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale");
reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED);
merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds
flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check
require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1)
assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor();
IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338)
- cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only
mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner);
uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000
function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2
require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded
sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale");
reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED);
merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds
flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check
require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1)
assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor();
IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338)
- cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only
mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner);
uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000
[PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external {
prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy");
+ require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17
forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap)
function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2
require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded
sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale");
reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED);
merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds
flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338) · - cf = reserve.collateralFactor; // no freshness check
require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only · mediation: MODIFY -> severity = CRITICAL (IMP-C1)
assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner); · uint256 cf = reserve.freshCollateralFactor();
IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000 · [PASS] test_exploit_drainsHealthyPosition() (gas: 412338)
- cf = reserve.collateralFactor; // no freshness check · require(cf.updatedAt > block.timestamp - 1 hours, "stale"); · reward = min(max(pct * fundsAtRisk, floor), cap) · function liquidate(address v, uint256 id) external { · prevHash <- headHash // append-only
mediation: MODIFY -> severity = CRITICAL (IMP-C1) · assert(obligation.ownershipTransferState == APPROVED); · merkleRoot = H(H(e1,e2), H(e3,e4)) // head 9c41e0…a7d2 · require(healthFactor(v) < 1e18, "healthy"); · + require(msg.sender == pendingOwner);
uint256 cf = reserve.freshCollateralFactor(); · IMP-C1 Critical direct theft of user funds · flashLoan(amount); _reenter(); _settle(); // guarded · sha256(payload) = 3f9a2b7c…c21e // event #17 · forge test --match-contract Vault --fuzz-runs 50000
Audit competitions
Time-boxed audits of a frozen commit. An independent judge, duplicate groups everyone can see, a scoring formula published before day one, and a 48-hour escalation window before any result is final.
- Live prize pools
- $0
- Paid to wardens
- $0
- Competitions
- 0
- Wardens
- 0
Live now 1
Upcoming 1
Judging & escalations 2
Quanta Solana Feeds
by Quanta Network
Pull-based price feeds and reporter staking on Solana.
Prize pool
$60,000
420 nSLOC 2 wardens Oct 16, 2026 – Oct 23, 2026Unfunded
RustSolana
Helix v3 Liquidation Engine
by Helix Labs
Dutch-auction liquidations and bad-debt socialization for Helix isolated markets.
Prize pool
$90,000
Escalations close
… 675 nSLOC 3 wardens Oct 11, 2026 – Oct 18, 2026Payment guarantee
SolidityEthereumArbitrum
Finished 1
Published scoring
value = points × 0.9^(n−1), split between the n duplicates. The best write-up gets +30%. Anyone can recompute their own payout.
Transparent duplicates
Every valid finding sits in a root-cause group. You see your group's size and severity and your share of it.
Judged, then escalated
An independent judge gives a reason for every decision. You get one escalation per finding before results finalize.