deposit() computes mintAmount using the caller-supplied amount before the transfer occurs, then mints AssetTokens to the depositor, and only then calls token.safeTransferFrom. For fee-on-transfer tokens the AssetToken vault receives fewer underlying tokens than amount, while the depositor receives shares priced on the full nominal amount.
The exchange rate is updated via assetToken.updateExchangeRate(calculatedFee) using a fee derived from the nominal amount, not the actual tokens received. This overstates the vault's underlying balance relative to outstanding shares.
Existing LPs can exploit this: by depositing a fee-on-transfer token, the new depositor inflates the exchange rate beyond what the vault actually holds, allowing pre-existing AssetToken holders to redeem at an artificially elevated rate — extracting value that was never deposited.
Likelihood: Medium — requires an allowed fee-on-transfer ERC-20. The pattern is reproducible by any depositor using such a token.
Impact: Medium — existing LPs gain at new depositors' expense. The vault's exchange rate diverges from its real backing over time, eventually causing last-redeemers to receive less than owed. No direct fund theft from the protocol but LP-vs-LP value extraction is repeatable.
LP1 deposits standard tokens at the baseline rate. LP2 then deposits the same nominal amount of a fee-on-transfer token — the vault receives fewer underlying tokens but the exchange rate is bumped using the full nominal amount. LP1 can now redeem for more than they deposited.
Measure actual tokens received by comparing balance before and after the safeTransferFrom, then use the real received amount for both mintAmount and fee calculation:
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.