The ZENO contract allows the owner to mint tokens without ensuring the protocol holds sufficient USDC reserves to back them. This leads to undercollateralization, where the total ZENO supply exceeds the USDC reserves. Users redeeming ZENO tokens may receive no USDC, resulting in permanent fund loss.
https://github.com/Cyfrin/2025-02-raac/blob/89ccb062e2b175374d40d824263a4c0b601bcb7f/contracts/zeno/ZENO.sol#L34
Example Scenario
Mint ZENO Without Reserves:
The owner mints 1,000,000 ZENO without depositing any USDC into the contract.
Users Attempt Redemption:
Users redeem ZENO after the maturity date, but the contract lacks USDC to fulfill withdrawals.
Code Proof
In ZENO.sol, the mint function lacks USDC reserve checks:
Mint 1M ZENO Without Reserves:
User Redeems Tokens:
Result: Users cannot redeem ZENO tokens, rendering them worthless.
Protocol Insolvency: ZENO tokens become unbacked "IOUs" (I Owe You) with no real value.
User Fund Loss: Redeeming users receive nothing despite holding ZENO tokens.
Static analysis, manual review
Add Reserve Check to Minting
- Modify the mint function to ensure the contract holds sufficient USDC reserves:
Why This Fix Works
- The mint function now verifies that the contract’s USDC balance covers the new total ZENO supply (existing + minted tokens).
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.