import { ethers } from "hardhat"; import * as fs from "fs"; import * as path from "path"; async function main() { const network = await ethers.provider.getNetwork(); console.log("Deploying to network:", network.name, "Chain ID:", network.chainId); if (network.chainId !== 138n) { throw new Error("This script is only for Chain 138. Use --network chain138"); } const [deployer] = await ethers.getSigners(); console.log("Deploying contracts with the account:", deployer.address); const balance = await ethers.provider.getBalance(deployer.address); console.log("Account balance:", ethers.formatEther(balance), "ETH"); if (balance === 0n) { throw new Error("Deployer account has no balance. Please fund the account first."); } // Deploy SubAccountFactory console.log("\nDeploying SubAccountFactory..."); const SubAccountFactory = await ethers.getContractFactory("SubAccountFactory"); const factory = await SubAccountFactory.deploy(); await factory.waitForDeployment(); const factoryAddress = await factory.getAddress(); console.log("SubAccountFactory deployed to:", factoryAddress); // Deploy a TreasuryWallet with initial owners // Note: In production, this would be done by the frontend when a user creates a treasury // For now, we deploy an example treasury with the deployer as the only owner console.log("\nDeploying example TreasuryWallet..."); const owners = [deployer.address]; // Replace with actual owners in production const threshold = 1; const TreasuryWallet = await ethers.getContractFactory("TreasuryWallet"); const treasury = await TreasuryWallet.deploy(owners, threshold); await treasury.waitForDeployment(); const treasuryAddress = await treasury.getAddress(); console.log("TreasuryWallet deployed to:", treasuryAddress); // Save deployment addresses to a JSON file const deploymentInfo = { network: "chain138", chainId: 138, deployedAt: new Date().toISOString(), deployer: deployer.address, contracts: { SubAccountFactory: factoryAddress, TreasuryWallet: treasuryAddress, }, }; const outputDir = path.join(__dirname, "../deployments"); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const outputPath = path.join(outputDir, "chain138.json"); fs.writeFileSync(outputPath, JSON.stringify(deploymentInfo, null, 2)); console.log("\nDeployment Summary:"); console.log("==================="); console.log("Network: Chain 138"); console.log("SubAccountFactory:", factoryAddress); console.log("Example TreasuryWallet:", treasuryAddress); console.log("\nDeployment info saved to:", outputPath); console.log("\nNext steps:"); console.log("1. Update frontend/.env.production with:"); console.log(` NEXT_PUBLIC_SUB_ACCOUNT_FACTORY_ADDRESS=${factoryAddress}`); console.log(` NEXT_PUBLIC_TREASURY_WALLET_ADDRESS=${treasuryAddress}`); console.log("2. Update backend/.env with:"); console.log(` CONTRACT_ADDRESS=${treasuryAddress}`); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });