129 lines
3.8 KiB
TypeScript
129 lines
3.8 KiB
TypeScript
/**
|
||
* 部署测试 USDT 合约到测试网
|
||
*
|
||
* 使用方法:
|
||
* npx ts-node deploy-test-usdt.ts --network bsc-testnet
|
||
* npx ts-node deploy-test-usdt.ts --network kava-testnet
|
||
*
|
||
* 环境变量:
|
||
* DEPLOYER_PRIVATE_KEY - 部署者私钥 (必须有测试网原生代币用于 gas)
|
||
*/
|
||
|
||
import { ethers } from 'ethers';
|
||
|
||
// 测试 USDT 合约 ABI (简化版)
|
||
const TEST_USDT_ABI = [
|
||
'constructor()',
|
||
'function name() view returns (string)',
|
||
'function symbol() view returns (string)',
|
||
'function decimals() view returns (uint8)',
|
||
'function totalSupply() view returns (uint256)',
|
||
'function balanceOf(address) view returns (uint256)',
|
||
'function transfer(address to, uint256 amount) returns (bool)',
|
||
'function mint(address to, uint256 amount)',
|
||
'function faucet()',
|
||
'function airdrop(address[] recipients, uint256 amount)',
|
||
];
|
||
|
||
// 编译后的合约字节码 (需要先编译合约获得)
|
||
// 运行: solc --optimize --bin TestUSDT.sol -o ./build
|
||
// 或使用 Remix IDE 编译获取
|
||
const TEST_USDT_BYTECODE = `
|
||
注意: 这里需要填入编译后的字节码
|
||
请使用 Remix IDE 或 solc 编译 TestUSDT.sol 获取字节码
|
||
`;
|
||
|
||
// 网络配置
|
||
const NETWORKS = {
|
||
'bsc-testnet': {
|
||
name: 'BSC Testnet',
|
||
chainId: 97,
|
||
rpcUrl: 'https://data-seed-prebsc-1-s1.binance.org:8545',
|
||
explorerUrl: 'https://testnet.bscscan.com',
|
||
faucet: 'https://testnet.bnbchain.org/faucet-smart',
|
||
},
|
||
'kava-testnet': {
|
||
name: 'KAVA Testnet',
|
||
chainId: 2221,
|
||
rpcUrl: 'https://evm.testnet.kava.io',
|
||
explorerUrl: 'https://testnet.kavascan.com',
|
||
faucet: 'https://faucet.kava.io',
|
||
},
|
||
};
|
||
|
||
async function main() {
|
||
// 解析命令行参数
|
||
const networkArg = process.argv.find((arg) => arg.startsWith('--network='));
|
||
const networkName = networkArg?.split('=')[1] || 'bsc-testnet';
|
||
|
||
const network = NETWORKS[networkName as keyof typeof NETWORKS];
|
||
if (!network) {
|
||
console.error(`Unknown network: ${networkName}`);
|
||
console.error(`Available networks: ${Object.keys(NETWORKS).join(', ')}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
console.log(`\n=== 部署测试 USDT 到 ${network.name} ===\n`);
|
||
|
||
// 检查私钥
|
||
const privateKey = process.env.DEPLOYER_PRIVATE_KEY;
|
||
if (!privateKey) {
|
||
console.error('错误: 请设置 DEPLOYER_PRIVATE_KEY 环境变量');
|
||
console.error('\n获取测试网代币:');
|
||
console.error(` ${network.faucet}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
// 连接网络
|
||
const provider = new ethers.JsonRpcProvider(network.rpcUrl);
|
||
const wallet = new ethers.Wallet(privateKey, provider);
|
||
|
||
console.log(`部署者地址: ${wallet.address}`);
|
||
|
||
// 检查余额
|
||
const balance = await provider.getBalance(wallet.address);
|
||
console.log(`余额: ${ethers.formatEther(balance)} ${networkName.includes('bsc') ? 'tBNB' : 'KAVA'}`);
|
||
|
||
if (balance === 0n) {
|
||
console.error('\n错误: 余额为 0,请先从水龙头获取测试代币');
|
||
console.error(`水龙头: ${network.faucet}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
// 部署合约
|
||
console.log('\n正在部署合约...');
|
||
|
||
// 注意: 实际使用时需要先编译合约获取 bytecode
|
||
// 这里提供一个替代方案: 使用 Remix IDE 部署
|
||
|
||
console.log(`
|
||
========================================
|
||
手动部署步骤 (使用 Remix IDE):
|
||
========================================
|
||
|
||
1. 打开 Remix IDE: https://remix.ethereum.org
|
||
|
||
2. 创建新文件 TestUSDT.sol,复制合约代码
|
||
|
||
3. 编译合约:
|
||
- 选择 Solidity 0.8.20
|
||
- 启用 Optimizer (runs: 200)
|
||
|
||
4. 部署:
|
||
- Environment: Injected Provider (MetaMask)
|
||
- 切换 MetaMask 到 ${network.name}
|
||
- Chain ID: ${network.chainId}
|
||
- RPC: ${network.rpcUrl}
|
||
|
||
5. 部署成功后,将合约地址更新到 .env:
|
||
${networkName.includes('bsc') ? 'BSC_USDT_CONTRACT' : 'KAVA_USDT_CONTRACT'}=0x...
|
||
|
||
6. 验证合约 (可选):
|
||
${network.explorerUrl}/address/0x.../code
|
||
|
||
========================================
|
||
`);
|
||
}
|
||
|
||
main().catch(console.error);
|