mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	add WETH to constructor of swap adapters
This commit is contained in:
		
							parent
							
								
									d611b1e8dc
								
							
						
					
					
						commit
						41efe9e811
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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`);
 | 
			
		||||
  });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user