From 921af2f626e2d64af439011b3041e3115042338b Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Wed, 31 Aug 2022 04:54:15 +0530 Subject: [PATCH] refactor + resolve stack too deep --- .../connectors/compound-iii/helpers.sol | 59 ++++++- .../mainnet/connectors/compound-iii/main.sol | 166 +++++------------- 2 files changed, 102 insertions(+), 123 deletions(-) diff --git a/contracts/mainnet/connectors/compound-iii/helpers.sol b/contracts/mainnet/connectors/compound-iii/helpers.sol index 500329dc..597d9044 100644 --- a/contracts/mainnet/connectors/compound-iii/helpers.sol +++ b/contracts/mainnet/connectors/compound-iii/helpers.sol @@ -2,6 +2,7 @@ pragma solidity ^0.7.0; pragma abicoder v2; +import { TokenInterface } from "../../common/interfaces.sol"; import { DSMath } from "../../common/math.sol"; import { Basic } from "../../common/basic.sol"; import { CometInterface, CometRewards } from "./interface.sol"; @@ -10,6 +11,16 @@ abstract contract Helpers is DSMath, Basic { CometRewards internal constant cometRewards = CometRewards(0x1B0e765F6224C21223AeA2af16c1C46E38885a40); + struct BorrowWithdrawParams { + address market; + address token; + address from; + address to; + uint256 amt; + uint256 getId; + uint256 setId; + } + function getBaseToken(address market) internal view @@ -99,7 +110,7 @@ abstract contract Helpers is DSMath, Basic { if (from == address(0)) { data = abi.encodeWithSignature( "transferAsset(address, address, uint256)", - dest, + to, token, amt ); @@ -107,7 +118,7 @@ abstract contract Helpers is DSMath, Basic { data = abi.encodeWithSignature( "transferAssetFrom(address, address, address, uint256)", from, - dest, + to, token, amt ); @@ -116,6 +127,50 @@ abstract contract Helpers is DSMath, Basic { (success, ) = market.delegatecall(data); } + function _borrowOrWithdraw(BorrowWithdrawParams memory params) + internal + returns (uint256 amt, uint256 setId) + { + uint256 _amt = getUint(params.getId, params.amt); + + require( + params.market != address(0) && params.token != address(0), + "invalid market/token address" + ); + bool isEth = params.token == ethAddr; + address _token = isEth ? wethAddr : params.token; + + TokenInterface tokenContract = TokenInterface(_token); + + uint256 initialBal = getAccountSupplyBalanceOfAsset( + address(this), + params.market, + _token + ); + bool success = _withdraw( + params.market, + _token, + params.from, + params.to, + _amt + ); + require(success, "borrow-or-withdraw-failed"); + + uint256 finalBal = getAccountSupplyBalanceOfAsset( + address(this), + params.market, + _token + ); + _amt = sub(finalBal, initialBal); + + convertWethToEth(isEth, tokenContract, _amt); + + setUint(params.setId, _amt); + + amt = _amt; + setId = params.setId; + } + function getAccountSupplyBalanceOfAsset( address account, address market, diff --git a/contracts/mainnet/connectors/compound-iii/main.sol b/contracts/mainnet/connectors/compound-iii/main.sol index 6eca63be..570f88f3 100644 --- a/contracts/mainnet/connectors/compound-iii/main.sol +++ b/contracts/mainnet/connectors/compound-iii/main.sol @@ -236,40 +236,20 @@ abstract contract CompoundIIIResolver is Events, Helpers { payable returns (string memory _eventName, bytes memory _eventParam) { - uint256 _amt = getUint(getId, amt); - - require( - market != address(0) && token != address(0), - "invalid market/token address" + (uint256 _amt, uint256 _setId) = _borrowOrWithdraw( + BorrowWithdrawParams({ + market: market, + token: token, + from: address(0), + to: to, + amt: amt, + getId: getId, + setId: setId + }) ); - bool isEth = token == ethAddr; - address _token = isEth ? wethAddr : token; - - TokenInterface tokenContract = TokenInterface(_token); - - uint256 initialBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - token - ); - bool success = _withdraw(market, token, address(0), to, _amt); - require(success, "withdraw-failed"); - - uint256 finalBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - token - ); - - _amt = sub(finalBal, initialBal); - - convertWethToEth(isEth, tokenContract, _amt); - - setUint(setId, _amt); - _eventName = "LogWithdrawOnBehalf(address,address,address,uint256,uint256,uint256)"; - _eventParam = abi.encode(market, token, to, _amt, getId, setId); + _eventParam = abi.encode(market, token, to, _amt, getId, _setId); } /** @@ -296,40 +276,20 @@ abstract contract CompoundIIIResolver is Events, Helpers { payable returns (string memory _eventName, bytes memory _eventParam) { - uint256 _amt = getUint(getId, amt); - - require( - market != address(0) && token != address(0), - "invalid market/token address" + (uint256 _amt, uint256 _setId) = _borrowOrWithdraw( + BorrowWithdrawParams({ + market: market, + token: token, + from: from, + to: to, + amt: amt, + getId: getId, + setId: setId + }) ); - bool isEth = token == ethAddr; - address _token = isEth ? wethAddr : token; - - TokenInterface tokenContract = TokenInterface(_token); - - uint256 initialBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - token - ); - bool success = _withdraw(market, token, from, to, _amt); - require(success, "withdraw-failed"); - - uint256 finalBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - token - ); - - _amt = sub(finalBal, initialBal); - - convertWethToEth(isEth, tokenContract, _amt); - - setUint(setId, _amt); - _eventName = "LogWithdrawFrom(address,address,address,address,uint256,uint256,uint256)"; - _eventParam = abi.encode(market, token, from, to, _amt, getId, setId); + _eventParam = abi.encode(market, token, from, to, _amt, getId, _setId); } /** @@ -404,38 +364,19 @@ abstract contract CompoundIIIResolver is Events, Helpers { payable returns (string memory _eventName, bytes memory _eventParam) { - uint256 _amt = getUint(getId, amt); - - require(market != address(0), "invalid market address"); - - address token = getBaseToken(market); - bool isEth = token == ethAddr; - address _token = isEth ? wethAddr : token; - - TokenInterface tokenContract = TokenInterface(_token); - - uint256 initialBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - token + (uint256 _amt, uint256 _setId) = _borrowOrWithdraw( + BorrowWithdrawParams({ + market: market, + token: getBaseToken(market), + from: address(0), + to: to, + amt: amt, + getId: getId, + setId: setId + }) ); - bool success = _withdraw(market, token, address(0), to, _amt); - require(success, "borrow-failed"); - - uint256 finalBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - token - ); - - _amt = sub(finalBal, initialBal); - - convertWethToEth(isEth, tokenContract, _amt); - - setUint(setId, _amt); - _eventName = "LogBorrowOnBehalf(address,address,uint256,uint256,uint256)"; - _eventParam = abi.encode(market, to, _amt, getId, setId); + _eventParam = abi.encode(market, to, _amt, getId, _setId); } /** @@ -460,36 +401,19 @@ abstract contract CompoundIIIResolver is Events, Helpers { payable returns (string memory _eventName, bytes memory _eventParam) { - uint256 _amt = getUint(getId, amt); - - require(market != address(0), "invalid market address"); - bool isEth = (getBaseToken(market) == ethAddr); - address _token = isEth ? wethAddr : getBaseToken(market); - - TokenInterface tokenContract = TokenInterface(_token); - - uint256 initialBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - getBaseToken(market) + (uint256 _amt, uint256 _setId) = _borrowOrWithdraw( + BorrowWithdrawParams({ + market: market, + token: getBaseToken(market), + from: from, + to: to, + amt: amt, + getId: getId, + setId: setId + }) ); - bool success = _withdraw(market, _token, from, to, _amt); - require(success, "borrow-failed"); - - uint256 finalBal = getAccountSupplyBalanceOfAsset( - address(this), - market, - getBaseToken(market) - ); - - _amt = sub(finalBal, initialBal); - - convertWethToEth(isEth, tokenContract, _amt); - - setUint(setId, _amt); - _eventName = "LogBorrowFrom(address,address,address,uint256,uint256,uint256)"; - _eventParam = abi.encode(market, from, to, _amt, getId, setId); + _eventParam = abi.encode(market, from, to, _amt, getId, _setId); } /** @@ -605,7 +529,7 @@ abstract contract CompoundIIIResolver is Events, Helpers { * @notice Buy collateral asset to increase protocol base reserves until targetReserves is reached. * @param market The address of the market from where to withdraw. * @param asset The collateral asset to purachase. - * @param to The address on to transfer the purchased assets. + * @param dest The address on to transfer the purchased assets. * @param minCollateralAmt Minimum amount of collateral expected to be received. * @param baseAmt Amount of base asset to be sold for collateral. * @param getId ID to retrieve amt.