Reproduced Exploit

Super DCA — H-4: Bucket rewards wiped by stake/unstake before accrue

After rewards accrue on a bucket, any stake/unstake resets lastRewardIndex to current rewardIndex. Subsequent accrueReward sees delta 0 → paid = 0.

Sep 2025Otheruntagged2 min read

Chain

Other

Category

untagged

Date

Sep 2025

Source

AuditVault

EVM Playground

Source-level debugger — step opcodes and Solidity in sync

evm-hack-analyzer

The attack is replayed in an in-browser EVM preloaded with the exact dumped fork state. The execution tree shows every call; step by Solidity line or by opcode across all depths — source, Stack, Memory, Storage, Balances (native / ERC-20 / NFT), Transient storage and Return value stay in sync. Click a tree node, opcode, or source line to jump. No backend, no live RPC.

Loading fork state…

Source & credit. Reproduction of a public audit finding curated by AuditVault — the original finding: 63422-h-4-bucket-rewards-will-be-wiped-by-stakeunstake-before-accr. Standalone Foundry PoC and full write-up: 63422-h-4-bucket-rewards-will-be-wiped-by-stakeunstake-before-accr_exp in the evm-hack-registry mirror.


Vulnerability classes: state-update · reward-theft · reward-accounting

Reproduction: self-contained Foundry PoC, forge-std only.

AuditVault taxonomy: severity/high · sector/staking · platform/sherlock · state-update · reward-accounting


Key info#

ImpactHIGH — up to 100% of pending bucket rewards lost
ProtocolSuperDCAStaking
Vulnerable codeunstake sets lastRewardIndex = rewardIndex without settling
Bug classIndex reset without accrual
FindingSherlock · 2025-09-super-dca · #63422

TL;DR#

After rewards accrue on a bucket, any stake/unstake resets lastRewardIndex to current rewardIndex. Subsequent accrueReward sees delta 0 → paid = 0.

The vulnerable code#

SOLIDITY
info.lastRewardIndex = rewardIndex; // @> VULN in unstake/stake
// FIX: settle pending bucket rewards first

Diagrams#

sequenceDiagram participant User participant Staking participant Gauge User->>Staking: stake Note over Staking: rewards accrue index 50 to 100 User->>Staking: unstake 1 wei Note over Staking: lastRewardIndex equals 100 Gauge->>Staking: accrueReward Staking-->>Gauge: paid equals 0

Impact#

Stakers lose accrued rewards whenever stake/unstake races before gauge settlement.

Sources#


Sources & further analysis#

Reproductions & code

Alerts & third-party analyses

  • Web3Sec X hacked database: search.
  • Rekt leaderboard: search.
  • Solodit incident search: search.

These dashboards index community alerts tweets, post-mortems, and independent write-ups. Reach them through the protocol name above to cross-check this reproduction against other analyses.