135 lines
4.1 KiB
TypeScript
135 lines
4.1 KiB
TypeScript
/**
|
|
* Deploy TestUSDT to KAVA Testnet using inline Solidity compilation
|
|
*/
|
|
import { ethers } from 'ethers';
|
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
const solc = require('solc');
|
|
|
|
const KAVA_TESTNET_RPC = 'https://evm.testnet.kava.io';
|
|
const KAVA_TESTNET_CHAIN_ID = 2221;
|
|
const privateKey = '0xd42a6e6021ebd884f3f179d3793a32e97b9f1001db6ff44441ec455d748b9aa6';
|
|
|
|
const sourceCode = `
|
|
// SPDX-License-Identifier: MIT
|
|
pragma solidity 0.8.17;
|
|
|
|
contract TestUSDT {
|
|
string public constant name = "Test USDT";
|
|
string public constant symbol = "USDT";
|
|
uint8 public constant decimals = 6;
|
|
uint256 public totalSupply;
|
|
mapping(address => uint256) public balanceOf;
|
|
mapping(address => mapping(address => uint256)) public allowance;
|
|
|
|
event Transfer(address indexed from, address indexed to, uint256 value);
|
|
event Approval(address indexed owner, address indexed spender, uint256 value);
|
|
|
|
constructor() {
|
|
_mint(msg.sender, 1000000 * 1e6);
|
|
}
|
|
|
|
function _mint(address to, uint256 amount) internal {
|
|
totalSupply += amount;
|
|
balanceOf[to] += amount;
|
|
emit Transfer(address(0), to, amount);
|
|
}
|
|
|
|
function transfer(address to, uint256 amount) public returns (bool) {
|
|
balanceOf[msg.sender] -= amount;
|
|
balanceOf[to] += amount;
|
|
emit Transfer(msg.sender, to, amount);
|
|
return true;
|
|
}
|
|
|
|
function approve(address spender, uint256 amount) public returns (bool) {
|
|
allowance[msg.sender][spender] = amount;
|
|
emit Approval(msg.sender, spender, amount);
|
|
return true;
|
|
}
|
|
|
|
function transferFrom(address from, address to, uint256 amount) public returns (bool) {
|
|
allowance[from][msg.sender] -= amount;
|
|
balanceOf[from] -= amount;
|
|
balanceOf[to] += amount;
|
|
emit Transfer(from, to, amount);
|
|
return true;
|
|
}
|
|
|
|
function mint(uint256 amount) external {
|
|
_mint(msg.sender, amount);
|
|
}
|
|
|
|
function faucet() external {
|
|
_mint(msg.sender, 10000 * 1e6);
|
|
}
|
|
}
|
|
`;
|
|
|
|
async function deploy() {
|
|
console.log('🔨 Compiling contract...');
|
|
|
|
const input = {
|
|
language: 'Solidity',
|
|
sources: { 'TestUSDT.sol': { content: sourceCode } },
|
|
settings: { outputSelection: { '*': { '*': ['abi', 'evm.bytecode'] } } },
|
|
};
|
|
|
|
const output = JSON.parse(solc.compile(JSON.stringify(input)));
|
|
|
|
if (output.errors) {
|
|
const errors = output.errors.filter((e: any) => e.severity === 'error');
|
|
if (errors.length > 0) {
|
|
console.error('❌ Compilation errors:', errors);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
const contract = output.contracts['TestUSDT.sol']['TestUSDT'];
|
|
const bytecode = contract.evm.bytecode.object;
|
|
const compiledAbi = contract.abi;
|
|
|
|
console.log('🌐 Connecting to KAVA Testnet...');
|
|
const provider = new ethers.JsonRpcProvider(KAVA_TESTNET_RPC, {
|
|
chainId: KAVA_TESTNET_CHAIN_ID,
|
|
name: 'kava-testnet',
|
|
});
|
|
|
|
const wallet = new ethers.Wallet(privateKey, provider);
|
|
console.log(`📍 Deployer: ${wallet.address}`);
|
|
|
|
const balance = await provider.getBalance(wallet.address);
|
|
console.log(`💰 Balance: ${ethers.formatEther(balance)} TKAVA`);
|
|
|
|
if (balance < ethers.parseEther('0.01')) {
|
|
console.error('❌ Insufficient TKAVA');
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log('📦 Deploying...');
|
|
const factory = new ethers.ContractFactory(compiledAbi, bytecode, wallet);
|
|
const deployedContract = await factory.deploy({
|
|
gasLimit: 5000000,
|
|
});
|
|
|
|
console.log(`⏳ Waiting for confirmation...`);
|
|
console.log(` TX: https://testnet.kavascan.com/tx/${deployedContract.deploymentTransaction()?.hash}`);
|
|
|
|
await deployedContract.waitForDeployment();
|
|
|
|
const address = await deployedContract.getAddress();
|
|
console.log('');
|
|
console.log('='.repeat(60));
|
|
console.log(`✅ SUCCESS! TestUSDT deployed on KAVA Testnet`);
|
|
console.log(`📋 Contract Address: ${address}`);
|
|
console.log('='.repeat(60));
|
|
console.log('');
|
|
console.log(`🔗 KavaScan: https://testnet.kavascan.com/address/${address}`);
|
|
console.log('');
|
|
console.log('Next: Update KAVA_USDT_CONTRACT in .env');
|
|
}
|
|
|
|
deploy().catch((e) => {
|
|
console.error('❌ Error:', e.message);
|
|
process.exit(1);
|
|
});
|