Skip to content

Commit

Permalink
feat: metis (#120)
Browse files Browse the repository at this point in the history
  • Loading branch information
brotherlymite committed Apr 26, 2023
1 parent d94db75 commit 9961128
Show file tree
Hide file tree
Showing 42 changed files with 292 additions and 64 deletions.
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

0 comments on commit 9961128

Please sign in to comment.