mirror of
				https://github.com/Instadapp/aave-protocol-v2.git
				synced 2024-07-29 21:47:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { task } from 'hardhat/config';
 | |
| import { eEthereumNetwork } from '../../helpers/types';
 | |
| import { getTreasuryAddress } from '../../helpers/configuration';
 | |
| import * as marketConfigs from '../../markets/aave';
 | |
| import * as reserveConfigs from '../../markets/aave/reservesConfigs';
 | |
| import { chooseATokenDeployment } from '../../helpers/init-helpers';
 | |
| import { getLendingPoolAddressesProvider } from './../../helpers/contracts-getters';
 | |
| import {
 | |
|   deployDefaultReserveInterestRateStrategy,
 | |
|   deployStableDebtToken,
 | |
|   deployVariableDebtToken,
 | |
| } from './../../helpers/contracts-deployments';
 | |
| import { setDRE } from '../../helpers/misc-utils';
 | |
| import { ZERO_ADDRESS } from './../../helpers/constants';
 | |
| 
 | |
| const LENDING_POOL_ADDRESS_PROVIDER = {
 | |
|   main: '0xb53c1a33016b2dc2ff3653530bff1848a515c8c5',
 | |
|   kovan: '0x652B2937Efd0B5beA1c8d54293FC1289672AFC6b',
 | |
| };
 | |
| 
 | |
| const isSymbolValid = (symbol: string, network: eEthereumNetwork) =>
 | |
|   Object.keys(reserveConfigs).includes('strategy' + symbol) &&
 | |
|   marketConfigs.AaveConfig.ReserveAssets[network][symbol] &&
 | |
|   marketConfigs.AaveConfig.ReservesConfig[symbol] === reserveConfigs['strategy' + symbol];
 | |
| 
 | |
| task('external:deploy-new-asset', 'Deploy A token, Debt Tokens, Risk Parameters')
 | |
|   .addParam('symbol', `Asset symbol, needs to have configuration ready`)
 | |
|   .addFlag('verify', 'Verify contracts at Etherscan')
 | |
|   .setAction(async ({ verify, symbol }, localBRE) => {
 | |
|     const network = localBRE.network.name;
 | |
|     if (!isSymbolValid(symbol, network as eEthereumNetwork)) {
 | |
|       throw new Error(
 | |
|         `
 | |
| WRONG RESERVE ASSET SETUP:
 | |
|         The symbol ${symbol} has no reserve Config and/or reserve Asset setup.
 | |
|         update /markets/aave/index.ts and add the asset address for ${network} network
 | |
|         update /markets/aave/reservesConfigs.ts and add parameters for ${symbol}
 | |
|         `
 | |
|       );
 | |
|     }
 | |
|     setDRE(localBRE);
 | |
|     const strategyParams = reserveConfigs['strategy' + symbol];
 | |
|     const reserveAssetAddress =
 | |
|       marketConfigs.AaveConfig.ReserveAssets[localBRE.network.name][symbol];
 | |
|     const deployCustomAToken = chooseATokenDeployment(strategyParams.aTokenImpl);
 | |
|     const addressProvider = await getLendingPoolAddressesProvider(
 | |
|       LENDING_POOL_ADDRESS_PROVIDER[network]
 | |
|     );
 | |
|     const poolAddress = await addressProvider.getLendingPool();
 | |
|     const treasuryAddress = await getTreasuryAddress(marketConfigs.AaveConfig);
 | |
|     const aToken = await deployCustomAToken(
 | |
|       [
 | |
|         poolAddress,
 | |
|         reserveAssetAddress,
 | |
|         treasuryAddress,
 | |
|         ZERO_ADDRESS, // Incentives Controller
 | |
|         `Aave interest bearing ${symbol}`,
 | |
|         `a${symbol}`,
 | |
|       ],
 | |
|       verify
 | |
|     );
 | |
|     const stableDebt = await deployStableDebtToken(
 | |
|       [
 | |
|         poolAddress,
 | |
|         reserveAssetAddress,
 | |
|         ZERO_ADDRESS, // Incentives Controller
 | |
|         `Aave stable debt bearing ${symbol}`,
 | |
|         `stableDebt${symbol}`,
 | |
|       ],
 | |
|       verify
 | |
|     );
 | |
|     const variableDebt = await deployVariableDebtToken(
 | |
|       [
 | |
|         poolAddress,
 | |
|         reserveAssetAddress,
 | |
|         ZERO_ADDRESS, // Incentives Controller
 | |
|         `Aave variable debt bearing ${symbol}`,
 | |
|         `variableDebt${symbol}`,
 | |
|       ],
 | |
|       verify
 | |
|     );
 | |
|     const rates = await deployDefaultReserveInterestRateStrategy(
 | |
|       [
 | |
|         addressProvider.address,
 | |
|         strategyParams.strategy.optimalUtilizationRate,
 | |
|         strategyParams.strategy.baseVariableBorrowRate,
 | |
|         strategyParams.strategy.variableRateSlope1,
 | |
|         strategyParams.strategy.variableRateSlope2,
 | |
|         strategyParams.strategy.stableRateSlope1,
 | |
|         strategyParams.strategy.stableRateSlope2,
 | |
|       ],
 | |
|       verify
 | |
|     );
 | |
|     console.log(`
 | |
|     New interest bearing asset deployed on ${network}:
 | |
|     Interest bearing a${symbol} address: ${aToken.address}
 | |
|     Variable Debt variableDebt${symbol} address: ${variableDebt.address}
 | |
|     Stable Debt stableDebt${symbol} address: ${stableDebt.address}
 | |
|     Strategy Implementation for ${symbol} address: ${rates.address}
 | |
|     `);
 | |
|   });
 | 
