From 41efe9e811dcdc2de8ce8c9f348a9aaf0205f33d Mon Sep 17 00:00:00 2001 From: andyk Date: Wed, 2 Dec 2020 19:56:38 +0400 Subject: [PATCH] add WETH to constructor of swap adapters --- contracts/adapters/BaseUniswapAdapter.sol | 14 ++++--- .../adapters/UniswapLiquiditySwapAdapter.sol | 37 +++++++++++-------- contracts/adapters/UniswapRepayAdapter.sol | 21 +++++++---- .../interfaces/IBaseUniswapAdapter.sol | 2 + hardhat.config.ts | 4 +- helpers/contracts-deployments.ts | 7 ++-- package.json | 8 ++-- .../deploy-UniswapLiquiditySwapAdapter.ts | 7 ++-- .../deployments/deploy-UniswapRepayAdapter.ts | 16 ++++---- 9 files changed, 70 insertions(+), 46 deletions(-) diff --git a/contracts/adapters/BaseUniswapAdapter.sol b/contracts/adapters/BaseUniswapAdapter.sol index 5f0851a7..a10cf825 100644 --- a/contracts/adapters/BaseUniswapAdapter.sol +++ b/contracts/adapters/BaseUniswapAdapter.sol @@ -32,17 +32,21 @@ abstract contract BaseUniswapAdapter is FlashLoanReceiverBase, IBaseUniswapAdapt // USD oracle asset address address public constant override USD_ADDRESS = 0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96; - address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; + // address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; mainnet + // address public constant WETH_ADDRESS = 0xd0a1e359811322d97991e03f863a0c30c2cf029c; kovan + address public immutable override WETH_ADDRESS; IPriceOracleGetter public immutable override ORACLE; IUniswapV2Router02 public immutable override UNISWAP_ROUTER; - constructor(ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter) - public - FlashLoanReceiverBase(addressesProvider) - { + constructor( + ILendingPoolAddressesProvider addressesProvider, + IUniswapV2Router02 uniswapRouter, + address wethAddress + ) public FlashLoanReceiverBase(addressesProvider) { ORACLE = IPriceOracleGetter(addressesProvider.getPriceOracle()); UNISWAP_ROUTER = uniswapRouter; + WETH_ADDRESS = wethAddress; } /** diff --git a/contracts/adapters/UniswapLiquiditySwapAdapter.sol b/contracts/adapters/UniswapLiquiditySwapAdapter.sol index b4d01550..aaf13406 100644 --- a/contracts/adapters/UniswapLiquiditySwapAdapter.sol +++ b/contracts/adapters/UniswapLiquiditySwapAdapter.sol @@ -29,10 +29,11 @@ contract UniswapLiquiditySwapAdapter is BaseUniswapAdapter { bool[] useEthPath; } - constructor(ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter) - public - BaseUniswapAdapter(addressesProvider, uniswapRouter) - {} + constructor( + ILendingPoolAddressesProvider addressesProvider, + IUniswapV2Router02 uniswapRouter, + address wethAddress + ) public BaseUniswapAdapter(addressesProvider, uniswapRouter, wethAddress) {} /** * @dev Swaps the received reserve amount from the flash loan into the asset specified in the params. @@ -148,19 +149,25 @@ contract UniswapLiquiditySwapAdapter is BaseUniswapAdapter { vars.aToken = _getReserveData(assetToSwapFromList[vars.i]).aTokenAddress; vars.aTokenInitiatorBalance = IERC20(vars.aToken).balanceOf(msg.sender); - vars.amountToSwap = - amountToSwapList[vars.i] > vars.aTokenInitiatorBalance ? vars.aTokenInitiatorBalance : amountToSwapList[vars.i]; + vars.amountToSwap = amountToSwapList[vars.i] > vars.aTokenInitiatorBalance + ? vars.aTokenInitiatorBalance + : amountToSwapList[vars.i]; - _pullAToken(assetToSwapFromList[vars.i], vars.aToken, msg.sender, vars.amountToSwap, permitParams[vars.i]); + _pullAToken( + assetToSwapFromList[vars.i], + vars.aToken, + msg.sender, + vars.amountToSwap, + permitParams[vars.i] + ); - vars.receivedAmount = - _swapExactTokensForTokens( - assetToSwapFromList[vars.i], - assetToSwapToList[vars.i], - vars.amountToSwap, - minAmountsToReceive[vars.i], - useEthPath[vars.i] - ); + vars.receivedAmount = _swapExactTokensForTokens( + assetToSwapFromList[vars.i], + assetToSwapToList[vars.i], + vars.amountToSwap, + minAmountsToReceive[vars.i], + useEthPath[vars.i] + ); // Deposit new reserve IERC20(assetToSwapToList[vars.i]).approve(address(LENDING_POOL), vars.receivedAmount); diff --git a/contracts/adapters/UniswapRepayAdapter.sol b/contracts/adapters/UniswapRepayAdapter.sol index 9e725653..b5ce12bb 100644 --- a/contracts/adapters/UniswapRepayAdapter.sol +++ b/contracts/adapters/UniswapRepayAdapter.sol @@ -22,10 +22,11 @@ contract UniswapRepayAdapter is BaseUniswapAdapter { bool useEthPath; } - constructor(ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter) - public - BaseUniswapAdapter(addressesProvider, uniswapRouter) - {} + constructor( + ILendingPoolAddressesProvider addressesProvider, + IUniswapV2Router02 uniswapRouter, + address wethAddress + ) public BaseUniswapAdapter(addressesProvider, uniswapRouter, wethAddress) {} /** * @dev Uses the received funds from the flash loan to repay a debt on the protocol on behalf of the user. Then pulls @@ -114,7 +115,8 @@ contract UniswapRepayAdapter is BaseUniswapAdapter { } // Get exact collateral needed for the swap to avoid leftovers - uint256[] memory amounts = _getAmountsIn(collateralAsset, debtAsset, amountToRepay, useEthPath); + uint256[] memory amounts = + _getAmountsIn(collateralAsset, debtAsset, amountToRepay, useEthPath); require(amounts[0] <= maxCollateralToSwap, 'slippage too high'); // Pull aTokens from user @@ -182,7 +184,8 @@ contract UniswapRepayAdapter is BaseUniswapAdapter { } uint256 neededForFlashLoanDebt = repaidAmount.add(premium); - uint256[] memory amounts = _getAmountsIn(collateralAsset, debtAsset, neededForFlashLoanDebt, useEthPath); + uint256[] memory amounts = + _getAmountsIn(collateralAsset, debtAsset, neededForFlashLoanDebt, useEthPath); require(amounts[0] <= maxCollateralToSwap, 'slippage too high'); // Pull aTokens from user @@ -235,7 +238,11 @@ contract UniswapRepayAdapter is BaseUniswapAdapter { bytes32 r, bytes32 s, bool useEthPath - ) = abi.decode(params, (address, uint256, uint256, uint256, uint256, uint8, bytes32, bytes32, bool)); + ) = + abi.decode( + params, + (address, uint256, uint256, uint256, uint256, uint8, bytes32, bytes32, bool) + ); return RepayParams( diff --git a/contracts/adapters/interfaces/IBaseUniswapAdapter.sol b/contracts/adapters/interfaces/IBaseUniswapAdapter.sol index 540f9e46..82997b74 100644 --- a/contracts/adapters/interfaces/IBaseUniswapAdapter.sol +++ b/contracts/adapters/interfaces/IBaseUniswapAdapter.sol @@ -24,6 +24,8 @@ interface IBaseUniswapAdapter { address[] path; } + function WETH_ADDRESS() external returns (address); + function MAX_SLIPPAGE_PERCENT() external returns (uint256); function FLASHLOAN_PREMIUM_TOTAL() external returns (uint256); diff --git a/hardhat.config.ts b/hardhat.config.ts index f4dcaf69..74297504 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -6,6 +6,8 @@ import { accounts } from './test-wallets.js'; import { eEthereumNetwork } from './helpers/types'; import { BUIDLEREVM_CHAINID, COVERAGE_CHAINID } from './helpers/buidler-constants'; +require('dotenv').config(); + import '@nomiclabs/hardhat-ethers'; import '@nomiclabs/hardhat-waffle'; import 'temp-hardhat-etherscan'; @@ -45,7 +47,7 @@ const getCommonNetworkConfig = (networkName: eEthereumNetwork, networkId: number ? `https://eth-${ networkName === 'main' ? 'mainnet' : networkName }.alchemyapi.io/v2/${ALCHEMY_KEY}` - : `https://${networkName}.infura.io/v3/${INFURA_KEY}`, + : `https://${networkName === 'main' ? 'mainnet' : networkName}.infura.io/v3/${INFURA_KEY}`, hardfork: HARDFORK, blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, gasMultiplier: DEFAULT_GAS_MUL, diff --git a/helpers/contracts-deployments.ts b/helpers/contracts-deployments.ts index 7f91cf6a..4d1f0617 100644 --- a/helpers/contracts-deployments.ts +++ b/helpers/contracts-deployments.ts @@ -321,7 +321,7 @@ export const deployVariableDebtToken = async ( ); export const deployGenericAToken = async ( - [poolAddress, underlyingAssetAddress, treasuryAddress, name, symbol,incentivesController]: [ + [poolAddress, underlyingAssetAddress, treasuryAddress, name, symbol, incentivesController]: [ tEthereumAddress, tEthereumAddress, tEthereumAddress, @@ -338,7 +338,6 @@ export const deployGenericAToken = async ( string, tEthereumAddress, tEthereumAddress - ] = [poolAddress, underlyingAssetAddress, treasuryAddress, name, symbol, incentivesController]; return withSaveAndVerify( await new ATokenFactory(await getFirstSigner()).deploy(...args), @@ -506,7 +505,7 @@ export const deployMockUniswapRouter = async (verify?: boolean) => ); export const deployUniswapLiquiditySwapAdapter = async ( - args: [tEthereumAddress, tEthereumAddress], + args: [tEthereumAddress, tEthereumAddress, tEthereumAddress], verify?: boolean ) => withSaveAndVerify( @@ -517,7 +516,7 @@ export const deployUniswapLiquiditySwapAdapter = async ( ); export const deployUniswapRepayAdapter = async ( - args: [tEthereumAddress, tEthereumAddress], + args: [tEthereumAddress, tEthereumAddress, tEthereumAddress], verify?: boolean ) => withSaveAndVerify( diff --git a/package.json b/package.json index 4c8fdd95..5d9bfc75 100644 --- a/package.json +++ b/package.json @@ -43,10 +43,10 @@ "print-contracts:main": "npm run hardhat:main -- print-contracts", "print-contracts:ropsten": "npm run hardhat:main -- print-contracts", "dev:deployUIProvider": "npm run hardhat:kovan deploy-UiPoolDataProvider", - "dev:deployUniswapRepayAdapter": "hardhat --network kovan deploy-UniswapRepayAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441", - "dev:UniswapLiquiditySwapAdapter": "hardhat --network kovan deploy-UniswapLiquiditySwapAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441", - "main:deployUniswapRepayAdapter": "hardhat --network main deploy-UniswapRepayAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", - "main:UniswapLiquiditySwapAdapter": "hardhat --network main deploy-UniswapLiquiditySwapAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", + "dev:deployUniswapRepayAdapter": "hardhat --network kovan deploy-UniswapRepayAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441 --weth 0xd0a1e359811322d97991e03f863a0c30c2cf029c", + "dev:UniswapLiquiditySwapAdapter": "hardhat --network kovan deploy-UniswapLiquiditySwapAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441 --weth 0xd0a1e359811322d97991e03f863a0c30c2cf029c", + "main:deployUniswapRepayAdapter": "hardhat --network main deploy-UniswapRepayAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D --weth 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "main:UniswapLiquiditySwapAdapter": "hardhat --network main deploy-UniswapLiquiditySwapAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D --weth 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "kovan:verify": "npm run hardhat:kovan verify:general -- --all --pool Aave", "ropsten:verify": "npm run hardhat:ropsten verify:general -- --all --pool Aave", "mainnet:verify": "npm run hardhat:main verify:general -- --all --pool Aave", diff --git a/tasks/deployments/deploy-UniswapLiquiditySwapAdapter.ts b/tasks/deployments/deploy-UniswapLiquiditySwapAdapter.ts index af9aaa04..a41cd975 100644 --- a/tasks/deployments/deploy-UniswapLiquiditySwapAdapter.ts +++ b/tasks/deployments/deploy-UniswapLiquiditySwapAdapter.ts @@ -9,8 +9,9 @@ const CONTRACT_NAME = 'UniswapLiquiditySwapAdapter'; task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`) .addParam('provider', 'Address of the LendingPoolAddressesProvider') .addParam('router', 'Address of the uniswap router') + .addParam('weth', 'Address of the weth token') .addFlag('verify', `Verify ${CONTRACT_NAME} contract via Etherscan API.`) - .setAction(async ({ provider, router, verify }, localBRE) => { + .setAction(async ({ provider, router, weth, verify }, localBRE) => { await localBRE.run('set-DRE'); if (!localBRE.network.config.chainId) { @@ -25,10 +26,10 @@ task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`) */ const uniswapRepayAdapter = await new UniswapLiquiditySwapAdapterFactory( await getFirstSigner() - ).deploy(provider, router); + ).deploy(provider, router, weth); await uniswapRepayAdapter.deployTransaction.wait(); console.log(`${CONTRACT_NAME}.address`, uniswapRepayAdapter.address); - await verifyContract(uniswapRepayAdapter.address, [provider, router]); + await verifyContract(uniswapRepayAdapter.address, [provider, router, weth]); console.log(`\tFinished ${CONTRACT_NAME} proxy and implementation deployment`); }); diff --git a/tasks/deployments/deploy-UniswapRepayAdapter.ts b/tasks/deployments/deploy-UniswapRepayAdapter.ts index 5d52a36c..58ba23a1 100644 --- a/tasks/deployments/deploy-UniswapRepayAdapter.ts +++ b/tasks/deployments/deploy-UniswapRepayAdapter.ts @@ -9,8 +9,9 @@ const CONTRACT_NAME = 'UniswapRepayAdapter'; task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`) .addParam('provider', 'Address of the LendingPoolAddressesProvider') .addParam('router', 'Address of the uniswap router') + .addParam('weth', 'Address of the weth token') .addFlag('verify', `Verify ${CONTRACT_NAME} contract via Etherscan API.`) - .setAction(async ({ provider, router, verify }, localBRE) => { + .setAction(async ({ provider, router, weth, verify }, localBRE) => { await localBRE.run('set-DRE'); if (!localBRE.network.config.chainId) { @@ -18,17 +19,18 @@ task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`) } console.log(`\n- ${CONTRACT_NAME} deployment`); - const args = [ - '0x88757f2f99175387aB4C6a4b3067c77A695b0349', // lending provider kovan address - '0xfcd87315f0e4067070ade8682fcdbc3006631441', // uniswap router address - ]; + // const args = [ + // '0x88757f2f99175387aB4C6a4b3067c77A695b0349', // lending provider kovan address + // '0xfcd87315f0e4067070ade8682fcdbc3006631441', // uniswap router address + // ]; const uniswapRepayAdapter = await new UniswapRepayAdapterFactory(await getFirstSigner()).deploy( provider, - router + router, + weth ); await uniswapRepayAdapter.deployTransaction.wait(); console.log(`${CONTRACT_NAME}.address`, uniswapRepayAdapter.address); - await verifyContract(uniswapRepayAdapter.address, [provider, router]); + await verifyContract(uniswapRepayAdapter.address, [provider, router, weth]); console.log( `\tFinished ${CONTRACT_NAME}${CONTRACT_NAME}lDataProvider proxy and implementation deployment`