There's an issue in the Zeno and USDC parity due to lack of accounting regarding difference of decimals.
Zero is an ERC20 inherited from openzeppelin which doesn't modify the existing decimals, therefore it will have 18 decimals. USDC, on the ethereum mainnet, has 6 decimals.
Not taking the difference in decimals will lead to incorrect accounting in Zeno.sol and Auction.sol.
https://github.com/Cyfrin/2025-02-raac/blob/main/contracts/zeno/Auction.sol#L84-L97
https://github.com/Cyfrin/2025-02-raac/blob/main/contracts/zeno/ZENO.sol#L34-L40
https://github.com/Cyfrin/2025-02-raac/blob/main/contracts/zeno/ZENO.sol#L46-L63
For example, if the input is in 18 decimals.
And for example, if the input is in 6 decimals.
Incorrect accounting due to usdc having 6 decimals and zeno having 18 decimals. The flow of Auction.buy() -> Zeno.mint() -> Zeno.redeem() will not work. In the input is in 18 decimals the TX it will revert. If it's in 18 decimals, a very small amount of Zeno tokens will be minted.
Manual Review.
Need to account for the difference in decimals. One solution can be to assume function inputs are done with 18 decimals (since zero was 18 decimals), and when transferring usdc take into account the usdc.decimals().
In Zeno.redeem()
In Auction.buy()
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.