Backd Tokenomics contest - dipp's results

Maximize the power of your assets and start earning yield

General Information

Platform: Code4rena

Start Date: 27/05/2022

Pot Size: $75,000 USDC

Total HM: 20

Participants: 58

Period: 7 days

Judge: GalloDaSballo

Total Solo HM: 15

Id: 131

League: ETH

Backd

Findings Distribution

Researcher Performance

Rank: 44/58

Findings: 1

Award: $159.01

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

159.0051 USDC - $159.01

Labels

bug
QA (Quality Assurance)
resolved
sponsor confirmed

External Links

1. AddressProvider.sol does not have a getSwapperRouter function

Line References

FeeBurner.sol#L126

AddressProvider.sol

Impact

In FeeBurner.sol, the _swapperRouter function gets the swapper router from the address provider. The AddressProvider.sol and IAddressProvider.sol contracts do not seem to have a getSwapperRouter function. If the _addressProvider in FeeBurner.sol is the AddressProvider.sol contract or implements IAddressProvider.sol then FeeBurner.sol would not function correctly or at all.

Proof of concept

The _swapperRouter function is called in the burnToTarget function which should then revert thus making burnToTarget uncallable.

Add the getSwapperRouter function in the AddressProvider.sol and IAddressProvider.sol contracts.

2. Incompatibility with deflationary/rebase/fee-on-transfer tokens in FeeBurner.sol

Line References

FeeBurner.sol#L85

Impact

In the burnToTarget function of FeeBurner.sol, if the tokens being transferred are tokens whose balances change during a transfer such as deflationary and fee-on-transfer tokens, then the swap could fail since the swap input amount might be larger than the actual amount of tokens received in FeeBurner.sol.

When tokens are transferred to the contract, check the balance of the contract before and after the transfer. Use the difference in the balances as the input amount for the swap call.

3. Return value for mint is not checked in InflationManager.sol

Line References

InflationManager.sol#L81

Minter.sol#L126-L135

Impact

In Minter.sol, if inflation has not started and lastEvent == 0 then the mint function will return false. In InflationManager.sol, the mintRewards function does not check the return value for the mint call. When mintRewards is called by a gauge and fails, the transaction does not revert.

Proof of Concept

When calling claimRewards in AmmGauge.sol, the call to mintRewards does not revert if minting has failed and the user loses their rewards.

function claimRewards(address beneficiary) external virtual override returns (uint256) { require( msg.sender == beneficiary || _roleManager().hasRole(Roles.GAUGE_ZAP, msg.sender), Error.UNAUTHORIZED_ACCESS ); _userCheckpoint(beneficiary); uint256 amount = perUserShare[beneficiary]; if (amount <= 0) return 0; perUserShare[beneficiary] = 0; controller.inflationManager().mintRewards(beneficiary, amount); emit RewardClaimed(beneficiary, amount); return amount; }

The KeeperGauge.sol and LpGauge.sol contracts would fail in a similar way in addition to any other gauges that call mintRewards.

Consider either returning a bool value for the mintRewards function in InflationManager.sol and check the return value in the gauges or insert the mint call in a require,

require(Minter(minter).mint(beneficiary, amount))

#0 - GalloDaSballo

2022-06-21T00:18:54Z

1. AddressProvider.sol does not have a getSwapperRouter function

Great find!!

## 2. Incompatibility with deflationary/rebase/fee-on-transfer tokens in FeeBurner.sol Agree as non-critical

3. Return value for mint is not checked in InflationManager.sol

Great find!

The findings in this report are very unique, good job!

#1 - GalloDaSballo

2022-06-23T17:40:34Z

Actually after re-review finding 3 is not valid as _mint always returns true or reverts

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax © 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter