The create() and update() functions lack validation for depositFee and redeemFee, enabling administrators to set fees exceeding 100%. This could result in complete loss of user funds during deposits/redemptions or denial-of-service by making transactions economically impossible.
Fee Representation:
Fees use 18-decimal fixed-point (1e18 = 100%)
Stored as uint256, allowing values up to 1.15e77 (far beyond 100%)
Exploit Scenarios:
Malicious Admin: Sets depositFee = 2e18 (200%) → Users lose all deposited funds + extra
Accidental Misconfiguration: Admin typo (e.g., 1000000000000000000 → 10000000000000000000) sets 1000% fee
Protocol Impact:
Fees applied via amount * fee / 1e18 would invert returns:
| Severity | Consequences |
|---|---|
| High | • Direct Fund Theft: Fees >100% let admins siphon user assets |
• Broken Economics: Fees ≥100% block deposits/redemptions entirely
• Reputation Damage: Users lose trust in protocol safety
• Governance Attack: Compromised admin keys could drain vaults
Example Attack Flow:
Attacker gains admin privileges (via compromise or malicious proposal)
Sets redeemFee = 1.5e18 (150%)
Users attempting to redeem $100 receive:
Result: All redemptions fail, funds permanently locked.
Add explicit fee validation in both functions:
Event Emission:
Log fee changes for transparency:
Input Sanitization:
Reject fees exceeding a safe threshold (e.g., 20%):
Multi-Sig Enforcement:
Require multiple signers for fee changes above 5%.
Timelock:
Implement a 24-72 hour delay for fee adjustments to allow user exits.
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.