From 1a9ab0ac702a253cf009451e4d6501001800e48c Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Fri, 25 Jun 2021 01:25:04 +0530 Subject: [PATCH] Fixed approve(token.approve => approve()) --- contracts/mainnet/common/basic.sol | 11 ++++++++++- contracts/mainnet/connectors/1inch/main.sol | 2 +- contracts/mainnet/connectors/1proto/main.sol | 4 ++-- contracts/mainnet/connectors/aave/v1/main.sol | 4 ++-- contracts/mainnet/connectors/aave/v2-amm/main.sol | 4 ++-- contracts/mainnet/connectors/aave/v2/main.sol | 4 ++-- contracts/mainnet/connectors/compound/main.sol | 8 ++++---- contracts/mainnet/connectors/cream/main.sol | 8 ++++---- contracts/mainnet/connectors/dydx/main.sol | 12 ++++++------ contracts/mainnet/connectors/erc20_staking/main.sol | 2 +- .../mainnet/connectors/guniswap_v3_erc20/main.sol | 12 ++++++------ .../connectors/guniswap_v3_erc20_staking/main.sol | 2 +- contracts/mainnet/connectors/kyber/main.sol | 2 +- contracts/mainnet/connectors/makerdao/main.sol | 8 ++++---- contracts/mainnet/connectors/oasis/main.sol | 4 ++-- contracts/mainnet/connectors/polygon-bridge/main.sol | 4 ++-- .../mainnet/connectors/refinance/helpers/aaveV1.sol | 4 ++-- .../mainnet/connectors/refinance/helpers/aaveV2.sol | 4 ++-- .../connectors/refinance/helpers/compound.sol | 4 ++-- contracts/mainnet/connectors/reflexer/main.sol | 6 +++--- contracts/mainnet/connectors/uniswap/helpers.sol | 6 +++--- contracts/mainnet/connectors/uniswap/main.sol | 4 ++-- contracts/mainnet/connectors/weth/main.sol | 2 +- contracts/mainnet/connectors_old/1inch.sol | 6 +++--- contracts/polygon/common/basic.sol | 11 ++++++++++- contracts/polygon/connectors/aave/v2/main.sol | 4 ++-- contracts/polygon/connectors/paraswap/helpers.sol | 2 +- 27 files changed, 81 insertions(+), 63 deletions(-) diff --git a/contracts/mainnet/common/basic.sol b/contracts/mainnet/common/basic.sol index fb0882b5..febeb784 100644 --- a/contracts/mainnet/common/basic.sol +++ b/contracts/mainnet/common/basic.sol @@ -27,6 +27,15 @@ abstract contract Basic is DSMath, Stores { return abi.encode(eventName, eventParam); } + function approve(TokenInterface token, address spender, uint256 amount) internal { + try token.approve(spender, amount) { + + } catch { + token.approve(spender, 0); + token.approve(spender, amount); + } + } + function changeEthAddress(address buy, address sell) internal pure returns(TokenInterface _buy, TokenInterface _sell){ _buy = buy == ethAddr ? TokenInterface(wethAddr) : TokenInterface(buy); _sell = sell == ethAddr ? TokenInterface(wethAddr) : TokenInterface(sell); @@ -38,7 +47,7 @@ abstract contract Basic is DSMath, Stores { function convertWethToEth(bool isEth, TokenInterface token, uint amount) internal { if(isEth) { - token.approve(address(token), amount); + approve(token, address(token), amount); token.withdraw(amount); } } diff --git a/contracts/mainnet/connectors/1inch/main.sol b/contracts/mainnet/connectors/1inch/main.sol index 31901334..cc3b7384 100644 --- a/contracts/mainnet/connectors/1inch/main.sol +++ b/contracts/mainnet/connectors/1inch/main.sol @@ -74,7 +74,7 @@ abstract contract OneInchResolverHelpers is OneInchResolver { if (address(_sellAddr) == ethAddr) { ethAmt = oneInchData._sellAmt; } else { - TokenInterface(_sellAddr).approve(oneInchAddr, oneInchData._sellAmt); + approve(TokenInterface(_sellAddr), oneInchAddr, oneInchData._sellAmt); } require(checkOneInchSig(oneInchData.callData), "Not-swap-function"); diff --git a/contracts/mainnet/connectors/1proto/main.sol b/contracts/mainnet/connectors/1proto/main.sol index aec46e0d..f3c2f380 100644 --- a/contracts/mainnet/connectors/1proto/main.sol +++ b/contracts/mainnet/connectors/1proto/main.sol @@ -30,7 +30,7 @@ abstract contract OneProtoResolver is Helpers, Events { if (address(_sellAddr) == ethAddr) { ethAmt = _sellAmt; } else { - _sellAddr.approve(address(oneProto), _sellAmt); + approve(_sellAddr, address(oneProto), _sellAmt); } @@ -64,7 +64,7 @@ abstract contract OneProtoResolver is Helpers, Events { if (address(_sellAddr) == ethAddr) { ethAmt = _sellAmt; } else { - _sellAddr.approve(address(oneProto), _sellAmt); + approve(_sellAddr, address(oneProto), _sellAmt); } uint initalBal = getTokenBal(_buyAddr); diff --git a/contracts/mainnet/connectors/aave/v1/main.sol b/contracts/mainnet/connectors/aave/v1/main.sol index 3dd63cc6..0354c0e8 100644 --- a/contracts/mainnet/connectors/aave/v1/main.sol +++ b/contracts/mainnet/connectors/aave/v1/main.sol @@ -37,7 +37,7 @@ abstract contract AaveResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - tokenContract.approve(aaveProvider.getLendingPoolCore(), _amt); + approve(tokenContract, aaveProvider.getLendingPoolCore(), _amt); } aave.deposit{value: ethAmt}(token, _amt, referralCode); @@ -129,7 +129,7 @@ abstract contract AaveResolver is Events, Helpers { if (token == ethAddr) { ethAmt = _amt; } else { - TokenInterface(token).approve(aaveProvider.getLendingPoolCore(), _amt); + approve(TokenInterface(token), aaveProvider.getLendingPoolCore(), _amt); } aave.repay{value: ethAmt}(token, _amt, payable(address(this))); diff --git a/contracts/mainnet/connectors/aave/v2-amm/main.sol b/contracts/mainnet/connectors/aave/v2-amm/main.sol index 996976a9..4c2f624e 100644 --- a/contracts/mainnet/connectors/aave/v2-amm/main.sol +++ b/contracts/mainnet/connectors/aave/v2-amm/main.sol @@ -42,7 +42,7 @@ abstract contract AaveResolver is Events, Helpers { _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; } - tokenContract.approve(address(aave), _amt); + approve(tokenContract, address(aave), _amt); aave.deposit(_token, _amt, address(this), referralCode); @@ -153,7 +153,7 @@ abstract contract AaveResolver is Events, Helpers { if (isEth) convertEthToWeth(isEth, tokenContract, _amt); - tokenContract.approve(address(aave), _amt); + approve(tokenContract, address(aave), _amt); aave.repay(_token, _amt, rateMode, address(this)); diff --git a/contracts/mainnet/connectors/aave/v2/main.sol b/contracts/mainnet/connectors/aave/v2/main.sol index 7a37ad79..4b9f4656 100644 --- a/contracts/mainnet/connectors/aave/v2/main.sol +++ b/contracts/mainnet/connectors/aave/v2/main.sol @@ -42,7 +42,7 @@ abstract contract AaveResolver is Events, Helpers { _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; } - tokenContract.approve(address(aave), _amt); + approve(tokenContract, address(aave), _amt); aave.deposit(_token, _amt, address(this), referralCode); @@ -153,7 +153,7 @@ abstract contract AaveResolver is Events, Helpers { if (isEth) convertEthToWeth(isEth, tokenContract, _amt); - tokenContract.approve(address(aave), _amt); + approve(tokenContract, address(aave), _amt); aave.repay(_token, _amt, rateMode, address(this)); diff --git a/contracts/mainnet/connectors/compound/main.sol b/contracts/mainnet/connectors/compound/main.sol index fa4a653c..01ee5fc3 100644 --- a/contracts/mainnet/connectors/compound/main.sol +++ b/contracts/mainnet/connectors/compound/main.sol @@ -40,7 +40,7 @@ abstract contract CompoundResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - tokenContract.approve(cToken, _amt); + approve(tokenContract, cToken, _amt); require(CTokenInterface(cToken).mint(_amt) == 0, "deposit-failed"); } setUint(setId, _amt); @@ -196,7 +196,7 @@ abstract contract CompoundResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(token); require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(cToken, _amt); + approve(tokenContract, cToken, _amt); require(cTokenContract.repayBorrow(_amt) == 0, "repay-failed."); } setUint(setId, _amt); @@ -254,7 +254,7 @@ abstract contract CompoundResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - tokenContract.approve(cToken, _amt); + approve(tokenContract, cToken, _amt); require(ctokenContract.mint(_amt) == 0, "deposit-ctoken-failed."); } @@ -385,7 +385,7 @@ abstract contract CompoundResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(tokenToPay); require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(cTokenPay, _amt); + approve(tokenContract, cTokenPay, _amt); require(cTokenContract.liquidateBorrow(borrower, _amt, cTokenColl) == 0, "liquidate-failed"); } diff --git a/contracts/mainnet/connectors/cream/main.sol b/contracts/mainnet/connectors/cream/main.sol index 8d3849d4..2852147a 100644 --- a/contracts/mainnet/connectors/cream/main.sol +++ b/contracts/mainnet/connectors/cream/main.sol @@ -40,7 +40,7 @@ abstract contract CreamResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - tokenContract.approve(cToken, _amt); + approve(tokenContract, cToken, _amt); require(CTokenInterface(cToken).mint(_amt) == 0, "deposit-failed"); } setUint(setId, _amt); @@ -196,7 +196,7 @@ abstract contract CreamResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(token); require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(cToken, _amt); + approve(tokenContract, cToken, _amt); require(cTokenContract.repayBorrow(_amt) == 0, "repay-failed."); } setUint(setId, _amt); @@ -254,7 +254,7 @@ abstract contract CreamResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - tokenContract.approve(cToken, _amt); + approve(tokenContract, cToken, _amt); require(ctokenContract.mint(_amt) == 0, "deposit-ctoken-failed."); } @@ -384,7 +384,7 @@ abstract contract CreamResolver is Events, Helpers { } else { TokenInterface tokenContract = TokenInterface(tokenToPay); require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(cTokenPay, _amt); + approve(tokenContract, cTokenPay, _amt); require(cTokenContract.liquidateBorrow(borrower, _amt, cTokenColl) == 0, "liquidate-failed"); } diff --git a/contracts/mainnet/connectors/dydx/main.sol b/contracts/mainnet/connectors/dydx/main.sol index d38588e8..dedad6ac 100644 --- a/contracts/mainnet/connectors/dydx/main.sol +++ b/contracts/mainnet/connectors/dydx/main.sol @@ -36,11 +36,11 @@ abstract contract DyDxResolver is Events, Helpers { TokenInterface tokenContract = TokenInterface(wethAddr); _amt = _amt == uint(-1) ? address(this).balance : _amt; tokenContract.deposit{value: _amt}(); - tokenContract.approve(address(solo), _amt); + approve(tokenContract, address(solo), _amt); } else { TokenInterface tokenContract = TokenInterface(token); _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; - tokenContract.approve(address(solo), _amt); + approve(tokenContract, address(solo), _amt); } solo.operate(getAccountArgs(), getActionsArgs(_marketId, _amt, true)); @@ -77,7 +77,7 @@ abstract contract DyDxResolver is Events, Helpers { if (token == ethAddr) { TokenInterface tokenContract = TokenInterface(wethAddr); - tokenContract.approve(address(tokenContract), _amt); + approve(tokenContract, address(tokenContract), _amt); tokenContract.withdraw(_amt); } @@ -111,7 +111,7 @@ abstract contract DyDxResolver is Events, Helpers { if (token == ethAddr) { TokenInterface tokenContract = TokenInterface(wethAddr); - tokenContract.approve(address(tokenContract), _amt); + approve(tokenContract, address(tokenContract), _amt); tokenContract.withdraw(_amt); } @@ -148,11 +148,11 @@ abstract contract DyDxResolver is Events, Helpers { TokenInterface tokenContract = TokenInterface(wethAddr); require(address(this).balance >= _amt, "not-enough-eth"); tokenContract.deposit{value: _amt}(); - tokenContract.approve(address(solo), _amt); + approve(tokenContract, address(solo), _amt); } else { TokenInterface tokenContract = TokenInterface(token); require(tokenContract.balanceOf(address(this)) >= _amt, "not-enough-token"); - tokenContract.approve(address(solo), _amt); + approve(tokenContract, address(solo), _amt); } solo.operate(getAccountArgs(), getActionsArgs(_marketId, _amt, true)); diff --git a/contracts/mainnet/connectors/erc20_staking/main.sol b/contracts/mainnet/connectors/erc20_staking/main.sol index 176b21fa..70f83947 100644 --- a/contracts/mainnet/connectors/erc20_staking/main.sol +++ b/contracts/mainnet/connectors/erc20_staking/main.sol @@ -38,7 +38,7 @@ contract Main is Helpers, Events { _amt = _amt == uint(-1) ? stakingToken.balanceOf(address(this)) : _amt; - stakingToken.approve(address(stakingContract), _amt); + approve(stakingToken, address(stakingContract), _amt); stakingContract.stake(_amt); setUint(setId, _amt); diff --git a/contracts/mainnet/connectors/guniswap_v3_erc20/main.sol b/contracts/mainnet/connectors/guniswap_v3_erc20/main.sol index 3c7895bd..77b36687 100644 --- a/contracts/mainnet/connectors/guniswap_v3_erc20/main.sol +++ b/contracts/mainnet/connectors/guniswap_v3_erc20/main.sol @@ -54,12 +54,12 @@ abstract contract UniswapV3Resolver is Events, Helpers { if (depositData.amount0In > 0) { IERC20 _token0 = depositData.poolContract.token0(); convertEthToWeth(address(_token0) == wethAddr, TokenInterface(address(_token0)), depositData.amount0In); - _token0.safeApprove(address(pool), depositData.amount0In); + approve(TokenInterface(address(_token0)), address(pool), depositData.amount0In); } if (depositData.amount1In > 0) { IERC20 _token1 = depositData.poolContract.token1(); convertEthToWeth(address(_token1) == wethAddr, TokenInterface(address(_token1)), depositData.amount1In); - _token1.safeApprove(address(pool), depositData.amount1In); + approve(TokenInterface(address(_token1)), address(pool), depositData.amount1In); } (uint amount0, uint amount1,) = depositData.poolContract.mint(depositData.mintAmount, address(this)); @@ -151,7 +151,7 @@ abstract contract UniswapV3Resolver is Events, Helpers { depositAndSwap.mintAmount; if (address(depositAndSwap._token0) == wethAddr) { - depositAndSwap._token1.approve(address(gUniRouter), amount1In); + approve(depositAndSwap._token1, address(gUniRouter), amount1In); (depositAndSwap.amount0, depositAndSwap.amount1, depositAndSwap.mintAmount) = gUniRouter.rebalanceAndAddLiquidityETH{value: amount0In}( @@ -166,7 +166,7 @@ abstract contract UniswapV3Resolver is Events, Helpers { address(this) ); } else if (address(depositAndSwap._token1) == wethAddr) { - depositAndSwap._token0.approve(address(gUniRouter), amount0In); + approve(depositAndSwap._token0, address(gUniRouter), amount0In); (depositAndSwap.amount0, depositAndSwap.amount1,depositAndSwap. mintAmount) = gUniRouter.rebalanceAndAddLiquidityETH{value: amount1In}( @@ -181,8 +181,8 @@ abstract contract UniswapV3Resolver is Events, Helpers { address(this) ); } else { - depositAndSwap._token0.approve(address(gUniRouter), amount0In); - depositAndSwap._token1.approve(address(gUniRouter), amount1In); + approve(depositAndSwap._token0, address(gUniRouter), amount0In); + approve(depositAndSwap._token1, address(gUniRouter), amount1In); (depositAndSwap.amount0, depositAndSwap.amount1, depositAndSwap.mintAmount) = gUniRouter.rebalanceAndAddLiquidity( depositAndSwap.poolContract, diff --git a/contracts/mainnet/connectors/guniswap_v3_erc20_staking/main.sol b/contracts/mainnet/connectors/guniswap_v3_erc20_staking/main.sol index 4cd4fbcc..47a2d62a 100644 --- a/contracts/mainnet/connectors/guniswap_v3_erc20_staking/main.sol +++ b/contracts/mainnet/connectors/guniswap_v3_erc20_staking/main.sol @@ -35,7 +35,7 @@ contract Main is Helpers, Events { _amt = _amt == uint(-1) ? stakingTokenContract.balanceOf(address(this)) : _amt; - stakingTokenContract.approve(address(stakingContract), _amt); + approve(stakingTokenContract, address(stakingContract), _amt); stakingContract.stake(_amt); setUint(setId, _amt); diff --git a/contracts/mainnet/connectors/kyber/main.sol b/contracts/mainnet/connectors/kyber/main.sol index 8961b851..cdf810a7 100644 --- a/contracts/mainnet/connectors/kyber/main.sol +++ b/contracts/mainnet/connectors/kyber/main.sol @@ -37,7 +37,7 @@ abstract contract KyberResolver is Helpers, Events { } else { TokenInterface sellContract = TokenInterface(sellAddr); _sellAmt = _sellAmt == uint(-1) ? sellContract.balanceOf(address(this)) : _sellAmt; - sellContract.approve(address(kyber), _sellAmt); + approve(sellContract, address(kyber), _sellAmt); } uint _buyAmt = kyber.trade{value: ethAmt}( diff --git a/contracts/mainnet/connectors/makerdao/main.sol b/contracts/mainnet/connectors/makerdao/main.sol index e9240770..ae77595e 100644 --- a/contracts/mainnet/connectors/makerdao/main.sol +++ b/contracts/mainnet/connectors/makerdao/main.sol @@ -96,7 +96,7 @@ abstract contract MakerResolver is Helpers, Events { _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; } - tokenContract.approve(address(colAddr), _amt); + approve(tokenContract, address(colAddr), _amt); tokenJoinContract.join(address(this), _amt); VatLike(managerContract.vat()).frob( @@ -245,7 +245,7 @@ abstract contract MakerResolver is Helpers, Events { require(_maxDebt >= _amt, "paying-excess-debt"); - daiJoinContract.dai().approve(address(daiJoinContract), _amt); + approve(daiJoinContract.dai(), address(daiJoinContract), _amt); daiJoinContract.join(urn, _amt); managerContract.frob( @@ -357,7 +357,7 @@ abstract contract MakerResolver is Helpers, Events { _amtDeposit = _amtDeposit == uint(-1) ? makerData.tokenContract.balanceOf(address(this)) : _amtDeposit; } - makerData.tokenContract.approve(address(makerData.colAddr), _amtDeposit); + approve(makerData.tokenContract, address(makerData.colAddr), _amtDeposit); makerData.tokenJoinContract.join(urn, _amtDeposit); managerContract.frob( @@ -462,7 +462,7 @@ abstract contract MakerResolver is Helpers, Events { VatLike vat = daiJoinContract.vat(); uint chi = potContract.drip(); - daiJoinContract.dai().approve(address(daiJoinContract), _amt); + approve(daiJoinContract.dai(), address(daiJoinContract), _amt); daiJoinContract.join(address(this), _amt); if (vat.can(address(this), address(potContract)) == 0) { vat.hope(address(potContract)); diff --git a/contracts/mainnet/connectors/oasis/main.sol b/contracts/mainnet/connectors/oasis/main.sol index 4761ad65..07393309 100644 --- a/contracts/mainnet/connectors/oasis/main.sol +++ b/contracts/mainnet/connectors/oasis/main.sol @@ -49,7 +49,7 @@ contract OasisResolver is DSMath, Basic, Events { bool isEth = address(_sellAddr) == wethAddr; convertEthToWeth(isEth, _sellAddr, _expectedAmt); - _sellAddr.approve(address(oasis), _expectedAmt); + approve(_sellAddr, address(oasis), _expectedAmt); uint _sellAmt = oasis.buyAllAmount( address(_buyAddr), @@ -104,7 +104,7 @@ contract OasisResolver is DSMath, Basic, Events { bool isEth = address(_sellAddr) == wethAddr; convertEthToWeth(isEth, _sellAddr, _sellAmt); - _sellAddr.approve(address(oasis), _sellAmt); + approve(_sellAddr, address(oasis), _sellAmt); uint _buyAmt = oasis.sellAllAmount( address(_sellAddr), diff --git a/contracts/mainnet/connectors/polygon-bridge/main.sol b/contracts/mainnet/connectors/polygon-bridge/main.sol index 0540f3c0..5c2356e2 100644 --- a/contracts/mainnet/connectors/polygon-bridge/main.sol +++ b/contracts/mainnet/connectors/polygon-bridge/main.sol @@ -36,10 +36,10 @@ abstract contract PolygonBridgeResolver is Events, Helpers { TokenInterface _token = TokenInterface(token); _amt = _amt == uint(-1) ? _token.balanceOf(address(this)) : _amt; if (migrator.rootToChildToken(token) != address(0)) { - _token.approve(erc20Predicate, _amt); + approve(_token, erc20Predicate, _amt); migrator.depositFor(targetDsa, token, abi.encode(_amt)); } else { - _token.approve(address(migratorPlasma), _amt); + approve(_token, address(migratorPlasma), _amt); migratorPlasma.depositERC20ForUser(token, targetDsa, _amt); } } diff --git a/contracts/mainnet/connectors/refinance/helpers/aaveV1.sol b/contracts/mainnet/connectors/refinance/helpers/aaveV1.sol index bc33c624..dc8a3d33 100644 --- a/contracts/mainnet/connectors/refinance/helpers/aaveV1.sol +++ b/contracts/mainnet/connectors/refinance/helpers/aaveV1.sol @@ -102,7 +102,7 @@ contract AaveV1Helpers is protocolHelpers { if (isEth) { ethAmt = _amt; } else { - token.approve(address(aaveCore), _amt); + approve(token, address(aaveCore), _amt); } transferFees(_token, feeAmt); @@ -180,7 +180,7 @@ contract AaveV1Helpers is protocolHelpers { if (isEth) { ethAmt = amt; } else { - token.approve(address(aaveCore), amt); + approve(token, address(aaveCore), amt); } aave.repay{value:ethAmt}(_token, amt, payable(address(this))); diff --git a/contracts/mainnet/connectors/refinance/helpers/aaveV2.sol b/contracts/mainnet/connectors/refinance/helpers/aaveV2.sol index 488deae3..9e8b5f27 100644 --- a/contracts/mainnet/connectors/refinance/helpers/aaveV2.sol +++ b/contracts/mainnet/connectors/refinance/helpers/aaveV2.sol @@ -109,7 +109,7 @@ contract AaveV2Helpers is protocolHelpers { convertEthToWeth(isEth, token, _amt); - token.approve(address(aave), _amt); + approve(token, address(aave), _amt); aave.deposit(address(token), _amt, address(this), getReferralCode); @@ -178,7 +178,7 @@ contract AaveV2Helpers is protocolHelpers { convertEthToWeth(isEth, token, _amt); - token.approve(address(aave), _amt); + approve(token, address(aave), _amt); aave.repay(address(token), _amt, rateMode, address(this)); } diff --git a/contracts/mainnet/connectors/refinance/helpers/compound.sol b/contracts/mainnet/connectors/refinance/helpers/compound.sol index c6bebc42..56e90cc8 100644 --- a/contracts/mainnet/connectors/refinance/helpers/compound.sol +++ b/contracts/mainnet/connectors/refinance/helpers/compound.sol @@ -83,7 +83,7 @@ contract CompoundHelpers is protocolHelpers { (uint feeAmt, uint _amt) = calculateFee(amt, fee, false); if (_token != ethAddr) { - token.approve(address(ctoken), _amt); + approve(token, address(ctoken), _amt); require(ctoken.mint(_amt) == 0, "deposit-failed"); } else { CETHInterface(address(ctoken)).mint{value:_amt}(); @@ -138,7 +138,7 @@ contract CompoundHelpers is protocolHelpers { amt = ctoken.borrowBalanceCurrent(address(this)); } if (address(token) != wethAddr) { - token.approve(address(ctoken), amt); + approve(token, address(ctoken), amt); require(ctoken.repayBorrow(amt) == 0, "repay-failed."); } else { CETHInterface(address(ctoken)).repayBorrow{value:amt}(); diff --git a/contracts/mainnet/connectors/reflexer/main.sol b/contracts/mainnet/connectors/reflexer/main.sol index ffeb6fe3..1a6d47eb 100644 --- a/contracts/mainnet/connectors/reflexer/main.sol +++ b/contracts/mainnet/connectors/reflexer/main.sol @@ -73,7 +73,7 @@ abstract contract GebResolver is Helpers, Events { _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; } - tokenContract.approve(address(colAddr), _amt); + approve(tokenContract, address(colAddr), _amt); tokenJoinContract.join(address(this), _amt); SafeEngineLike(managerContract.safeEngine()).modifySAFECollateralization( @@ -222,7 +222,7 @@ abstract contract GebResolver is Helpers, Events { require(_maxDebt >= _amt, "paying-excess-debt"); - coinJoinContract.systemCoin().approve(address(coinJoinContract), _amt); + approve(coinJoinContract.systemCoin(), address(coinJoinContract), _amt); coinJoinContract.join(handler, _amt); managerContract.modifySAFECollateralization( @@ -335,7 +335,7 @@ abstract contract GebResolver is Helpers, Events { _amtDeposit = _amtDeposit == uint(-1) ? gebData.tokenContract.balanceOf(address(this)) : _amtDeposit; } - gebData.tokenContract.approve(address(gebData.colAddr), _amtDeposit); + approve(gebData.tokenContract, address(gebData.colAddr), _amtDeposit); gebData.tokenJoinContract.join(handler, _amtDeposit); managerContract.modifySAFECollateralization( diff --git a/contracts/mainnet/connectors/uniswap/helpers.sol b/contracts/mainnet/connectors/uniswap/helpers.sol index 10569cd8..f435a78b 100644 --- a/contracts/mainnet/connectors/uniswap/helpers.sol +++ b/contracts/mainnet/connectors/uniswap/helpers.sol @@ -78,8 +78,8 @@ abstract contract Helpers is DSMath, Basic { isEth = address(_tokenB) == wethAddr; convertEthToWeth(isEth, _tokenB, _amtB); - _tokenA.approve(address(router), _amtA); - _tokenB.approve(address(router), _amtB); + approve(_tokenA, address(router), _amtA); + approve(_tokenB, address(router), _amtB); uint minAmtA = getMinAmount(_tokenA, _amtA, slippage); uint minAmtB = getMinAmount(_tokenB, _amtB, slippage); @@ -141,6 +141,6 @@ abstract contract Helpers is DSMath, Basic { TokenInterface uniToken = TokenInterface(exchangeAddr); _uniAmt = _amt == uint(-1) ? uniToken.balanceOf(address(this)) : _amt; - uniToken.approve(address(router), _uniAmt); + approve(uniToken, address(router), _uniAmt); } } \ No newline at end of file diff --git a/contracts/mainnet/connectors/uniswap/main.sol b/contracts/mainnet/connectors/uniswap/main.sol index 68da00f5..18f0140b 100644 --- a/contracts/mainnet/connectors/uniswap/main.sol +++ b/contracts/mainnet/connectors/uniswap/main.sol @@ -114,7 +114,7 @@ abstract contract UniswapResolver is Helpers, Events { bool isEth = address(_sellAddr) == wethAddr; convertEthToWeth(isEth, _sellAddr, _expectedAmt); - _sellAddr.approve(address(router), _expectedAmt); + approve(_sellAddr, address(router), _expectedAmt); uint _sellAmt = router.swapTokensForExactTokens( _buyAmt, @@ -171,7 +171,7 @@ abstract contract UniswapResolver is Helpers, Events { bool isEth = address(_sellAddr) == wethAddr; convertEthToWeth(isEth, _sellAddr, _sellAmt); - _sellAddr.approve(address(router), _sellAmt); + approve(_sellAddr, address(router), _sellAmt); uint _buyAmt = router.swapExactTokensForTokens( _sellAmt, diff --git a/contracts/mainnet/connectors/weth/main.sol b/contracts/mainnet/connectors/weth/main.sol index 9a5f1444..f4d8f056 100644 --- a/contracts/mainnet/connectors/weth/main.sol +++ b/contracts/mainnet/connectors/weth/main.sol @@ -50,7 +50,7 @@ abstract contract Resolver is Events, DSMath, Basic, Helpers { uint _amt = getUint(getId, amt); _amt = _amt == uint(-1) ? wethContract.balanceOf(address(this)) : _amt; - wethContract.approve(wethAddr, _amt); + approve(wethContract, wethAddr, _amt); wethContract.withdraw(_amt); setUint(setId, _amt); diff --git a/contracts/mainnet/connectors_old/1inch.sol b/contracts/mainnet/connectors_old/1inch.sol index fc4b728d..796c909e 100644 --- a/contracts/mainnet/connectors_old/1inch.sol +++ b/contracts/mainnet/connectors_old/1inch.sol @@ -155,7 +155,7 @@ abstract contract OneProtoResolver is OneHelpers { if (address(_sellAddr) == ethAddr) { ethAmt = _sellAmt; } else { - _sellAddr.approve(address(oneProtoContract), _sellAmt); + approve(_sellAddr, address(oneProtoContract), _sellAmt); } @@ -197,7 +197,7 @@ abstract contract OneProtoResolver is OneHelpers { if (address(_sellAddr) == ethAddr) { ethAmt = _sellAmt; } else { - _sellAddr.approve(address(oneSplitContract), _sellAmt); + approve(_sellAddr, address(oneSplitContract), _sellAmt); } uint initalBal = getTokenBal(_buyAddr); @@ -442,7 +442,7 @@ abstract contract OneInchResolverHelpers is OneProtoResolverHelpers { if (address(_sellAddr) == ethAddr) { ethAmt = oneInchData._sellAmt; } else { - TokenInterface(_sellAddr).approve(getOneInchAddress(), oneInchData._sellAmt); + approve(TokenInterface(_sellAddr), getOneInchAddress(), oneInchData._sellAmt); } require(checkOneInchSig(oneInchData.callData), "Not-swap-function"); diff --git a/contracts/polygon/common/basic.sol b/contracts/polygon/common/basic.sol index fea2b1ec..a5c83c7e 100644 --- a/contracts/polygon/common/basic.sol +++ b/contracts/polygon/common/basic.sol @@ -32,13 +32,22 @@ abstract contract Basic is DSMath, Stores { _sell = sell == maticAddr ? TokenInterface(wmaticAddr) : TokenInterface(sell); } + function approve(TokenInterface token, address spender, uint256 amount) internal { + try token.approve(spender, amount) { + + } catch { + token.approve(spender, 0); + token.approve(spender, amount); + } + } + function convertMaticToWmatic(bool isMatic, TokenInterface token, uint amount) internal { if(isMatic) token.deposit{value: amount}(); } function convertWmaticToMatic(bool isMatic, TokenInterface token, uint amount) internal { if(isMatic) { - token.approve(address(token), amount); + approve(token, address(token), amount); token.withdraw(amount); } } diff --git a/contracts/polygon/connectors/aave/v2/main.sol b/contracts/polygon/connectors/aave/v2/main.sol index eddf8855..a76873e0 100644 --- a/contracts/polygon/connectors/aave/v2/main.sol +++ b/contracts/polygon/connectors/aave/v2/main.sol @@ -43,7 +43,7 @@ abstract contract AaveResolver is Events, Helpers { _amt = _amt == uint(-1) ? tokenContract.balanceOf(address(this)) : _amt; } - tokenContract.approve(address(aave), _amt); + approve(tokenContract, address(aave), _amt); aave.deposit(_token, _amt, address(this), referralCode); @@ -154,7 +154,7 @@ abstract contract AaveResolver is Events, Helpers { if (isEth) convertMaticToWmatic(isEth, tokenContract, _amt); - tokenContract.approve(address(aave), _amt); + approve(tokenContract, address(aave), _amt); aave.repay(_token, _amt, rateMode, address(this)); diff --git a/contracts/polygon/connectors/paraswap/helpers.sol b/contracts/polygon/connectors/paraswap/helpers.sol index 3a54f10f..0f0bc803 100644 --- a/contracts/polygon/connectors/paraswap/helpers.sol +++ b/contracts/polygon/connectors/paraswap/helpers.sol @@ -45,7 +45,7 @@ abstract contract Helpers is DSMath, Basic { maticAmt = swapData._sellAmt; } else { address tokenProxy = AugustusSwapperInterface(paraswap).getTokenTransferProxy(); - TokenInterface(_sellAddr).approve(tokenProxy, swapData._sellAmt); + approve(TokenInterface(_sellAddr), tokenProxy, swapData._sellAmt); } swapData._buyAmt = _swapHelper(swapData, maticAmt);