rwadurian/backend/services/blockchain-service/scripts/deploy-kava-simple.ts

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