UNPKG

@codegame.dev/wallet-cli

Version:

A CLI tool for managing wallets across multiple blockchains, supporting operations like wallet creation, balance checking, transfers, and fee estimation.

125 lines (124 loc) 4.94 kB
import { ethers, formatUnits } from "ethers"; import { sleep } from "../utils/index.js"; const erc20Abi = [ // ERC-20 Standard Functions "function balanceOf(address owner) view returns (uint256)", "function transfer(address to, uint256 amount) returns (bool)", "function approve(address spender, uint256 amount) returns (bool)", "function allowance(address owner, address spender) view returns (uint256)", "function transferFrom(address from, address to, uint256 amount) returns (bool)", "function decimals() view returns (uint8)", "function totalSupply() view returns (uint256)", "function symbol() view returns (string)", "function name() view returns (string)", // ERC-20 Events "event Transfer(address indexed from, address indexed to, uint256 value)", "event Approval(address indexed owner, address indexed spender, uint256 value)" ]; export const getBalance = async (params) => { const provider = new ethers.JsonRpcProvider(params.jsonRpcProvider); if (params.tokenAddress) { const tokenContract = new ethers.Contract(params.tokenAddress, erc20Abi, provider); const decimals = await tokenContract.decimals(); await sleep(params.delay); const tokenBalance = formatUnits(await tokenContract.balanceOf(params.address), decimals); return { success: true, token_balance: tokenBalance, }; } else { const coinBalance = formatUnits(await provider.getBalance(params.address), params.chainDecimals); return { success: true, coin_balance: coinBalance, }; } }; export const transfer = async (params) => { const provider = new ethers.JsonRpcProvider(params.jsonRpcProvider); const evmWallet = ethers.Wallet.fromPhrase(params.mnemonic, provider); if (params.tokenAddress) { const tokenContract = new ethers.Contract(params.tokenAddress, erc20Abi, evmWallet); const decimals = await tokenContract.decimals(); await sleep(params.delay); const amountInWei = ethers.parseUnits(params.amount, decimals); const transaction = await tokenContract.transfer(params.toAddress, amountInWei); const hash = transaction.hash; const fee = formatUnits(transaction.gasPrice * transaction.gasLimit, params.chainDecimals); return { success: true, hash, fee, }; } else { const amountInWei = ethers.parseUnits(params.amount, params.chainDecimals); const tx = { to: params.toAddress, value: amountInWei, }; const transaction = await evmWallet.sendTransaction(tx); const hash = transaction.hash; const fee = formatUnits(transaction.gasPrice * transaction.gasLimit, params.chainDecimals); return { success: true, hash, fee, }; } }; export const estimateFee = async (params) => { const provider = new ethers.JsonRpcProvider(params.jsonRpcProvider); if (params.tokenAddress) { const tokenContract = new ethers.Contract(params.tokenAddress, erc20Abi, provider); const decimals = await tokenContract.decimals(); await sleep(params.delay); const amountInWei = ethers.parseUnits(params.amount, decimals); let gasLimit = await provider.estimateGas({ to: params.toAddress, value: amountInWei, }); await sleep(params.delay); gasLimit = gasLimit * BigInt(3); const feeData = await provider.getFeeData(); const gasPrice = feeData.maxFeePerGas || feeData.gasPrice; if (!gasPrice) { return { success: false, code: 'empty-gas-price', message: "Error in fetching gas price", }; } const gasCostInWei = gasLimit * gasPrice; const gasCost = formatUnits(gasCostInWei, params.chainDecimals); return { success: true, fee: gasCost, }; } else { const amountInWei = ethers.parseUnits(params.amount, params.chainDecimals); const gasLimit = await provider.estimateGas({ to: params.toAddress, value: amountInWei }); await sleep(params.delay); const feeData = await provider.getFeeData(); const gasPrice = feeData.maxFeePerGas || feeData.gasPrice; if (!gasPrice) { return { success: false, code: 'empty-gas-price', message: "Error in fetching gas price" }; } const gasCostInWei = gasLimit * gasPrice; const gasCost = formatUnits(gasCostInWei, params.chainDecimals); return { success: true, fee: gasCost, }; } }; export default { getBalance, transfer, estimateFee };