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