Omniscia Myso Finance Audit
GLPStakingCompartment Manual Review Findings
GLPStakingCompartment Manual Review Findings
GLP-01M: Incorrect Reward Receiver
Type | Severity | Location |
---|---|---|
Logical Fault | GLPStakingCompartment.sol:L43 |
Description:
The GLPStakingCompartment::transferCollFromCompartment
function will claim any pending WETH
fees from the fGLP
token and transfer the correct proportion to the borrowerAddr
. This behaviour is contradictory to BaseCompartment::_transferCollFromCompartment
as the latter will transfer the collateral to either the callbackAddr
or the borrowerAddr
with priority on the former if it is defined.
Impact:
Callback modules of the Myso Finance protocol will assume that they will be claiming their collateral as well as any associated rewards (i.e. in the case of AaveStakingCompartment
), however, this is not the case for the GLPStakingCompartment
which can cause those callback implementations to fail execution or misbehave in their strategy. We should note that this seems to be desirable behaviour based on the documentation of CurveLPStakingCompartment
, however, we would urge Myso Finance to revisit this approach.
Example:
19// transfer coll on repays20function transferCollFromCompartment(21 uint256 repayAmount,22 uint256 repayAmountLeft,23 address borrowerAddr,24 address collTokenAddr,25 address callbackAddr26) external {27 _transferCollFromCompartment(28 repayAmount,29 repayAmountLeft,30 borrowerAddr,31 collTokenAddr,32 callbackAddr33 );34
35 IStakingHelper(FEE_GLP).claim(address(this));36
37 // check weth token balance38 uint256 currentWethBal = IERC20(WETH).balanceOf(address(this));39
40 // transfer proportion of weth token balance41 uint256 wethTokenAmount = (repayAmount * currentWethBal) /42 repayAmountLeft;43 IERC20(WETH).safeTransfer(borrowerAddr, wethTokenAmount);44}
Recommendation:
We advise this behaviour to be mimicked by GLPStakingCompartment
as the callbackAddr
may want to liquidate the assets or perform other actions with the reward tokens claimed via the fGLP
interface.
Alleviation (c740f7c6b5ebd365618fd2d7ea77370599e1ca11):
The Myso Finance team has specified that they considered whether reward disbursement should be performed to the callback address and that they have knowingly opted to not support this type of flow.
As a result, we consider this exhibit nullified given that it represents desirable behaviour by the Myso Finance team.
GLP-02M: Inexistent Opportunistic Claim
Type | Severity | Location |
---|---|---|
External Call Validation | GLPStakingCompartment.sol:L35, L50 |
Description:
The fGLP
token that is meant to be integrated with by the GLPStakingCompartment
contains logic within fGLP::claim
that can cause it to revert
, rendering the GLPStakingCompartment
completely inoperable.
Impact:
While the likelihood of the GLP governance module voting on private claim operations is low, it would still affect the Myso Finance in a significantly adverse way. As such, we consider this exhibit of "minor" severity.
Example:
19// transfer coll on repays20function transferCollFromCompartment(21 uint256 repayAmount,22 uint256 repayAmountLeft,23 address borrowerAddr,24 address collTokenAddr,25 address callbackAddr26) external {27 _transferCollFromCompartment(28 repayAmount,29 repayAmountLeft,30 borrowerAddr,31 collTokenAddr,32 callbackAddr33 );34
35 IStakingHelper(FEE_GLP).claim(address(this));36
37 // check weth token balance38 uint256 currentWethBal = IERC20(WETH).balanceOf(address(this));39
40 // transfer proportion of weth token balance41 uint256 wethTokenAmount = (repayAmount * currentWethBal) /42 repayAmountLeft;43 IERC20(WETH).safeTransfer(borrowerAddr, wethTokenAmount);44}45
46// unlockColl this would be called on defaults47function unlockCollToVault(address collTokenAddr) external {48 _unlockCollToVault(collTokenAddr);49
50 IStakingHelper(FEE_GLP).claim(address(this));51
52 // get weth token balance53 uint256 currentWethBal = IERC20(WETH).balanceOf(address(this));54 // transfer all weth to vault55 IERC20(WETH).safeTransfer(vaultAddr, currentWethBal);56}
Recommendation:
We advise the fGLP::claim
function to be invoked opportunistically in a try-catch
block, utilizing the existing WETH
balance present in the contract to distribute its proportion and ensuring that both GLPStakingCompartment::transferCollFromCompartment
and GLPStakingCompartment::unlockCollToVault
can be invoked under all circumstances.
Alleviation (c740f7c6b5ebd365618fd2d7ea77370599e1ca11):
Both referenced IStakingHelper::claim
operations have been wrapped in try-catch
constructs, ensuring that a claim will be attempted but is not mandated to succeed and thus ensuring transfers and unlocks can occur regardless of the GLP protocol's state.