Omniscia Myso Finance Audit
CurveLPStakingCompartment Manual Review Findings
CurveLPStakingCompartment Manual Review Findings
CLP-01M: Inexistent Liquidity Gauge Reward Token Sanitization
Type | Severity | Location |
---|---|---|
Logical Fault | CurveLPStakingCompartment.sol:L39-L41 |
Description:
The CurveLPStakingCompartment::_collAccountingHelper
workflow relies on the assumption that the reward token of a gauge is not equal to the collateral token as otherwise it will misbehave greatly, distributing the full token reward rather than a portion of it to the borrower on partial repayments.
Impact:
The current withdrawal mechanism will fail to function as expected if the reward token of the gauge is equal to the collateral token, a case that should be rare yet would result in potential value leak from the CurveLPStakingCompartment
.
Example:
127// check staked balance in gauge if gaugeAddr has been set128// if not staked, then liqGaugeAddr = 0 and will not withdraw or have a reward address129address _rewardTokenAddr = _liqGaugeAddr != address(0)130 ? withdrawCollFromGauge(repayAmount, repayAmountLeft)131 : address(0);132
133// now check lp token balance of compartment which will be portion unstaked (could have never been staked)134uint256 currentCompartmentBal = IERC20(collTokenAddr).balanceOf(135 address(this)136);137
138// transfer proportion of compartment lp token balance if never staked or an unlock, else all balance if staked139{140 uint256 lpTokenAmount = isUnlock || _liqGaugeAddr != address(0)141 ? currentCompartmentBal142 : (repayAmount * currentCompartmentBal) / repayAmountLeft;
Recommendation:
We advise the code of CurveLPStakingCompartment::stake
to ensure that the IStakingHelper::reward_tokens
(if supported) do not contain the loan.collToke
entry. Alternatively, we advise the CurveLPStakingCompartment::withdrawCollFromGauge
function to yield an additional argument representing the withdrawAmount
and thus supporting gauges with any type of token as CurveLPStakingCompartment::_collAccountingHelper
would distribute the exact amount withdrawn rather than a dynamic evaluation based on the call's context.
Alleviation (c740f7c6b5ebd365618fd2d7ea77370599e1ca11):
The code of CurveLPStakingCompartment::_collAccountingHelper
function was updated to disburse token rewards of a liquidity gauge solely when the reward token is not the collTokenAddr
thus alleviating this exhibit's concerns utilizing an alternative approach than the one we advised.
CLP-02M: Potential Increase of Profitability
Type | Severity | Location |
---|---|---|
Standard Conformity | CurveLPStakingCompartment.sol:L30 |
Description:
The CurveLPStakingCompartment::stake
function will permit only a loan's borrower
to invoke its staking mechanism, thereby disallowing other authorized modules such as the callbackAddr
of CurveLPStakingCompartment::transferCollFromCompartment
to stake the underlying collateral to a gauge.
Impact:
Automatic strategies that wish to integrate with Myso Finance will be negatively impacted by the inability to stake a loan's collateral within a liquidity gauge thereby maximizing its potential value.
Example:
26function stake(uint256 gaugeIndex) external {27 DataTypesPeerToPeer.Loan memory loan = ILenderVaultImpl(vaultAddr).loan(28 loanIdx29 );30 if (msg.sender != loan.borrower) {31 revert Errors.InvalidSender();32 }
Recommendation:
We advise the logic of CurveLPStakingCompartment::stake
to allow staking to be performed by either a loan's borrower or an authorized party of the borrower. This can be achieved via multiple approaches, including ECDSA signatures, a typical approve
workflow with approval stored on CurveLPStakingCompartment
, adjustment of the DataTypesPeerToPeer.Loan
structure to include authorized members, and more.
Alleviation (c740f7c6b5ebd365618fd2d7ea77370599e1ca11):
The Myso Finance team opted to apply the second approach we recommended, introducing an approvedStaker
mapping to the CurveLPStakingCompartment
that is set by the loan's borrower and is authorized to invoke the CurveLPStakingCompartment::stake
function.
CLP-03M: Unrestricted Support of Token Reward Flow
Type | Severity | Location |
---|---|---|
Logical Fault | CurveLPStakingCompartment.sol:L105-L108 |
Description:
The CurveLPStakingCompartment::stake
function does not sanitize the gauge being staked to as having a single reward token, thereby permitting a multi-token reward gauge to be staked and the rewards accumulated to be lost.
Impact:
Any value acquired from staking into a multi-token reward gauge will be permanently lost within the CurveLPStakingCompartment
contract.
Example:
86function withdrawCollFromGauge(87 uint256 repayAmount,88 uint256 repayAmountLeft89) internal returns (address _rewardTokenAddr) {90 address _liqGaugeAddr = liqGaugeAddr;91
92 uint256 currentStakedBal = IERC20(_liqGaugeAddr).balanceOf(93 address(this)94 );95
96 // withdraw proportion of gauge amount97 uint256 withdrawAmount = (repayAmount * currentStakedBal) /98 repayAmountLeft;99
100 IStakingHelper(CRV_MINTER_ADDR).mint(_liqGaugeAddr);101
102 try IStakingHelper(_liqGaugeAddr).reward_tokens(0) returns (103 address rewardTokenAddr104 ) {105 if (rewardTokenAddr != address(0)) {106 _rewardTokenAddr = rewardTokenAddr;107 IStakingHelper(_liqGaugeAddr).claim_rewards();108 }109
110 IStakingHelper(_liqGaugeAddr).withdraw(withdrawAmount);111 } catch {112 IStakingHelper(_liqGaugeAddr).withdraw(withdrawAmount);113 }114}
Recommendation:
We advise the code of CurveLPStakingCompartment
to either prohibit multi-token reward gauges to be staked into within CurveLPStakingCompartment::stake
, or the code of both the CurveLPStakingCompartment::withdrawCollFromGauge
and CurveLPStakingCompartment::_collAccountingHelper
functions to be updated introducing support for multi-token reward gauges.
Alleviation (c740f7c6b5ebd365618fd2d7ea77370599e1ca11):
The code of both CurveLPStakingCompartment::_collAccountingHelper
and CurveLPStakingCompartment::_withdrawCollFromGauge
have been significantly revamped to support all types of liquidity gauges and all potential reward tokens they may support.
As such, we consider this exhibit fully alleviated.