add WETH to constructor of swap adapters

This commit is contained in:
andyk 2020-12-02 19:56:38 +04:00
parent d611b1e8dc
commit 41efe9e811
9 changed files with 70 additions and 46 deletions

View File

@ -32,17 +32,21 @@ abstract contract BaseUniswapAdapter is FlashLoanReceiverBase, IBaseUniswapAdapt
// USD oracle asset address // USD oracle asset address
address public constant override USD_ADDRESS = 0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96; 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; IPriceOracleGetter public immutable override ORACLE;
IUniswapV2Router02 public immutable override UNISWAP_ROUTER; IUniswapV2Router02 public immutable override UNISWAP_ROUTER;
constructor(ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter) constructor(
public ILendingPoolAddressesProvider addressesProvider,
FlashLoanReceiverBase(addressesProvider) IUniswapV2Router02 uniswapRouter,
{ address wethAddress
) public FlashLoanReceiverBase(addressesProvider) {
ORACLE = IPriceOracleGetter(addressesProvider.getPriceOracle()); ORACLE = IPriceOracleGetter(addressesProvider.getPriceOracle());
UNISWAP_ROUTER = uniswapRouter; UNISWAP_ROUTER = uniswapRouter;
WETH_ADDRESS = wethAddress;
} }
/** /**

View File

@ -29,10 +29,11 @@ contract UniswapLiquiditySwapAdapter is BaseUniswapAdapter {
bool[] useEthPath; bool[] useEthPath;
} }
constructor(ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter) constructor(
public ILendingPoolAddressesProvider addressesProvider,
BaseUniswapAdapter(addressesProvider, uniswapRouter) 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. * @dev Swaps the received reserve amount from the flash loan into the asset specified in the params.
@ -148,13 +149,19 @@ contract UniswapLiquiditySwapAdapter is BaseUniswapAdapter {
vars.aToken = _getReserveData(assetToSwapFromList[vars.i]).aTokenAddress; vars.aToken = _getReserveData(assetToSwapFromList[vars.i]).aTokenAddress;
vars.aTokenInitiatorBalance = IERC20(vars.aToken).balanceOf(msg.sender); vars.aTokenInitiatorBalance = IERC20(vars.aToken).balanceOf(msg.sender);
vars.amountToSwap = vars.amountToSwap = amountToSwapList[vars.i] > vars.aTokenInitiatorBalance
amountToSwapList[vars.i] > vars.aTokenInitiatorBalance ? vars.aTokenInitiatorBalance : amountToSwapList[vars.i]; ? 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 = vars.receivedAmount = _swapExactTokensForTokens(
_swapExactTokensForTokens(
assetToSwapFromList[vars.i], assetToSwapFromList[vars.i],
assetToSwapToList[vars.i], assetToSwapToList[vars.i],
vars.amountToSwap, vars.amountToSwap,

View File

@ -22,10 +22,11 @@ contract UniswapRepayAdapter is BaseUniswapAdapter {
bool useEthPath; bool useEthPath;
} }
constructor(ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter) constructor(
public ILendingPoolAddressesProvider addressesProvider,
BaseUniswapAdapter(addressesProvider, uniswapRouter) 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 * @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 // 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'); require(amounts[0] <= maxCollateralToSwap, 'slippage too high');
// Pull aTokens from user // Pull aTokens from user
@ -182,7 +184,8 @@ contract UniswapRepayAdapter is BaseUniswapAdapter {
} }
uint256 neededForFlashLoanDebt = repaidAmount.add(premium); 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'); require(amounts[0] <= maxCollateralToSwap, 'slippage too high');
// Pull aTokens from user // Pull aTokens from user
@ -235,7 +238,11 @@ contract UniswapRepayAdapter is BaseUniswapAdapter {
bytes32 r, bytes32 r,
bytes32 s, bytes32 s,
bool useEthPath 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 return
RepayParams( RepayParams(

View File

@ -24,6 +24,8 @@ interface IBaseUniswapAdapter {
address[] path; address[] path;
} }
function WETH_ADDRESS() external returns (address);
function MAX_SLIPPAGE_PERCENT() external returns (uint256); function MAX_SLIPPAGE_PERCENT() external returns (uint256);
function FLASHLOAN_PREMIUM_TOTAL() external returns (uint256); function FLASHLOAN_PREMIUM_TOTAL() external returns (uint256);

View File

@ -6,6 +6,8 @@ import { accounts } from './test-wallets.js';
import { eEthereumNetwork } from './helpers/types'; import { eEthereumNetwork } from './helpers/types';
import { BUIDLEREVM_CHAINID, COVERAGE_CHAINID } from './helpers/buidler-constants'; import { BUIDLEREVM_CHAINID, COVERAGE_CHAINID } from './helpers/buidler-constants';
require('dotenv').config();
import '@nomiclabs/hardhat-ethers'; import '@nomiclabs/hardhat-ethers';
import '@nomiclabs/hardhat-waffle'; import '@nomiclabs/hardhat-waffle';
import 'temp-hardhat-etherscan'; import 'temp-hardhat-etherscan';
@ -45,7 +47,7 @@ const getCommonNetworkConfig = (networkName: eEthereumNetwork, networkId: number
? `https://eth-${ ? `https://eth-${
networkName === 'main' ? 'mainnet' : networkName networkName === 'main' ? 'mainnet' : networkName
}.alchemyapi.io/v2/${ALCHEMY_KEY}` }.alchemyapi.io/v2/${ALCHEMY_KEY}`
: `https://${networkName}.infura.io/v3/${INFURA_KEY}`, : `https://${networkName === 'main' ? 'mainnet' : networkName}.infura.io/v3/${INFURA_KEY}`,
hardfork: HARDFORK, hardfork: HARDFORK,
blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT,
gasMultiplier: DEFAULT_GAS_MUL, gasMultiplier: DEFAULT_GAS_MUL,

View File

@ -338,7 +338,6 @@ export const deployGenericAToken = async (
string, string,
tEthereumAddress, tEthereumAddress,
tEthereumAddress tEthereumAddress
] = [poolAddress, underlyingAssetAddress, treasuryAddress, name, symbol, incentivesController]; ] = [poolAddress, underlyingAssetAddress, treasuryAddress, name, symbol, incentivesController];
return withSaveAndVerify( return withSaveAndVerify(
await new ATokenFactory(await getFirstSigner()).deploy(...args), await new ATokenFactory(await getFirstSigner()).deploy(...args),
@ -506,7 +505,7 @@ export const deployMockUniswapRouter = async (verify?: boolean) =>
); );
export const deployUniswapLiquiditySwapAdapter = async ( export const deployUniswapLiquiditySwapAdapter = async (
args: [tEthereumAddress, tEthereumAddress], args: [tEthereumAddress, tEthereumAddress, tEthereumAddress],
verify?: boolean verify?: boolean
) => ) =>
withSaveAndVerify( withSaveAndVerify(
@ -517,7 +516,7 @@ export const deployUniswapLiquiditySwapAdapter = async (
); );
export const deployUniswapRepayAdapter = async ( export const deployUniswapRepayAdapter = async (
args: [tEthereumAddress, tEthereumAddress], args: [tEthereumAddress, tEthereumAddress, tEthereumAddress],
verify?: boolean verify?: boolean
) => ) =>
withSaveAndVerify( withSaveAndVerify(

View File

@ -43,10 +43,10 @@
"print-contracts:main": "npm run hardhat:main -- print-contracts", "print-contracts:main": "npm run hardhat:main -- print-contracts",
"print-contracts:ropsten": "npm run hardhat:main -- print-contracts", "print-contracts:ropsten": "npm run hardhat:main -- print-contracts",
"dev:deployUIProvider": "npm run hardhat:kovan deploy-UiPoolDataProvider", "dev:deployUIProvider": "npm run hardhat:kovan deploy-UiPoolDataProvider",
"dev:deployUniswapRepayAdapter": "hardhat --network kovan deploy-UniswapRepayAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441", "dev:deployUniswapRepayAdapter": "hardhat --network kovan deploy-UniswapRepayAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441 --weth 0xd0a1e359811322d97991e03f863a0c30c2cf029c",
"dev:UniswapLiquiditySwapAdapter": "hardhat --network kovan deploy-UniswapLiquiditySwapAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441", "dev:UniswapLiquiditySwapAdapter": "hardhat --network kovan deploy-UniswapLiquiditySwapAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441 --weth 0xd0a1e359811322d97991e03f863a0c30c2cf029c",
"main:deployUniswapRepayAdapter": "hardhat --network main deploy-UniswapRepayAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", "main:deployUniswapRepayAdapter": "hardhat --network main deploy-UniswapRepayAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D --weth 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"main:UniswapLiquiditySwapAdapter": "hardhat --network main deploy-UniswapLiquiditySwapAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", "main:UniswapLiquiditySwapAdapter": "hardhat --network main deploy-UniswapLiquiditySwapAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D --weth 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"kovan:verify": "npm run hardhat:kovan verify:general -- --all --pool Aave", "kovan:verify": "npm run hardhat:kovan verify:general -- --all --pool Aave",
"ropsten:verify": "npm run hardhat:ropsten 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", "mainnet:verify": "npm run hardhat:main verify:general -- --all --pool Aave",

View File

@ -9,8 +9,9 @@ const CONTRACT_NAME = 'UniswapLiquiditySwapAdapter';
task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`) task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`)
.addParam('provider', 'Address of the LendingPoolAddressesProvider') .addParam('provider', 'Address of the LendingPoolAddressesProvider')
.addParam('router', 'Address of the uniswap router') .addParam('router', 'Address of the uniswap router')
.addParam('weth', 'Address of the weth token')
.addFlag('verify', `Verify ${CONTRACT_NAME} contract via Etherscan API.`) .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'); await localBRE.run('set-DRE');
if (!localBRE.network.config.chainId) { if (!localBRE.network.config.chainId) {
@ -25,10 +26,10 @@ task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`)
*/ */
const uniswapRepayAdapter = await new UniswapLiquiditySwapAdapterFactory( const uniswapRepayAdapter = await new UniswapLiquiditySwapAdapterFactory(
await getFirstSigner() await getFirstSigner()
).deploy(provider, router); ).deploy(provider, router, weth);
await uniswapRepayAdapter.deployTransaction.wait(); await uniswapRepayAdapter.deployTransaction.wait();
console.log(`${CONTRACT_NAME}.address`, uniswapRepayAdapter.address); 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`); console.log(`\tFinished ${CONTRACT_NAME} proxy and implementation deployment`);
}); });

View File

@ -9,8 +9,9 @@ const CONTRACT_NAME = 'UniswapRepayAdapter';
task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`) task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`)
.addParam('provider', 'Address of the LendingPoolAddressesProvider') .addParam('provider', 'Address of the LendingPoolAddressesProvider')
.addParam('router', 'Address of the uniswap router') .addParam('router', 'Address of the uniswap router')
.addParam('weth', 'Address of the weth token')
.addFlag('verify', `Verify ${CONTRACT_NAME} contract via Etherscan API.`) .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'); await localBRE.run('set-DRE');
if (!localBRE.network.config.chainId) { if (!localBRE.network.config.chainId) {
@ -18,17 +19,18 @@ task(`deploy-${CONTRACT_NAME}`, `Deploys the ${CONTRACT_NAME} contract`)
} }
console.log(`\n- ${CONTRACT_NAME} deployment`); console.log(`\n- ${CONTRACT_NAME} deployment`);
const args = [ // const args = [
'0x88757f2f99175387aB4C6a4b3067c77A695b0349', // lending provider kovan address // '0x88757f2f99175387aB4C6a4b3067c77A695b0349', // lending provider kovan address
'0xfcd87315f0e4067070ade8682fcdbc3006631441', // uniswap router address // '0xfcd87315f0e4067070ade8682fcdbc3006631441', // uniswap router address
]; // ];
const uniswapRepayAdapter = await new UniswapRepayAdapterFactory(await getFirstSigner()).deploy( const uniswapRepayAdapter = await new UniswapRepayAdapterFactory(await getFirstSigner()).deploy(
provider, provider,
router router,
weth
); );
await uniswapRepayAdapter.deployTransaction.wait(); await uniswapRepayAdapter.deployTransaction.wait();
console.log(`${CONTRACT_NAME}.address`, uniswapRepayAdapter.address); console.log(`${CONTRACT_NAME}.address`, uniswapRepayAdapter.address);
await verifyContract(uniswapRepayAdapter.address, [provider, router]); await verifyContract(uniswapRepayAdapter.address, [provider, router, weth]);
console.log( console.log(
`\tFinished ${CONTRACT_NAME}${CONTRACT_NAME}lDataProvider proxy and implementation deployment` `\tFinished ${CONTRACT_NAME}${CONTRACT_NAME}lDataProvider proxy and implementation deployment`