Platform: Code4rena
Start Date: 15/06/2022
Pot Size: $30,000 USDC
Total HM: 5
Participants: 55
Period: 3 days
Judge: Jack the Pug
Id: 138
League: ETH
Rank: 9/55
Findings: 1
Award: $1,723.59
๐ Selected for report: 1
๐ Solo Findings: 0
๐ Selected for report: PumpkingWok
Also found by: kirk-baird, rfa, tabish, unforgiven
1723.5939 USDC - $1,723.59
https://github.com/Badger-Finance/vested-aura/blob/v0.0.2/contracts/MyStrategy.sol#L220-L228 https://github.com/Badger-Finance/vested-aura/blob/v0.0.2/contracts/MyStrategy.sol#L288
The internal _harvest()
function defined is responsible to claim auraBAL from the aura locker and within the function it swaps them to auraBAL -> BAL/ETH BPT -> WETH -> AURA, finally it locks AURA to the locker to increase the position. For claiming auraBAL it calls LOCKER.getReward(address(this))
and it calculates the tokes earned, checking the balance before and after the claiming.
The function to get the rewards is public and any address can call it for the strategy address, and it will transfer all rewards tokens to the strategy, but in this scenario the auraBAL will remain in stuck into the contract, because they won't be counted as auraBAL earned during the next _harvest()
. Also they could not sweep because auraBAL is a protected token.
Also, the aura Locker will be able to add other token as reward apart of auraBAL, but the harvest function won't be able to manage them, so they will need to be sweep every time.
The same scenario can happen during the claimBribesFromHiddenHand()
call, the IRewardDistributor.Claim[] calldata _claims
pass as input parameters could be frontrunned, and another address can call the hiddenHandDistributor.claim(_claims)
(except for ETH rewards) for the strategy address, and like during the _harvest()
only the tokens received during the call will be counted as earned. However every token, except auraBAL can be sweep, but the _notifyBribesProcessor()
may never be called.
At every _harvest()
it checks the balance before the claim and after, to calculate the auraBAL earned, so every auraBAL transferred to the strategy address not during this call, won't be swapped to AURA.
Instead of calculating the balance before and after the claim, for both harvestโ and
claimBribesFromHiddenHand()`, the whole balance could be taken, directly after the claim.
#0 - KenzoAgada
2022-06-21T13:03:26Z
(I've marked this one as main as Alex started doing so, but other issues like #30 , #41 has sponsor's response to the issue)
#1 - GalloDaSballo
2022-07-13T22:27:55Z
Mitigated by refactoring from a delta of balance to absolute balances