Skip to content

Commit

Permalink
Merge pull request #1550 from morpho-dao/fix/spearbit-33
Browse files Browse the repository at this point in the history
Add Compound error return (Spearbit #33)
  • Loading branch information
pakim249CAL committed Dec 16, 2022
2 parents 9a624c2 + 303288c commit dba2c17
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 16 deletions.
6 changes: 3 additions & 3 deletions src/compound/MorphoGovernance.sol
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,8 @@ abstract contract MorphoGovernance is MorphoUtils {

/// ERRORS ///

/// @notice Thrown when the creation of a market failed on Compound.
error MarketCreationFailedOnCompound();
/// @notice Thrown when the creation of a market failed on Compound and kicks back Compound error code.
error MarketCreationFailedOnCompound(uint256 errorCode);

/// @notice Thrown when the input is above the max basis points value (100%).
error ExceedsMaxBasisPoints();
Expand Down Expand Up @@ -440,7 +440,7 @@ abstract contract MorphoGovernance is MorphoUtils {
address[] memory marketToEnter = new address[](1);
marketToEnter[0] = _poolToken;
uint256[] memory results = comptroller.enterMarkets(marketToEnter);
if (results[0] != 0) revert MarketCreationFailedOnCompound();
if (results[0] != 0) revert MarketCreationFailedOnCompound(results[0]);

// Same initial index as Compound.
uint256 initialIndex;
Expand Down
31 changes: 19 additions & 12 deletions src/compound/PositionsManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -125,17 +125,17 @@ contract PositionsManager is IPositionsManager, MatchingEngine {
/// @notice Thrown when the amount repaid during the liquidation is above what is allowed to be repaid.
error AmountAboveWhatAllowedToRepay();

/// @notice Thrown when the borrow on Compound failed.
error BorrowOnCompoundFailed();
/// @notice Thrown when the borrow on Compound failed and throws back the Compound error code.
error BorrowOnCompoundFailed(uint256 errorCode);

/// @notice Thrown when the redeem on Compound failed .
error RedeemOnCompoundFailed();
/// @notice Thrown when the redeem on Compound failed and throws back the Compound error code.
error RedeemOnCompoundFailed(uint256 errorCode);

/// @notice Thrown when the repay on Compound failed.
error RepayOnCompoundFailed();
/// @notice Thrown when the repay on Compound failed and throws back the Compound error code.
error RepayOnCompoundFailed(uint256 errorCode);

/// @notice Thrown when the mint on Compound failed.
error MintOnCompoundFailed();
/// @notice Thrown when the mint on Compound failed and throws back the Compound error code.
error MintOnCompoundFailed(uint256 errorCode);

/// @notice Thrown when user is not a member of the market.
error UserNotMemberOfMarket();
Expand Down Expand Up @@ -927,7 +927,8 @@ contract PositionsManager is IPositionsManager, MatchingEngine {
ICEther(_poolToken).mint{value: _amount}();
} else {
_underlyingToken.safeApprove(_poolToken, _amount);
if (ICToken(_poolToken).mint(_amount) != 0) revert MintOnCompoundFailed();
uint256 errorCode = ICToken(_poolToken).mint(_amount);
if (errorCode != 0) revert MintOnCompoundFailed(errorCode);
}
}

Expand All @@ -937,15 +938,20 @@ contract PositionsManager is IPositionsManager, MatchingEngine {
function _withdrawFromPool(address _poolToken, uint256 _amount) internal {
// Withdraw only what is possible. The remaining dust is taken from the contract balance.
_amount = CompoundMath.min(ICToken(_poolToken).balanceOfUnderlying(address(this)), _amount);
if (ICToken(_poolToken).redeemUnderlying(_amount) != 0) revert RedeemOnCompoundFailed();

uint256 errorCode = ICToken(_poolToken).redeemUnderlying(_amount);
if (errorCode != 0) revert RedeemOnCompoundFailed(errorCode);

if (_poolToken == cEth) IWETH(address(wEth)).deposit{value: _amount}(); // Turn the ETH received in wETH.
}

/// @dev Borrows underlying tokens from Compound.
/// @param _poolToken The address of the pool token.
/// @param _amount The amount of token (in underlying).
function _borrowFromPool(address _poolToken, uint256 _amount) internal {
if ((ICToken(_poolToken).borrow(_amount) != 0)) revert BorrowOnCompoundFailed();
uint256 errorCode = ICToken(_poolToken).borrow(_amount);
if (errorCode != 0) revert BorrowOnCompoundFailed(errorCode);

if (_poolToken == cEth) IWETH(address(wEth)).deposit{value: _amount}(); // Turn the ETH received in wETH.
}

Expand All @@ -970,7 +976,8 @@ contract PositionsManager is IPositionsManager, MatchingEngine {
ICEther(_poolToken).repayBorrow{value: _amount}();
} else {
_underlyingToken.safeApprove(_poolToken, _amount);
if (ICToken(_poolToken).repayBorrow(_amount) != 0) revert RepayOnCompoundFailed();
uint256 errorCode = ICToken(_poolToken).repayBorrow(_amount);
if (errorCode != 0) revert RepayOnCompoundFailed(errorCode);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion test/compound/TestGovernance.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ contract TestGovernance is TestSetup {
function testShouldRevertWhenCreatingMarketWithAnImproperMarket() public {
Types.MarketParameters memory marketParams = Types.MarketParameters(3_333, 0);

hevm.expectRevert(abi.encodeWithSignature("MarketCreationFailedOnCompound()"));
hevm.expectRevert(abi.encodeWithSignature("MarketCreationFailedOnCompound(uint256)", 9));
morpho.createMarket(address(supplier1), marketParams);
}

Expand Down

0 comments on commit dba2c17

Please sign in to comment.