diff --git a/src/compound/MorphoGovernance.sol b/src/compound/MorphoGovernance.sol index 1839d02fd..08b8659c3 100644 --- a/src/compound/MorphoGovernance.sol +++ b/src/compound/MorphoGovernance.sol @@ -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(); @@ -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; diff --git a/src/compound/PositionsManager.sol b/src/compound/PositionsManager.sol index 2d2086617..f43c27fe4 100644 --- a/src/compound/PositionsManager.sol +++ b/src/compound/PositionsManager.sol @@ -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(); @@ -926,7 +926,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); } } @@ -936,7 +937,10 @@ 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. } @@ -944,7 +948,9 @@ contract PositionsManager is IPositionsManager, MatchingEngine { /// @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. } @@ -969,7 +975,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); } } } diff --git a/test/compound/TestGovernance.t.sol b/test/compound/TestGovernance.t.sol index c3f647811..d5cc187d0 100644 --- a/test/compound/TestGovernance.t.sol +++ b/test/compound/TestGovernance.t.sol @@ -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); }