The pool assumes the stake token is a standard ERC20 (no transfer fees, no rebasing). The deposit side records the actually-received amount via balance-diff (received = balanceAfter − balanceBefore), so fee-on-transfer deposits are credited correctly; after resolution, each claim / withdraw / sweep pays out the accounted liabilities.
The compatibility bug is on the outbound side and the balance assumption: the contract calls safeTransfer with the accounted payout, implicitly assuming "pool balance is always ≥ tracked liabilities, and the recipient receives exactly what is sent." For a fee-on-transfer token the recipient gets payout − fee, so every claim/withdraw is silently under-paid; for a negative-rebasing / fee-on-sender token the pool balance erodes independently of tracked liabilities until balanceOf(pool) < tracked liabilities, so the last claim reverts on insufficient balance and principal is permanently locked. There is no on-chain guard or token-type probe.
Likelihood:
The factory owner adds a fee-on-transfer or rebasing token to allowedStakeToken. This is not an exotic mistake: stETH (rebasing), PAXG (0.02% transfer fee), and USDT (a built-in owner-toggleable fee switch) are all mainstream blue-chips an operator could plausibly allowlist as safe collateral
An already-allowlisted token (e.g. USDT) later enables a fee / becomes rebasing, while existing pools are locked to that token and cannot switch
Impact:
Fee-on-transfer: stakers / recovery are under-paid the transfer fee on every claim / withdraw / sweep, leaking value continuously
Negative-rebasing / fee-on-sender: the pool balance erodes below tracked liabilities, later claims revert on insufficient balance, and principal is permanently locked
(a) Fee-on-transfer under-payment (test/audit/I01_FeeOnTransferCompat.t.sol, 1% fee token):
(b) Negative-rebasing permanent lockup (test/audit/I01_RebasingLockup.t.sol):
Prefer rejecting known fee-on-transfer / rebasing tokens at the factory level, and institutionalize the "non-standard ERC20 unsupported" assumption as a pre-listing token probe.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.