The redeem
function in the ZENO contract does not validate whether the contract holds a sufficient USDC balance before attempting a transfer. This oversight can lead to failed transactions and permanently locked user funds, as ZENO tokens are burned before USDC is transferred.
The redeem
function allows users to burn ZENO tokens in exchange for USDC, but it does not verify if the contract has enough USDC before calling safeTransfer
:
If the contract does not have enough USDC, safeTransfer
fails, reverting the transaction after the user's ZENO tokens have already been burned.
This results in permanently lost user funds, as their ZENO balance is reduced but they receive no USDC.
The protocol lacks an emergency recovery mechanism, leaving users with no way to reclaim lost value.
The likelihood of this issue is high, as it can occur whenever redemptions exceed the contract’s USDC balance.
Manual Code Review,Hardhat
Proof of Concept (PoC) - Hardhat Test Case
I identified and confirmed this vulnerability using Hardhat, demonstrating that users can permanently lose their ZENO tokens when the contract has insufficient USDC balance.
Deploy the ZENO contract and assign an initial owner.
Mint 1000 ZENO to a user.
Do not send any USDC to the contract.
Attempt to redeem 1000 ZENO.
The transaction fails, but the user’s ZENO tokens are already burned.
Modify the redeem
function to verify if the contract holds enough USDC before burning the user's ZENO tokens:
✅ Severity: High
✅ Likelihood: High
✅ Impact: Permanent loss of user funds due to token burning without fund validation
✅ Recommended Fix Applied: Yes, add USDC balance verification before _burn
This fix ensures that redemptions only occur when the contract has sufficient USDC, preventing the loss of user funds.
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.