Files
asle/scripts/deploy-multichain.ts

146 lines
5.4 KiB
TypeScript
Raw Permalink Normal View History

import { ethers } from "hardhat";
import { Contract } from "ethers";
async function main() {
const [deployer] = await ethers.getSigners();
console.log("Deploying with account:", deployer.address);
// Chain configurations
const chains = [
{ name: "Ethereum", chainId: 1, rpcUrl: process.env.ETHEREUM_RPC_URL },
{ name: "Polygon", chainId: 137, rpcUrl: process.env.POLYGON_RPC_URL },
{ name: "Arbitrum", chainId: 42161, rpcUrl: process.env.ARBITRUM_RPC_URL },
{ name: "Optimism", chainId: 10, rpcUrl: process.env.OPTIMISM_RPC_URL },
{ name: "BSC", chainId: 56, rpcUrl: process.env.BSC_RPC_URL },
{ name: "Avalanche", chainId: 43114, rpcUrl: process.env.AVALANCHE_RPC_URL },
{ name: "Base", chainId: 8453, rpcUrl: process.env.BASE_RPC_URL },
];
// CCIP Router addresses (mainnet)
const ccipRouters: { [key: number]: string } = {
1: "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", // Ethereum
137: "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", // Polygon
42161: "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", // Arbitrum
10: "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", // Optimism
56: "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", // BSC
43114: "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", // Avalanche
8453: "0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D", // Base
};
// Chain selectors for CCIP
const chainSelectors: { [key: number]: bigint } = {
1: BigInt('5009297550715157269'), // Ethereum Mainnet
137: BigInt('4051577828743386545'), // Polygon
42161: BigInt('4949039107694359620'), // Arbitrum
10: BigInt('3734403246176062136'), // Optimism
56: BigInt('11344663589394136015'), // BSC
43114: BigInt('6433500567565415381'), // Avalanche
8453: BigInt('15971525489660198786'), // Base
};
const deployments: { [key: number]: any } = {};
for (const chain of chains) {
if (!chain.rpcUrl) {
console.log(`Skipping ${chain.name} - no RPC URL configured`);
continue;
}
console.log(`\n=== Deploying to ${chain.name} (Chain ID: ${chain.chainId}) ===`);
try {
// Deploy Diamond
const Diamond = await ethers.getContractFactory("Diamond");
const diamond = await Diamond.deploy();
await diamond.waitForDeployment();
const diamondAddress = await diamond.getAddress();
console.log(`Diamond deployed to: ${diamondAddress}`);
// Deploy Facets
const facets = {
DiamondCutFacet: await (await ethers.getContractFactory("DiamondCutFacet")).deploy(),
LiquidityFacet: await (await ethers.getContractFactory("LiquidityFacet")).deploy(),
VaultFacet: await (await ethers.getContractFactory("VaultFacet")).deploy(),
ComplianceFacet: await (await ethers.getContractFactory("ComplianceFacet")).deploy(),
CCIPFacet: await (await ethers.getContractFactory("CCIPFacet")).deploy(),
GovernanceFacet: await (await ethers.getContractFactory("GovernanceFacet")).deploy(),
SecurityFacet: await (await ethers.getContractFactory("SecurityFacet")).deploy(),
};
console.log("Facets deployed");
// Configure CCIP
const ccipRouter = ccipRouters[chain.chainId];
if (ccipRouter) {
const ccipFacet = await ethers.getContractAt("CCIPFacet", diamondAddress);
await ccipFacet.setCCIPRouter(ccipRouter);
console.log(`CCIP Router configured: ${ccipRouter}`);
// Set chain selector
const selector = chainSelectors[chain.chainId];
if (selector) {
await ccipFacet.setChainSelector(chain.chainId, selector);
console.log(`Chain selector set: ${selector}`);
}
// Set supported chains
const supportedChains = chains.map(c => c.chainId);
for (const supportedChainId of supportedChains) {
if (supportedChainId !== chain.chainId) {
await ccipFacet.setSupportedChain(supportedChainId, true);
}
}
}
// Configure ChainConfigFacet if deployed
try {
const chainConfigFacet = await ethers.getContractAt("ChainConfigFacet", diamondAddress);
await chainConfigFacet.setChainConfig(
chain.chainId,
chain.name,
ethers.ZeroAddress, // Native token
`https://${chain.name.toLowerCase()}.explorer.com`, // Explorer URL
BigInt(3000000), // Gas limit
BigInt(300) // Message timeout
);
await chainConfigFacet.setChainActive(chain.chainId, true);
console.log(`Chain config set for ${chain.name}`);
} catch (error) {
console.log(`ChainConfigFacet not available, skipping...`);
}
deployments[chain.chainId] = {
diamond: diamondAddress,
facets: Object.fromEntries(
Object.entries(facets).map(([name, contract]) => [name, contract.target])
),
chainId: chain.chainId,
chainName: chain.name,
};
console.log(`${chain.name} deployment complete`);
} catch (error) {
console.error(`✗ Failed to deploy to ${chain.name}:`, error);
}
}
// Save deployment addresses
console.log("\n=== Deployment Summary ===");
console.log(JSON.stringify(deployments, null, 2));
// Write to file
const fs = require("fs");
fs.writeFileSync(
"deployments.json",
JSON.stringify(deployments, null, 2)
);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});