Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: metis #120

Merged
merged 13 commits into from
Apr 26, 2023
30 changes: 30 additions & 0 deletions scripts/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export enum ChainId {
harmony = 1666600000,
sepolia = 11155111,
scroll_alpha = 534353,
metis = 1088,
}

const RPC_PROVIDERS = {
Expand All @@ -37,6 +38,7 @@ const RPC_PROVIDERS = {
[ChainId.fantom_testnet]: 'https://rpc.ankr.com/fantom_testnet',
[ChainId.sepolia]: 'https://rpc.sepolia.org/',
[ChainId.scroll_alpha]: 'https://alpha-rpc.scroll.io/l2',
[ChainId.metis]: 'https://andromeda.metis.io/?owner=1088',
} as const;

export interface Pool {
Expand All @@ -62,6 +64,13 @@ export interface Pool {
DELEGATION_AWARE_A_TOKEN_IMPL_REV_1?: string;
STATIC_A_TOKEN_FACTORY?: string;
};
// will be used for pending pools where the impls can't be fetched yet
initial?: {
COLLECTOR?: string;
DEFAULT_A_TOKEN_IMPL?: string;
DEFAULT_VARIABLE_DEBT_TOKEN_IMPL?: string;
DEFAULT_STABLE_DEBT_TOKEN_IMPL?: string;
};
}

export interface Token {
Expand Down Expand Up @@ -450,6 +459,27 @@ export const pools: Pool[] = [
L2_ENCODER: '0x997a8208902e1259dDf676Eb37FeD31A2f77110B',
},
},
{
name: 'AaveV3Metis',
chainId: ChainId.metis,
addressProvider: '0xB9FABd7500B2C6781c35Dd48d54f81fc2299D7AF',
version: 3,
additionalAddresses: {
POOL_ADDRESSES_PROVIDER_REGISTRY: '0x9E7B73ffD9D2026F3ff4212c29E209E09C8A91F5',
WALLET_BALANCE_PROVIDER: '0x1df710eb1E2FD9C21494aF2BFb1F210a4185885b',
UI_POOL_DATA_PROVIDER: '0x7dd60bd8507fDC3d300d53427b7AE566701a7320',
UI_INCENTIVE_DATA_PROVIDER: '0x3e7BC5EcE0f22DbB16c3e3EeA288a10A57d68927',
L2_ENCODER: '0x9f3A1B399A9074eBA63Dc4fc274bE2A2b2d80cB9',
RATES_FACTORY: '0x87Aaba7cf8e1F319d0E3402d68017171201dEcd5',
LISTING_ENGINE: '0x857720ad258db0ACb180e76A5526c72CFCe6F8A7',
},
initial: {
COLLECTOR: '0xB5b64c7E00374e766272f8B442Cd261412D4b118',
DEFAULT_A_TOKEN_IMPL: '0x246405C70461f93513C74606815615c24c5C8C79',
DEFAULT_VARIABLE_DEBT_TOKEN_IMPL: '0xE7fA271BD76FC9c6F2F968976E9f4f553256E02f',
DEFAULT_STABLE_DEBT_TOKEN_IMPL: '0x52aC2476Fc6F788B4c5A9B12Cfcb7fDB163955f4',
},
},
].map((m) => ({
...m,
provider: new ethers.providers.StaticJsonRpcProvider(
Expand Down
167 changes: 103 additions & 64 deletions scripts/generator_v3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import variableDebtTokenV3ABI from './abi/variableDebtToken_v3_abi.json';
import rewardsControllerABI from './abi/rewardsController_v3_abi.json';
import uipooldataProviderABI from './abi/uipooldata_provider.json';
import {
ZERO_ADDRESS,
addressOrZero,
bytes32toAddress,
generateAdditionalAddresses,
generateAdditionalAddressesSol,
Expand All @@ -21,6 +23,7 @@ export interface PoolV3WithAddresses extends Pool {
poolDataProvider: string;
poolConfigurator: string;
oracle: string;
oracleSentinel: string;
aclAdmin: string;
aclManager: string;
collector: string;
Expand All @@ -44,10 +47,27 @@ export async function fetchPoolV3Addresses(pool: Pool): Promise<PoolV3WithAddres
const poolAddress = await contract.getPool();
const poolConfigurator = await contract.getPoolConfigurator();
const oracle = await contract.getPriceOracle();
const oracleSentinel = await contract.getPriceOracleSentinel();
const aclAdmin = await contract.getACLAdmin();
const aclManager = await contract.getACLManager();
const poolDataProvider = await contract.getPoolDataProvider();

const defaultIncentivesController = await contract.getAddress(
'0x703c2c8634bed68d98c029c18f310e7f7ec0e5d6342c590190b3cb8b3ba54532'
);

let emissionManager = ZERO_ADDRESS;
try {
const incentivesControllerContract = await new ethers.Contract(
defaultIncentivesController,
rewardsControllerABI,
pool.provider
);
emissionManager = await incentivesControllerContract.getEmissionManager();
} catch (e) {
console.log(`old version of incentives controller deployed on ${pool.name}`);
}

await sleep(1000);
let reservesData: PoolV3WithAddresses['reservesData'] = [];
// workaround, fix before merge
Expand All @@ -73,80 +93,95 @@ export async function fetchPoolV3Addresses(pool: Pool): Promise<PoolV3WithAddres
}
);
}
/**
* While the reserve treasury address is per token in most cases it will be the same address, so for the sake of the address-book we assume it always is.
*/
const aTokenContract = new ethers.Contract(
reservesData[0].aTokenAddress,
aTokenV3ABI,
pool.provider
);

const collector = await aTokenContract.RESERVE_TREASURY_ADDRESS();

const defaultIncentivesController = await aTokenContract.getIncentivesController();
if (reservesData.length > 0) {
/**
* While the reserve treasury address is per token in most cases it will be the same address, so for the sake of the address-book we assume it always is.
*/
const aTokenContract = new ethers.Contract(
reservesData[0].aTokenAddress,
aTokenV3ABI,
pool.provider
);

const defaultATokenImplementation = bytes32toAddress(
await getImplementationStorageSlot(pool.provider, reservesData[0].aTokenAddress)
);
const collector = await aTokenContract.RESERVE_TREASURY_ADDRESS();

const aTokenRevision = await aTokenContract.ATOKEN_REVISION();
const defaultATokenImplementation = bytes32toAddress(
await getImplementationStorageSlot(pool.provider, reservesData[0].aTokenAddress)
);

await sleep(1000);
const aTokenRevision = await aTokenContract.ATOKEN_REVISION();

const defaultVariableDebtTokenImplementation = bytes32toAddress(
await getImplementationStorageSlot(pool.provider, reservesData[0].variableDebtTokenAddress)
);
await sleep(1000);

const variableDebtTokenRevision = await new ethers.Contract(
reservesData[0].variableDebtTokenAddress,
variableDebtTokenV3ABI,
pool.provider
).DEBT_TOKEN_REVISION();
const defaultVariableDebtTokenImplementation = bytes32toAddress(
await getImplementationStorageSlot(pool.provider, reservesData[0].variableDebtTokenAddress)
);

const defaultStableDebtTokenImplementation = bytes32toAddress(
await getImplementationStorageSlot(pool.provider, reservesData[0].stableDebtTokenAddress)
);
const variableDebtTokenRevision = await new ethers.Contract(
reservesData[0].variableDebtTokenAddress,
variableDebtTokenV3ABI,
pool.provider
).DEBT_TOKEN_REVISION();

const stableDebtTokenRevision = await new ethers.Contract(
reservesData[0].stableDebtTokenAddress,
stableDebtTokenV3ABI,
pool.provider
).DEBT_TOKEN_REVISION();
const defaultStableDebtTokenImplementation = bytes32toAddress(
await getImplementationStorageSlot(pool.provider, reservesData[0].stableDebtTokenAddress)
);

let emissionManager = '0x0000000000000000000000000000000000000000';
try {
const incentivesControllerContract = await new ethers.Contract(
defaultIncentivesController,
rewardsControllerABI,
const stableDebtTokenRevision = await new ethers.Contract(
reservesData[0].stableDebtTokenAddress,
stableDebtTokenV3ABI,
pool.provider
);
emissionManager = await incentivesControllerContract.getEmissionManager();
} catch (e) {
console.log(`old version of incentives controller deployed on ${pool.name}`);
).DEBT_TOKEN_REVISION();

console.timeEnd(pool.name);

return {
pool: poolAddress,
poolConfigurator,
oracle,
oracleSentinel,
aclAdmin,
aclManager,
poolDataProvider,
collector,
defaultATokenImplementation,
aTokenRevision,
defaultVariableDebtTokenImplementation,
variableDebtTokenRevision,
defaultStableDebtTokenImplementation,
stableDebtTokenRevision,
emissionManager,
defaultIncentivesController,
reservesData,
...pool,
};
} else {
console.timeEnd(pool.name);
return {
pool: poolAddress,
poolConfigurator,
oracle,
oracleSentinel,
aclAdmin,
aclManager,
poolDataProvider,
collector: addressOrZero(pool.initial?.COLLECTOR),
defaultATokenImplementation: addressOrZero(pool.initial?.DEFAULT_A_TOKEN_IMPL),
aTokenRevision: '1',
defaultVariableDebtTokenImplementation: addressOrZero(
pool.initial?.DEFAULT_VARIABLE_DEBT_TOKEN_IMPL
),
variableDebtTokenRevision: '1',
defaultStableDebtTokenImplementation: addressOrZero(
pool.initial?.DEFAULT_STABLE_DEBT_TOKEN_IMPL
),
stableDebtTokenRevision: '1',
emissionManager,
defaultIncentivesController,
reservesData,
...pool,
};
}

console.timeEnd(pool.name);

return {
pool: poolAddress,
poolConfigurator,
oracle,
aclAdmin,
aclManager,
poolDataProvider,
collector,
defaultATokenImplementation,
aTokenRevision,
defaultVariableDebtTokenImplementation,
variableDebtTokenRevision,
defaultStableDebtTokenImplementation,
stableDebtTokenRevision,
emissionManager,
defaultIncentivesController,
reservesData,
...pool,
};
} catch (error: any) {
throw new Error(JSON.stringify({message: error.message, pool, stack: error.stack}));
}
Expand All @@ -158,6 +193,7 @@ export function writeV3Templates({
pool,
poolConfigurator,
oracle,
oracleSentinel,
poolDataProvider,
aclAdmin,
aclManager,
Expand Down Expand Up @@ -196,6 +232,8 @@ export function writeV3Templates({
IAaveOracle internal constant ORACLE =
IAaveOracle(${oracle});

address internal constant PRICE_ORACLE_SENTINEL = ${oracleSentinel};

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER = IPoolDataProvider(${poolDataProvider});

IACLManager internal constant ACL_MANAGER = IACLManager(${aclManager});
Expand Down Expand Up @@ -228,6 +266,7 @@ export const POOL_ADDRESSES_PROVIDER = "${addressProvider}";
export const POOL = "${pool}";
export const POOL_CONFIGURATOR = "${poolConfigurator}";
export const ORACLE = "${oracle}";
export const PRICE_ORACLE_SENTINEL = "${oracleSentinel}";
export const AAVE_PROTOCOL_DATA_PROVIDER = "${poolDataProvider}";
export const ACL_MANAGER = "${aclManager}";
export const ACL_ADMIN = "${aclAdmin}";
Expand Down
7 changes: 7 additions & 0 deletions scripts/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,10 @@ export const generateAdditionalAddressesSol = (
export async function sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}

export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';

export function addressOrZero(address?: string) {
if (address) return address;
return ZERO_ADDRESS;
}
1 change: 1 addition & 0 deletions src/AaveAddressBook.sol
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {AaveV3Harmony} from './AaveV3Harmony.sol';
import {AaveV3Optimism} from './AaveV3Optimism.sol';
import {AaveV3OptimismGoerli} from './AaveV3OptimismGoerli.sol';
import {AaveV3ScrollAlpha} from './AaveV3ScrollAlpha.sol';
import {AaveV3Metis} from './AaveV3Metis.sol';

import {AaveGovernanceV2, IGovernanceStrategy} from './AaveGovernanceV2.sol';
import {IAaveEcosystemReserveController, AaveMisc} from './AaveMisc.sol';
4 changes: 4 additions & 0 deletions src/AaveGovernanceV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,8 @@ library AaveGovernanceV2 {

address internal constant ARBITRUM_BRIDGE_EXECUTOR = 0x7d9103572bE58FfE99dc390E8246f02dcAe6f611;

address internal constant METIS_BRIDGE_EXECUTOR = 0x8EC77963068474a45016938Deb95E603Ca82a029;

// https://github.com/bgd-labs/aave-v3-crosschain-listing-template/tree/master/src/contracts
address internal constant CROSSCHAIN_FORWARDER_POLYGON =
0x158a6bC04F0828318821baE797f50B0A1299d45b;
Expand All @@ -528,4 +530,6 @@ library AaveGovernanceV2 {

address internal constant CROSSCHAIN_FORWARDER_ARBITRUM =
0xd1B3E25fD7C8AE7CADDC6F71b461b79CD4ddcFa3;

address internal constant CROSSCHAIN_FORWARDER_METIS = 0x2fE52eF191F0BE1D98459BdaD2F1d3160336C08f;
}
3 changes: 3 additions & 0 deletions src/AaveMisc.sol
Original file line number Diff line number Diff line change
Expand Up @@ -172,4 +172,7 @@ library AaveMisc {

address constant TRANSPARENT_PROXY_FACTORY_FANTOM = 0xB4e496f70602fE2AC6Ae511D028BA4D194773B29;
address constant PROXY_ADMIN_FANTOM = 0xD3cF979e676265e4f6379749DECe4708B9A22476;

address constant TRANSPARENT_PROXY_FACTORY_METIS = 0x1dad86dC5990BCE5bFe3A150A4E0ece990d6EBcB;
address constant PROXY_ADMIN_METIS = 0x1CabD986cBAbDf12E00128DFf03C80ee62C4fd97;
}
2 changes: 2 additions & 0 deletions src/AaveV3Arbitrum.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ library AaveV3Arbitrum {

IAaveOracle internal constant ORACLE = IAaveOracle(0xb56c2F0B653B2e0b10C9b928C8580Ac5Df02C7C7);

address internal constant PRICE_ORACLE_SENTINEL = 0xF876d26041a4Fdc7A787d209DC3D2795dDc74f1e;

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER =
IPoolDataProvider(0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654);

Expand Down
2 changes: 2 additions & 0 deletions src/AaveV3ArbitrumGoerli.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ library AaveV3ArbitrumGoerli {

IAaveOracle internal constant ORACLE = IAaveOracle(0xaEA17ddD7cEDD233f851e1cFd2cBca42F488772d);

address internal constant PRICE_ORACLE_SENTINEL = 0x0000000000000000000000000000000000000000;

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER =
IPoolDataProvider(0x2Fc0604AE02FA8AB833f135B0C01dFa45f88DAa2);

Expand Down
2 changes: 2 additions & 0 deletions src/AaveV3Avalanche.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ library AaveV3Avalanche {

IAaveOracle internal constant ORACLE = IAaveOracle(0xEBd36016B3eD09D4693Ed4251c67Bd858c3c7C9C);

address internal constant PRICE_ORACLE_SENTINEL = 0x0000000000000000000000000000000000000000;

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER =
IPoolDataProvider(0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654);

Expand Down
2 changes: 2 additions & 0 deletions src/AaveV3Ethereum.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ library AaveV3Ethereum {

IAaveOracle internal constant ORACLE = IAaveOracle(0x54586bE62E3c3580375aE3723C145253060Ca0C2);

address internal constant PRICE_ORACLE_SENTINEL = 0x0000000000000000000000000000000000000000;

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER =
IPoolDataProvider(0x7B4EB56E7CD4b454BA8ff71E4518426369a138a3);

Expand Down
2 changes: 2 additions & 0 deletions src/AaveV3Fantom.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ library AaveV3Fantom {

IAaveOracle internal constant ORACLE = IAaveOracle(0xfd6f3c1845604C8AE6c6E402ad17fb9885160754);

address internal constant PRICE_ORACLE_SENTINEL = 0x0000000000000000000000000000000000000000;

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER =
IPoolDataProvider(0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654);

Expand Down
2 changes: 2 additions & 0 deletions src/AaveV3FantomTestnet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ library AaveV3FantomTestnet {

IAaveOracle internal constant ORACLE = IAaveOracle(0xDd6BCF7EF3dbA79b03D61De36Cc292661c664efD);

address internal constant PRICE_ORACLE_SENTINEL = 0x0000000000000000000000000000000000000000;

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER =
IPoolDataProvider(0x221b58772526669172acCA8B68f6905086c81569);

Expand Down
2 changes: 2 additions & 0 deletions src/AaveV3Fuji.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ library AaveV3Fuji {

IAaveOracle internal constant ORACLE = IAaveOracle(0xB9107870a2e22b9cd4B51ED5483212Cb9eAE0329);

address internal constant PRICE_ORACLE_SENTINEL = 0x0000000000000000000000000000000000000000;

IPoolDataProvider internal constant AAVE_PROTOCOL_DATA_PROVIDER =
IPoolDataProvider(0x0B59871DF373136bB7753A7A2675b47ffA0ccC86);

Expand Down
Loading