Core Contracts

Regnum Aurum Acquisition Corp
HardhatReal World AssetsNFT
77,280 USDC
View results
Submission Details
Severity: high
Valid

Decimal mismatch in `redeem()` function leads to excessive USDC transfer

Summary

The redeem() function in ZENO contract transfers USDC without accounting for the decimal difference between ZENO (18 decimals) and USDC (6 decimals).

Vulnerability Details

The redeem() function directly uses the ZENO amount for USDC transfer:

function redeem(uint amount) external nonReentrant {
if (!isRedeemable()) {
revert BondNotRedeemable();
}
if (amount == 0) {
revert ZeroAmount();
}
uint256 totalAmount = balanceOf(msg.sender);
if (amount > totalAmount) {
revert InsufficientBalance();
}
totalZENORedeemed += amount;
_burn(msg.sender, amount);
USDC.safeTransfer(msg.sender, amount);
}

But it's incorrect because ZENO has 18 decimals while USDC has 6 decimals.

Impact

Users can receive 1e12 times more USDC than intended when redeeming their ZENO tokens.

Recommendations

Adjust the USDC transfer amount by scaling down the ZENO amount by 12 decimals to match USDC's 6 decimal places.

Updates

Lead Judging Commences

inallhonesty Lead Judge 7 months ago
Submission Judgement Published
Validated
Assigned finding tags:

Decimal precision mismatch between ZENO token (18 decimals) and USDC (6 decimals) not accounted for in redemption, causing calculation errors and incorrect payments

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!