The _harvestAndReport()
function in StrategyMainnet
relies on transmuter.getClaimableBalance()
to determine the total assets. However, it does not actually claim these funds, nor are they included in the final _totalAssets
calculation. As a result, the reported assets do not accurately reflect the strategy’s true holdings.
Note, that both StrategyArb
and StrategyOP
contracts have the same Issue.
I will refer to StrategyMainnet
contract at all times for consistency and ease of reading.
Within _harvestAndReport
function, the claimable
balance is obtained from the transmuter
but never claimed, this can be seen on L178-191 of StrategyMainnet
contract.
Consequently, the strategy’s final asset count omits these claimable funds. The comments on L151-159 suggest that most accurate accounting of current assets was intended, yet the omission introduces a discrepancy.
This inaccurate total asset calculation, when used downstream (in the report()
function of TokenizedStrategy
, L2387 of the contract on tokenizedStrategyAddress
defined in BaseStrategy
contract, an abstract contract the StrategyMainnet
contract is built on), leads to faulty recalculations and incorrect behaviour.
This can be seen in function report
defined on L2372. The function assumes that newTotalAssets
is equal to the value returned by IBaseStrategy(address(this)).harvestAndReport()
call, where address(this)
is address of StrategyMainnet
contract, since call to the TokenizedStrategy
is done via delegateCall
from BaseStrategy
contract by Keepers
. This is obviously incorrect, since the real newTotalAssets
must include all of the assets in the vault. This inconsistency will lead to incorrect calculations down the flow of the report
function.
Omitting claimable but unclaimed funds from the total assets could cause:
Misstated profit/loss reporting.
Incorrect protocol accounting.
Possible long-term insolvency scenarios if the logic perpetuates over multiple reporting cycles.
Potential financial loss for users and the protocol due to mispriced shares and erroneous fee assessments.
Manual review.
Update _harvestAndReport()
to claim the funds from the transmuter
before returning the _totalAssets
.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.