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); });