Core Contracts

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

User will redeem less USDC than supplied when bidding

Summary

User will redeem less USDC than he should due to incorrect redeem ratio.

Vulnerability Details

The buy allow users to bid on ZENO auction

function buy(uint256 amount) external whenActive {
require(amount <= state.totalRemaining, "Not enough ZENO remaining");
uint256 price = getPrice();
uint256 cost = price * amount;
@> require(usdc.transferFrom(msg.sender, businessAddress, cost), "Transfer failed");
bidAmounts[msg.sender] += amount;
state.totalRemaining -= amount;
state.lastBidTime = block.timestamp;
state.lastBidder = msg.sender;
zeno.mint(msg.sender, amount);
emit ZENOPurchased(msg.sender, amount, price);
}

An issue with the current implementation is that, when transferring the USDC, the amount is calculated as price * amount and the total (cost) is then passed to the transferFrom, and minting ZENO, just the amount is passed to it, this will mean that the USDC provided is not the ZENO minted.(USDC provided is higher than zeno minted)

However when redeeming, There is 1:1 conversion of USDC to ZENO , causing user recived less USDC amount than provided

Impact

User redeem less USDC than he supplied, resulting in loss of funds.

Tools Used

Manual review

Recommendations

Use the correct conversion of USDC to zeno when redeem.

Updates

Lead Judging Commences

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

ZENO.sol implements fixed 1:1 redemption with USDC regardless of auction purchase price, breaking zero-coupon bond economics and causing user funds to be permanently lost

Support

FAQs

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