import "dotenv/config" import { ethers } from "ethers" import * as fs from "fs" import * as path from "path" import { execSync } from "child_process" import { BasicERC20__factory, Launchpad__factory, MockUSD1__factory } from "../typechain-types" async function main() { // 获取环境配置 const environment = process.env.ENVIRONMENT || "bsctest" const rpcUrl = process.env.RPC_URL || "https://data-seed-prebsc-1-s1.binance.org:8545/" const outputDir = process.env.OUTPUT_DIR || "./output/bsctest" const chainId = process.env.CHAIN_ID || "97" console.log(`🚀 第1步:部署合约到${environment === "hardhat" ? "Hardhat本地环境" : "BSC测试网"}...`) console.log(`🌍 环境: ${environment}`) console.log(`🔗 RPC: ${rpcUrl}`) console.log(`📁 输出目录: ${outputDir}`) // 确保合约已编译 console.log("\n🔨 编译合约...") try { execSync("npx hardhat compile", { stdio: "inherit" }) console.log("✅ 合约编译完成") } catch (error) { console.error("❌ 合约编译失败:", error) process.exit(1) } // 检查环境变量 if (!process.env.PRIVATE_KEY) { console.error("❌ 需要设置 PRIVATE_KEY 环境变量") process.exit(1) } // 设置提供者和部署者 const provider = new ethers.JsonRpcProvider(rpcUrl) const deployer = new ethers.Wallet(process.env.PRIVATE_KEY, provider) // 获取当前nonce const currentNonce = await provider.getTransactionCount(deployer.address) console.log("📋 当前nonce:", currentNonce) console.log("📋 部署者地址:", deployer.address) // 检查部署者余额 const balance = await provider.getBalance(deployer.address) console.log("💰 部署者余额:", ethers.formatEther(balance), "BNB") if (balance < ethers.parseEther("0.01")) { console.error("❌ 余额不足。部署需要至少0.01 BNB") process.exit(1) } // 检查是否已有合约地址文件 let existingAddresses: any = {} let mockUSD1Address: string let saleTokenAddress: string const contractAddressesPath = path.join(outputDir, "contract-addresses.json") if (fs.existsSync(contractAddressesPath)) { console.log("\n📋 检测到现有合约地址文件,检查合约状态...") existingAddresses = JSON.parse(fs.readFileSync(contractAddressesPath, "utf8")) // 检查MockUSD1合约是否存在 try { const mockUSD1 = MockUSD1__factory.connect(existingAddresses.mockUSD1, provider) await mockUSD1.name() // 尝试调用合约方法验证合约存在 mockUSD1Address = existingAddresses.mockUSD1 console.log("✅ MockUSD1合约已存在:", mockUSD1Address) } catch (error) { console.log("❌ MockUSD1合约不存在或无效,需要重新部署") mockUSD1Address = "" } // 检查BasicERC20合约是否存在 try { const saleToken = BasicERC20__factory.connect(existingAddresses.saleToken, provider) await saleToken.name() // 尝试调用合约方法验证合约存在 saleTokenAddress = existingAddresses.saleToken console.log("✅ 销售代币合约已存在:", saleTokenAddress) } catch (error) { console.log("❌ 销售代币合约不存在或无效,需要重新部署") saleTokenAddress = "" } } else { console.log("\n📋 未检测到现有合约地址文件,将部署所有合约") mockUSD1Address = "" saleTokenAddress = "" } // 部署MockUSD1代币(如果需要) let mockUSD1: any let nonce = currentNonce if (!mockUSD1Address) { console.log("\n📦 部署MockUSD1代币...") mockUSD1 = await new MockUSD1__factory(deployer).deploy({ nonce: nonce++ }) await mockUSD1.waitForDeployment() mockUSD1Address = await mockUSD1.getAddress() console.log("✅ MockUSD1已部署到:", mockUSD1Address) } else { mockUSD1 = MockUSD1__factory.connect(mockUSD1Address, deployer) } // 部署BasicERC20代币(如果需要) let saleToken: any if (!saleTokenAddress) { console.log("\n📦 部署BasicERC20代币...") saleToken = await new BasicERC20__factory(deployer).deploy("Test Token", "TEST", deployer.address, { nonce: nonce++ }) await saleToken.waitForDeployment() saleTokenAddress = await saleToken.getAddress() console.log("✅ 销售代币已部署到:", saleTokenAddress) } else { saleToken = BasicERC20__factory.connect(saleTokenAddress, deployer) } // 总是部署新的启动板合约 console.log("\n📦 部署新的启动板合约...") const launchpad = await new Launchpad__factory(deployer).deploy({ nonce: nonce++ }) await launchpad.waitForDeployment() const launchpadAddress = await launchpad.getAddress() console.log("✅ 启动板已部署到:", launchpadAddress) // 保存合约地址到文件供后续步骤使用 const contractAddresses = { mockUSD1: mockUSD1Address, saleToken: saleTokenAddress, launchpad: launchpadAddress, deployer: deployer.address, } fs.writeFileSync(contractAddressesPath, JSON.stringify(contractAddresses, null, 2)) console.log("\n🎉 合约部署成功完成!") console.log(`\n📋 合约地址已保存到 ${contractAddressesPath}:`) console.log("- MockUSD1:", contractAddresses.mockUSD1) console.log("- 销售代币:", contractAddresses.saleToken) console.log("- 启动板:", contractAddresses.launchpad) console.log("- 部署者:", contractAddresses.deployer) console.log("\n📋 下一步:运行 'npm run 02:distribute' 来分发测试代币") } // 导出main函数供多环境脚本调用 export { main } // 如果直接运行此脚本 if (require.main === module) { main() .then(() => process.exit(0)) .catch((error) => { console.error("❌ Error:", error) process.exit(1) }) }