feat: Add optimistic kovan market

This commit is contained in:
miguelmtzinf 2021-07-29 18:25:01 +02:00
parent 36c8f08782
commit d6a0f34ba2
9 changed files with 616 additions and 6 deletions

View File

@ -10,6 +10,7 @@ import { getEthersSignersAddresses, getParamPerPool } from './contracts-helpers'
import AaveConfig from '../markets/aave';
import MaticConfig from '../markets/matic';
import AmmConfig from '../markets/amm';
import OptimismConfig from '../markets/ovm';
import { CommonsConfig } from '../markets/aave/commons';
import { DRE, filterMapBy } from './misc-utils';
@ -22,6 +23,7 @@ export enum ConfigNames {
Aave = 'Aave',
Matic = 'Matic',
Amm = 'Amm',
Optimism = 'Optimism'
}
export const loadPoolConfig = (configName: ConfigNames): PoolConfiguration => {
@ -32,6 +34,8 @@ export const loadPoolConfig = (configName: ConfigNames): PoolConfiguration => {
return MaticConfig;
case ConfigNames.Amm:
return AmmConfig;
case ConfigNames.Optimism:
return OptimismConfig;
case ConfigNames.Commons:
return CommonsConfig;
default:
@ -59,6 +63,9 @@ export const getReservesConfigByPool = (pool: AavePools): iMultiPoolsAssets<IRes
[AavePools.matic]: {
...MaticConfig.ReservesConfig,
},
[AavePools.optimism]: {
...OptimismConfig.ReservesConfig,
},
},
pool
);
@ -131,6 +138,7 @@ export const getLendingRateOracles = (poolConfig: IBaseConfiguration) => {
} = poolConfig;
const network = process.env.FORK ? process.env.FORK : DRE.network.name;
console.log(ReserveAssets[network])
return filterMapBy(LendingRateOracleRatesCommon, (key) =>
Object.keys(ReserveAssets[network]).includes(key)
);

View File

@ -48,6 +48,9 @@ import {
WETH9MockedFactory,
WETHGatewayFactory,
FlashLiquidationAdapterFactory,
LendingPoolBaseLogic,
ConfiguratorLogic,
ConfiguratorLogicFactory,
} from '../types';
import {
withSaveAndVerify,
@ -103,7 +106,14 @@ export const deployLendingPoolAddressesProviderRegistry = async (verify?: boolea
);
export const deployLendingPoolConfigurator = async (verify?: boolean) => {
const configuratorLogic = await withSaveAndVerify(
await new ConfiguratorLogicFactory(await getFirstSigner()).deploy(),
eContractid.ConfiguratorLogic,
[],
verify
);
const lendingPoolConfiguratorImpl = await new LendingPoolConfiguratorFactory(
{['__$3ddc574512022f331a6a4c7e4bbb5c67b6$__']: configuratorLogic.address},
await getFirstSigner()
).deploy();
await insertContractAddressInDb(
@ -168,12 +178,70 @@ export const deployValidationLogic = async (
return withSaveAndVerify(validationLogic, eContractid.ValidationLogic, [], verify);
};
export const deployLendingPoolBaseLogic = async (
reserveLogic: Contract,
validationLogic: Contract,
verify?: boolean
) => {
const lendingPoolBaseLogicArtifact = await readArtifact(eContractid.LendingPoolBaseLogic);
const linkedLendingPoolLogicByteCode = linkBytecode(lendingPoolBaseLogicArtifact, {
[eContractid.ReserveLogic]: reserveLogic.address,
[eContractid.ValidationLogic]: validationLogic.address,
});
const lendingPoolBaseLogicFactory = await DRE.ethers.getContractFactory(
lendingPoolBaseLogicArtifact.abi,
linkedLendingPoolLogicByteCode
);
const lendingPoolBaseLogic = await (
await lendingPoolBaseLogicFactory.connect(await getFirstSigner()).deploy()
).deployed();
return withSaveAndVerify(lendingPoolBaseLogic, eContractid.LendingPoolBaseLogic, [], verify);
};
export const deployLendingPoolOtherLogic = async (
reserveLogic: Contract,
validationLogic: Contract,
verify?: boolean
) => {
const lendingPoolOtherLogicArtifact = await readArtifact(eContractid.LendingPoolOtherLogic);
const linkedLendingPoolLogicByteCode = linkBytecode(lendingPoolOtherLogicArtifact, {
[eContractid.ReserveLogic]: reserveLogic.address,
[eContractid.ValidationLogic]: validationLogic.address,
});
const lendingPoolOtherLogicFactory = await DRE.ethers.getContractFactory(
lendingPoolOtherLogicArtifact.abi,
linkedLendingPoolLogicByteCode
);
const lendingPoolOtherLogic = await (
await lendingPoolOtherLogicFactory.connect(await getFirstSigner()).deploy()
).deployed();
return withSaveAndVerify(lendingPoolOtherLogic, eContractid.LendingPoolOtherLogic, [], verify);
};
export const deployAaveLibraries = async (
verify?: boolean
): Promise<LendingPoolLibraryAddresses> => {
const reserveLogic = await deployReserveLogicLibrary(verify);
const genericLogic = await deployGenericLogic(reserveLogic, verify);
const validationLogic = await deployValidationLogic(reserveLogic, genericLogic, verify);
const lendingPoolBaseLogic = await deployLendingPoolBaseLogic(
reserveLogic,
validationLogic,
verify
);
const lendingPoolOtherLogic = await deployLendingPoolOtherLogic(
reserveLogic,
validationLogic,
verify
);
// Hardcoded solidity placeholders, if any library changes path this will fail.
// The '__$PLACEHOLDER$__ can be calculated via solidity keccak, but the LendingPoolLibraryAddresses Type seems to
@ -189,8 +257,10 @@ export const deployAaveLibraries = async (
return {
['__$de8c0cf1a7d7c36c802af9a64fb9d86036$__']: validationLogic.address,
['__$22cd43a9dda9ce44e9b92ba393b88fb9ac$__']: reserveLogic.address,
["__$52a8a86ab43135662ff256bbc95497e8e3$__"]: genericLogic.address,
}
['__$52a8a86ab43135662ff256bbc95497e8e3$__']: genericLogic.address,
['__$3eebaf3cae995fc60fc10192f4df8139e2$__']: lendingPoolOtherLogic.address,
['__$a51786c2269c2ea419cdc7fd27f45f7870$__']: lendingPoolBaseLogic.address,
};
};
export const deployLendingPool = async (verify?: boolean) => {

View File

@ -17,6 +17,8 @@ import {
iEthereumParamsPerNetwork,
iPolygonParamsPerNetwork,
iXDaiParamsPerNetwork,
eOptimismNetwork,
iOptimismParamsPerNetwork,
} from './types';
import { MintableERC20 } from '../types/MintableERC20';
import { Artifact } from 'hardhat/types';
@ -147,6 +149,7 @@ export const getParamPerNetwork = <T>(param: iParamsPerNetwork<T>, network: eNet
param as iEthereumParamsPerNetwork<T>;
const { matic, mumbai } = param as iPolygonParamsPerNetwork<T>;
const { xdai } = param as iXDaiParamsPerNetwork<T>;
const { optimism, optimismKovan } = param as iOptimismParamsPerNetwork<T>;
if (process.env.FORK) {
return param[process.env.FORK as eNetwork] as T;
}
@ -172,6 +175,10 @@ export const getParamPerNetwork = <T>(param: iParamsPerNetwork<T>, network: eNet
return mumbai;
case eXDaiNetwork.xdai:
return xdai;
case eOptimismNetwork.optimismKovan:
return optimismKovan;
case eOptimismNetwork.optimism:
return optimism;
}
};
@ -185,7 +192,10 @@ export const getOptionalParamAddressPerNetwork = (
return getParamPerNetwork(param, network);
};
export const getParamPerPool = <T>({ proto, amm, matic }: iParamsPerPool<T>, pool: AavePools) => {
export const getParamPerPool = <T>(
{ proto, amm, matic, optimism }: iParamsPerPool<T>,
pool: AavePools
) => {
switch (pool) {
case AavePools.proto:
return proto;
@ -193,6 +203,8 @@ export const getParamPerPool = <T>({ proto, amm, matic }: iParamsPerPool<T>, poo
return amm;
case AavePools.matic:
return matic;
case AavePools.optimism:
return optimism;
default:
return proto;
}

View File

@ -4,7 +4,7 @@ export interface SymbolMap<T> {
[symbol: string]: T;
}
export type eNetwork = eEthereumNetwork | ePolygonNetwork | eXDaiNetwork;
export type eNetwork = eEthereumNetwork | ePolygonNetwork | eXDaiNetwork | eOptimismNetwork;
export enum eEthereumNetwork {
buidlerevm = 'buidlerevm',
@ -25,6 +25,11 @@ export enum eXDaiNetwork {
xdai = 'xdai',
}
export enum eOptimismNetwork {
optimismKovan = 'optimismKovan',
optimism = 'optimism'
}
export enum EthereumNetworkNames {
kovan = 'kovan',
ropsten = 'ropsten',
@ -32,12 +37,15 @@ export enum EthereumNetworkNames {
matic = 'matic',
mumbai = 'mumbai',
xdai = 'xdai',
optimism = 'optimism',
optimismKovan = 'optimismKovan'
}
export enum AavePools {
proto = 'proto',
matic = 'matic',
amm = 'amm',
optimism = 'optimism'
}
export enum eContractid {
@ -87,6 +95,9 @@ export enum eContractid {
UniswapLiquiditySwapAdapter = 'UniswapLiquiditySwapAdapter',
UniswapRepayAdapter = 'UniswapRepayAdapter',
FlashLiquidationAdapter = 'FlashLiquidationAdapter',
LendingPoolBaseLogic = 'LendingPoolBaseLogic',
LendingPoolOtherLogic = 'LendingPoolOtherLogic',
ConfiguratorLogic = 'ConfiguratorLogic'
}
/*
@ -319,6 +330,11 @@ export type iXDAIPoolAssets<T> = Pick<
'DAI' | 'USDC' | 'USDT' | 'WBTC' | 'WETH' | 'STAKE'
>;
export type iOptimismPoolAssets<T> = Pick<
iAssetsWithoutUSD<T>,
'DAI' | 'USDC' | 'USDT' | 'WBTC' | 'WETH' | 'LINK' | 'AAVE'
>;
export type iMultiPoolsAssets<T> = iAssetCommon<T> | iAavePoolAssets<T>;
export type iAavePoolTokens<T> = Omit<iAavePoolAssets<T>, 'ETH'>;
@ -410,12 +426,15 @@ export interface IMarketRates {
export type iParamsPerNetwork<T> =
| iEthereumParamsPerNetwork<T>
| iPolygonParamsPerNetwork<T>
| iXDaiParamsPerNetwork<T>;
| iXDaiParamsPerNetwork<T>
| iOptimismParamsPerNetwork<T>;
export interface iParamsPerNetworkAll<T>
extends iEthereumParamsPerNetwork<T>,
iPolygonParamsPerNetwork<T>,
iXDaiParamsPerNetwork<T> {}
iXDaiParamsPerNetwork<T>,
iOptimismParamsPerNetwork<T> {}
export interface iEthereumParamsPerNetwork<T> {
[eEthereumNetwork.coverage]: T;
@ -436,10 +455,16 @@ export interface iXDaiParamsPerNetwork<T> {
[eXDaiNetwork.xdai]: T;
}
export interface iOptimismParamsPerNetwork<T> {
[eOptimismNetwork.optimismKovan]: T;
[eOptimismNetwork.optimism]: T;
}
export interface iParamsPerPool<T> {
[AavePools.proto]: T;
[AavePools.matic]: T;
[AavePools.amm]: T;
[AavePools.optimism]: T;
}
export interface iBasicDistributionParams {
@ -535,6 +560,10 @@ export interface IXDAIConfiguration extends ICommonConfiguration {
ReservesConfig: iXDAIPoolAssets<IReserveParams>;
}
export interface IOptimismConfiguration extends ICommonConfiguration {
ReservesConfig: iOptimismPoolAssets<IReserveParams>;
}
export interface ITokenAddress {
[token: string]: tEthereumAddress;
}

View File

@ -0,0 +1,166 @@
import {
oneRay,
ZERO_ADDRESS,
MOCK_CHAINLINK_AGGREGATORS_PRICES,
oneUsd,
} from '../../helpers/constants';
import { ICommonConfiguration, eOptimismNetwork } from '../../helpers/types';
// ----------------
// PROTOCOL GLOBAL PARAMS
// ----------------
export const CommonsConfig: ICommonConfiguration = {
MarketId: 'Commons',
ATokenNamePrefix: 'Aave Optimism Market',
StableDebtTokenNamePrefix: 'Aave Optimism Market stable debt',
VariableDebtTokenNamePrefix: 'Aave Optimism Market variable debt',
SymbolPrefix: '', // TODO: add a symbol?
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(),
},
LINK: {
borrowRate: oneRay.multipliedBy(0.03).toFixed(),
},
},
// ----------------
// COMMON PROTOCOL ADDRESSES ACROSS POOLS
// ----------------
// If PoolAdmin/emergencyAdmin is set, will take priority over PoolAdminIndex/emergencyAdminIndex
PoolAdmin: {
[eOptimismNetwork.optimismKovan]: undefined,
[eOptimismNetwork.optimism]: undefined,
},
PoolAdminIndex: 0,
EmergencyAdminIndex: 0,
EmergencyAdmin: {
[eOptimismNetwork.optimism]: undefined,
[eOptimismNetwork.optimismKovan]: undefined,
},
ProviderRegistry: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '0x18AF64027c1E17e99e5709E42174151F9f62C622',
},
ProviderRegistryOwner: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '0xA68E2f643e0fa7062A78DFB6C629577aE21ad829',
},
LendingRateOracle: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '0xf4fE2aBdcC90c80188E16A0aBc065da7e90cC0C9',
},
LendingPoolCollateralManager: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '0xb4beffF48e24785F787c13EeF7366467477f8202',
},
LendingPoolConfigurator: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '',
},
LendingPool: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '',
},
WethGateway: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '0x9B0C9d5a030915F01aB4962D52D54c03cf37D2ce',
},
TokenDistributor: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '',
},
AaveOracle: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '0xB6a4826e2e37118440B446C8Ff42D9b617b0844C',
},
FallbackOracle: {
[eOptimismNetwork.optimism]: ZERO_ADDRESS,
[eOptimismNetwork.optimismKovan]: ZERO_ADDRESS, // TODO: Deploy?
},
ChainlinkAggregator: {
[eOptimismNetwork.optimism]: {
WETH: '',
DAI: '',
USDC: '',
USDT: '',
AAVE: '',
WBTC: '',
LINK: '',
USD: '',
},
[eOptimismNetwork.optimismKovan]: {
WETH: '0xB438eADc39Ff9B3EaCA2e8ada6E9D74338f0B02D', // MOCK
DAI: '0xa269EC2e011d07045Eaef98db5fA6F4399c01768', // MOCK
USDC: '0x9E4702B6079BD54A5889E0104515fa87f4BB55AF', // MOCK
// USDT: '',
// AAVE: '',
WBTC: '0x662807E8d69168c89743DAB7b3e3aE18b37cAD8a', // RANDOM
// LINK: '',
USD: '0xB438eADc39Ff9B3EaCA2e8ada6E9D74338f0B02D', // MOCK
},
},
ReserveAssets: {
[eOptimismNetwork.optimism]: {},
[eOptimismNetwork.optimismKovan]: {},
},
ReservesConfig: {},
ATokenDomainSeparator: {
[eOptimismNetwork.optimism]: '',
[eOptimismNetwork.optimismKovan]: '',
},
WETH: {
[eOptimismNetwork.optimism]: '0x4200000000000000000000000000000000000006', // TODO: WETH
[eOptimismNetwork.optimismKovan]: '0x4200000000000000000000000000000000000006', // TODO: WETH
},
WrappedNativeToken: {
[eOptimismNetwork.optimism]: '0x4200000000000000000000000000000000000006', // WETH
[eOptimismNetwork.optimismKovan]: '0x4200000000000000000000000000000000000006', // WETH
},
ReserveFactorTreasuryAddress: {
[eOptimismNetwork.optimism]: '0x652e2Ac6b072Ba8bF7BEF2B11B092447dBc40bde', // TODO: Deploy Treasury
[eOptimismNetwork.optimismKovan]: '0x652e2Ac6b072Ba8bF7BEF2B11B092447dBc40bde',
},
IncentivesController: {
[eOptimismNetwork.optimism]: ZERO_ADDRESS,
[eOptimismNetwork.optimismKovan]: ZERO_ADDRESS,
},
};

View File

@ -1 +1,53 @@
import { eOptimismNetwork, IOptimismConfiguration } from '../../helpers/types';
import { CommonsConfig } from './commons';
import {
strategyWETH,
strategyDAI,
strategyUSDC,
strategyUSDT,
strategyAAVE,
strategyWBTC,
strategyLINK,
} from './reservesConfigs';
// ----------------
// POOL--SPECIFIC PARAMS
// ----------------
export const OptimismConfig: IOptimismConfiguration = {
...CommonsConfig,
MarketId: 'Avalanche market',
ProviderId: 5, // TODO: What is this?
ReservesConfig: {
WETH: strategyWETH,
DAI: strategyDAI,
USDC: strategyUSDC,
USDT: strategyUSDT,
AAVE: strategyAAVE,
WBTC: strategyWBTC,
LINK: strategyLINK,
},
ReserveAssets: {
[eOptimismNetwork.optimism]: { // TODO: Check this
WETH: '0x4200000000000000000000000000000000000006',
// DAI: '',
// USDC: '', // TODO:
// USDT: '',
// AAVE: '', // TODO:
// WBTC: '',
// LINK: ''
},
[eOptimismNetwork.optimismKovan]: { // TODO: Deploy Mock tokens
WETH: '0x4200000000000000000000000000000000000006',
DAI: '0x47ee20342BC51ED759F0971cc96C31177ebc81Ae',
USDC: '0x4de9ee3d1F33676e505CA3747993929c29802293',
// USDT: '0x871091955225468eA25862A9C40147c698c20164',
// AAVE: '0xe84b739b6B5d057301cB49c30C7783158Ba2Ded0',
WBTC: '0x0706661fe3FB1f9b3D10DdFb3A30fBB709BC7D59',
// LINK: '0x5a5Fcf7Aa05Beb73A78D5d19b9f7eB8009454B73'
},
},
};
export default OptimismConfig;

View File

@ -0,0 +1,102 @@
import BigNumber from 'bignumber.js';
import { oneRay } from '../../helpers/constants';
import { IInterestRateStrategyParams } from '../../helpers/types';
// BUSD SUSD
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(1).multipliedBy(oneRay).toFixed(),
stableRateSlope1: '0',
stableRateSlope2: '0',
};
// DAI TUSD
export const rateStrategyStableTwo: IInterestRateStrategyParams = {
name: "rateStrategyStableTwo",
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(),
}
// USDC USDT
export const rateStrategyStableThree: IInterestRateStrategyParams = {
name: "rateStrategyStableThree",
optimalUtilizationRate: new BigNumber(0.9).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(),
variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(),
variableRateSlope2: new BigNumber(0.60).multipliedBy(oneRay).toFixed(),
stableRateSlope1: new BigNumber(0.02).multipliedBy(oneRay).toFixed(),
stableRateSlope2: new BigNumber(0.60).multipliedBy(oneRay).toFixed(),
}
// WETH
export const rateStrategyWETH: IInterestRateStrategyParams = {
name: "rateStrategyWETH",
optimalUtilizationRate: new BigNumber(0.65).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(),
variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(),
variableRateSlope2: new BigNumber(1).multipliedBy(oneRay).toFixed(),
stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(),
stableRateSlope2: new BigNumber(1).multipliedBy(oneRay).toFixed(),
}
// AAVE
export const rateStrategyAAVE: IInterestRateStrategyParams = {
name: "rateStrategyAAVE",
optimalUtilizationRate: new BigNumber(0.45).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: '0',
variableRateSlope1: '0',
variableRateSlope2: '0',
stableRateSlope1: '0',
stableRateSlope2: '0',
}
// BAT ENJ LINK MANA MKR REN YFI ZRX
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: new BigNumber(0.1).multipliedBy(oneRay).toFixed(),
stableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(),
}
// KNC WBTC
export const rateStrategyVolatileTwo: IInterestRateStrategyParams = {
name: "rateStrategyVolatileTwo",
optimalUtilizationRate: new BigNumber(0.65).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(),
variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(),
variableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(),
stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(),
stableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(),
}
// SNX
export const rateStrategyVolatileThree: IInterestRateStrategyParams = {
name: "rateStrategyVolatileThree",
optimalUtilizationRate: new BigNumber(0.65).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(),
variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(),
variableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(),
stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(),
stableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(),
}
export const rateStrategyVolatileFour: IInterestRateStrategyParams = {
name: "rateStrategyVolatileFour",
optimalUtilizationRate: new BigNumber(0.45).multipliedBy(oneRay).toFixed(),
baseVariableBorrowRate: '0',
variableRateSlope1: new BigNumber(0.07).multipliedBy(oneRay).toFixed(),
variableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(),
stableRateSlope1: '0',
stableRateSlope2: '0',
}

View File

@ -0,0 +1,111 @@
import { eContractid, IReserveParams } from '../../helpers/types';
import {
rateStrategyStableOne,
rateStrategyStableTwo,
rateStrategyStableThree,
rateStrategyWETH,
rateStrategyAAVE,
rateStrategyVolatileOne,
rateStrategyVolatileTwo,
rateStrategyVolatileThree,
rateStrategyVolatileFour,
} from './rateStrategies';
export const strategyDAI: IReserveParams = {
strategy: rateStrategyStableTwo,
baseLTVAsCollateral: '7500',
liquidationThreshold: '8000',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: true,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
borrowCap: '0',
supplyCap: '0',
};
export const strategyUSDC: IReserveParams = {
strategy: rateStrategyStableThree,
baseLTVAsCollateral: '8000',
liquidationThreshold: '8500',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: true,
reserveDecimals: '6',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
borrowCap: '0',
supplyCap: '0',
};
export const strategyUSDT: IReserveParams = {
strategy: rateStrategyStableThree,
baseLTVAsCollateral: '8000',
liquidationThreshold: '8500',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: true,
reserveDecimals: '6',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
borrowCap: '0',
supplyCap: '0',
};
export const strategyAAVE: IReserveParams = {
strategy: rateStrategyAAVE,
baseLTVAsCollateral: '5000',
liquidationThreshold: '6500',
liquidationBonus: '11000',
borrowingEnabled: false,
stableBorrowRateEnabled: false,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '0',
borrowCap: '0',
supplyCap: '0',
};
export const strategyWETH: IReserveParams = {
strategy: rateStrategyWETH,
baseLTVAsCollateral: '8000',
liquidationThreshold: '8250',
liquidationBonus: '10500',
borrowingEnabled: true,
stableBorrowRateEnabled: true,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '1000',
borrowCap: '0',
supplyCap: '0',
};
export const strategyLINK: IReserveParams = {
strategy: rateStrategyVolatileOne,
baseLTVAsCollateral: '7000',
liquidationThreshold: '7500',
liquidationBonus: '11000',
borrowingEnabled: true,
stableBorrowRateEnabled: true,
reserveDecimals: '18',
aTokenImpl: eContractid.AToken,
reserveFactor: '2000',
borrowCap: '0',
supplyCap: '0',
};
export const strategyWBTC: IReserveParams = {
strategy: rateStrategyVolatileTwo,
baseLTVAsCollateral: '7000',
liquidationThreshold: '7500',
liquidationBonus: '11000',
borrowingEnabled: true,
stableBorrowRateEnabled: true,
reserveDecimals: '8',
aTokenImpl: eContractid.AToken,
reserveFactor: '2000',
borrowCap: '0',
supplyCap: '0',
};

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('optimism:mainnet', 'Deploy market at Optimism')
.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();
});