Merge pull request #220 from aave/feat/188-avalanche-market

Feat/188 Avalanche market
This commit is contained in:
The-3D 2021-10-07 14:33:58 +02:00 committed by GitHub
commit c1ada1cb68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 1253 additions and 396 deletions

View File

@ -30,6 +30,21 @@ interface IAaveIncentivesController {
uint256 uint256
); );
/*
* LEGACY **************************
* @dev Returns the configuration of the distribution for a certain asset
* @param asset The address of the reference asset of the distribution
* @return The asset index, the emission per second and the last updated timestamp
**/
function assets(address asset)
external
view
returns (
uint128,
uint128,
uint256
);
/** /**
* @dev Whitelists an address to claim the rewards on behalf of another address * @dev Whitelists an address to claim the rewards on behalf of another address
* @param user The address of the user * @param user The address of the user

View File

@ -18,29 +18,34 @@ import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol';
contract AaveOracle is IPriceOracleGetter, Ownable { contract AaveOracle is IPriceOracleGetter, Ownable {
using SafeERC20 for IERC20; using SafeERC20 for IERC20;
event WethSet(address indexed weth); event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit);
event AssetSourceUpdated(address indexed asset, address indexed source); event AssetSourceUpdated(address indexed asset, address indexed source);
event FallbackOracleUpdated(address indexed fallbackOracle); event FallbackOracleUpdated(address indexed fallbackOracle);
mapping(address => IChainlinkAggregator) private assetsSources; mapping(address => IChainlinkAggregator) private assetsSources;
IPriceOracleGetter private _fallbackOracle; IPriceOracleGetter private _fallbackOracle;
address public immutable WETH; address public immutable BASE_CURRENCY;
uint256 public immutable BASE_CURRENCY_UNIT;
/// @notice Constructor /// @notice Constructor
/// @param assets The addresses of the assets /// @param assets The addresses of the assets
/// @param sources The address of the source of each asset /// @param sources The address of the source of each asset
/// @param fallbackOracle The address of the fallback oracle to use if the data of an /// @param fallbackOracle The address of the fallback oracle to use if the data of an
/// aggregator is not consistent /// aggregator is not consistent
/// @param baseCurrency the base currency used for the price quotes. If USD is used, base currency is 0x0
/// @param baseCurrencyUnit the unit of the base currency
constructor( constructor(
address[] memory assets, address[] memory assets,
address[] memory sources, address[] memory sources,
address fallbackOracle, address fallbackOracle,
address weth address baseCurrency,
uint256 baseCurrencyUnit
) public { ) public {
_setFallbackOracle(fallbackOracle); _setFallbackOracle(fallbackOracle);
_setAssetsSources(assets, sources); _setAssetsSources(assets, sources);
WETH = weth; BASE_CURRENCY = baseCurrency;
emit WethSet(weth); BASE_CURRENCY_UNIT = baseCurrencyUnit;
emit BaseCurrencySet(baseCurrency, baseCurrencyUnit);
} }
/// @notice External function called by the Aave governance to set or replace sources of assets /// @notice External function called by the Aave governance to set or replace sources of assets
@ -83,8 +88,8 @@ contract AaveOracle is IPriceOracleGetter, Ownable {
function getAssetPrice(address asset) public view override returns (uint256) { function getAssetPrice(address asset) public view override returns (uint256) {
IChainlinkAggregator source = assetsSources[asset]; IChainlinkAggregator source = assetsSources[asset];
if (asset == WETH) { if (asset == BASE_CURRENCY) {
return 1 ether; return BASE_CURRENCY_UNIT;
} else if (address(source) == address(0)) { } else if (address(source) == address(0)) {
return _fallbackOracle.getAssetPrice(asset); return _fallbackOracle.getAssetPrice(asset);
} else { } else {

View File

@ -25,7 +25,7 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
using UserConfiguration for DataTypes.UserConfigurationMap; using UserConfiguration for DataTypes.UserConfigurationMap;
address public constant MOCK_USD_ADDRESS = 0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96; address public constant MOCK_USD_ADDRESS = 0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96;
IAaveIncentivesController public immutable incentivesController; IAaveIncentivesController public immutable override incentivesController;
IPriceOracleGetter public immutable oracle; IPriceOracleGetter public immutable oracle;
constructor(IAaveIncentivesController _incentivesController, IPriceOracleGetter _oracle) public { constructor(IAaveIncentivesController _incentivesController, IPriceOracleGetter _oracle) public {
@ -51,6 +51,185 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
); );
} }
function getReservesList(ILendingPoolAddressesProvider provider)
public
view
override
returns (address[] memory)
{
ILendingPool lendingPool = ILendingPool(provider.getLendingPool());
return lendingPool.getReservesList();
}
function getSimpleReservesData(ILendingPoolAddressesProvider provider)
public
view
override
returns (
AggregatedReserveData[] memory,
uint256,
uint256
)
{
ILendingPool lendingPool = ILendingPool(provider.getLendingPool());
address[] memory reserves = lendingPool.getReservesList();
AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length);
for (uint256 i = 0; i < reserves.length; i++) {
AggregatedReserveData memory reserveData = reservesData[i];
reserveData.underlyingAsset = reserves[i];
// reserve current state
DataTypes.ReserveData memory baseData =
lendingPool.getReserveData(reserveData.underlyingAsset);
reserveData.liquidityIndex = baseData.liquidityIndex;
reserveData.variableBorrowIndex = baseData.variableBorrowIndex;
reserveData.liquidityRate = baseData.currentLiquidityRate;
reserveData.variableBorrowRate = baseData.currentVariableBorrowRate;
reserveData.stableBorrowRate = baseData.currentStableBorrowRate;
reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp;
reserveData.aTokenAddress = baseData.aTokenAddress;
reserveData.stableDebtTokenAddress = baseData.stableDebtTokenAddress;
reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress;
reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress;
reserveData.priceInEth = oracle.getAssetPrice(reserveData.underlyingAsset);
reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf(
reserveData.aTokenAddress
);
(
reserveData.totalPrincipalStableDebt,
,
reserveData.averageStableRate,
reserveData.stableDebtLastUpdateTimestamp
) = IStableDebtToken(reserveData.stableDebtTokenAddress).getSupplyData();
reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress)
.scaledTotalSupply();
// reserve configuration
// we're getting this info from the aToken, because some of assets can be not compliant with ETC20Detailed
reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol();
reserveData.name = '';
(
reserveData.baseLTVasCollateral,
reserveData.reserveLiquidationThreshold,
reserveData.reserveLiquidationBonus,
reserveData.decimals,
reserveData.reserveFactor
) = baseData.configuration.getParamsMemory();
(
reserveData.isActive,
reserveData.isFrozen,
reserveData.borrowingEnabled,
reserveData.stableBorrowRateEnabled
) = baseData.configuration.getFlagsMemory();
reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0;
(
reserveData.variableRateSlope1,
reserveData.variableRateSlope2,
reserveData.stableRateSlope1,
reserveData.stableRateSlope2
) = getInterestRateStrategySlopes(
DefaultReserveInterestRateStrategy(reserveData.interestRateStrategyAddress)
);
// incentives
if (address(0) != address(incentivesController)) {
(
reserveData.aTokenIncentivesIndex,
reserveData.aEmissionPerSecond,
reserveData.aIncentivesLastUpdateTimestamp
) = incentivesController.getAssetData(reserveData.aTokenAddress);
(
reserveData.sTokenIncentivesIndex,
reserveData.sEmissionPerSecond,
reserveData.sIncentivesLastUpdateTimestamp
) = incentivesController.getAssetData(reserveData.stableDebtTokenAddress);
(
reserveData.vTokenIncentivesIndex,
reserveData.vEmissionPerSecond,
reserveData.vIncentivesLastUpdateTimestamp
) = incentivesController.getAssetData(reserveData.variableDebtTokenAddress);
}
}
uint256 emissionEndTimestamp;
if (address(0) != address(incentivesController)) {
emissionEndTimestamp = incentivesController.DISTRIBUTION_END();
}
return (reservesData, oracle.getAssetPrice(MOCK_USD_ADDRESS), emissionEndTimestamp);
}
function getUserReservesData(ILendingPoolAddressesProvider provider, address user)
external
view
override
returns (UserReserveData[] memory, uint256)
{
ILendingPool lendingPool = ILendingPool(provider.getLendingPool());
address[] memory reserves = lendingPool.getReservesList();
DataTypes.UserConfigurationMap memory userConfig = lendingPool.getUserConfiguration(user);
UserReserveData[] memory userReservesData =
new UserReserveData[](user != address(0) ? reserves.length : 0);
for (uint256 i = 0; i < reserves.length; i++) {
DataTypes.ReserveData memory baseData = lendingPool.getReserveData(reserves[i]);
// incentives
if (address(0) != address(incentivesController)) {
userReservesData[i].aTokenincentivesUserIndex = incentivesController.getUserAssetData(
user,
baseData.aTokenAddress
);
userReservesData[i].vTokenincentivesUserIndex = incentivesController.getUserAssetData(
user,
baseData.variableDebtTokenAddress
);
userReservesData[i].sTokenincentivesUserIndex = incentivesController.getUserAssetData(
user,
baseData.stableDebtTokenAddress
);
}
// user reserve data
userReservesData[i].underlyingAsset = reserves[i];
userReservesData[i].scaledATokenBalance = IAToken(baseData.aTokenAddress).scaledBalanceOf(
user
);
userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i);
if (userConfig.isBorrowing(i)) {
userReservesData[i].scaledVariableDebt = IVariableDebtToken(
baseData
.variableDebtTokenAddress
)
.scaledBalanceOf(user);
userReservesData[i].principalStableDebt = IStableDebtToken(baseData.stableDebtTokenAddress)
.principalBalanceOf(user);
if (userReservesData[i].principalStableDebt != 0) {
userReservesData[i].stableBorrowRate = IStableDebtToken(baseData.stableDebtTokenAddress)
.getUserStableRate(user);
userReservesData[i].stableBorrowLastUpdateTimestamp = IStableDebtToken(
baseData
.stableDebtTokenAddress
)
.getUserLastUpdated(user);
}
}
}
uint256 userUnclaimedRewards;
if (address(0) != address(incentivesController)) {
userUnclaimedRewards = incentivesController.getUserUnclaimedRewards(user);
}
return (userReservesData, userUnclaimedRewards);
}
function getReservesData(ILendingPoolAddressesProvider provider, address user) function getReservesData(ILendingPoolAddressesProvider provider, address user)
external external
view view
@ -104,7 +283,7 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
// reserve configuration // reserve configuration
// we're getting this info from the aToken, because some of assets can be not compliant with ETC20Detailed // we're getting this info from the aToken, because some of assets can be not compliant with ETC20Detailed
reserveData.symbol = IERC20Detailed(reserveData.aTokenAddress).symbol(); reserveData.symbol = IERC20Detailed(reserveData.underlyingAsset).symbol();
reserveData.name = ''; reserveData.name = '';
( (
@ -136,14 +315,14 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
reserveData.aTokenIncentivesIndex, reserveData.aTokenIncentivesIndex,
reserveData.aEmissionPerSecond, reserveData.aEmissionPerSecond,
reserveData.aIncentivesLastUpdateTimestamp reserveData.aIncentivesLastUpdateTimestamp
) = incentivesController.getAssetData(reserveData.aTokenAddress); ) = incentivesController.getAssetData(reserveData.aTokenAddress);
( (
reserveData.sTokenIncentivesIndex, reserveData.sTokenIncentivesIndex,
reserveData.sEmissionPerSecond, reserveData.sEmissionPerSecond,
reserveData.sIncentivesLastUpdateTimestamp reserveData.sIncentivesLastUpdateTimestamp
) = incentivesController.getAssetData(reserveData.stableDebtTokenAddress); ) = incentivesController.getAssetData(reserveData.stableDebtTokenAddress);
( (
reserveData.vTokenIncentivesIndex, reserveData.vTokenIncentivesIndex,
reserveData.vEmissionPerSecond, reserveData.vEmissionPerSecond,
@ -200,12 +379,12 @@ contract UiPoolDataProvider is IUiPoolDataProvider {
} }
} }
IncentivesControllerData memory incentivesControllerData; IncentivesControllerData memory incentivesControllerData;
if (address(0) != address(incentivesController)) { if (address(0) != address(incentivesController)) {
if (user != address(0)) { if (user != address(0)) {
incentivesControllerData.userUnclaimedRewards = incentivesController.getUserUnclaimedRewards(user); incentivesControllerData.userUnclaimedRewards = incentivesController
.getUserUnclaimedRewards(user);
} }
incentivesControllerData.emissionEndTimestamp = incentivesController.DISTRIBUTION_END(); incentivesControllerData.emissionEndTimestamp = incentivesController.DISTRIBUTION_END();
} }

View File

@ -73,7 +73,31 @@ interface IUiPoolDataProvider {
uint256 emissionEndTimestamp; uint256 emissionEndTimestamp;
} }
function getReservesList(ILendingPoolAddressesProvider provider)
external
view
returns (address[] memory);
function incentivesController() external view returns (IAaveIncentivesController);
function getSimpleReservesData(ILendingPoolAddressesProvider provider)
external
view
returns (
AggregatedReserveData[] memory,
uint256, // usd price eth
uint256 // emission end timestamp
);
function getUserReservesData(ILendingPoolAddressesProvider provider, address user)
external
view
returns (
UserReserveData[] memory,
uint256 // user unclaimed rewards
);
// generic method with full data
function getReservesData(ILendingPoolAddressesProvider provider, address user) function getReservesData(ILendingPoolAddressesProvider provider, address user)
external external
view view

View File

@ -3,7 +3,13 @@ import fs from 'fs';
import { HardhatUserConfig } from 'hardhat/types'; import { HardhatUserConfig } from 'hardhat/types';
// @ts-ignore // @ts-ignore
import { accounts } from './test-wallets.js'; import { accounts } from './test-wallets.js';
import { eEthereumNetwork, eNetwork, ePolygonNetwork, eXDaiNetwork } from './helpers/types'; import {
eAvalancheNetwork,
eEthereumNetwork,
eNetwork,
ePolygonNetwork,
eXDaiNetwork,
} from './helpers/types';
import { BUIDLEREVM_CHAINID, COVERAGE_CHAINID } from './helpers/buidler-constants'; import { BUIDLEREVM_CHAINID, COVERAGE_CHAINID } from './helpers/buidler-constants';
import { import {
NETWORKS_RPC_URL, NETWORKS_RPC_URL,
@ -24,7 +30,7 @@ import 'solidity-coverage';
import { fork } from 'child_process'; import { fork } from 'child_process';
const SKIP_LOAD = process.env.SKIP_LOAD === 'true'; const SKIP_LOAD = process.env.SKIP_LOAD === 'true';
const DEFAULT_BLOCK_GAS_LIMIT = 12450000; const DEFAULT_BLOCK_GAS_LIMIT = 8000000;
const DEFAULT_GAS_MUL = 5; const DEFAULT_GAS_MUL = 5;
const HARDFORK = 'istanbul'; const HARDFORK = 'istanbul';
const ETHERSCAN_KEY = process.env.ETHERSCAN_KEY || ''; const ETHERSCAN_KEY = process.env.ETHERSCAN_KEY || '';
@ -96,10 +102,12 @@ const buidlerConfig: HardhatUserConfig = {
kovan: getCommonNetworkConfig(eEthereumNetwork.kovan, 42), kovan: getCommonNetworkConfig(eEthereumNetwork.kovan, 42),
ropsten: getCommonNetworkConfig(eEthereumNetwork.ropsten, 3), ropsten: getCommonNetworkConfig(eEthereumNetwork.ropsten, 3),
main: getCommonNetworkConfig(eEthereumNetwork.main, 1), main: getCommonNetworkConfig(eEthereumNetwork.main, 1),
tenderlyMain: getCommonNetworkConfig(eEthereumNetwork.tenderlyMain, 3030), tenderly: getCommonNetworkConfig(eEthereumNetwork.tenderly, 3030),
matic: getCommonNetworkConfig(ePolygonNetwork.matic, 137), matic: getCommonNetworkConfig(ePolygonNetwork.matic, 137),
mumbai: getCommonNetworkConfig(ePolygonNetwork.mumbai, 80001), mumbai: getCommonNetworkConfig(ePolygonNetwork.mumbai, 80001),
xdai: getCommonNetworkConfig(eXDaiNetwork.xdai, 100), xdai: getCommonNetworkConfig(eXDaiNetwork.xdai, 100),
avalanche: getCommonNetworkConfig(eAvalancheNetwork.avalanche, 43114),
fuji: getCommonNetworkConfig(eAvalancheNetwork.fuji, 43113),
hardhat: { hardhat: {
hardfork: 'berlin', hardfork: 'berlin',
blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT,

View File

@ -1,6 +1,7 @@
// @ts-ignore // @ts-ignore
import { HardhatNetworkForkingUserConfig, HardhatUserConfig } from 'hardhat/types'; import { HardhatNetworkForkingUserConfig, HardhatUserConfig } from 'hardhat/types';
import { import {
eAvalancheNetwork,
eEthereumNetwork, eEthereumNetwork,
ePolygonNetwork, ePolygonNetwork,
eXDaiNetwork, eXDaiNetwork,
@ -45,10 +46,15 @@ export const NETWORKS_RPC_URL: iParamsPerNetwork<string> = {
[eEthereumNetwork.coverage]: 'http://localhost:8555', [eEthereumNetwork.coverage]: 'http://localhost:8555',
[eEthereumNetwork.hardhat]: 'http://localhost:8545', [eEthereumNetwork.hardhat]: 'http://localhost:8545',
[eEthereumNetwork.buidlerevm]: 'http://localhost:8545', [eEthereumNetwork.buidlerevm]: 'http://localhost:8545',
[eEthereumNetwork.tenderlyMain]: `https://rpc.tenderly.co/fork/${TENDERLY_FORK_ID}`, [eEthereumNetwork.tenderly]: `https://rpc.tenderly.co/fork/`,
[ePolygonNetwork.mumbai]: 'https://rpc-mumbai.maticvigil.com', [ePolygonNetwork.mumbai]: 'https://rpc-mumbai.maticvigil.com',
[ePolygonNetwork.matic]: 'https://rpc-mainnet.matic.network', [ePolygonNetwork.matic]:
// 'https://rpc-mainnet.maticvigil.com/v1/e616b9ddc7598ffae92629f8145614d55094c722',
'https://polygon-mainnet.g.alchemy.com/v2/6NUmfWDZw6lC3RPAphj0p_2vm7ElOn2U',
// [ePolygonNetwork.matic]: 'https://rpc-mainnet.matic.network',
[eXDaiNetwork.xdai]: 'https://rpc.xdaichain.com/', [eXDaiNetwork.xdai]: 'https://rpc.xdaichain.com/',
[eAvalancheNetwork.avalanche]: 'https://api.avax.network/ext/bc/C/rpc',
[eAvalancheNetwork.fuji]: 'https://api.avax-test.network/ext/bc/C/rpc',
}; };
export const NETWORKS_DEFAULT_GAS: iParamsPerNetwork<number> = { export const NETWORKS_DEFAULT_GAS: iParamsPerNetwork<number> = {
@ -58,10 +64,12 @@ export const NETWORKS_DEFAULT_GAS: iParamsPerNetwork<number> = {
[eEthereumNetwork.coverage]: 65 * GWEI, [eEthereumNetwork.coverage]: 65 * GWEI,
[eEthereumNetwork.hardhat]: 65 * GWEI, [eEthereumNetwork.hardhat]: 65 * GWEI,
[eEthereumNetwork.buidlerevm]: 65 * GWEI, [eEthereumNetwork.buidlerevm]: 65 * GWEI,
[eEthereumNetwork.tenderlyMain]: 0.01 * GWEI, [eEthereumNetwork.tenderly]: 1 * GWEI,
[ePolygonNetwork.mumbai]: 1 * GWEI, [ePolygonNetwork.mumbai]: 1 * GWEI,
[ePolygonNetwork.matic]: 1 * GWEI, [ePolygonNetwork.matic]: 1 * GWEI,
[eXDaiNetwork.xdai]: 1 * GWEI, [eXDaiNetwork.xdai]: 1 * GWEI,
[eAvalancheNetwork.avalanche]: 225 * GWEI,
[eAvalancheNetwork.fuji]: 85 * GWEI,
}; };
export const BLOCK_TO_FORK: iParamsPerNetwork<number | undefined> = { export const BLOCK_TO_FORK: iParamsPerNetwork<number | undefined> = {
@ -71,8 +79,10 @@ export const BLOCK_TO_FORK: iParamsPerNetwork<number | undefined> = {
[eEthereumNetwork.coverage]: undefined, [eEthereumNetwork.coverage]: undefined,
[eEthereumNetwork.hardhat]: undefined, [eEthereumNetwork.hardhat]: undefined,
[eEthereumNetwork.buidlerevm]: undefined, [eEthereumNetwork.buidlerevm]: undefined,
[eEthereumNetwork.tenderlyMain]: 12406069, [eEthereumNetwork.tenderly]: undefined,
[ePolygonNetwork.mumbai]: undefined, [ePolygonNetwork.mumbai]: undefined,
[ePolygonNetwork.matic]: undefined, [ePolygonNetwork.matic]: undefined,
[eXDaiNetwork.xdai]: undefined, [eXDaiNetwork.xdai]: undefined,
[eAvalancheNetwork.avalanche]: undefined,
[eAvalancheNetwork.fuji]: undefined,
}; };

View File

@ -3,13 +3,15 @@ import {
iMultiPoolsAssets, iMultiPoolsAssets,
IReserveParams, IReserveParams,
PoolConfiguration, PoolConfiguration,
ICommonConfiguration,
eNetwork, eNetwork,
IBaseConfiguration,
} from './types'; } from './types';
import { getEthersSignersAddresses, getParamPerPool } from './contracts-helpers'; import { getEthersSignersAddresses, getParamPerPool } from './contracts-helpers';
import AaveConfig from '../markets/aave'; import AaveConfig from '../markets/aave';
import MaticConfig from '../markets/matic'; import MaticConfig from '../markets/matic';
import AvalancheConfig from '../markets/avalanche';
import AmmConfig from '../markets/amm'; import AmmConfig from '../markets/amm';
import { CommonsConfig } from '../markets/aave/commons'; import { CommonsConfig } from '../markets/aave/commons';
import { DRE, filterMapBy } from './misc-utils'; import { DRE, filterMapBy } from './misc-utils';
import { tEthereumAddress } from './types'; import { tEthereumAddress } from './types';
@ -21,6 +23,7 @@ export enum ConfigNames {
Aave = 'Aave', Aave = 'Aave',
Matic = 'Matic', Matic = 'Matic',
Amm = 'Amm', Amm = 'Amm',
Avalanche = 'Avalanche'
} }
export const loadPoolConfig = (configName: ConfigNames): PoolConfiguration => { export const loadPoolConfig = (configName: ConfigNames): PoolConfiguration => {
@ -31,10 +34,16 @@ export const loadPoolConfig = (configName: ConfigNames): PoolConfiguration => {
return MaticConfig; return MaticConfig;
case ConfigNames.Amm: case ConfigNames.Amm:
return AmmConfig; return AmmConfig;
case ConfigNames.Avalanche:
return AvalancheConfig;
case ConfigNames.Commons: case ConfigNames.Commons:
return CommonsConfig; return CommonsConfig;
default: default:
throw new Error(`Unsupported pool configuration: ${Object.values(ConfigNames)}`); throw new Error(
`Unsupported pool configuration: ${configName} is not one of the supported configs ${Object.values(
ConfigNames
)}`
);
} }
}; };
@ -54,12 +63,15 @@ export const getReservesConfigByPool = (pool: AavePools): iMultiPoolsAssets<IRes
[AavePools.matic]: { [AavePools.matic]: {
...MaticConfig.ReservesConfig, ...MaticConfig.ReservesConfig,
}, },
[AavePools.avalanche]: {
...AvalancheConfig.ReservesConfig,
}
}, },
pool pool
); );
export const getGenesisPoolAdmin = async ( export const getGenesisPoolAdmin = async (
config: ICommonConfiguration config: IBaseConfiguration
): Promise<tEthereumAddress> => { ): Promise<tEthereumAddress> => {
const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name; const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name;
const targetAddress = getParamPerNetwork(config.PoolAdmin, <eNetwork>currentNetwork); const targetAddress = getParamPerNetwork(config.PoolAdmin, <eNetwork>currentNetwork);
@ -71,9 +83,7 @@ export const getGenesisPoolAdmin = async (
return addressList[addressIndex]; return addressList[addressIndex];
}; };
export const getEmergencyAdmin = async ( export const getEmergencyAdmin = async (config: IBaseConfiguration): Promise<tEthereumAddress> => {
config: ICommonConfiguration
): Promise<tEthereumAddress> => {
const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name; const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name;
const targetAddress = getParamPerNetwork(config.EmergencyAdmin, <eNetwork>currentNetwork); const targetAddress = getParamPerNetwork(config.EmergencyAdmin, <eNetwork>currentNetwork);
if (targetAddress) { if (targetAddress) {
@ -84,19 +94,17 @@ export const getEmergencyAdmin = async (
return addressList[addressIndex]; return addressList[addressIndex];
}; };
export const getTreasuryAddress = async ( export const getTreasuryAddress = async (config: IBaseConfiguration): Promise<tEthereumAddress> => {
config: ICommonConfiguration
): Promise<tEthereumAddress> => {
const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name; const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name;
return getParamPerNetwork(config.ReserveFactorTreasuryAddress, <eNetwork>currentNetwork); return getParamPerNetwork(config.ReserveFactorTreasuryAddress, <eNetwork>currentNetwork);
}; };
export const getATokenDomainSeparatorPerNetwork = ( export const getATokenDomainSeparatorPerNetwork = (
network: eNetwork, network: eNetwork,
config: ICommonConfiguration config: IBaseConfiguration
): tEthereumAddress => getParamPerNetwork<tEthereumAddress>(config.ATokenDomainSeparator, network); ): tEthereumAddress => getParamPerNetwork<tEthereumAddress>(config.ATokenDomainSeparator, network);
export const getWethAddress = async (config: ICommonConfiguration) => { export const getWethAddress = async (config: IBaseConfiguration) => {
const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name; const currentNetwork = process.env.FORK ? process.env.FORK : DRE.network.name;
const wethAddress = getParamPerNetwork(config.WETH, <eNetwork>currentNetwork); const wethAddress = getParamPerNetwork(config.WETH, <eNetwork>currentNetwork);
if (wethAddress) { if (wethAddress) {
@ -109,7 +117,7 @@ export const getWethAddress = async (config: ICommonConfiguration) => {
return weth.address; return weth.address;
}; };
export const getWrappedNativeTokenAddress = async (config: ICommonConfiguration) => { export const getWrappedNativeTokenAddress = async (config: IBaseConfiguration) => {
const currentNetwork = process.env.MAINNET_FORK === 'true' ? 'main' : DRE.network.name; const currentNetwork = process.env.MAINNET_FORK === 'true' ? 'main' : DRE.network.name;
const wethAddress = getParamPerNetwork(config.WrappedNativeToken, <eNetwork>currentNetwork); const wethAddress = getParamPerNetwork(config.WrappedNativeToken, <eNetwork>currentNetwork);
if (wethAddress) { if (wethAddress) {
@ -122,7 +130,7 @@ export const getWrappedNativeTokenAddress = async (config: ICommonConfiguration)
return weth.address; return weth.address;
}; };
export const getLendingRateOracles = (poolConfig: ICommonConfiguration) => { export const getLendingRateOracles = (poolConfig: IBaseConfiguration) => {
const { const {
ProtocolGlobalParams: { UsdAddress }, ProtocolGlobalParams: { UsdAddress },
LendingRateOracleRatesCommon, LendingRateOracleRatesCommon,
@ -134,3 +142,15 @@ export const getLendingRateOracles = (poolConfig: ICommonConfiguration) => {
Object.keys(ReserveAssets[network]).includes(key) Object.keys(ReserveAssets[network]).includes(key)
); );
}; };
export const getQuoteCurrency = async (config: IBaseConfiguration) => {
switch (config.OracleQuoteCurrency) {
case 'ETH':
case 'WETH':
return getWethAddress(config);
case 'USD':
return config.ProtocolGlobalParams.UsdAddress;
default:
throw `Quote ${config.OracleQuoteCurrency} currency not set. Add a new case to getQuoteCurrency switch`;
}
};

View File

@ -1,4 +1,5 @@
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import { eEthereumNetwork } from './types';
// ---------------- // ----------------
// MATH // MATH
@ -12,6 +13,7 @@ export const RAY = new BigNumber(10).exponentiatedBy(27).toFixed();
export const HALF_RAY = new BigNumber(RAY).multipliedBy(0.5).toFixed(); export const HALF_RAY = new BigNumber(RAY).multipliedBy(0.5).toFixed();
export const WAD_RAY_RATIO = Math.pow(10, 9).toString(); export const WAD_RAY_RATIO = Math.pow(10, 9).toString();
export const oneEther = new BigNumber(Math.pow(10, 18)); export const oneEther = new BigNumber(Math.pow(10, 18));
export const oneUsd = new BigNumber(Math.pow(10, 8));
export const oneRay = new BigNumber(Math.pow(10, 27)); export const oneRay = new BigNumber(Math.pow(10, 27));
export const MAX_UINT_AMOUNT = export const MAX_UINT_AMOUNT =
'115792089237316195423570985008687907853269984665640564039457584007913129639935'; '115792089237316195423570985008687907853269984665640564039457584007913129639935';
@ -30,6 +32,7 @@ export const USD_ADDRESS = '0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96';
export const AAVE_REFERRAL = '0'; export const AAVE_REFERRAL = '0';
export const MOCK_CHAINLINK_AGGREGATORS_PRICES = { export const MOCK_CHAINLINK_AGGREGATORS_PRICES = {
// Update to USD-based price feeds
AAVE: oneEther.multipliedBy('0.003620948469').toFixed(), AAVE: oneEther.multipliedBy('0.003620948469').toFixed(),
BAT: oneEther.multipliedBy('0.00137893825230').toFixed(), BAT: oneEther.multipliedBy('0.00137893825230').toFixed(),
BUSD: oneEther.multipliedBy('0.00736484').toFixed(), BUSD: oneEther.multipliedBy('0.00736484').toFixed(),
@ -69,5 +72,6 @@ export const MOCK_CHAINLINK_AGGREGATORS_PRICES = {
WMATIC: oneEther.multipliedBy('0.003620948469').toFixed(), WMATIC: oneEther.multipliedBy('0.003620948469').toFixed(),
STAKE: oneEther.multipliedBy('0.003620948469').toFixed(), STAKE: oneEther.multipliedBy('0.003620948469').toFixed(),
xSUSHI: oneEther.multipliedBy('0.00913428586').toFixed(), xSUSHI: oneEther.multipliedBy('0.00913428586').toFixed(),
WAVAX: oneEther.multipliedBy('0.006051936629').toFixed(),
USD: '5848466240000000', USD: '5848466240000000',
}; };

View File

@ -1,5 +1,5 @@
import { Contract } from 'ethers'; import { Contract } from 'ethers';
import { DRE } from './misc-utils'; import { DRE, notFalsyOrZeroAddress } from './misc-utils';
import { import {
tEthereumAddress, tEthereumAddress,
eContractid, eContractid,
@ -13,9 +13,8 @@ import {
} from './types'; } from './types';
import { MintableERC20 } from '../types/MintableERC20'; import { MintableERC20 } from '../types/MintableERC20';
import { MockContract } from 'ethereum-waffle'; import { MockContract } from 'ethereum-waffle';
import { getReservesConfigByPool } from './configuration'; import { ConfigNames, getReservesConfigByPool, loadPoolConfig } from './configuration';
import { getFirstSigner } from './contracts-getters'; import { getFirstSigner } from './contracts-getters';
import { ZERO_ADDRESS } from './constants';
import { import {
AaveProtocolDataProviderFactory, AaveProtocolDataProviderFactory,
ATokenFactory, ATokenFactory,
@ -60,6 +59,7 @@ import {
insertContractAddressInDb, insertContractAddressInDb,
deployContract, deployContract,
verifyContract, verifyContract,
getOptionalParamAddressPerNetwork,
} from './contracts-helpers'; } from './contracts-helpers';
import { StableAndVariableTokensHelperFactory } from '../types/StableAndVariableTokensHelperFactory'; import { StableAndVariableTokensHelperFactory } from '../types/StableAndVariableTokensHelperFactory';
import { MintableDelegationERC20 } from '../types/MintableDelegationERC20'; import { MintableDelegationERC20 } from '../types/MintableDelegationERC20';
@ -67,6 +67,7 @@ import { readArtifact as buidlerReadArtifact } from '@nomiclabs/buidler/plugins'
import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { HardhatRuntimeEnvironment } from 'hardhat/types';
import { LendingPoolLibraryAddresses } from '../types/LendingPoolFactory'; import { LendingPoolLibraryAddresses } from '../types/LendingPoolFactory';
import { UiPoolDataProvider } from '../types'; import { UiPoolDataProvider } from '../types';
import { eNetwork } from './types';
export const deployUiPoolDataProvider = async ( export const deployUiPoolDataProvider = async (
[incentivesController, aaveOracle]: [tEthereumAddress, tEthereumAddress], [incentivesController, aaveOracle]: [tEthereumAddress, tEthereumAddress],
@ -226,7 +227,7 @@ export const deployMockAggregator = async (price: tStringTokenSmallUnits, verify
); );
export const deployAaveOracle = async ( export const deployAaveOracle = async (
args: [tEthereumAddress[], tEthereumAddress[], tEthereumAddress, tEthereumAddress], args: [tEthereumAddress[], tEthereumAddress[], tEthereumAddress, tEthereumAddress, string],
verify?: boolean verify?: boolean
) => ) =>
withSaveAndVerify( withSaveAndVerify(
@ -354,20 +355,20 @@ export const deployVariableDebtToken = async (
return instance; return instance;
}; };
export const deployGenericStableDebtToken = async () => export const deployGenericStableDebtToken = async (verify?: boolean) =>
withSaveAndVerify( withSaveAndVerify(
await new StableDebtTokenFactory(await getFirstSigner()).deploy(), await new StableDebtTokenFactory(await getFirstSigner()).deploy(),
eContractid.StableDebtToken, eContractid.StableDebtToken,
[], [],
false verify
); );
export const deployGenericVariableDebtToken = async () => export const deployGenericVariableDebtToken = async (verify?: boolean) =>
withSaveAndVerify( withSaveAndVerify(
await new VariableDebtTokenFactory(await getFirstSigner()).deploy(), await new VariableDebtTokenFactory(await getFirstSigner()).deploy(),
eContractid.VariableDebtToken, eContractid.VariableDebtToken,
[], [],
false verify
); );
export const deployGenericAToken = async ( export const deployGenericAToken = async (
@ -641,6 +642,75 @@ export const deployFlashLiquidationAdapter = async (
verify verify
); );
export const chooseATokenDeployment = (id: eContractid) => {
switch (id) {
case eContractid.AToken:
return deployGenericATokenImpl;
case eContractid.DelegationAwareAToken:
return deployDelegationAwareATokenImpl;
default:
throw Error(`Missing aToken implementation deployment script for: ${id}`);
}
};
export const deployATokenImplementations = async (
pool: ConfigNames,
reservesConfig: { [key: string]: IReserveParams },
verify = false
) => {
const poolConfig = loadPoolConfig(pool);
const network = <eNetwork>DRE.network.name;
// Obtain the different AToken implementations of all reserves inside the Market config
const aTokenImplementations = [
...Object.entries(reservesConfig).reduce<Set<eContractid>>((acc, [, entry]) => {
acc.add(entry.aTokenImpl);
return acc;
}, new Set<eContractid>()),
];
for (let x = 0; x < aTokenImplementations.length; x++) {
const aTokenAddress = getOptionalParamAddressPerNetwork(
poolConfig[aTokenImplementations[x].toString()],
network
);
if (!notFalsyOrZeroAddress(aTokenAddress)) {
const deployImplementationMethod = chooseATokenDeployment(aTokenImplementations[x]);
console.log(`Deploying implementation`, aTokenImplementations[x]);
await deployImplementationMethod(verify);
}
}
// Debt tokens, for now all Market configs follows same implementations
const genericStableDebtTokenAddress = getOptionalParamAddressPerNetwork(
poolConfig.StableDebtTokenImplementation,
network
);
const geneticVariableDebtTokenAddress = getOptionalParamAddressPerNetwork(
poolConfig.VariableDebtTokenImplementation,
network
);
if (!notFalsyOrZeroAddress(genericStableDebtTokenAddress)) {
await deployGenericStableDebtToken(verify);
}
if (!notFalsyOrZeroAddress(geneticVariableDebtTokenAddress)) {
await deployGenericVariableDebtToken(verify);
}
};
export const deployRateStrategy = async (
strategyName: string,
args: [tEthereumAddress, string, string, string, string, string, string],
verify: boolean
): Promise<tEthereumAddress> => {
switch (strategyName) {
default:
return await (
await deployDefaultReserveInterestRateStrategy(args, verify)
).address;
}
};
export const deployMockParaSwapAugustus = async (verify?: boolean) => export const deployMockParaSwapAugustus = async (verify?: boolean) =>
withSaveAndVerify( withSaveAndVerify(
await new MockParaSwapAugustusFactory(await getFirstSigner()).deploy(), await new MockParaSwapAugustusFactory(await getFirstSigner()).deploy(),

View File

@ -36,7 +36,7 @@ import {
} from '../types'; } from '../types';
import { IERC20DetailedFactory } from '../types/IERC20DetailedFactory'; import { IERC20DetailedFactory } from '../types/IERC20DetailedFactory';
import { getEthersSigners, MockTokenMap } from './contracts-helpers'; import { getEthersSigners, MockTokenMap } from './contracts-helpers';
import { DRE, getDb, notFalsyOrZeroAddress } from './misc-utils'; import { DRE, getDb, notFalsyOrZeroAddress, omit } from './misc-utils';
import { eContractid, PoolConfiguration, tEthereumAddress, TokenContractId } from './types'; import { eContractid, PoolConfiguration, tEthereumAddress, TokenContractId } from './types';
export const getFirstSigner = async () => (await getEthersSigners())[0]; export const getFirstSigner = async () => (await getEthersSigners())[0];
@ -44,16 +44,18 @@ export const getFirstSigner = async () => (await getEthersSigners())[0];
export const getLendingPoolAddressesProvider = async (address?: tEthereumAddress) => { export const getLendingPoolAddressesProvider = async (address?: tEthereumAddress) => {
return await LendingPoolAddressesProviderFactory.connect( return await LendingPoolAddressesProviderFactory.connect(
address || address ||
(await getDb().get(`${eContractid.LendingPoolAddressesProvider}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.LendingPoolAddressesProvider}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
}; };
export const getLendingPoolConfiguratorProxy = async (address?: tEthereumAddress) => { export const getLendingPoolConfiguratorProxy = async (address?: tEthereumAddress) => {
return await LendingPoolConfiguratorFactory.connect( return await LendingPoolConfiguratorFactory.connect(
address || address ||
(await getDb().get(`${eContractid.LendingPoolConfigurator}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.LendingPoolConfigurator}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
}; };
@ -61,14 +63,18 @@ export const getLendingPoolConfiguratorProxy = async (address?: tEthereumAddress
export const getLendingPool = async (address?: tEthereumAddress) => export const getLendingPool = async (address?: tEthereumAddress) =>
await LendingPoolFactory.connect( await LendingPoolFactory.connect(
address || address ||
(await getDb().get(`${eContractid.LendingPool}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.LendingPool}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getPriceOracle = async (address?: tEthereumAddress) => export const getPriceOracle = async (address?: tEthereumAddress) =>
await PriceOracleFactory.connect( await PriceOracleFactory.connect(
address || address ||
(await getDb().get(`${eContractid.PriceOracle}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.PriceOracle}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -81,36 +87,45 @@ export const getAToken = async (address?: tEthereumAddress) =>
export const getStableDebtToken = async (address?: tEthereumAddress) => export const getStableDebtToken = async (address?: tEthereumAddress) =>
await StableDebtTokenFactory.connect( await StableDebtTokenFactory.connect(
address || address ||
(await getDb().get(`${eContractid.StableDebtToken}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.StableDebtToken}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getVariableDebtToken = async (address?: tEthereumAddress) => export const getVariableDebtToken = async (address?: tEthereumAddress) =>
await VariableDebtTokenFactory.connect( await VariableDebtTokenFactory.connect(
address || address ||
(await getDb().get(`${eContractid.VariableDebtToken}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.VariableDebtToken}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getMintableERC20 = async (address: tEthereumAddress) => export const getMintableERC20 = async (address: tEthereumAddress) =>
await MintableERC20Factory.connect( await MintableERC20Factory.connect(
address || address ||
(await getDb().get(`${eContractid.MintableERC20}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.MintableERC20}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getIErc20Detailed = async (address: tEthereumAddress) => export const getIErc20Detailed = async (address: tEthereumAddress) =>
await IERC20DetailedFactory.connect( await IERC20DetailedFactory.connect(
address || address ||
(await getDb().get(`${eContractid.IERC20Detailed}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.IERC20Detailed}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getAaveProtocolDataProvider = async (address?: tEthereumAddress) => export const getAaveProtocolDataProvider = async (address?: tEthereumAddress) =>
await AaveProtocolDataProviderFactory.connect( await AaveProtocolDataProviderFactory.connect(
address || address ||
(await getDb().get(`${eContractid.AaveProtocolDataProvider}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.AaveProtocolDataProvider}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -128,15 +143,18 @@ export const getInterestRateStrategy = async (address?: tEthereumAddress) =>
export const getMockFlashLoanReceiver = async (address?: tEthereumAddress) => export const getMockFlashLoanReceiver = async (address?: tEthereumAddress) =>
await MockFlashLoanReceiverFactory.connect( await MockFlashLoanReceiverFactory.connect(
address || address ||
(await getDb().get(`${eContractid.MockFlashLoanReceiver}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.MockFlashLoanReceiver}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getLendingRateOracle = async (address?: tEthereumAddress) => export const getLendingRateOracle = async (address?: tEthereumAddress) =>
await LendingRateOracleFactory.connect( await LendingRateOracleFactory.connect(
address || address ||
(await getDb().get(`${eContractid.LendingRateOracle}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.LendingRateOracle}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -169,23 +187,37 @@ export const getAllMockedTokens = async () => {
return tokens; return tokens;
}; };
export const getQuoteCurrencies = (oracleQuoteCurrency: string): string[] => {
switch (oracleQuoteCurrency) {
case 'USD':
return ['USD'];
case 'ETH':
case 'WETH':
default:
return ['ETH', 'WETH'];
}
};
export const getPairsTokenAggregator = ( export const getPairsTokenAggregator = (
allAssetsAddresses: { allAssetsAddresses: {
[tokenSymbol: string]: tEthereumAddress; [tokenSymbol: string]: tEthereumAddress;
}, },
aggregatorsAddresses: { [tokenSymbol: string]: tEthereumAddress } aggregatorsAddresses: { [tokenSymbol: string]: tEthereumAddress },
oracleQuoteCurrency: string
): [string[], string[]] => { ): [string[], string[]] => {
const { ETH, WETH, ...assetsAddressesWithoutEth } = allAssetsAddresses; const assetsWithoutQuoteCurrency = omit(
allAssetsAddresses,
getQuoteCurrencies(oracleQuoteCurrency)
);
const pairs = Object.entries(assetsAddressesWithoutEth).map(([tokenSymbol, tokenAddress]) => { const pairs = Object.entries(assetsWithoutQuoteCurrency).map(([tokenSymbol, tokenAddress]) => {
//if (true/*tokenSymbol !== 'WETH' && tokenSymbol !== 'ETH' && tokenSymbol !== 'LpWETH'*/) { //if (true/*tokenSymbol !== 'WETH' && tokenSymbol !== 'ETH' && tokenSymbol !== 'LpWETH'*/) {
const aggregatorAddressIndex = Object.keys(aggregatorsAddresses).findIndex( const aggregatorAddressIndex = Object.keys(aggregatorsAddresses).findIndex(
(value) => value === tokenSymbol (value) => value === tokenSymbol
); );
const [, aggregatorAddress] = (Object.entries(aggregatorsAddresses) as [ const [, aggregatorAddress] = (
string, Object.entries(aggregatorsAddresses) as [string, tEthereumAddress][]
tEthereumAddress )[aggregatorAddressIndex];
][])[aggregatorAddressIndex];
return [tokenAddress, aggregatorAddress]; return [tokenAddress, aggregatorAddress];
//} //}
}) as [string, string][]; }) as [string, string][];
@ -211,14 +243,18 @@ export const getLendingPoolAddressesProviderRegistry = async (address?: tEthereu
export const getReserveLogic = async (address?: tEthereumAddress) => export const getReserveLogic = async (address?: tEthereumAddress) =>
await ReserveLogicFactory.connect( await ReserveLogicFactory.connect(
address || address ||
(await getDb().get(`${eContractid.ReserveLogic}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.ReserveLogic}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getGenericLogic = async (address?: tEthereumAddress) => export const getGenericLogic = async (address?: tEthereumAddress) =>
await GenericLogicFactory.connect( await GenericLogicFactory.connect(
address || address ||
(await getDb().get(`${eContractid.GenericLogic}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.GenericLogic}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -236,15 +272,18 @@ export const getStableAndVariableTokensHelper = async (address?: tEthereumAddres
export const getATokensAndRatesHelper = async (address?: tEthereumAddress) => export const getATokensAndRatesHelper = async (address?: tEthereumAddress) =>
await ATokensAndRatesHelperFactory.connect( await ATokensAndRatesHelperFactory.connect(
address || address ||
(await getDb().get(`${eContractid.ATokensAndRatesHelper}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.ATokensAndRatesHelper}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getWETHGateway = async (address?: tEthereumAddress) => export const getWETHGateway = async (address?: tEthereumAddress) =>
await WETHGatewayFactory.connect( await WETHGatewayFactory.connect(
address || address ||
(await getDb().get(`${eContractid.WETHGateway}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.WETHGateway}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -263,23 +302,27 @@ export const getMockAToken = async (address?: tEthereumAddress) =>
export const getMockVariableDebtToken = async (address?: tEthereumAddress) => export const getMockVariableDebtToken = async (address?: tEthereumAddress) =>
await MockVariableDebtTokenFactory.connect( await MockVariableDebtTokenFactory.connect(
address || address ||
(await getDb().get(`${eContractid.MockVariableDebtToken}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.MockVariableDebtToken}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getMockStableDebtToken = async (address?: tEthereumAddress) => export const getMockStableDebtToken = async (address?: tEthereumAddress) =>
await MockStableDebtTokenFactory.connect( await MockStableDebtTokenFactory.connect(
address || address ||
(await getDb().get(`${eContractid.MockStableDebtToken}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.MockStableDebtToken}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getSelfdestructTransferMock = async (address?: tEthereumAddress) => export const getSelfdestructTransferMock = async (address?: tEthereumAddress) =>
await SelfdestructTransferFactory.connect( await SelfdestructTransferFactory.connect(
address || address ||
(await getDb().get(`${eContractid.SelfdestructTransferMock}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.SelfdestructTransferMock}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -289,15 +332,18 @@ export const getProxy = async (address: tEthereumAddress) =>
export const getLendingPoolImpl = async (address?: tEthereumAddress) => export const getLendingPoolImpl = async (address?: tEthereumAddress) =>
await LendingPoolFactory.connect( await LendingPoolFactory.connect(
address || address ||
(await getDb().get(`${eContractid.LendingPoolImpl}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.LendingPoolImpl}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getLendingPoolConfiguratorImpl = async (address?: tEthereumAddress) => export const getLendingPoolConfiguratorImpl = async (address?: tEthereumAddress) =>
await LendingPoolConfiguratorFactory.connect( await LendingPoolConfiguratorFactory.connect(
address || address ||
(await getDb().get(`${eContractid.LendingPoolConfiguratorImpl}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.LendingPoolConfiguratorImpl}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -315,16 +361,18 @@ export const getLendingPoolCollateralManagerImpl = async (address?: tEthereumAdd
export const getWalletProvider = async (address?: tEthereumAddress) => export const getWalletProvider = async (address?: tEthereumAddress) =>
await WalletBalanceProviderFactory.connect( await WalletBalanceProviderFactory.connect(
address || address ||
(await getDb().get(`${eContractid.WalletBalanceProvider}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.WalletBalanceProvider}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getLendingPoolCollateralManager = async (address?: tEthereumAddress) => export const getLendingPoolCollateralManager = async (address?: tEthereumAddress) =>
await LendingPoolCollateralManagerFactory.connect( await LendingPoolCollateralManagerFactory.connect(
address || address ||
(await getDb().get(`${eContractid.LendingPoolCollateralManager}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.LendingPoolCollateralManager}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
@ -340,31 +388,36 @@ export const getAaveOracle = async (address?: tEthereumAddress) =>
export const getMockUniswapRouter = async (address?: tEthereumAddress) => export const getMockUniswapRouter = async (address?: tEthereumAddress) =>
await MockUniswapV2Router02Factory.connect( await MockUniswapV2Router02Factory.connect(
address || address ||
(await getDb().get(`${eContractid.MockUniswapV2Router02}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.MockUniswapV2Router02}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getUniswapLiquiditySwapAdapter = async (address?: tEthereumAddress) => export const getUniswapLiquiditySwapAdapter = async (address?: tEthereumAddress) =>
await UniswapLiquiditySwapAdapterFactory.connect( await UniswapLiquiditySwapAdapterFactory.connect(
address || address ||
(await getDb().get(`${eContractid.UniswapLiquiditySwapAdapter}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.UniswapLiquiditySwapAdapter}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getUniswapRepayAdapter = async (address?: tEthereumAddress) => export const getUniswapRepayAdapter = async (address?: tEthereumAddress) =>
await UniswapRepayAdapterFactory.connect( await UniswapRepayAdapterFactory.connect(
address || address ||
(await getDb().get(`${eContractid.UniswapRepayAdapter}.${DRE.network.name}`).value()).address, (
await getDb().get(`${eContractid.UniswapRepayAdapter}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );
export const getFlashLiquidationAdapter = async (address?: tEthereumAddress) => export const getFlashLiquidationAdapter = async (address?: tEthereumAddress) =>
await FlashLiquidationAdapterFactory.connect( await FlashLiquidationAdapterFactory.connect(
address || address ||
(await getDb().get(`${eContractid.FlashLiquidationAdapter}.${DRE.network.name}`).value()) (
.address, await getDb().get(`${eContractid.FlashLiquidationAdapter}.${DRE.network.name}`).value()
).address,
await getFirstSigner() await getFirstSigner()
); );

View File

@ -2,7 +2,7 @@ import { Contract, Signer, utils, ethers, BigNumberish } from 'ethers';
import { signTypedData_v4 } from 'eth-sig-util'; import { signTypedData_v4 } from 'eth-sig-util';
import { fromRpcSig, ECDSASignature } from 'ethereumjs-util'; import { fromRpcSig, ECDSASignature } from 'ethereumjs-util';
import BigNumber from 'bignumber.js'; import BigNumber from 'bignumber.js';
import { getDb, DRE, waitForTx } from './misc-utils'; import { getDb, DRE, waitForTx, notFalsyOrZeroAddress } from './misc-utils';
import { import {
tEthereumAddress, tEthereumAddress,
eContractid, eContractid,
@ -14,10 +14,11 @@ import {
ePolygonNetwork, ePolygonNetwork,
eXDaiNetwork, eXDaiNetwork,
eNetwork, eNetwork,
iParamsPerNetworkAll,
iEthereumParamsPerNetwork, iEthereumParamsPerNetwork,
iPolygonParamsPerNetwork, iPolygonParamsPerNetwork,
iXDaiParamsPerNetwork, iXDaiParamsPerNetwork,
iAvalancheParamsPerNetwork,
eAvalancheNetwork,
} from './types'; } from './types';
import { MintableERC20 } from '../types/MintableERC20'; import { MintableERC20 } from '../types/MintableERC20';
import { Artifact } from 'hardhat/types'; import { Artifact } from 'hardhat/types';
@ -26,6 +27,8 @@ import { verifyEtherscanContract } from './etherscan-verification';
import { getFirstSigner, getIErc20Detailed } from './contracts-getters'; import { getFirstSigner, getIErc20Detailed } from './contracts-getters';
import { usingTenderly, verifyAtTenderly } from './tenderly-utils'; import { usingTenderly, verifyAtTenderly } from './tenderly-utils';
import { usingPolygon, verifyAtPolygon } from './polygon-utils'; import { usingPolygon, verifyAtPolygon } from './polygon-utils';
import { ConfigNames, loadPoolConfig } from './configuration';
import { ZERO_ADDRESS } from './constants';
import { getDefenderRelaySigner, usingDefender } from './defender-utils'; import { getDefenderRelaySigner, usingDefender } from './defender-utils';
export type MockTokenMap = { [symbol: string]: MintableERC20 }; export type MockTokenMap = { [symbol: string]: MintableERC20 };
@ -142,16 +145,11 @@ export const linkBytecode = (artifact: BuidlerArtifact | Artifact, libraries: an
}; };
export const getParamPerNetwork = <T>(param: iParamsPerNetwork<T>, network: eNetwork) => { export const getParamPerNetwork = <T>(param: iParamsPerNetwork<T>, network: eNetwork) => {
const { const { main, ropsten, kovan, coverage, buidlerevm, tenderly } =
main, param as iEthereumParamsPerNetwork<T>;
ropsten,
kovan,
coverage,
buidlerevm,
tenderlyMain,
} = param as iEthereumParamsPerNetwork<T>;
const { matic, mumbai } = param as iPolygonParamsPerNetwork<T>; const { matic, mumbai } = param as iPolygonParamsPerNetwork<T>;
const { xdai } = param as iXDaiParamsPerNetwork<T>; const { xdai } = param as iXDaiParamsPerNetwork<T>;
const { avalanche, fuji } = param as iAvalancheParamsPerNetwork<T>;
if (process.env.FORK) { if (process.env.FORK) {
return param[process.env.FORK as eNetwork] as T; return param[process.env.FORK as eNetwork] as T;
} }
@ -169,18 +167,32 @@ export const getParamPerNetwork = <T>(param: iParamsPerNetwork<T>, network: eNet
return ropsten; return ropsten;
case eEthereumNetwork.main: case eEthereumNetwork.main:
return main; return main;
case eEthereumNetwork.tenderlyMain: case eEthereumNetwork.tenderly:
return tenderlyMain; return tenderly;
case ePolygonNetwork.matic: case ePolygonNetwork.matic:
return matic; return matic;
case ePolygonNetwork.mumbai: case ePolygonNetwork.mumbai:
return mumbai; return mumbai;
case eXDaiNetwork.xdai: case eXDaiNetwork.xdai:
return xdai; return xdai;
case eAvalancheNetwork.avalanche:
return avalanche;
case eAvalancheNetwork.fuji:
return fuji;
} }
}; };
export const getParamPerPool = <T>({ proto, amm, matic }: iParamsPerPool<T>, pool: AavePools) => { export const getOptionalParamAddressPerNetwork = (
param: iParamsPerNetwork<tEthereumAddress> | undefined | null,
network: eNetwork
) => {
if (!param) {
return ZERO_ADDRESS;
}
return getParamPerNetwork(param, network);
};
export const getParamPerPool = <T>({ proto, amm, matic, avalanche }: iParamsPerPool<T>, pool: AavePools) => {
switch (pool) { switch (pool) {
case AavePools.proto: case AavePools.proto:
return proto; return proto;
@ -188,6 +200,8 @@ export const getParamPerPool = <T>({ proto, amm, matic }: iParamsPerPool<T>, poo
return amm; return amm;
case AavePools.matic: case AavePools.matic:
return matic; return matic;
case AavePools.avalanche:
return avalanche;
default: default:
return proto; return proto;
} }
@ -374,3 +388,23 @@ export const verifyContract = async (
} }
return instance; return instance;
}; };
export const getContractAddressWithJsonFallback = async (
id: string,
pool: ConfigNames
): Promise<tEthereumAddress> => {
const poolConfig = loadPoolConfig(pool);
const network = <eNetwork>DRE.network.name;
const db = getDb();
const contractAtMarketConfig = getOptionalParamAddressPerNetwork(poolConfig[id], network);
if (notFalsyOrZeroAddress(contractAtMarketConfig)) {
return contractAtMarketConfig;
}
const contractAtDb = await getDb().get(`${id}.${DRE.network.name}`).value();
if (contractAtDb?.address) {
return contractAtDb.address as tEthereumAddress;
}
throw Error(`Missing contract address ${id} at Market config and JSON local db`);
};

View File

@ -1,48 +1,31 @@
import { import {
eContractid, eContractid,
eEthereumNetwork,
eNetwork, eNetwork,
iMultiPoolsAssets, iMultiPoolsAssets,
IReserveParams, IReserveParams,
tEthereumAddress, tEthereumAddress,
} from './types'; } from './types';
import { AaveProtocolDataProvider } from '../types/AaveProtocolDataProvider'; import { AaveProtocolDataProvider } from '../types/AaveProtocolDataProvider';
import { chunk, DRE, getDb, waitForTx } from './misc-utils'; import { chunk, getDb, waitForTx } from './misc-utils';
import { import {
getAaveProtocolDataProvider,
getAToken, getAToken,
getATokensAndRatesHelper, getATokensAndRatesHelper,
getFirstSigner,
getLendingPoolAddressesProvider, getLendingPoolAddressesProvider,
getLendingPoolConfiguratorProxy, getLendingPoolConfiguratorProxy,
getStableAndVariableTokensHelper,
} from './contracts-getters'; } from './contracts-getters';
import { rawInsertContractAddressInDb } from './contracts-helpers';
import { BigNumber, BigNumberish, Signer } from 'ethers';
import { import {
deployDefaultReserveInterestRateStrategy, getContractAddressWithJsonFallback,
deployDelegationAwareAToken, rawInsertContractAddressInDb,
deployDelegationAwareATokenImpl, } from './contracts-helpers';
deployGenericAToken, import { BigNumberish } from 'ethers';
deployGenericATokenImpl, import { ConfigNames } from './configuration';
deployGenericStableDebtToken, import { deployRateStrategy } from './contracts-deployments';
deployGenericVariableDebtToken,
deployStableDebtToken,
deployVariableDebtToken,
} from './contracts-deployments';
import { ZERO_ADDRESS } from './constants';
import { isZeroAddress } from 'ethereumjs-util';
import { DefaultReserveInterestRateStrategy, DelegationAwareAToken } from '../types';
import { config } from 'process';
export const chooseATokenDeployment = (id: eContractid) => { export const getATokenExtraParams = async (aTokenName: string, tokenAddress: tEthereumAddress) => {
switch (id) { console.log(aTokenName);
case eContractid.AToken: switch (aTokenName) {
return deployGenericAToken;
case eContractid.DelegationAwareAToken:
return deployDelegationAwareAToken;
default: default:
throw Error(`Missing aToken deployment script for: ${id}`); return '0x10';
} }
}; };
@ -56,19 +39,15 @@ export const initReservesByHelper = async (
admin: tEthereumAddress, admin: tEthereumAddress,
treasuryAddress: tEthereumAddress, treasuryAddress: tEthereumAddress,
incentivesController: tEthereumAddress, incentivesController: tEthereumAddress,
poolName: ConfigNames,
verify: boolean verify: boolean
): Promise<BigNumber> => { ) => {
let gasUsage = BigNumber.from('0');
const stableAndVariableDeployer = await getStableAndVariableTokensHelper();
const addressProvider = await getLendingPoolAddressesProvider(); const addressProvider = await getLendingPoolAddressesProvider();
// CHUNK CONFIGURATION // CHUNK CONFIGURATION
const initChunks = 4; const initChunks = 1;
// Initialize variables for future reserves initialization // Initialize variables for future reserves initialization
let reserveTokens: string[] = [];
let reserveInitDecimals: string[] = [];
let reserveSymbols: string[] = []; let reserveSymbols: string[] = [];
let initInputParams: { let initInputParams: {
@ -101,49 +80,8 @@ export const initReservesByHelper = async (
]; ];
let rateStrategies: Record<string, typeof strategyRates> = {}; let rateStrategies: Record<string, typeof strategyRates> = {};
let strategyAddresses: Record<string, tEthereumAddress> = {}; let strategyAddresses: Record<string, tEthereumAddress> = {};
let strategyAddressPerAsset: Record<string, string> = {};
let aTokenType: Record<string, string> = {};
let delegationAwareATokenImplementationAddress = '';
let aTokenImplementationAddress = '';
let stableDebtTokenImplementationAddress = '';
let variableDebtTokenImplementationAddress = '';
// NOT WORKING ON MATIC, DEPLOYING INDIVIDUAL IMPLs INSTEAD const reserves = Object.entries(reservesParams);
// const tx1 = await waitForTx(
// await stableAndVariableDeployer.initDeployment([ZERO_ADDRESS], ["1"])
// );
// console.log(tx1.events);
// tx1.events?.forEach((event, index) => {
// stableDebtTokenImplementationAddress = event?.args?.stableToken;
// variableDebtTokenImplementationAddress = event?.args?.variableToken;
// rawInsertContractAddressInDb(`stableDebtTokenImpl`, stableDebtTokenImplementationAddress);
// rawInsertContractAddressInDb(`variableDebtTokenImpl`, variableDebtTokenImplementationAddress);
// });
//gasUsage = gasUsage.add(tx1.gasUsed);
stableDebtTokenImplementationAddress = await (await deployGenericStableDebtToken()).address;
variableDebtTokenImplementationAddress = await (await deployGenericVariableDebtToken()).address;
const aTokenImplementation = await deployGenericATokenImpl(verify);
aTokenImplementationAddress = aTokenImplementation.address;
rawInsertContractAddressInDb(`aTokenImpl`, aTokenImplementationAddress);
const delegatedAwareReserves = Object.entries(reservesParams).filter(
([_, { aTokenImpl }]) => aTokenImpl === eContractid.DelegationAwareAToken
) as [string, IReserveParams][];
if (delegatedAwareReserves.length > 0) {
const delegationAwareATokenImplementation = await deployDelegationAwareATokenImpl(verify);
delegationAwareATokenImplementationAddress = delegationAwareATokenImplementation.address;
rawInsertContractAddressInDb(
`delegationAwareATokenImpl`,
delegationAwareATokenImplementationAddress
);
}
const reserves = Object.entries(reservesParams).filter(
([_, { aTokenImpl }]) =>
aTokenImpl === eContractid.DelegationAwareAToken || aTokenImpl === eContractid.AToken
) as [string, IReserveParams][];
for (let [symbol, params] of reserves) { for (let [symbol, params] of reserves) {
if (!tokenAddresses[symbol]) { if (!tokenAddresses[symbol]) {
@ -170,52 +108,41 @@ export const initReservesByHelper = async (
stableRateSlope1, stableRateSlope1,
stableRateSlope2, stableRateSlope2,
]; ];
strategyAddresses[strategy.name] = ( strategyAddresses[strategy.name] = await deployRateStrategy(
await deployDefaultReserveInterestRateStrategy(rateStrategies[strategy.name], verify) strategy.name,
).address; rateStrategies[strategy.name],
verify
);
// This causes the last strategy to be printed twice, once under "DefaultReserveInterestRateStrategy" // This causes the last strategy to be printed twice, once under "DefaultReserveInterestRateStrategy"
// and once under the actual `strategyASSET` key. // and once under the actual `strategyASSET` key.
rawInsertContractAddressInDb(strategy.name, strategyAddresses[strategy.name]); rawInsertContractAddressInDb(strategy.name, strategyAddresses[strategy.name]);
} }
strategyAddressPerAsset[symbol] = strategyAddresses[strategy.name]; // Prepare input parameters
console.log('Strategy address for asset %s: %s', symbol, strategyAddressPerAsset[symbol]);
if (aTokenImpl === eContractid.AToken) {
aTokenType[symbol] = 'generic';
} else if (aTokenImpl === eContractid.DelegationAwareAToken) {
aTokenType[symbol] = 'delegation aware';
}
reserveInitDecimals.push(reserveDecimals);
reserveTokens.push(tokenAddresses[symbol]);
reserveSymbols.push(symbol); reserveSymbols.push(symbol);
}
for (let i = 0; i < reserveSymbols.length; i++) {
let aTokenToUse: string;
if (aTokenType[reserveSymbols[i]] === 'generic') {
aTokenToUse = aTokenImplementationAddress;
} else {
aTokenToUse = delegationAwareATokenImplementationAddress;
}
initInputParams.push({ initInputParams.push({
aTokenImpl: aTokenToUse, aTokenImpl: await getContractAddressWithJsonFallback(aTokenImpl, poolName),
stableDebtTokenImpl: stableDebtTokenImplementationAddress, stableDebtTokenImpl: await getContractAddressWithJsonFallback(
variableDebtTokenImpl: variableDebtTokenImplementationAddress, eContractid.StableDebtToken,
underlyingAssetDecimals: reserveInitDecimals[i], poolName
interestRateStrategyAddress: strategyAddressPerAsset[reserveSymbols[i]], ),
underlyingAsset: reserveTokens[i], variableDebtTokenImpl: await getContractAddressWithJsonFallback(
eContractid.VariableDebtToken,
poolName
),
underlyingAssetDecimals: reserveDecimals,
interestRateStrategyAddress: strategyAddresses[strategy.name],
underlyingAsset: tokenAddresses[symbol],
treasury: treasuryAddress, treasury: treasuryAddress,
incentivesController, incentivesController: incentivesController,
underlyingAssetName: reserveSymbols[i], underlyingAssetName: symbol,
aTokenName: `${aTokenNamePrefix} ${reserveSymbols[i]}`, aTokenName: `${aTokenNamePrefix} ${symbol}`,
aTokenSymbol: `a${symbolPrefix}${reserveSymbols[i]}`, aTokenSymbol: `a${symbolPrefix}${symbol}`,
variableDebtTokenName: `${variableDebtTokenNamePrefix} ${symbolPrefix}${reserveSymbols[i]}`, variableDebtTokenName: `${variableDebtTokenNamePrefix} ${symbolPrefix}${symbol}`,
variableDebtTokenSymbol: `variableDebt${symbolPrefix}${reserveSymbols[i]}`, variableDebtTokenSymbol: `variableDebt${symbolPrefix}${symbol}`,
stableDebtTokenName: `${stableDebtTokenNamePrefix} ${reserveSymbols[i]}`, stableDebtTokenName: `${stableDebtTokenNamePrefix} ${symbol}`,
stableDebtTokenSymbol: `stableDebt${symbolPrefix}${reserveSymbols[i]}`, stableDebtTokenSymbol: `stableDebt${symbolPrefix}${symbol}`,
params: '0x10', params: await getATokenExtraParams(aTokenImpl, tokenAddresses[symbol]),
}); });
} }
@ -224,7 +151,6 @@ export const initReservesByHelper = async (
const chunkedInitInputParams = chunk(initInputParams, initChunks); const chunkedInitInputParams = chunk(initInputParams, initChunks);
const configurator = await getLendingPoolConfiguratorProxy(); const configurator = await getLendingPoolConfiguratorProxy();
//await waitForTx(await addressProvider.setPoolAdmin(admin));
console.log(`- Reserves initialization in ${chunkedInitInputParams.length} txs`); console.log(`- Reserves initialization in ${chunkedInitInputParams.length} txs`);
for (let chunkIndex = 0; chunkIndex < chunkedInitInputParams.length; chunkIndex++) { for (let chunkIndex = 0; chunkIndex < chunkedInitInputParams.length; chunkIndex++) {
@ -234,10 +160,7 @@ export const initReservesByHelper = async (
console.log(` - Reserve ready for: ${chunkedSymbols[chunkIndex].join(', ')}`); console.log(` - Reserve ready for: ${chunkedSymbols[chunkIndex].join(', ')}`);
console.log(' * gasUsed', tx3.gasUsed.toString()); console.log(' * gasUsed', tx3.gasUsed.toString());
//gasUsage = gasUsage.add(tx3.gasUsed);
} }
return gasUsage; // Deprecated
}; };
export const getPairsTokenAggregator = ( export const getPairsTokenAggregator = (
@ -253,10 +176,9 @@ export const getPairsTokenAggregator = (
const aggregatorAddressIndex = Object.keys(aggregatorsAddresses).findIndex( const aggregatorAddressIndex = Object.keys(aggregatorsAddresses).findIndex(
(value) => value === tokenSymbol (value) => value === tokenSymbol
); );
const [, aggregatorAddress] = (Object.entries(aggregatorsAddresses) as [ const [, aggregatorAddress] = (
string, Object.entries(aggregatorsAddresses) as [string, tEthereumAddress][]
tEthereumAddress )[aggregatorAddressIndex];
][])[aggregatorAddressIndex];
return [tokenAddress, aggregatorAddress]; return [tokenAddress, aggregatorAddress];
} }
}) as [string, string][]; }) as [string, string][];
@ -348,9 +270,7 @@ export const configureReservesByHelper = async (
console.log(`- Configure reserves in ${chunkedInputParams.length} txs`); console.log(`- Configure reserves in ${chunkedInputParams.length} txs`);
for (let chunkIndex = 0; chunkIndex < chunkedInputParams.length; chunkIndex++) { for (let chunkIndex = 0; chunkIndex < chunkedInputParams.length; chunkIndex++) {
await waitForTx( await waitForTx(
await atokenAndRatesDeployer.configureReserves(chunkedInputParams[chunkIndex], { await atokenAndRatesDeployer.configureReserves(chunkedInputParams[chunkIndex])
gasLimit: 12000000,
})
); );
console.log(` - Init for: ${chunkedSymbols[chunkIndex].join(', ')}`); console.log(` - Init for: ${chunkedSymbols[chunkIndex].join(', ')}`);
} }

View File

@ -9,6 +9,8 @@ import { BuidlerRuntimeEnvironment } from '@nomiclabs/buidler/types';
import { tEthereumAddress } from './types'; import { tEthereumAddress } from './types';
import { isAddress } from 'ethers/lib/utils'; import { isAddress } from 'ethers/lib/utils';
import { isZeroAddress } from 'ethereumjs-util'; import { isZeroAddress } from 'ethereumjs-util';
import { SignerWithAddress } from '../test-suites/test-aave/helpers/make-suite';
import { usingTenderly } from './tenderly-utils';
export const toWad = (value: string | number) => new BigNumber(value).times(WAD).toFixed(); export const toWad = (value: string | number) => new BigNumber(value).times(WAD).toFixed();
@ -116,6 +118,27 @@ export const notFalsyOrZeroAddress = (address: tEthereumAddress | null | undefin
return isAddress(address) && !isZeroAddress(address); return isAddress(address) && !isZeroAddress(address);
}; };
export const impersonateAddress = async (address: tEthereumAddress): Promise<SignerWithAddress> => {
if (!usingTenderly()) {
await (DRE as HardhatRuntimeEnvironment).network.provider.request({
method: 'hardhat_impersonateAccount',
params: [address],
});
}
const signer = await DRE.ethers.provider.getSigner(address);
return {
signer,
address,
};
};
export const omit = <T, U extends keyof T>(obj: T, keys: U[]): Omit<T, U> =>
(Object.keys(obj) as U[]).reduce(
(acc, curr) => (keys.includes(curr) ? acc : { ...acc, [curr]: obj[curr] }),
{} as Omit<T, U>
);
export const impersonateAccountsHardhat = async (accounts: string[]) => { export const impersonateAccountsHardhat = async (accounts: string[]) => {
if (process.env.TENDERLY === 'true') { if (process.env.TENDERLY === 'true') {
return; return;

View File

@ -4,7 +4,7 @@ export interface SymbolMap<T> {
[symbol: string]: T; [symbol: string]: T;
} }
export type eNetwork = eEthereumNetwork | ePolygonNetwork | eXDaiNetwork; export type eNetwork = eEthereumNetwork | ePolygonNetwork | eXDaiNetwork | eAvalancheNetwork;
export enum eEthereumNetwork { export enum eEthereumNetwork {
buidlerevm = 'buidlerevm', buidlerevm = 'buidlerevm',
@ -13,7 +13,7 @@ export enum eEthereumNetwork {
main = 'main', main = 'main',
coverage = 'coverage', coverage = 'coverage',
hardhat = 'hardhat', hardhat = 'hardhat',
tenderlyMain = 'tenderlyMain', tenderly = 'tenderly',
} }
export enum ePolygonNetwork { export enum ePolygonNetwork {
@ -25,6 +25,11 @@ export enum eXDaiNetwork {
xdai = 'xdai', xdai = 'xdai',
} }
export enum eAvalancheNetwork {
avalanche = 'avalanche',
fuji = 'fuji',
}
export enum EthereumNetworkNames { export enum EthereumNetworkNames {
kovan = 'kovan', kovan = 'kovan',
ropsten = 'ropsten', ropsten = 'ropsten',
@ -32,12 +37,15 @@ export enum EthereumNetworkNames {
matic = 'matic', matic = 'matic',
mumbai = 'mumbai', mumbai = 'mumbai',
xdai = 'xdai', xdai = 'xdai',
avalanche = 'avalanche',
fuji = 'fuji',
} }
export enum AavePools { export enum AavePools {
proto = 'proto', proto = 'proto',
matic = 'matic', matic = 'matic',
amm = 'amm', amm = 'amm',
avalanche = 'avalanche',
} }
export enum eContractid { export enum eContractid {
@ -242,6 +250,7 @@ export interface iAssetBase<T> {
WMATIC: T; WMATIC: T;
STAKE: T; STAKE: T;
xSUSHI: T; xSUSHI: T;
WAVAX: T;
} }
export type iAssetsWithoutETH<T> = Omit<iAssetBase<T>, 'ETH'>; export type iAssetsWithoutETH<T> = Omit<iAssetBase<T>, 'ETH'>;
@ -308,6 +317,11 @@ export type iXDAIPoolAssets<T> = Pick<
'DAI' | 'USDC' | 'USDT' | 'WBTC' | 'WETH' | 'STAKE' 'DAI' | 'USDC' | 'USDT' | 'WBTC' | 'WETH' | 'STAKE'
>; >;
export type iAvalanchePoolAssets<T> = Pick<
iAssetsWithoutUSD<T>,
'WETH' | 'DAI' | 'USDT' | 'AAVE' | 'WBTC' | 'WAVAX' | 'USDC'
>;
export type iMultiPoolsAssets<T> = iAssetCommon<T> | iAavePoolAssets<T>; export type iMultiPoolsAssets<T> = iAssetCommon<T> | iAavePoolAssets<T>;
export type iAavePoolTokens<T> = Omit<iAavePoolAssets<T>, 'ETH'>; export type iAavePoolTokens<T> = Omit<iAavePoolAssets<T>, 'ETH'>;
@ -355,6 +369,7 @@ export enum TokenContractId {
WMATIC = 'WMATIC', WMATIC = 'WMATIC',
STAKE = 'STAKE', STAKE = 'STAKE',
xSUSHI = 'xSUSHI', xSUSHI = 'xSUSHI',
WAVAX = 'WAVAX',
} }
export interface IReserveParams extends IReserveBorrowParams, IReserveCollateralParams { export interface IReserveParams extends IReserveBorrowParams, IReserveCollateralParams {
@ -397,7 +412,8 @@ export interface IMarketRates {
export type iParamsPerNetwork<T> = export type iParamsPerNetwork<T> =
| iEthereumParamsPerNetwork<T> | iEthereumParamsPerNetwork<T>
| iPolygonParamsPerNetwork<T> | iPolygonParamsPerNetwork<T>
| iXDaiParamsPerNetwork<T>; | iXDaiParamsPerNetwork<T>
| iAvalancheParamsPerNetwork<T>;
export interface iParamsPerNetworkAll<T> export interface iParamsPerNetworkAll<T>
extends iEthereumParamsPerNetwork<T>, extends iEthereumParamsPerNetwork<T>,
@ -411,7 +427,7 @@ export interface iEthereumParamsPerNetwork<T> {
[eEthereumNetwork.ropsten]: T; [eEthereumNetwork.ropsten]: T;
[eEthereumNetwork.main]: T; [eEthereumNetwork.main]: T;
[eEthereumNetwork.hardhat]: T; [eEthereumNetwork.hardhat]: T;
[eEthereumNetwork.tenderlyMain]: T; [eEthereumNetwork.tenderly]: T;
} }
export interface iPolygonParamsPerNetwork<T> { export interface iPolygonParamsPerNetwork<T> {
@ -423,10 +439,16 @@ export interface iXDaiParamsPerNetwork<T> {
[eXDaiNetwork.xdai]: T; [eXDaiNetwork.xdai]: T;
} }
export interface iAvalancheParamsPerNetwork<T> {
[eAvalancheNetwork.avalanche]: T;
[eAvalancheNetwork.fuji]: T;
}
export interface iParamsPerPool<T> { export interface iParamsPerPool<T> {
[AavePools.proto]: T; [AavePools.proto]: T;
[AavePools.matic]: T; [AavePools.matic]: T;
[AavePools.amm]: T; [AavePools.amm]: T;
[AavePools.avalanche]: T;
} }
export interface iBasicDistributionParams { export interface iBasicDistributionParams {
@ -465,7 +487,7 @@ export interface ILendingRate {
borrowRate: string; borrowRate: string;
} }
export interface ICommonConfiguration { export interface IBaseConfiguration {
MarketId: string; MarketId: string;
ATokenNamePrefix: string; ATokenNamePrefix: string;
StableDebtTokenNamePrefix: string; StableDebtTokenNamePrefix: string;
@ -473,7 +495,6 @@ export interface ICommonConfiguration {
SymbolPrefix: string; SymbolPrefix: string;
ProviderId: number; ProviderId: number;
ProtocolGlobalParams: IProtocolGlobalConfig; ProtocolGlobalParams: IProtocolGlobalConfig;
Mocks: IMocksConfig;
ProviderRegistry: iParamsPerNetwork<tEthereumAddress | undefined>; ProviderRegistry: iParamsPerNetwork<tEthereumAddress | undefined>;
ProviderRegistryOwner: iParamsPerNetwork<tEthereumAddress | undefined>; ProviderRegistryOwner: iParamsPerNetwork<tEthereumAddress | undefined>;
LendingPoolCollateralManager: iParamsPerNetwork<tEthereumAddress>; LendingPoolCollateralManager: iParamsPerNetwork<tEthereumAddress>;
@ -489,14 +510,22 @@ export interface ICommonConfiguration {
PoolAdminIndex: number; PoolAdminIndex: number;
EmergencyAdmin: iParamsPerNetwork<tEthereumAddress | undefined>; EmergencyAdmin: iParamsPerNetwork<tEthereumAddress | undefined>;
EmergencyAdminIndex: number; EmergencyAdminIndex: number;
ReserveAssets: iParamsPerNetwork<SymbolMap<tEthereumAddress>>;
ReservesConfig: iMultiPoolsAssets<IReserveParams>;
ATokenDomainSeparator: iParamsPerNetwork<string>; ATokenDomainSeparator: iParamsPerNetwork<string>;
WETH: iParamsPerNetwork<tEthereumAddress>; WETH: iParamsPerNetwork<tEthereumAddress>;
WrappedNativeToken: iParamsPerNetwork<tEthereumAddress>; WrappedNativeToken: iParamsPerNetwork<tEthereumAddress>;
WethGateway: iParamsPerNetwork<tEthereumAddress>; WethGateway: iParamsPerNetwork<tEthereumAddress>;
ReserveFactorTreasuryAddress: iParamsPerNetwork<tEthereumAddress>; ReserveFactorTreasuryAddress: iParamsPerNetwork<tEthereumAddress>;
IncentivesController: iParamsPerNetwork<tEthereumAddress>; IncentivesController: iParamsPerNetwork<tEthereumAddress>;
StableDebtTokenImplementation?: iParamsPerNetwork<tEthereumAddress>;
VariableDebtTokenImplementation?: iParamsPerNetwork<tEthereumAddress>;
ReserveAssets: iParamsPerNetwork<SymbolMap<tEthereumAddress>>;
OracleQuoteCurrency: string;
OracleQuoteUnit: string;
}
export interface ICommonConfiguration extends IBaseConfiguration {
ReservesConfig: iMultiPoolsAssets<IReserveParams>;
Mocks: IMocksConfig;
} }
export interface IAaveConfiguration extends ICommonConfiguration { export interface IAaveConfiguration extends ICommonConfiguration {
@ -515,6 +544,10 @@ export interface IXDAIConfiguration extends ICommonConfiguration {
ReservesConfig: iXDAIPoolAssets<IReserveParams>; ReservesConfig: iXDAIPoolAssets<IReserveParams>;
} }
export interface IAvalancheConfiguration extends ICommonConfiguration {
ReservesConfig: iAvalanchePoolAssets<IReserveParams>;
}
export interface ITokenAddress { export interface ITokenAddress {
[token: string]: tEthereumAddress; [token: string]: tEthereumAddress;
} }

View File

@ -1,10 +1,8 @@
import BigNumber from 'bignumber.js';
import { import {
oneEther,
oneRay, oneRay,
RAY,
ZERO_ADDRESS, ZERO_ADDRESS,
MOCK_CHAINLINK_AGGREGATORS_PRICES, MOCK_CHAINLINK_AGGREGATORS_PRICES,
oneEther,
} from '../../helpers/constants'; } from '../../helpers/constants';
import { ICommonConfiguration, eEthereumNetwork } from '../../helpers/types'; import { ICommonConfiguration, eEthereumNetwork } from '../../helpers/types';
@ -19,6 +17,8 @@ export const CommonsConfig: ICommonConfiguration = {
VariableDebtTokenNamePrefix: 'Aave variable debt bearing', VariableDebtTokenNamePrefix: 'Aave variable debt bearing',
SymbolPrefix: '', SymbolPrefix: '',
ProviderId: 0, // Overriden in index.ts ProviderId: 0, // Overriden in index.ts
OracleQuoteCurrency: 'ETH',
OracleQuoteUnit: oneEther.toString(),
ProtocolGlobalParams: { ProtocolGlobalParams: {
TokenDistributorPercentageBase: '10000', TokenDistributorPercentageBase: '10000',
MockUsdPriceInWei: '5848466240000000', MockUsdPriceInWei: '5848466240000000',
@ -113,7 +113,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: undefined, [eEthereumNetwork.kovan]: undefined,
[eEthereumNetwork.ropsten]: undefined, [eEthereumNetwork.ropsten]: undefined,
[eEthereumNetwork.main]: undefined, [eEthereumNetwork.main]: undefined,
[eEthereumNetwork.tenderlyMain]: undefined, [eEthereumNetwork.tenderly]: undefined,
}, },
PoolAdminIndex: 0, PoolAdminIndex: 0,
EmergencyAdmin: { EmergencyAdmin: {
@ -123,7 +123,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: undefined, [eEthereumNetwork.kovan]: undefined,
[eEthereumNetwork.ropsten]: undefined, [eEthereumNetwork.ropsten]: undefined,
[eEthereumNetwork.main]: undefined, [eEthereumNetwork.main]: undefined,
[eEthereumNetwork.tenderlyMain]: undefined, [eEthereumNetwork.tenderly]: undefined,
}, },
EmergencyAdminIndex: 1, EmergencyAdminIndex: 1,
ProviderRegistry: { ProviderRegistry: {
@ -133,7 +133,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
[eEthereumNetwork.hardhat]: '', [eEthereumNetwork.hardhat]: '',
[eEthereumNetwork.buidlerevm]: '', [eEthereumNetwork.buidlerevm]: '',
[eEthereumNetwork.tenderlyMain]: '0x52D306e36E3B6B02c153d0266ff0f85d18BCD413', [eEthereumNetwork.tenderly]: '0x52D306e36E3B6B02c153d0266ff0f85d18BCD413',
}, },
ProviderRegistryOwner: { ProviderRegistryOwner: {
[eEthereumNetwork.kovan]: '0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F', [eEthereumNetwork.kovan]: '0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F',
@ -142,7 +142,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
[eEthereumNetwork.hardhat]: '', [eEthereumNetwork.hardhat]: '',
[eEthereumNetwork.buidlerevm]: '', [eEthereumNetwork.buidlerevm]: '',
[eEthereumNetwork.tenderlyMain]: '0xB9062896ec3A615a4e4444DF183F0531a77218AE', [eEthereumNetwork.tenderly]: '0xB9062896ec3A615a4e4444DF183F0531a77218AE',
}, },
LendingRateOracle: { LendingRateOracle: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -151,7 +151,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '', //'0xdCde9Bb6a49e37fA433990832AB541AE2d4FEB4a', [eEthereumNetwork.kovan]: '', //'0xdCde9Bb6a49e37fA433990832AB541AE2d4FEB4a',
[eEthereumNetwork.ropsten]: '0x05dcca805a6562c1bdd0423768754acb6993241b', [eEthereumNetwork.ropsten]: '0x05dcca805a6562c1bdd0423768754acb6993241b',
[eEthereumNetwork.main]: '', //'0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D', [eEthereumNetwork.main]: '', //'0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D',
[eEthereumNetwork.tenderlyMain]: '0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D', [eEthereumNetwork.tenderly]: '0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D',
}, },
LendingPoolCollateralManager: { LendingPoolCollateralManager: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -160,7 +160,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x9269b6453d0d75370c4c85e5a42977a53efdb72a', [eEthereumNetwork.kovan]: '0x9269b6453d0d75370c4c85e5a42977a53efdb72a',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C', [eEthereumNetwork.main]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C',
[eEthereumNetwork.tenderlyMain]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C', [eEthereumNetwork.tenderly]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C',
}, },
LendingPoolConfigurator: { LendingPoolConfigurator: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -169,7 +169,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '', [eEthereumNetwork.kovan]: '',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
LendingPool: { LendingPool: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -178,7 +178,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '', [eEthereumNetwork.kovan]: '',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
WethGateway: { WethGateway: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -187,7 +187,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '', [eEthereumNetwork.kovan]: '',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
TokenDistributor: { TokenDistributor: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -196,7 +196,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x971efe90088f21dc6a36f610ffed77fc19710708', [eEthereumNetwork.kovan]: '0x971efe90088f21dc6a36f610ffed77fc19710708',
[eEthereumNetwork.ropsten]: '0xeba2ea67942b8250d870b12750b594696d02fc9c', [eEthereumNetwork.ropsten]: '0xeba2ea67942b8250d870b12750b594696d02fc9c',
[eEthereumNetwork.main]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae', [eEthereumNetwork.main]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae',
[eEthereumNetwork.tenderlyMain]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae', [eEthereumNetwork.tenderly]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae',
}, },
AaveOracle: { AaveOracle: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -205,7 +205,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '', //'0xB8bE51E6563BB312Cbb2aa26e352516c25c26ac1', [eEthereumNetwork.kovan]: '', //'0xB8bE51E6563BB312Cbb2aa26e352516c25c26ac1',
[eEthereumNetwork.ropsten]: ZERO_ADDRESS, [eEthereumNetwork.ropsten]: ZERO_ADDRESS,
[eEthereumNetwork.main]: '', //'0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', [eEthereumNetwork.main]: '', //'0xA50ba011c48153De246E5192C8f9258A2ba79Ca9',
[eEthereumNetwork.tenderlyMain]: '0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', [eEthereumNetwork.tenderly]: '0xA50ba011c48153De246E5192C8f9258A2ba79Ca9',
}, },
FallbackOracle: { FallbackOracle: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -214,7 +214,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x50913E8E1c650E790F8a1E741FF9B1B1bB251dfe', [eEthereumNetwork.kovan]: '0x50913E8E1c650E790F8a1E741FF9B1B1bB251dfe',
[eEthereumNetwork.ropsten]: '0xAD1a978cdbb8175b2eaeC47B01404f8AEC5f4F0d', [eEthereumNetwork.ropsten]: '0xAD1a978cdbb8175b2eaeC47B01404f8AEC5f4F0d',
[eEthereumNetwork.main]: ZERO_ADDRESS, [eEthereumNetwork.main]: ZERO_ADDRESS,
[eEthereumNetwork.tenderlyMain]: ZERO_ADDRESS, [eEthereumNetwork.tenderly]: ZERO_ADDRESS,
}, },
ChainlinkAggregator: { ChainlinkAggregator: {
[eEthereumNetwork.coverage]: {}, [eEthereumNetwork.coverage]: {},
@ -287,7 +287,7 @@ export const CommonsConfig: ICommonConfiguration = {
USD: '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419', USD: '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419',
xSUSHI: '0x9b26214bEC078E68a394AaEbfbffF406Ce14893F', xSUSHI: '0x9b26214bEC078E68a394AaEbfbffF406Ce14893F',
}, },
[eEthereumNetwork.tenderlyMain]: { [eEthereumNetwork.tenderly]: {
AAVE: '0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012', AAVE: '0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012',
BAT: '0x0d16d4528239e9ee52fa531af613AcdB23D88c94', BAT: '0x0d16d4528239e9ee52fa531af613AcdB23D88c94',
BUSD: '0x614715d2Af89E6EC99A233818275142cE88d1Cfd', BUSD: '0x614715d2Af89E6EC99A233818275142cE88d1Cfd',
@ -318,7 +318,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.main]: {}, [eEthereumNetwork.main]: {},
[eEthereumNetwork.kovan]: {}, [eEthereumNetwork.kovan]: {},
[eEthereumNetwork.ropsten]: {}, [eEthereumNetwork.ropsten]: {},
[eEthereumNetwork.tenderlyMain]: {}, [eEthereumNetwork.tenderly]: {},
}, },
ReservesConfig: {}, ReservesConfig: {},
ATokenDomainSeparator: { ATokenDomainSeparator: {
@ -331,7 +331,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '', [eEthereumNetwork.kovan]: '',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
WETH: { WETH: {
[eEthereumNetwork.coverage]: '', // deployed in local evm [eEthereumNetwork.coverage]: '', // deployed in local evm
@ -340,7 +340,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', [eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c',
[eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab', [eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab',
[eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
[eEthereumNetwork.tenderlyMain]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.tenderly]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
}, },
WrappedNativeToken: { WrappedNativeToken: {
[eEthereumNetwork.coverage]: '', // deployed in local evm [eEthereumNetwork.coverage]: '', // deployed in local evm
@ -349,7 +349,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', [eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c',
[eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab', [eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab',
[eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
[eEthereumNetwork.tenderlyMain]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.tenderly]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
}, },
ReserveFactorTreasuryAddress: { ReserveFactorTreasuryAddress: {
[eEthereumNetwork.coverage]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.coverage]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
@ -358,7 +358,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.kovan]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
[eEthereumNetwork.ropsten]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.ropsten]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
[eEthereumNetwork.main]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.main]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
[eEthereumNetwork.tenderlyMain]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.tenderly]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
}, },
IncentivesController: { IncentivesController: {
[eEthereumNetwork.coverage]: ZERO_ADDRESS, [eEthereumNetwork.coverage]: ZERO_ADDRESS,
@ -367,6 +367,6 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: ZERO_ADDRESS, [eEthereumNetwork.kovan]: ZERO_ADDRESS,
[eEthereumNetwork.ropsten]: ZERO_ADDRESS, [eEthereumNetwork.ropsten]: ZERO_ADDRESS,
[eEthereumNetwork.main]: ZERO_ADDRESS, [eEthereumNetwork.main]: ZERO_ADDRESS,
[eEthereumNetwork.tenderlyMain]: ZERO_ADDRESS, [eEthereumNetwork.tenderly]: ZERO_ADDRESS,
}, },
}; };

View File

@ -128,7 +128,7 @@ export const AaveConfig: IAaveConfiguration = {
ZRX: '0xE41d2489571d322189246DaFA5ebDe1F4699F498', ZRX: '0xE41d2489571d322189246DaFA5ebDe1F4699F498',
xSUSHI: '0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272', xSUSHI: '0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272',
}, },
[eEthereumNetwork.tenderlyMain]: { [eEthereumNetwork.tenderly]: {
AAVE: '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9', AAVE: '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9',
BAT: '0x0d8775f648430679a709e98d2b0cb6250d2887ef', BAT: '0x0d8775f648430679a709e98d2b0cb6250d2887ef',
BUSD: '0x4Fabb145d64652a948d72533023f6E7A623C7C53', BUSD: '0x4Fabb145d64652a948d72533023f6E7A623C7C53',

View File

@ -1,6 +1,6 @@
import { eContractid, IReserveParams } from '../../helpers/types'; import { eContractid, IReserveParams } from '../../helpers/types';
import { import {
rateStrategyStableOne, rateStrategyStableOne,
rateStrategyStableTwo, rateStrategyStableTwo,
rateStrategyStableThree, rateStrategyStableThree,
@ -21,7 +21,7 @@ export const strategyBUSD: IReserveParams = {
stableBorrowRateEnabled: false, stableBorrowRateEnabled: false,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '1000' reserveFactor: '1000',
}; };
export const strategyDAI: IReserveParams = { export const strategyDAI: IReserveParams = {
@ -33,7 +33,7 @@ export const strategyDAI: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '1000' reserveFactor: '1000',
}; };
export const strategySUSD: IReserveParams = { export const strategySUSD: IReserveParams = {
@ -45,7 +45,7 @@ export const strategySUSD: IReserveParams = {
stableBorrowRateEnabled: false, stableBorrowRateEnabled: false,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyTUSD: IReserveParams = { export const strategyTUSD: IReserveParams = {
@ -57,7 +57,7 @@ export const strategyTUSD: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '1000' reserveFactor: '1000',
}; };
export const strategyUSDC: IReserveParams = { export const strategyUSDC: IReserveParams = {
@ -69,7 +69,7 @@ export const strategyUSDC: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '6', reserveDecimals: '6',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '1000' reserveFactor: '1000',
}; };
export const strategyUSDT: IReserveParams = { export const strategyUSDT: IReserveParams = {
@ -81,7 +81,7 @@ export const strategyUSDT: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '6', reserveDecimals: '6',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '1000' reserveFactor: '1000',
}; };
export const strategyAAVE: IReserveParams = { export const strategyAAVE: IReserveParams = {
@ -93,7 +93,7 @@ export const strategyAAVE: IReserveParams = {
stableBorrowRateEnabled: false, stableBorrowRateEnabled: false,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '0' reserveFactor: '0',
}; };
export const strategyBAT: IReserveParams = { export const strategyBAT: IReserveParams = {
@ -105,7 +105,7 @@ export const strategyBAT: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyENJ: IReserveParams = { export const strategyENJ: IReserveParams = {
@ -117,7 +117,7 @@ export const strategyENJ: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyWETH: IReserveParams = { export const strategyWETH: IReserveParams = {
@ -129,7 +129,7 @@ export const strategyWETH: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '1000' reserveFactor: '1000',
}; };
export const strategyKNC: IReserveParams = { export const strategyKNC: IReserveParams = {
@ -141,7 +141,7 @@ export const strategyKNC: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyLINK: IReserveParams = { export const strategyLINK: IReserveParams = {
@ -153,7 +153,7 @@ export const strategyLINK: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyMANA: IReserveParams = { export const strategyMANA: IReserveParams = {
@ -165,7 +165,7 @@ export const strategyMANA: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '3500' reserveFactor: '3500',
}; };
export const strategyMKR: IReserveParams = { export const strategyMKR: IReserveParams = {
@ -177,7 +177,7 @@ export const strategyMKR: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyREN: IReserveParams = { export const strategyREN: IReserveParams = {
@ -189,7 +189,7 @@ export const strategyREN: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategySNX: IReserveParams = { export const strategySNX: IReserveParams = {
@ -201,7 +201,7 @@ export const strategySNX: IReserveParams = {
stableBorrowRateEnabled: false, stableBorrowRateEnabled: false,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '3500' reserveFactor: '3500',
}; };
// Invalid borrow rates in params currently, replaced with snx params // Invalid borrow rates in params currently, replaced with snx params
@ -214,7 +214,7 @@ export const strategyUNI: IReserveParams = {
stableBorrowRateEnabled: false, stableBorrowRateEnabled: false,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.DelegationAwareAToken, aTokenImpl: eContractid.DelegationAwareAToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyWBTC: IReserveParams = { export const strategyWBTC: IReserveParams = {
@ -226,7 +226,7 @@ export const strategyWBTC: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '8', reserveDecimals: '8',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyYFI: IReserveParams = { export const strategyYFI: IReserveParams = {
@ -238,7 +238,7 @@ export const strategyYFI: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyZRX: IReserveParams = { export const strategyZRX: IReserveParams = {
@ -250,7 +250,7 @@ export const strategyZRX: IReserveParams = {
stableBorrowRateEnabled: true, stableBorrowRateEnabled: true,
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '2000' reserveFactor: '2000',
}; };
export const strategyXSUSHI: IReserveParams = { export const strategyXSUSHI: IReserveParams = {
@ -263,4 +263,4 @@ export const strategyXSUSHI: IReserveParams = {
reserveDecimals: '18', reserveDecimals: '18',
aTokenImpl: eContractid.AToken, aTokenImpl: eContractid.AToken,
reserveFactor: '3500', reserveFactor: '3500',
}; };

View File

@ -5,6 +5,7 @@ import {
RAY, RAY,
ZERO_ADDRESS, ZERO_ADDRESS,
MOCK_CHAINLINK_AGGREGATORS_PRICES, MOCK_CHAINLINK_AGGREGATORS_PRICES,
oneUsd,
} from '../../helpers/constants'; } from '../../helpers/constants';
import { ICommonConfiguration, eEthereumNetwork } from '../../helpers/types'; import { ICommonConfiguration, eEthereumNetwork } from '../../helpers/types';
@ -19,6 +20,8 @@ export const CommonsConfig: ICommonConfiguration = {
VariableDebtTokenNamePrefix: 'Aave AMM Market variable debt', VariableDebtTokenNamePrefix: 'Aave AMM Market variable debt',
SymbolPrefix: 'Amm', SymbolPrefix: 'Amm',
ProviderId: 0, // Overriden in index.ts ProviderId: 0, // Overriden in index.ts
OracleQuoteCurrency: 'ETH',
OracleQuoteUnit: oneEther.toString(),
ProtocolGlobalParams: { ProtocolGlobalParams: {
TokenDistributorPercentageBase: '10000', TokenDistributorPercentageBase: '10000',
MockUsdPriceInWei: '5848466240000000', MockUsdPriceInWei: '5848466240000000',
@ -116,7 +119,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: undefined, [eEthereumNetwork.kovan]: undefined,
[eEthereumNetwork.ropsten]: undefined, [eEthereumNetwork.ropsten]: undefined,
[eEthereumNetwork.main]: undefined, [eEthereumNetwork.main]: undefined,
[eEthereumNetwork.tenderlyMain]: undefined, [eEthereumNetwork.tenderly]: undefined,
}, },
PoolAdminIndex: 0, PoolAdminIndex: 0,
EmergencyAdmin: { EmergencyAdmin: {
@ -126,7 +129,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: undefined, [eEthereumNetwork.kovan]: undefined,
[eEthereumNetwork.ropsten]: undefined, [eEthereumNetwork.ropsten]: undefined,
[eEthereumNetwork.main]: undefined, [eEthereumNetwork.main]: undefined,
[eEthereumNetwork.tenderlyMain]: undefined, [eEthereumNetwork.tenderly]: undefined,
}, },
EmergencyAdminIndex: 1, EmergencyAdminIndex: 1,
ProviderRegistry: { ProviderRegistry: {
@ -136,7 +139,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
[eEthereumNetwork.hardhat]: '', [eEthereumNetwork.hardhat]: '',
[eEthereumNetwork.buidlerevm]: '', [eEthereumNetwork.buidlerevm]: '',
[eEthereumNetwork.tenderlyMain]: '0x52D306e36E3B6B02c153d0266ff0f85d18BCD413', [eEthereumNetwork.tenderly]: '0x52D306e36E3B6B02c153d0266ff0f85d18BCD413',
}, },
ProviderRegistryOwner: { ProviderRegistryOwner: {
[eEthereumNetwork.kovan]: '0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F', [eEthereumNetwork.kovan]: '0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F',
@ -145,7 +148,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
[eEthereumNetwork.hardhat]: '', [eEthereumNetwork.hardhat]: '',
[eEthereumNetwork.buidlerevm]: '', [eEthereumNetwork.buidlerevm]: '',
[eEthereumNetwork.tenderlyMain]: '0xB9062896ec3A615a4e4444DF183F0531a77218AE', [eEthereumNetwork.tenderly]: '0xB9062896ec3A615a4e4444DF183F0531a77218AE',
}, },
LendingRateOracle: { LendingRateOracle: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -154,7 +157,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0xd00Bd28FAdDa9d5658D1D4e0c151973146C7A533', //'0xE48F95873855bfd97BF89572DDf5cBC44D9c545b' [eEthereumNetwork.kovan]: '0xd00Bd28FAdDa9d5658D1D4e0c151973146C7A533', //'0xE48F95873855bfd97BF89572DDf5cBC44D9c545b'
[eEthereumNetwork.ropsten]: '0x05dcca805a6562c1bdd0423768754acb6993241b', [eEthereumNetwork.ropsten]: '0x05dcca805a6562c1bdd0423768754acb6993241b',
[eEthereumNetwork.main]: '', //'0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D', // Need to re-deploy because of onlyOwner [eEthereumNetwork.main]: '', //'0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D', // Need to re-deploy because of onlyOwner
[eEthereumNetwork.tenderlyMain]: '0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D', [eEthereumNetwork.tenderly]: '0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D',
}, },
LendingPoolCollateralManager: { LendingPoolCollateralManager: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -163,7 +166,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x9269b6453d0d75370c4c85e5a42977a53efdb72a', [eEthereumNetwork.kovan]: '0x9269b6453d0d75370c4c85e5a42977a53efdb72a',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C', [eEthereumNetwork.main]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C',
[eEthereumNetwork.tenderlyMain]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C', [eEthereumNetwork.tenderly]: '0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C',
}, },
LendingPoolConfigurator: { LendingPoolConfigurator: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -172,7 +175,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x36eB31800aa67a9c50df1d56EE01981A6E14Cce5', [eEthereumNetwork.kovan]: '0x36eB31800aa67a9c50df1d56EE01981A6E14Cce5',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
LendingPool: { LendingPool: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -181,7 +184,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x78142De7a1930412E9e50dEB3b80dB284c2dFa3A', [eEthereumNetwork.kovan]: '0x78142De7a1930412E9e50dEB3b80dB284c2dFa3A',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
WethGateway: { WethGateway: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -190,7 +193,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x1c4A1cC35A477aa1cF35DF671d93ACc04d8131E0', [eEthereumNetwork.kovan]: '0x1c4A1cC35A477aa1cF35DF671d93ACc04d8131E0',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
TokenDistributor: { TokenDistributor: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -199,7 +202,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x971efe90088f21dc6a36f610ffed77fc19710708', [eEthereumNetwork.kovan]: '0x971efe90088f21dc6a36f610ffed77fc19710708',
[eEthereumNetwork.ropsten]: '0xeba2ea67942b8250d870b12750b594696d02fc9c', [eEthereumNetwork.ropsten]: '0xeba2ea67942b8250d870b12750b594696d02fc9c',
[eEthereumNetwork.main]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae', [eEthereumNetwork.main]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae',
[eEthereumNetwork.tenderlyMain]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae', [eEthereumNetwork.tenderly]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae',
}, },
AaveOracle: { AaveOracle: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -208,7 +211,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x8fb777d67e9945e2c01936e319057f9d41d559e6', // Need to re-deploy because of onlyOwner [eEthereumNetwork.kovan]: '0x8fb777d67e9945e2c01936e319057f9d41d559e6', // Need to re-deploy because of onlyOwner
[eEthereumNetwork.ropsten]: ZERO_ADDRESS, [eEthereumNetwork.ropsten]: ZERO_ADDRESS,
[eEthereumNetwork.main]: '', //'0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', // Need to re-deploy because of onlyOwner [eEthereumNetwork.main]: '', //'0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', // Need to re-deploy because of onlyOwner
[eEthereumNetwork.tenderlyMain]: '0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', [eEthereumNetwork.tenderly]: '0xA50ba011c48153De246E5192C8f9258A2ba79Ca9',
}, },
FallbackOracle: { FallbackOracle: {
[eEthereumNetwork.coverage]: '', [eEthereumNetwork.coverage]: '',
@ -217,7 +220,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x50913E8E1c650E790F8a1E741FF9B1B1bB251dfe', [eEthereumNetwork.kovan]: '0x50913E8E1c650E790F8a1E741FF9B1B1bB251dfe',
[eEthereumNetwork.ropsten]: '0xAD1a978cdbb8175b2eaeC47B01404f8AEC5f4F0d', [eEthereumNetwork.ropsten]: '0xAD1a978cdbb8175b2eaeC47B01404f8AEC5f4F0d',
[eEthereumNetwork.main]: ZERO_ADDRESS, [eEthereumNetwork.main]: ZERO_ADDRESS,
[eEthereumNetwork.tenderlyMain]: ZERO_ADDRESS, [eEthereumNetwork.tenderly]: ZERO_ADDRESS,
}, },
ChainlinkAggregator: { ChainlinkAggregator: {
[eEthereumNetwork.coverage]: {}, [eEthereumNetwork.coverage]: {},
@ -270,7 +273,7 @@ export const CommonsConfig: ICommonConfiguration = {
BptBALWETH: '0x2e4e78936b100be6Ef85BCEf7FB25bC770B02B85', BptBALWETH: '0x2e4e78936b100be6Ef85BCEf7FB25bC770B02B85',
USD: '0x9326BFA02ADD2366b30bacB125260Af641031331', USD: '0x9326BFA02ADD2366b30bacB125260Af641031331',
}, },
[eEthereumNetwork.tenderlyMain]: { [eEthereumNetwork.tenderly]: {
USDT: '0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46', USDT: '0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46',
WBTC: '0xdeb288F737066589598e9214E782fa5A8eD689e8', WBTC: '0xdeb288F737066589598e9214E782fa5A8eD689e8',
USDC: '0x986b5E1e1755e3C2440e960477f25201B0a8bbD4', USDC: '0x986b5E1e1755e3C2440e960477f25201B0a8bbD4',
@ -301,7 +304,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.main]: {}, [eEthereumNetwork.main]: {},
[eEthereumNetwork.kovan]: {}, [eEthereumNetwork.kovan]: {},
[eEthereumNetwork.ropsten]: {}, [eEthereumNetwork.ropsten]: {},
[eEthereumNetwork.tenderlyMain]: {}, [eEthereumNetwork.tenderly]: {},
}, },
ReservesConfig: {}, ReservesConfig: {},
ATokenDomainSeparator: { ATokenDomainSeparator: {
@ -314,7 +317,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '', [eEthereumNetwork.kovan]: '',
[eEthereumNetwork.ropsten]: '', [eEthereumNetwork.ropsten]: '',
[eEthereumNetwork.main]: '', [eEthereumNetwork.main]: '',
[eEthereumNetwork.tenderlyMain]: '', [eEthereumNetwork.tenderly]: '',
}, },
WETH: { WETH: {
[eEthereumNetwork.coverage]: '', // deployed in local evm [eEthereumNetwork.coverage]: '', // deployed in local evm
@ -323,7 +326,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', [eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c',
[eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab', [eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab',
[eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
[eEthereumNetwork.tenderlyMain]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.tenderly]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
}, },
WrappedNativeToken: { WrappedNativeToken: {
[eEthereumNetwork.coverage]: '', // deployed in local evm [eEthereumNetwork.coverage]: '', // deployed in local evm
@ -332,7 +335,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', [eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c',
[eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab', [eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab',
[eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
[eEthereumNetwork.tenderlyMain]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', [eEthereumNetwork.tenderly]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
}, },
ReserveFactorTreasuryAddress: { ReserveFactorTreasuryAddress: {
[eEthereumNetwork.coverage]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.coverage]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
@ -341,7 +344,7 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.kovan]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
[eEthereumNetwork.ropsten]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.ropsten]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
[eEthereumNetwork.main]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.main]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
[eEthereumNetwork.tenderlyMain]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c', [eEthereumNetwork.tenderly]: '0x464c71f6c2f760dda6093dcb91c24c39e5d6e18c',
}, },
IncentivesController: { IncentivesController: {
[eEthereumNetwork.coverage]: ZERO_ADDRESS, [eEthereumNetwork.coverage]: ZERO_ADDRESS,
@ -350,6 +353,6 @@ export const CommonsConfig: ICommonConfiguration = {
[eEthereumNetwork.kovan]: ZERO_ADDRESS, [eEthereumNetwork.kovan]: ZERO_ADDRESS,
[eEthereumNetwork.ropsten]: ZERO_ADDRESS, [eEthereumNetwork.ropsten]: ZERO_ADDRESS,
[eEthereumNetwork.main]: ZERO_ADDRESS, [eEthereumNetwork.main]: ZERO_ADDRESS,
[eEthereumNetwork.tenderlyMain]: ZERO_ADDRESS, [eEthereumNetwork.tenderly]: ZERO_ADDRESS,
}, },
}; };

View File

@ -83,8 +83,7 @@ export const AmmConfig: IAmmConfiguration = {
BptWBTCWETH: '0x110569E3261bC0934dA637b019f6f1b6F50ec574', BptWBTCWETH: '0x110569E3261bC0934dA637b019f6f1b6F50ec574',
BptBALWETH: '0xad01D8e0Fa9EAA8Fe76dA30CFb1BCe12707aE6c5', BptBALWETH: '0xad01D8e0Fa9EAA8Fe76dA30CFb1BCe12707aE6c5',
}, },
[eEthereumNetwork.ropsten]: { [eEthereumNetwork.ropsten]: {},
},
[eEthereumNetwork.main]: { [eEthereumNetwork.main]: {
DAI: '0x6B175474E89094C44Da98b954EedeAC495271d0F', DAI: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
@ -108,7 +107,7 @@ export const AmmConfig: IAmmConfiguration = {
BptWBTCWETH: '0x1efF8aF5D577060BA4ac8A29A13525bb0Ee2A3D5', BptWBTCWETH: '0x1efF8aF5D577060BA4ac8A29A13525bb0Ee2A3D5',
BptBALWETH: '0x59A19D8c652FA0284f44113D0ff9aBa70bd46fB4', BptBALWETH: '0x59A19D8c652FA0284f44113D0ff9aBa70bd46fB4',
}, },
[eEthereumNetwork.tenderlyMain]: { [eEthereumNetwork.tenderly]: {
DAI: '0x6B175474E89094C44Da98b954EedeAC495271d0F', DAI: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', USDC: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7',

View File

@ -0,0 +1,165 @@
import BigNumber from 'bignumber.js';
import {
oneEther,
oneRay,
RAY,
ZERO_ADDRESS,
MOCK_CHAINLINK_AGGREGATORS_PRICES,
oneUsd,
} from '../../helpers/constants';
import { ICommonConfiguration, eAvalancheNetwork } from '../../helpers/types';
// ----------------
// PROTOCOL GLOBAL PARAMS
// ----------------
export const CommonsConfig: ICommonConfiguration = {
MarketId: 'Commons',
ATokenNamePrefix: 'Aave Avalanche Market',
StableDebtTokenNamePrefix: 'Aave Avalanche Market stable debt',
VariableDebtTokenNamePrefix: 'Aave Avalanche Market variable debt',
SymbolPrefix: 'v',
ProviderId: 0, // Overriden in index.ts
OracleQuoteCurrency: 'USD',
OracleQuoteUnit: oneUsd.toString(),
ProtocolGlobalParams: {
TokenDistributorPercentageBase: '10000',
MockUsdPriceInWei: '5848466240000000',
UsdAddress: '0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96', // TODO: what is this?
NilAddress: '0x0000000000000000000000000000000000000000',
OneAddress: '0x0000000000000000000000000000000000000001',
AaveReferral: '0',
},
// ----------------
// COMMON PROTOCOL PARAMS ACROSS POOLS AND NETWORKS
// ----------------
Mocks: {
AllAssetsInitialPrices: {
...MOCK_CHAINLINK_AGGREGATORS_PRICES,
},
},
// TODO: reorg alphabetically, checking the reason of tests failing
LendingRateOracleRatesCommon: {
WETH: {
borrowRate: oneRay.multipliedBy(0.03).toFixed(),
},
DAI: {
borrowRate: oneRay.multipliedBy(0.039).toFixed(),
},
USDC: {
borrowRate: oneRay.multipliedBy(0.039).toFixed(),
},
USDT: {
borrowRate: oneRay.multipliedBy(0.035).toFixed(),
},
AAVE: {
borrowRate: oneRay.multipliedBy(0.03).toFixed(),
},
WBTC: {
borrowRate: oneRay.multipliedBy(0.03).toFixed(),
},
WAVAX: {
borrowRate: oneRay.multipliedBy(0.05).toFixed(), // TODO: fix borrowRate?
},
},
// ----------------
// COMMON PROTOCOL ADDRESSES ACROSS POOLS
// ----------------
// If PoolAdmin/emergencyAdmin is set, will take priority over PoolAdminIndex/emergencyAdminIndex
PoolAdmin: {
[eAvalancheNetwork.avalanche]: undefined,
[eAvalancheNetwork.fuji]: undefined,
},
PoolAdminIndex: 0,
EmergencyAdminIndex: 0,
EmergencyAdmin: {
[eAvalancheNetwork.avalanche]: undefined,
[eAvalancheNetwork.fuji]: undefined,
},
ProviderRegistry: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '0x06eC0BDC3997EE32Cb5B66a1B9C11d92e2C27Aab',
},
ProviderRegistryOwner: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '0x1128d177BdaA74Ae68EB06e693f4CbA6BF427a5e',
},
LendingRateOracle: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '0xEbBD998B7Dc2a8E675F0859d907c8Fa6027aBc7b',
},
LendingPoolCollateralManager: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '0x6242bE2fB5591FA1e81a99e6DD55Ff667fa82a71',
},
LendingPoolConfigurator: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '',
},
LendingPool: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '0x5f3968A2E41C95A95329333d44AB989de6c43f8E',
},
WethGateway: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '0x62AF6258d26838f33BADFbb33cf1De8FaB8EB19f',
},
TokenDistributor: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '',
},
AaveOracle: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '0xD217DdD9f0Af84644dEFe84a0b634621D4617a29',
},
FallbackOracle: {
[eAvalancheNetwork.avalanche]: ZERO_ADDRESS,
[eAvalancheNetwork.fuji]: ZERO_ADDRESS,
},
ChainlinkAggregator: {
[eAvalancheNetwork.avalanche]: {
WETH: '0x976B3D034E162d8bD72D6b9C989d545b839003b0',
DAI: '0x51D7180edA2260cc4F6e4EebB82FEF5c3c2B8300',
USDC: '0xF096872672F44d6EBA71458D74fe67F9a77a23B9',
USDT: '0xEBE676ee90Fe1112671f19b6B7459bC678B67e8a',
AAVE: '0x3CA13391E9fb38a75330fb28f8cc2eB3D9ceceED',
WBTC: '0x2779D32d5166BAaa2B2b658333bA7e6Ec0C65743',
WAVAX: '0x0A77230d17318075983913bC2145DB16C7366156',
},
[eAvalancheNetwork.fuji]: {
WETH: '0x86d67c3D38D2bCeE722E601025C25a575021c6EA',
USDT: '0x7898AcCC83587C3C55116c5230C17a6Cd9C71bad',
WBTC: '0x31CF013A08c6Ac228C94551d535d5BAfE19c602a',
WAVAX: '0x5498BB86BC934c8D34FDA08E81D444153d0D06aD',
USD: '0x86d67c3D38D2bCeE722E601025C25a575021c6EA',
},
},
ReserveAssets: {
[eAvalancheNetwork.avalanche]: {},
[eAvalancheNetwork.fuji]: {},
},
ReservesConfig: {},
ATokenDomainSeparator: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '',
},
WETH: {
[eAvalancheNetwork.avalanche]: '',
[eAvalancheNetwork.fuji]: '',
},
WrappedNativeToken: {
[eAvalancheNetwork.avalanche]: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7', // Official WAVAX
[eAvalancheNetwork.fuji]: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c', // Official WAVAX
},
ReserveFactorTreasuryAddress: {
[eAvalancheNetwork.avalanche]: '0x467b92aF281d14cB6809913AD016a607b5ba8A36',
[eAvalancheNetwork.fuji]: '0xB45F5C501A22288dfdb897e5f73E189597e09288', // Self-controlled EOA for testing
},
IncentivesController: {
[eAvalancheNetwork.avalanche]: '0x01D83Fe6A10D2f2B7AF17034343746188272cAc9',
[eAvalancheNetwork.fuji]: '0xa1EF206fb9a8D8186157FC817fCddcC47727ED55',
},
};

View File

@ -0,0 +1,52 @@
import { eAvalancheNetwork, IAvalancheConfiguration } from '../../helpers/types';
import { CommonsConfig } from './commons';
import {
strategyWETH,
strategyDAI,
strategyUSDC,
strategyUSDT,
strategyAAVE,
strategyWBTC,
strategyWAVAX,
} from './reservesConfigs';
// ----------------
// POOL--SPECIFIC PARAMS
// ----------------
export const AvalancheConfig: IAvalancheConfiguration = {
...CommonsConfig,
MarketId: 'Avalanche market',
ProviderId: 4,
ReservesConfig: {
WETH: strategyWETH,
DAI: strategyDAI,
USDT: strategyUSDT,
USDC: strategyUSDC,
AAVE: strategyAAVE,
WBTC: strategyWBTC,
WAVAX: strategyWAVAX,
},
ReserveAssets: {
[eAvalancheNetwork.avalanche]: {
WETH: '0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab',
DAI: '0xd586e7f844cea2f87f50152665bcbc2c279d8d70',
USDT: '0xc7198437980c041c805a1edcba50c1ce5db95118',
USDC: '0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664',
AAVE: '0x63a72806098bd3d9520cc43356dd78afe5d386d9',
WBTC: '0x50b7545627a5162f82a992c33b87adc75187b218',
WAVAX: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7',
},
[eAvalancheNetwork.fuji]: {
WETH: '0x9668f5f55f2712Dd2dfa316256609b516292D554', // MintableERC20 token
DAI: '0x51BC2DfB9D12d9dB50C855A5330fBA0faF761D15',
USDT: '0x02823f9B469960Bb3b1de0B3746D4b95B7E35543', // MintableERC20 token
AAVE: '0x47183584aCbc1C45608d7B61cce1C562Ee180E7e',
WBTC: '0x9C1DCacB57ADa1E9e2D3a8280B7cfC7EB936186F', // MintableERC20 token
WAVAX: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c', // Official WAVAX
},
},
};
export default AvalancheConfig;

View File

@ -0,0 +1,23 @@
import BigNumber from 'bignumber.js';
import { oneRay } from '../../helpers/constants';
import { IInterestRateStrategyParams } from '../../helpers/types';
export const rateStrategyVolatileOne: IInterestRateStrategyParams = {
name: 'rateStrategyVolatileOne',
optimalUtilizationRate: new BigNumber(0.45).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(),
variableRateSlope1: new BigNumber(0.07).multipliedBy(oneRay).toFixed(),
variableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(),
stableRateSlope1: '0',
stableRateSlope2: '0',
};
export const rateStrategyStableOne: IInterestRateStrategyParams = {
name: 'rateStrategyStableOne',
optimalUtilizationRate: new BigNumber(0.8).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(),
variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(),
variableRateSlope2: new BigNumber(0.75).multipliedBy(oneRay).toFixed(),
stableRateSlope1: new BigNumber(0.02).multipliedBy(oneRay).toFixed(),
stableRateSlope2: new BigNumber(0.75).multipliedBy(oneRay).toFixed(),
};

View File

@ -0,0 +1,87 @@
import { eContractid, IReserveParams } from '../../helpers/types';
import { rateStrategyStableOne, rateStrategyVolatileOne } from './rateStrategies';
export const strategyWAVAX: IReserveParams = {
strategy: rateStrategyVolatileOne,
baseLTVAsCollateral: '5000',
liquidationThreshold: '6500',
liquidationBonus: '11000',
borrowingEnabled: true,
stableBorrowRateEnabled: false,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '1500',
};
export const strategyWETH: IReserveParams = {
strategy: rateStrategyVolatileOne,
baseLTVAsCollateral: '8000',
liquidationThreshold: '8250',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: false,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
};
export const strategyWBTC: IReserveParams = {
strategy: rateStrategyVolatileOne,
baseLTVAsCollateral: '6000',
liquidationThreshold: '7500',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: false,
reserveDecimals: '8',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
};
export const strategyAAVE: IReserveParams = {
strategy: rateStrategyVolatileOne,
baseLTVAsCollateral: '4000',
liquidationThreshold: '6500',
liquidationBonus: '11000',
borrowingEnabled: false,
stableBorrowRateEnabled: false,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '2000',
};
export const strategyDAI: IReserveParams = {
strategy: rateStrategyStableOne,
baseLTVAsCollateral: '7500',
liquidationThreshold: '8000',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: false,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
};
export const strategyUSDT: IReserveParams = {
strategy: rateStrategyStableOne,
baseLTVAsCollateral: '0',
liquidationThreshold: '0',
liquidationBonus: '0',
borrowingEnabled: true,
stableBorrowRateEnabled: false,
reserveDecimals: '6',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
};
export const strategyUSDC: IReserveParams = {
strategy: rateStrategyStableOne,
baseLTVAsCollateral: '7500',
liquidationThreshold: '8000',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: false,
reserveDecimals: '6',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
};

View File

@ -19,6 +19,8 @@ export const CommonsConfig: ICommonConfiguration = {
VariableDebtTokenNamePrefix: 'Aave Matic Market variable debt', VariableDebtTokenNamePrefix: 'Aave Matic Market variable debt',
SymbolPrefix: 'm', SymbolPrefix: 'm',
ProviderId: 0, // Overriden in index.ts ProviderId: 0, // Overriden in index.ts
OracleQuoteCurrency: 'ETH',
OracleQuoteUnit: oneEther.toString(),
ProtocolGlobalParams: { ProtocolGlobalParams: {
TokenDistributorPercentageBase: '10000', TokenDistributorPercentageBase: '10000',
MockUsdPriceInWei: '5848466240000000', MockUsdPriceInWei: '5848466240000000',

View File

@ -19,6 +19,7 @@ export const CommonsConfig: ICommonConfiguration = {
VariableDebtTokenNamePrefix: 'Aave XDAI Market variable debt', VariableDebtTokenNamePrefix: 'Aave XDAI Market variable debt',
SymbolPrefix: 'm', SymbolPrefix: 'm',
ProviderId: 0, // Overriden in index.ts ProviderId: 0, // Overriden in index.ts
OracleQuoteCurrency: 'ETH',
ProtocolGlobalParams: { ProtocolGlobalParams: {
TokenDistributorPercentageBase: '10000', TokenDistributorPercentageBase: '10000',
MockUsdPriceInWei: '5848466240000000', MockUsdPriceInWei: '5848466240000000',

2
package-lock.json generated
View File

@ -14793,7 +14793,7 @@
} }
}, },
"ethereumjs-abi": { "ethereumjs-abi": {
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1a27c59c15ab1e95ee8e5c4ed6ad814c49cc439e", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"dev": true, "dev": true,
"requires": { "requires": {

View File

@ -16,6 +16,8 @@
"hardhat:docker": "hardhat --network hardhatevm_docker", "hardhat:docker": "hardhat --network hardhatevm_docker",
"hardhat:mumbai": "hardhat --network mumbai", "hardhat:mumbai": "hardhat --network mumbai",
"hardhat:matic": "hardhat --network matic", "hardhat:matic": "hardhat --network matic",
"hardhat:fuji": "hardhat --network fuji",
"hardhat:avalanche": "hardhat --network avalanche",
"compile": "SKIP_LOAD=true hardhat compile", "compile": "SKIP_LOAD=true hardhat compile",
"console:fork": "FORK=main hardhat console", "console:fork": "FORK=main hardhat console",
"test": "npm run compile && TS_NODE_TRANSPILE_ONLY=1 hardhat test ./test-suites/test-aave/*.spec.ts", "test": "npm run compile && TS_NODE_TRANSPILE_ONLY=1 hardhat test ./test-suites/test-aave/*.spec.ts",
@ -30,12 +32,15 @@
"aave:kovan:full:migration": "npm run compile && npm run hardhat:kovan -- aave:mainnet --skip-registry", "aave:kovan:full:migration": "npm run compile && npm run hardhat:kovan -- aave:mainnet --skip-registry",
"matic:mumbai:full:migration": "npm run compile && npm run hardhat:mumbai sidechain:mainnet -- --pool Matic --skip-registry", "matic:mumbai:full:migration": "npm run compile && npm run hardhat:mumbai sidechain:mainnet -- --pool Matic --skip-registry",
"matic:matic:full:migration": "npm run compile && npm run hardhat:matic sidechain:mainnet -- --pool Matic --skip-registry", "matic:matic:full:migration": "npm run compile && npm run hardhat:matic sidechain:mainnet -- --pool Matic --skip-registry",
"avalanche:fuji:full:migration": "npm run compile && npm run hardhat:fuji avalanche:mainnet -- --pool Avalanche",
"amm:kovan:full:migration": "npm run compile && npm run hardhat:kovan -- amm:mainnet --skip-registry", "amm:kovan:full:migration": "npm run compile && npm run hardhat:kovan -- amm:mainnet --skip-registry",
"aave:docker:full:migration:add-registry": "npm run compile && npm run hardhat:docker -- aave:mainnet", "aave:docker:full:migration:add-registry": "npm run compile && npm run hardhat:docker -- aave:mainnet",
"aave:kovan:full:migration:add-registry": "npm run compile && npm run hardhat:kovan -- aave:mainnet", "aave:kovan:full:migration:add-registry": "npm run compile && npm run hardhat:kovan -- aave:mainnet",
"matic:mumbai:full:migration:add-registry": "npm run compile && npm run hardhat:mumbai sidechain:mainnet -- --pool Matic", "matic:mumbai:full:migration:add-registry": "npm run compile && npm run hardhat:mumbai sidechain:mainnet -- --pool Matic",
"matic:matic:full:migration:add-registry": "npm run compile && npm run hardhat:matic sidechain:mainnet -- --pool Matic", "matic:matic:full:migration:add-registry": "npm run compile && npm run hardhat:matic sidechain:mainnet -- --pool Matic",
"amm:kovan:full:migration:add-registry": "npm run compile && npm run hardhat:kovan -- amm:mainnet", "amm:kovan:full:migration:add-registry": "npm run compile && npm run hardhat:kovan -- amm:mainnet",
"avalanche:fuji:full:migration:add-registry": "npm run compile && npm run hardhat:fuji avalanche:mainnet -- --pool Avalanche",
"avalanche:mainnet:full:migration:add-registry": "npm run compile && npm run hardhat:avalanche avalanche:mainnet -- --pool Avalanche",
"aave:docker:add-market-to-registry-from-config": "npm run compile && npm run hardhat:docker -- add-market-to-registry --pool Aave", "aave:docker:add-market-to-registry-from-config": "npm run compile && npm run hardhat:docker -- add-market-to-registry --pool Aave",
"aave:kovan:add-market-to-registry-from-config": "npm run compile && npm run hardhat:kovan -- add-market-to-registry --pool Aave", "aave:kovan:add-market-to-registry-from-config": "npm run compile && npm run hardhat:kovan -- add-market-to-registry --pool Aave",
"matic:mumbai:add-market-to-registry-from-config": "npm run compile && npm run hardhat:mumbai add-market-to-registry --pool Matic", "matic:mumbai:add-market-to-registry-from-config": "npm run compile && npm run hardhat:mumbai add-market-to-registry --pool Matic",
@ -70,6 +75,7 @@
"main:deployUIProvider": "hardhat --network main deploy-UiPoolDataProvider --verify", "main:deployUIProvider": "hardhat --network main deploy-UiPoolDataProvider --verify",
"matic:deployUIProvider": "hardhat --network matic deploy-UiPoolDataProvider", "matic:deployUIProvider": "hardhat --network matic deploy-UiPoolDataProvider",
"mumbai:deployUIProvider": "hardhat --network mumbai deploy-UiPoolDataProvider", "mumbai:deployUIProvider": "hardhat --network mumbai deploy-UiPoolDataProvider",
"fuji:deployUIProvider": "hardhat --network fuji deploy-UiPoolDataProvider",
"dev:deployUniswapRepayAdapter": "hardhat --network kovan deploy-UniswapRepayAdapter --provider 0x88757f2f99175387aB4C6a4b3067c77A695b0349 --router 0xfcd87315f0e4067070ade8682fcdbc3006631441 --weth 0xd0a1e359811322d97991e03f863a0c30c2cf029c", "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", "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:deployUniswapRepayAdapter": "hardhat --network main deploy-UniswapRepayAdapter --provider 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5 --router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D --weth 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",

View File

@ -40,7 +40,7 @@ task('add-market-to-registry', 'Adds address provider to registry')
) { ) {
console.log('- Deploying a new Address Providers Registry:'); console.log('- Deploying a new Address Providers Registry:');
await DRE.run('full:deploy-address-provider-registry', { verify }); await DRE.run('full:deploy-address-provider-registry', { verify, pool });
providerRegistryAddress = (await getLendingPoolAddressesProviderRegistry()).address; providerRegistryAddress = (await getLendingPoolAddressesProviderRegistry()).address;
providerRegistryOwner = await (await getFirstSigner()).getAddress(); providerRegistryOwner = await (await getFirstSigner()).getAddress();

View File

@ -1,5 +1,11 @@
import { task } from 'hardhat/config'; import { task } from 'hardhat/config';
import { eContractid, eEthereumNetwork, eNetwork, ePolygonNetwork } from '../../helpers/types'; import {
eAvalancheNetwork,
eContractid,
eEthereumNetwork,
eNetwork,
ePolygonNetwork,
} from '../../helpers/types';
import { deployUiPoolDataProvider } from '../../helpers/contracts-deployments'; import { deployUiPoolDataProvider } from '../../helpers/contracts-deployments';
import { exit } from 'process'; import { exit } from 'process';
@ -31,6 +37,14 @@ task(`deploy-${eContractid.UiPoolDataProvider}`, `Deploys the UiPoolDataProvider
incentivesController: '0xd41aE58e803Edf4304334acCE4DC4Ec34a63C644', incentivesController: '0xd41aE58e803Edf4304334acCE4DC4Ec34a63C644',
aaveOracle: '0xC365C653f7229894F93994CD0b30947Ab69Ff1D5', aaveOracle: '0xC365C653f7229894F93994CD0b30947Ab69Ff1D5',
}, },
[eAvalancheNetwork.fuji]: {
incentivesController: '0xa1EF206fb9a8D8186157FC817fCddcC47727ED55',
aaveOracle: '0xD217DdD9f0Af84644dEFe84a0b634621D4617a29',
},
[eAvalancheNetwork.avalanche]: {
incentivesController: '0x01D83Fe6A10D2f2B7AF17034343746188272cAc9',
aaveOracle: '0xdC336Cd4769f4cC7E9d726DA53e6d3fC710cEB89',
},
}; };
const supportedNetworks = Object.keys(addressesByNetwork); const supportedNetworks = Object.keys(addressesByNetwork);

View File

@ -1,5 +1,6 @@
import { task } from 'hardhat/config'; import { task } from 'hardhat/config';
import { import {
deployATokenImplementations,
deployATokensAndRatesHelper, deployATokensAndRatesHelper,
deployLendingPool, deployLendingPool,
deployLendingPoolConfigurator, deployLendingPoolConfigurator,
@ -13,13 +14,15 @@ import {
getLendingPoolConfiguratorProxy, getLendingPoolConfiguratorProxy,
} from '../../helpers/contracts-getters'; } from '../../helpers/contracts-getters';
import { insertContractAddressInDb } from '../../helpers/contracts-helpers'; import { insertContractAddressInDb } from '../../helpers/contracts-helpers';
import { ConfigNames, loadPoolConfig } from '../../helpers/configuration';
task('dev:deploy-lending-pool', 'Deploy lending pool for dev enviroment') task('dev:deploy-lending-pool', 'Deploy lending pool for dev enviroment')
.addFlag('verify', 'Verify contracts at Etherscan') .addFlag('verify', 'Verify contracts at Etherscan')
.setAction(async ({ verify }, localBRE) => { .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`)
.setAction(async ({ verify, pool }, localBRE) => {
await localBRE.run('set-DRE'); await localBRE.run('set-DRE');
const addressesProvider = await getLendingPoolAddressesProvider(); const addressesProvider = await getLendingPoolAddressesProvider();
const poolConfig = loadPoolConfig(pool);
const lendingPoolImpl = await deployLendingPool(verify); const lendingPoolImpl = await deployLendingPool(verify);
@ -55,4 +58,5 @@ task('dev:deploy-lending-pool', 'Deploy lending pool for dev enviroment')
[lendingPoolProxy.address, addressesProvider.address, lendingPoolConfiguratorProxy.address], [lendingPoolProxy.address, addressesProvider.address, lendingPoolConfiguratorProxy.address],
verify verify
); );
await deployATokenImplementations(pool, poolConfig.ReservesConfig, verify);
}); });

View File

@ -12,14 +12,14 @@ import {
import { ICommonConfiguration, iAssetBase, TokenContractId } from '../../helpers/types'; import { ICommonConfiguration, iAssetBase, TokenContractId } from '../../helpers/types';
import { waitForTx } from '../../helpers/misc-utils'; import { waitForTx } from '../../helpers/misc-utils';
import { getAllAggregatorsAddresses, getAllTokenAddresses } from '../../helpers/mock-helpers'; import { getAllAggregatorsAddresses, getAllTokenAddresses } from '../../helpers/mock-helpers';
import { ConfigNames, loadPoolConfig, getWethAddress } from '../../helpers/configuration'; import { ConfigNames, loadPoolConfig, getQuoteCurrency } from '../../helpers/configuration';
import { import {
getAllMockedTokens, getAllMockedTokens,
getLendingPoolAddressesProvider, getLendingPoolAddressesProvider,
getPairsTokenAggregator, getPairsTokenAggregator,
} from '../../helpers/contracts-getters'; } from '../../helpers/contracts-getters';
task('dev:deploy-oracles', 'Deploy oracles for dev enviroment') task('dev:deploy-oracles', 'Deploy oracles for dev environment')
.addFlag('verify', 'Verify contracts at Etherscan') .addFlag('verify', 'Verify contracts at Etherscan')
.addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`)
.setAction(async ({ verify, pool }, localBRE) => { .setAction(async ({ verify, pool }, localBRE) => {
@ -29,6 +29,8 @@ task('dev:deploy-oracles', 'Deploy oracles for dev enviroment')
Mocks: { AllAssetsInitialPrices }, Mocks: { AllAssetsInitialPrices },
ProtocolGlobalParams: { UsdAddress, MockUsdPriceInWei }, ProtocolGlobalParams: { UsdAddress, MockUsdPriceInWei },
LendingRateOracleRatesCommon, LendingRateOracleRatesCommon,
OracleQuoteCurrency,
OracleQuoteUnit,
} = poolConfig as ICommonConfiguration; } = poolConfig as ICommonConfiguration;
const defaultTokenList = { const defaultTokenList = {
@ -54,11 +56,18 @@ task('dev:deploy-oracles', 'Deploy oracles for dev enviroment')
const [tokens, aggregators] = getPairsTokenAggregator( const [tokens, aggregators] = getPairsTokenAggregator(
allTokenAddresses, allTokenAddresses,
allAggregatorsAddresses allAggregatorsAddresses,
OracleQuoteCurrency
); );
await deployAaveOracle( await deployAaveOracle(
[tokens, aggregators, fallbackOracle.address, await getWethAddress(poolConfig)], [
tokens,
aggregators,
fallbackOracle.address,
await getQuoteCurrency(poolConfig),
OracleQuoteUnit,
],
verify verify
); );
await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address)); await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address));

View File

@ -40,6 +40,7 @@ task('dev:initialize-lending-pool', 'Initialize lending pool configuration.')
VariableDebtTokenNamePrefix, VariableDebtTokenNamePrefix,
SymbolPrefix, SymbolPrefix,
WethGateway, WethGateway,
ReservesConfig,
} = poolConfig; } = poolConfig;
const mockTokens = await getAllMockedTokens(); const mockTokens = await getAllMockedTokens();
const allTokenAddresses = getAllTokenAddresses(mockTokens); const allTokenAddresses = getAllTokenAddresses(mockTokens);
@ -52,14 +53,12 @@ task('dev:initialize-lending-pool', 'Initialize lending pool configuration.')
const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address, verify); const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address, verify);
const reservesParams = getReservesConfigByPool(AavePools.proto);
const admin = await addressesProvider.getPoolAdmin(); const admin = await addressesProvider.getPoolAdmin();
const treasuryAddress = await getTreasuryAddress(poolConfig); const treasuryAddress = await getTreasuryAddress(poolConfig);
await initReservesByHelper( await initReservesByHelper(
reservesParams, ReservesConfig,
protoPoolReservesAddresses, protoPoolReservesAddresses,
ATokenNamePrefix, ATokenNamePrefix,
StableDebtTokenNamePrefix, StableDebtTokenNamePrefix,
@ -68,9 +67,10 @@ task('dev:initialize-lending-pool', 'Initialize lending pool configuration.')
admin, admin,
treasuryAddress, treasuryAddress,
ZERO_ADDRESS, ZERO_ADDRESS,
pool,
verify verify
); );
await configureReservesByHelper(reservesParams, protoPoolReservesAddresses, testHelpers, admin); await configureReservesByHelper(ReservesConfig, protoPoolReservesAddresses, testHelpers, admin);
const collateralManager = await deployLendingPoolCollateralManager(verify); const collateralManager = await deployLendingPoolCollateralManager(verify);
await waitForTx( await waitForTx(

View File

@ -11,11 +11,14 @@ task('full:deploy-address-provider-registry', 'Deploy address provider registry'
.addFlag('verify', 'Verify contracts at Etherscan') .addFlag('verify', 'Verify contracts at Etherscan')
.addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`)
.setAction(async ({ verify, pool }, DRE) => { .setAction(async ({ verify, pool }, DRE) => {
console.log('prior dre');
await DRE.run('set-DRE'); await DRE.run('set-DRE');
const poolConfig = loadPoolConfig(pool); const poolConfig = loadPoolConfig(pool);
const network = <eNetwork>DRE.network.name; const network = <eNetwork>DRE.network.name;
const signer = await getFirstSigner(); const signer = await getFirstSigner();
console.log('Deployer:', await signer.getAddress(), formatEther(await signer.getBalance()));
const providerRegistryAddress = getParamPerNetwork(poolConfig.ProviderRegistry, network); const providerRegistryAddress = getParamPerNetwork(poolConfig.ProviderRegistry, network);
console.log('Signer', await signer.getAddress()); console.log('Signer', await signer.getAddress());

View File

@ -1,6 +1,7 @@
import { task } from 'hardhat/config'; import { task } from 'hardhat/config';
import { getParamPerNetwork, insertContractAddressInDb } from '../../helpers/contracts-helpers'; import { getParamPerNetwork, insertContractAddressInDb } from '../../helpers/contracts-helpers';
import { import {
deployATokenImplementations,
deployATokensAndRatesHelper, deployATokensAndRatesHelper,
deployLendingPool, deployLendingPool,
deployLendingPoolConfigurator, deployLendingPoolConfigurator,
@ -14,7 +15,12 @@ import {
getLendingPoolConfiguratorProxy, getLendingPoolConfiguratorProxy,
} from '../../helpers/contracts-getters'; } from '../../helpers/contracts-getters';
import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { HardhatRuntimeEnvironment } from 'hardhat/types';
import { loadPoolConfig, ConfigNames } from '../../helpers/configuration'; import {
loadPoolConfig,
ConfigNames,
getGenesisPoolAdmin,
getEmergencyAdmin,
} from '../../helpers/configuration';
task('full:deploy-lending-pool', 'Deploy lending pool for dev enviroment') task('full:deploy-lending-pool', 'Deploy lending pool for dev enviroment')
.addFlag('verify', 'Verify contracts at Etherscan') .addFlag('verify', 'Verify contracts at Etherscan')
@ -69,6 +75,10 @@ task('full:deploy-lending-pool', 'Deploy lending pool for dev enviroment')
eContractid.LendingPoolConfigurator, eContractid.LendingPoolConfigurator,
lendingPoolConfiguratorProxy.address lendingPoolConfiguratorProxy.address
); );
const admin = await DRE.ethers.getSigner(await getEmergencyAdmin(poolConfig));
// Pause market during deployment
await waitForTx(await lendingPoolConfiguratorProxy.connect(admin).setPoolPause(true));
// Deploy deployment helpers // Deploy deployment helpers
await deployStableAndVariableTokensHelper( await deployStableAndVariableTokensHelper(
[lendingPoolProxy.address, addressesProvider.address], [lendingPoolProxy.address, addressesProvider.address],
@ -78,11 +88,12 @@ task('full:deploy-lending-pool', 'Deploy lending pool for dev enviroment')
[lendingPoolProxy.address, addressesProvider.address, lendingPoolConfiguratorProxy.address], [lendingPoolProxy.address, addressesProvider.address, lendingPoolConfiguratorProxy.address],
verify verify
); );
await deployATokenImplementations(pool, poolConfig.ReservesConfig, verify);
} catch (error) { } catch (error) {
if (DRE.network.name.includes('tenderly')) { if (DRE.network.name.includes('tenderly')) {
const transactionLink = `https://dashboard.tenderly.co/${DRE.config.tenderly.username}/${ const transactionLink = `https://dashboard.tenderly.co/${DRE.config.tenderly.username}/${
DRE.config.tenderly.project DRE.config.tenderly.project
}/fork/${DRE.tenderlyNetwork.getFork()}/simulation/${DRE.tenderlyNetwork.getHead()}`; }/fork/${DRE.tenderly.network().getFork()}/simulation/${DRE.tenderly.network().getHead()}`;
console.error('Check tx error:', transactionLink); console.error('Check tx error:', transactionLink);
} }
throw error; throw error;

View File

@ -7,9 +7,9 @@ import { waitForTx, notFalsyOrZeroAddress } from '../../helpers/misc-utils';
import { import {
ConfigNames, ConfigNames,
loadPoolConfig, loadPoolConfig,
getWethAddress,
getGenesisPoolAdmin, getGenesisPoolAdmin,
getLendingRateOracles, getLendingRateOracles,
getQuoteCurrency,
} from '../../helpers/configuration'; } from '../../helpers/configuration';
import { import {
getAaveOracle, getAaveOracle,
@ -46,16 +46,27 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment')
...reserveAssets, ...reserveAssets,
USD: UsdAddress, USD: UsdAddress,
}; };
const [tokens, aggregators] = getPairsTokenAggregator(tokensToWatch, chainlinkAggregators); const [tokens, aggregators] = getPairsTokenAggregator(
tokensToWatch,
chainlinkAggregators,
poolConfig.OracleQuoteCurrency
);
let aaveOracle: AaveOracle; let aaveOracle: AaveOracle;
let lendingRateOracle: LendingRateOracle; let lendingRateOracle: LendingRateOracle;
if (notFalsyOrZeroAddress(aaveOracleAddress)) { if (notFalsyOrZeroAddress(aaveOracleAddress)) {
aaveOracle = await await getAaveOracle(aaveOracleAddress); aaveOracle = await await getAaveOracle(aaveOracleAddress);
await waitForTx(await aaveOracle.setAssetSources(tokens, aggregators));
} else { } else {
aaveOracle = await deployAaveOracle( aaveOracle = await deployAaveOracle(
[tokens, aggregators, fallbackOracleAddress, await getWethAddress(poolConfig)], [
tokens,
aggregators,
fallbackOracleAddress,
await getQuoteCurrency(poolConfig),
poolConfig.OracleQuoteUnit,
],
verify verify
); );
await waitForTx(await aaveOracle.setAssetSources(tokens, aggregators)); await waitForTx(await aaveOracle.setAssetSources(tokens, aggregators));
@ -74,7 +85,7 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment')
); );
} }
console.log('Aave Oracle: %s', lendingRateOracle.address); console.log('Aave Oracle: %s', aaveOracle.address);
console.log('Lending Rate Oracle: %s', lendingRateOracle.address); console.log('Lending Rate Oracle: %s', lendingRateOracle.address);
// Register the proxy price provider on the addressesProvider // Register the proxy price provider on the addressesProvider
@ -84,7 +95,7 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment')
if (DRE.network.name.includes('tenderly')) { if (DRE.network.name.includes('tenderly')) {
const transactionLink = `https://dashboard.tenderly.co/${DRE.config.tenderly.username}/${ const transactionLink = `https://dashboard.tenderly.co/${DRE.config.tenderly.username}/${
DRE.config.tenderly.project DRE.config.tenderly.project
}/fork/${DRE.tenderlyNetwork.getFork()}/simulation/${DRE.tenderlyNetwork.getHead()}`; }/fork/${DRE.tenderly.network().getFork()}/simulation/${DRE.tenderly.network().getHead()}`;
console.error('Check tx error:', transactionLink); console.error('Check tx error:', transactionLink);
} }
throw error; throw error;

View File

@ -3,15 +3,10 @@ import { getParamPerNetwork } from '../../helpers/contracts-helpers';
import { import {
deployLendingPoolCollateralManager, deployLendingPoolCollateralManager,
deployWalletBalancerProvider, deployWalletBalancerProvider,
deployWETHGateway,
authorizeWETHGateway, authorizeWETHGateway,
deployUiPoolDataProvider,
} from '../../helpers/contracts-deployments'; } from '../../helpers/contracts-deployments';
import { import { loadPoolConfig, ConfigNames, getTreasuryAddress } from '../../helpers/configuration';
loadPoolConfig,
ConfigNames,
getWethAddress,
getTreasuryAddress,
} from '../../helpers/configuration';
import { getWETHGateway } from '../../helpers/contracts-getters'; import { getWETHGateway } from '../../helpers/contracts-getters';
import { eNetwork, ICommonConfiguration } from '../../helpers/types'; import { eNetwork, ICommonConfiguration } from '../../helpers/types';
import { notFalsyOrZeroAddress, waitForTx } from '../../helpers/misc-utils'; import { notFalsyOrZeroAddress, waitForTx } from '../../helpers/misc-utils';
@ -50,6 +45,8 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.')
const testHelpers = await getAaveProtocolDataProvider(); const testHelpers = await getAaveProtocolDataProvider();
const admin = await addressesProvider.getPoolAdmin(); const admin = await addressesProvider.getPoolAdmin();
const oracle = await addressesProvider.getPriceOracle();
if (!reserveAssets) { if (!reserveAssets) {
throw 'Reserve assets is undefined. Check ReserveAssets configuration at config directory'; throw 'Reserve assets is undefined. Check ReserveAssets configuration at config directory';
} }
@ -66,6 +63,7 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.')
admin, admin,
treasuryAddress, treasuryAddress,
incentivesController, incentivesController,
pool,
verify verify
); );
await configureReservesByHelper(ReservesConfig, reserveAssets, testHelpers, admin); await configureReservesByHelper(ReservesConfig, reserveAssets, testHelpers, admin);
@ -102,6 +100,12 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.')
await deployWalletBalancerProvider(verify); await deployWalletBalancerProvider(verify);
const uiPoolDataProvider = await deployUiPoolDataProvider(
[incentivesController, oracle],
verify
);
console.log('UiPoolDataProvider deployed at:', uiPoolDataProvider.address);
const lendingPoolAddress = await addressesProvider.getLendingPool(); const lendingPoolAddress = await addressesProvider.getLendingPool();
let gateWay = getParamPerNetwork(WethGateway, network); let gateWay = getParamPerNetwork(WethGateway, network);

View File

@ -3,9 +3,9 @@ import { eEthereumNetwork } from '../../helpers/types';
import { getTreasuryAddress } from '../../helpers/configuration'; import { getTreasuryAddress } from '../../helpers/configuration';
import * as marketConfigs from '../../markets/aave'; import * as marketConfigs from '../../markets/aave';
import * as reserveConfigs from '../../markets/aave/reservesConfigs'; import * as reserveConfigs from '../../markets/aave/reservesConfigs';
import { chooseATokenDeployment } from '../../helpers/init-helpers';
import { getLendingPoolAddressesProvider } from './../../helpers/contracts-getters'; import { getLendingPoolAddressesProvider } from './../../helpers/contracts-getters';
import { import {
chooseATokenDeployment,
deployDefaultReserveInterestRateStrategy, deployDefaultReserveInterestRateStrategy,
deployStableDebtToken, deployStableDebtToken,
deployVariableDebtToken, deployVariableDebtToken,
@ -47,18 +47,7 @@ WRONG RESERVE ASSET SETUP:
LENDING_POOL_ADDRESS_PROVIDER[network] LENDING_POOL_ADDRESS_PROVIDER[network]
); );
const poolAddress = await addressProvider.getLendingPool(); const poolAddress = await addressProvider.getLendingPool();
const treasuryAddress = await getTreasuryAddress(marketConfigs.AaveConfig); const aToken = await deployCustomAToken(verify);
const aToken = await deployCustomAToken(
[
poolAddress,
reserveAssetAddress,
treasuryAddress,
ZERO_ADDRESS, // Incentives Controller
`Aave interest bearing ${symbol}`,
`a${symbol}`,
],
verify
);
const stableDebt = await deployStableDebtToken( const stableDebt = await deployStableDebtToken(
[ [
poolAddress, poolAddress,

View File

@ -24,7 +24,7 @@ task('aave:dev', 'Deploy development enviroment')
await localBRE.run('dev:deploy-address-provider', { verify }); await localBRE.run('dev:deploy-address-provider', { verify });
console.log('3. Deploy lending pool'); console.log('3. Deploy lending pool');
await localBRE.run('dev:deploy-lending-pool', { verify }); await localBRE.run('dev:deploy-lending-pool', { verify, pool: POOL_NAME });
console.log('4. Deploy oracles'); console.log('4. Deploy oracles');
await localBRE.run('dev:deploy-oracles', { verify, pool: POOL_NAME }); await localBRE.run('dev:deploy-oracles', { verify, pool: POOL_NAME });

View File

@ -0,0 +1,60 @@
import { task } from 'hardhat/config';
import { checkVerification } from '../../helpers/etherscan-verification';
import { ConfigNames } from '../../helpers/configuration';
import { printContracts } from '../../helpers/misc-utils';
import { usingTenderly } from '../../helpers/tenderly-utils';
task('avalanche:mainnet', 'Deploy market at avalanche')
.addParam('pool', `Market pool configuration, one of ${Object.keys(ConfigNames)}`)
.addFlag('verify', 'Verify contracts at Etherscan')
.addFlag('skipRegistry', 'Skip addresses provider registration at Addresses Provider Registry')
.setAction(async ({ verify, pool, skipRegistry }, DRE) => {
const POOL_NAME = pool;
await DRE.run('set-DRE');
// Prevent loss of gas verifying all the needed ENVs for Etherscan verification
if (verify) {
checkVerification();
}
console.log('Migration started\n');
console.log('0. Deploy address provider registry');
await DRE.run('full:deploy-address-provider-registry', { pool: POOL_NAME });
console.log('1. Deploy address provider');
await DRE.run('full:deploy-address-provider', { pool: POOL_NAME, skipRegistry });
console.log('2. Deploy lending pool');
await DRE.run('full:deploy-lending-pool', { pool: POOL_NAME });
console.log('3. Deploy oracles');
await DRE.run('full:deploy-oracles', { pool: POOL_NAME });
console.log('4. Deploy Data Provider');
await DRE.run('full:data-provider', { pool: POOL_NAME });
console.log('5. Deploy WETH Gateway');
await DRE.run('full-deploy-weth-gateway', { pool: POOL_NAME });
console.log('6. Initialize lending pool');
await DRE.run('full:initialize-lending-pool', { pool: POOL_NAME });
if (verify) {
printContracts();
console.log('7. Veryfing contracts');
await DRE.run('verify:general', { all: true, pool: POOL_NAME });
console.log('8. Veryfing aTokens and debtTokens');
await DRE.run('verify:tokens', { pool: POOL_NAME });
}
if (usingTenderly()) {
const postDeployHead = DRE.tenderlyNetwork.getHead();
const postDeployFork = DRE.tenderlyNetwork.getFork();
console.log('Tenderly Info');
console.log('- Head', postDeployHead);
console.log('- Fork', postDeployFork);
}
console.log('\nFinished migrations');
printContracts();
});

View File

@ -1,11 +1,9 @@
import { error } from 'console';
import { zeroAddress } from 'ethereumjs-util';
import { task } from 'hardhat/config'; import { task } from 'hardhat/config';
import { import {
loadPoolConfig, loadPoolConfig,
ConfigNames, ConfigNames,
getWethAddress,
getTreasuryAddress, getTreasuryAddress,
getWrappedNativeTokenAddress,
} from '../../helpers/configuration'; } from '../../helpers/configuration';
import { ZERO_ADDRESS } from '../../helpers/constants'; import { ZERO_ADDRESS } from '../../helpers/constants';
import { import {
@ -53,7 +51,8 @@ task('verify:general', 'Verify contracts at Etherscan')
: await getLendingPoolAddressesProviderRegistry(); : await getLendingPoolAddressesProviderRegistry();
const lendingPoolAddress = await addressesProvider.getLendingPool(); const lendingPoolAddress = await addressesProvider.getLendingPool();
const lendingPoolConfiguratorAddress = await addressesProvider.getLendingPoolConfigurator(); //getLendingPoolConfiguratorProxy(); const lendingPoolConfiguratorAddress = await addressesProvider.getLendingPoolConfigurator(); //getLendingPoolConfiguratorProxy();
const lendingPoolCollateralManagerAddress = await addressesProvider.getLendingPoolCollateralManager(); const lendingPoolCollateralManagerAddress =
await addressesProvider.getLendingPoolCollateralManager();
const lendingPoolProxy = await getProxy(lendingPoolAddress); const lendingPoolProxy = await getProxy(lendingPoolAddress);
const lendingPoolConfiguratorProxy = await getProxy(lendingPoolConfiguratorAddress); const lendingPoolConfiguratorProxy = await getProxy(lendingPoolConfiguratorAddress);
@ -132,7 +131,7 @@ task('verify:general', 'Verify contracts at Etherscan')
// WETHGateway // WETHGateway
console.log('\n- Verifying WETHGateway...\n'); console.log('\n- Verifying WETHGateway...\n');
await verifyContract(eContractid.WETHGateway, wethGateway, [ await verifyContract(eContractid.WETHGateway, wethGateway, [
await getWethAddress(poolConfig), await getWrappedNativeTokenAddress(poolConfig),
]); ]);
} }
// Lending Pool proxy // Lending Pool proxy

View File

@ -1,10 +1,5 @@
import { task } from 'hardhat/config'; import { task } from 'hardhat/config';
import { import { loadPoolConfig, ConfigNames, getTreasuryAddress } from '../../helpers/configuration';
loadPoolConfig,
ConfigNames,
getWethAddress,
getTreasuryAddress,
} from '../../helpers/configuration';
import { ZERO_ADDRESS } from '../../helpers/constants'; import { ZERO_ADDRESS } from '../../helpers/constants';
import { import {
getAddressById, getAddressById,

View File

@ -13,7 +13,6 @@ import {
deployLendingPoolConfigurator, deployLendingPoolConfigurator,
deployLendingPool, deployLendingPool,
deployPriceOracle, deployPriceOracle,
deployAaveOracle,
deployLendingPoolCollateralManager, deployLendingPoolCollateralManager,
deployMockFlashLoanReceiver, deployMockFlashLoanReceiver,
deployWalletBalancerProvider, deployWalletBalancerProvider,
@ -31,8 +30,9 @@ import {
deployMockParaSwapAugustusRegistry, deployMockParaSwapAugustusRegistry,
deployParaSwapLiquiditySwapAdapter, deployParaSwapLiquiditySwapAdapter,
authorizeWETHGateway, authorizeWETHGateway,
deployATokenImplementations,
deployAaveOracle,
} from '../../helpers/contracts-deployments'; } from '../../helpers/contracts-deployments';
import { eEthereumNetwork } from '../../helpers/types';
import { Signer } from 'ethers'; import { Signer } from 'ethers';
import { TokenContractId, eContractid, tEthereumAddress, AavePools } from '../../helpers/types'; import { TokenContractId, eContractid, tEthereumAddress, AavePools } from '../../helpers/types';
import { MintableERC20 } from '../../types/MintableERC20'; import { MintableERC20 } from '../../types/MintableERC20';
@ -52,7 +52,7 @@ import {
import { DRE, waitForTx } from '../../helpers/misc-utils'; import { DRE, waitForTx } from '../../helpers/misc-utils';
import { initReservesByHelper, configureReservesByHelper } from '../../helpers/init-helpers'; import { initReservesByHelper, configureReservesByHelper } from '../../helpers/init-helpers';
import AaveConfig from '../../markets/aave'; import AaveConfig from '../../markets/aave';
import { ZERO_ADDRESS } from '../../helpers/constants'; import { oneEther, ZERO_ADDRESS } from '../../helpers/constants';
import { import {
getLendingPool, getLendingPool,
getLendingPoolConfiguratorProxy, getLendingPoolConfiguratorProxy,
@ -63,7 +63,6 @@ import { WETH9Mocked } from '../../types/WETH9Mocked';
const MOCK_USD_PRICE_IN_WEI = AaveConfig.ProtocolGlobalParams.MockUsdPriceInWei; const MOCK_USD_PRICE_IN_WEI = AaveConfig.ProtocolGlobalParams.MockUsdPriceInWei;
const ALL_ASSETS_INITIAL_PRICES = AaveConfig.Mocks.AllAssetsInitialPrices; const ALL_ASSETS_INITIAL_PRICES = AaveConfig.Mocks.AllAssetsInitialPrices;
const USD_ADDRESS = AaveConfig.ProtocolGlobalParams.UsdAddress; const USD_ADDRESS = AaveConfig.ProtocolGlobalParams.UsdAddress;
const MOCK_CHAINLINK_AGGREGATORS_PRICES = AaveConfig.Mocks.AllAssetsInitialPrices;
const LENDING_RATE_ORACLE_RATES_COMMON = AaveConfig.LendingRateOracleRatesCommon; const LENDING_RATE_ORACLE_RATES_COMMON = AaveConfig.LendingRateOracleRatesCommon;
const deployAllMockTokens = async (deployer: Signer) => { const deployAllMockTokens = async (deployer: Signer) => {
@ -99,9 +98,13 @@ const deployAllMockTokens = async (deployer: Signer) => {
const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
console.time('setup'); console.time('setup');
const aaveAdmin = await deployer.getAddress(); const aaveAdmin = await deployer.getAddress();
const config = loadPoolConfig(ConfigNames.Aave);
const mockTokens = await deployAllMockTokens(deployer); const mockTokens: {
console.log('Deployed mocks'); [symbol: string]: MockContract | MintableERC20 | WETH9Mocked;
} = {
...(await deployAllMockTokens(deployer)),
};
const addressesProvider = await deployLendingPoolAddressesProvider(AaveConfig.MarketId); const addressesProvider = await deployLendingPoolAddressesProvider(AaveConfig.MarketId);
await waitForTx(await addressesProvider.setPoolAdmin(aaveAdmin)); await waitForTx(await addressesProvider.setPoolAdmin(aaveAdmin));
@ -194,12 +197,12 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
USD: USD_ADDRESS, USD: USD_ADDRESS,
STAKE: mockTokens.STAKE.address, STAKE: mockTokens.STAKE.address,
xSUSHI: mockTokens.xSUSHI.address, xSUSHI: mockTokens.xSUSHI.address,
WAVAX: mockTokens.WAVAX.address,
}, },
fallbackOracle fallbackOracle
); );
const mockAggregators = await deployAllMockAggregators(MOCK_CHAINLINK_AGGREGATORS_PRICES); const mockAggregators = await deployAllMockAggregators(ALL_ASSETS_INITIAL_PRICES);
console.log('Mock aggs deployed');
const allTokenAddresses = Object.entries(mockTokens).reduce( const allTokenAddresses = Object.entries(mockTokens).reduce(
(accum: { [tokenSymbol: string]: tEthereumAddress }, [tokenSymbol, tokenContract]) => ({ (accum: { [tokenSymbol: string]: tEthereumAddress }, [tokenSymbol, tokenContract]) => ({
...accum, ...accum,
@ -215,9 +218,19 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
{} {}
); );
const [tokens, aggregators] = getPairsTokenAggregator(allTokenAddresses, allAggregatorsAddresses); const [tokens, aggregators] = getPairsTokenAggregator(
allTokenAddresses,
allAggregatorsAddresses,
config.OracleQuoteCurrency
);
await deployAaveOracle([tokens, aggregators, fallbackOracle.address, mockTokens.WETH.address]); await deployAaveOracle([
tokens,
aggregators,
fallbackOracle.address,
mockTokens.WETH.address,
oneEther.toString(),
]);
await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address)); await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address));
const lendingRateOracle = await deployLendingRateOracle(); const lendingRateOracle = await deployLendingRateOracle();
@ -234,23 +247,19 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
aaveAdmin aaveAdmin
); );
const reservesParams = getReservesConfigByPool(AavePools.proto); // Reserve params from AAVE pool + mocked tokens
const reservesParams = {
...config.ReservesConfig,
};
const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address); const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address);
await insertContractAddressInDb(eContractid.AaveProtocolDataProvider, testHelpers.address); await deployATokenImplementations(ConfigNames.Aave, reservesParams, false);
const admin = await deployer.getAddress(); const admin = await deployer.getAddress();
console.log('Initialize configuration'); const { ATokenNamePrefix, StableDebtTokenNamePrefix, VariableDebtTokenNamePrefix, SymbolPrefix } =
config;
const config = loadPoolConfig(ConfigNames.Aave);
const {
ATokenNamePrefix,
StableDebtTokenNamePrefix,
VariableDebtTokenNamePrefix,
SymbolPrefix,
} = config;
const treasuryAddress = await getTreasuryAddress(config); const treasuryAddress = await getTreasuryAddress(config);
await initReservesByHelper( await initReservesByHelper(
@ -263,6 +272,7 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
admin, admin,
treasuryAddress, treasuryAddress,
ZERO_ADDRESS, ZERO_ADDRESS,
ConfigNames.Aave,
false false
); );
@ -306,7 +316,7 @@ before(async () => {
const FORK = process.env.FORK; const FORK = process.env.FORK;
if (FORK) { if (FORK) {
await rawBRE.run('aave:mainnet'); await rawBRE.run('aave:mainnet', { skipRegistry: true });
} else { } else {
console.log('-> Deploying test environment...'); console.log('-> Deploying test environment...');
await buildTestEnv(deployer, secondaryWallet); await buildTestEnv(deployer, secondaryWallet);

View File

@ -13,7 +13,6 @@ import {
deployLendingPoolConfigurator, deployLendingPoolConfigurator,
deployLendingPool, deployLendingPool,
deployPriceOracle, deployPriceOracle,
deployAaveOracle,
deployLendingPoolCollateralManager, deployLendingPoolCollateralManager,
deployMockFlashLoanReceiver, deployMockFlashLoanReceiver,
deployWalletBalancerProvider, deployWalletBalancerProvider,
@ -28,6 +27,8 @@ import {
deployUniswapRepayAdapter, deployUniswapRepayAdapter,
deployFlashLiquidationAdapter, deployFlashLiquidationAdapter,
authorizeWETHGateway, authorizeWETHGateway,
deployATokenImplementations,
deployAaveOracle,
} from '../../helpers/contracts-deployments'; } from '../../helpers/contracts-deployments';
import { Signer } from 'ethers'; import { Signer } from 'ethers';
import { TokenContractId, eContractid, tEthereumAddress, AavePools } from '../../helpers/types'; import { TokenContractId, eContractid, tEthereumAddress, AavePools } from '../../helpers/types';
@ -48,7 +49,7 @@ import {
import { DRE, waitForTx } from '../../helpers/misc-utils'; import { DRE, waitForTx } from '../../helpers/misc-utils';
import { initReservesByHelper, configureReservesByHelper } from '../../helpers/init-helpers'; import { initReservesByHelper, configureReservesByHelper } from '../../helpers/init-helpers';
import AmmConfig from '../../markets/amm'; import AmmConfig from '../../markets/amm';
import { ZERO_ADDRESS } from '../../helpers/constants'; import { oneEther, ZERO_ADDRESS } from '../../helpers/constants';
import { import {
getLendingPool, getLendingPool,
getLendingPoolConfiguratorProxy, getLendingPoolConfiguratorProxy,
@ -95,6 +96,14 @@ const deployAllMockTokens = async (deployer: Signer) => {
const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
console.time('setup'); console.time('setup');
const aaveAdmin = await deployer.getAddress(); const aaveAdmin = await deployer.getAddress();
const config = loadPoolConfig(ConfigNames.Amm);
const {
ATokenNamePrefix,
StableDebtTokenNamePrefix,
VariableDebtTokenNamePrefix,
SymbolPrefix,
ReservesConfig,
} = config;
const mockTokens = await deployAllMockTokens(deployer); const mockTokens = await deployAllMockTokens(deployer);
@ -189,6 +198,7 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
WMATIC: mockTokens.WMATIC.address, WMATIC: mockTokens.WMATIC.address,
USD: USD_ADDRESS, USD: USD_ADDRESS,
STAKE: mockTokens.STAKE.address, STAKE: mockTokens.STAKE.address,
xSUSHI: ZERO_ADDRESS,
}, },
fallbackOracle fallbackOracle
); );
@ -210,9 +220,19 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
{} {}
); );
const [tokens, aggregators] = getPairsTokenAggregator(allTokenAddresses, allAggregatorsAddresses); const [tokens, aggregators] = getPairsTokenAggregator(
allTokenAddresses,
allAggregatorsAddresses,
config.OracleQuoteCurrency
);
await deployAaveOracle([tokens, aggregators, fallbackOracle.address, mockTokens.WETH.address]); await deployAaveOracle([
tokens,
aggregators,
fallbackOracle.address,
mockTokens.WETH.address,
oneEther.toString(),
]);
await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address)); await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address));
const lendingRateOracle = await deployLendingRateOracle(); const lendingRateOracle = await deployLendingRateOracle();
@ -228,8 +248,7 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
lendingRateOracle, lendingRateOracle,
aaveAdmin aaveAdmin
); );
await deployATokenImplementations(ConfigNames.Amm, ReservesConfig);
const reservesParams = getReservesConfigByPool(AavePools.amm);
const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address); const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address);
@ -238,18 +257,10 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
console.log('Initialize configuration'); console.log('Initialize configuration');
const config = loadPoolConfig(ConfigNames.Amm);
const {
ATokenNamePrefix,
StableDebtTokenNamePrefix,
VariableDebtTokenNamePrefix,
SymbolPrefix,
} = config;
const treasuryAddress = await getTreasuryAddress(config); const treasuryAddress = await getTreasuryAddress(config);
await initReservesByHelper( await initReservesByHelper(
reservesParams, ReservesConfig,
allReservesAddresses, allReservesAddresses,
ATokenNamePrefix, ATokenNamePrefix,
StableDebtTokenNamePrefix, StableDebtTokenNamePrefix,
@ -258,9 +269,10 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => {
admin, admin,
treasuryAddress, treasuryAddress,
ZERO_ADDRESS, ZERO_ADDRESS,
ConfigNames.Amm,
false false
); );
await configureReservesByHelper(reservesParams, allReservesAddresses, testHelpers, admin); await configureReservesByHelper(ReservesConfig, allReservesAddresses, testHelpers, admin);
const collateralManager = await deployLendingPoolCollateralManager(); const collateralManager = await deployLendingPoolCollateralManager();
await waitForTx( await waitForTx(
@ -294,7 +306,7 @@ before(async () => {
const FORK = process.env.FORK; const FORK = process.env.FORK;
if (FORK) { if (FORK) {
await rawBRE.run('amm:mainnet'); await rawBRE.run('amm:mainnet', { skipRegistry: true });
} else { } else {
console.log('-> Deploying test environment...'); console.log('-> Deploying test environment...');
await buildTestEnv(deployer, secondaryWallet); await buildTestEnv(deployer, secondaryWallet);