Core Contracts

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

FeeCollector burn tax refund leads to incorrect token burn amount

Summary

When the FeeCollector is distributing via _processDistributions() the collected fees, it burns part of the them. However, it receives a portion back due to the burn tax mechanism in RAACToken, resulting in fewer tokens being burned than intended.

Vulnerability Details

The FeeCollector::_processDistributions() function attempts to burn a portion of collected fees by calling RAACToken::burn(). However, the RAACToken contract applies a burn tax on all burns, sending a portion back to the fee collector:

// RAACToken.sol
function burn(uint256 amount) external {
uint256 taxAmount = amount.percentMul(burnTaxRate);
_burn(msg.sender, amount - taxAmount);
if (taxAmount > 0 && feeCollector != address(0)) {
_transfer(msg.sender, feeCollector, taxAmount);
}
}

This creates a circular issue where:

  1. FeeCollector tries to burn X tokens

  2. RAACToken burns (X - burnTax) tokens

  3. burnTax tokens are sent back to FeeCollector

  4. These returned tokens remain in the FeeCollector and are used in the next distribution instead of being burned

Proof of Concept

  1. FeeCollector collects 1000 RAAC tokens in fees

  2. During distribution, it attempts to burn 100 RAAC (10% burn share)

  3. With a 0.5% burn tax rate:

    • Actually burns: 99.5 RAAC

    • Returns to FeeCollector: 0.5 RAAC

  4. Result: Only 99.5 tokens are burned instead of intended 100

// FeeCollector.sol
function _processDistributions(uint256 totalFees, uint256[4] memory shares) internal {
if (shares[1] > 0) raacToken.burn(shares[1]); // Burn share gets partially refunded
// ...
}

Impact

  • Protocol burns fewer tokens than intended by design

  • Accumulation of "refunded" tokens in the FeeCollector that should have been burned

Recommendations

Implement a mechanism for bypassing the burn tax for the FeeCollector, either by creating a new function in RAACToken, or modifying the existing one.

Updates

Lead Judging Commences

inallhonesty Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Support

FAQs

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

Give us feedback!