import { debounce } from '@material-ui/core' import { Contract, providers, Wallet } from 'ethers' import { bzzContractInterface } from './bzz-contract-interface' async function eth_getBalance(address: string, provider: providers.JsonRpcProvider): Promise { if (!address.startsWith('0x')) { address = `0x${address}` } const balance = await provider.getBalance(address) return balance.toString() } async function eth_getBlockByNumber(provider: providers.JsonRpcProvider): Promise { const blockNumber = await provider.getBlockNumber() return blockNumber.toString() } const partialERC20tokenABI = [ { constant: true, inputs: [ { name: '_owner', type: 'address', }, ], name: 'balanceOf', outputs: [ { name: 'balance', type: 'uint256', }, ], payable: false, type: 'function', }, ] async function eth_getBalanceERC20( address: string, provider: providers.JsonRpcProvider, tokenAddress = '0xdbf3ea6f5bee45c02255b2c26a16f300502f68da', ): Promise { if (!address.startsWith('0x')) { address = `0x${address}` } const contract = new Contract(tokenAddress, partialERC20tokenABI, provider) const balance = await contract.balanceOf(address) return balance.toString() } interface TransferResponse { transaction: providers.TransactionResponse receipt: providers.TransactionReceipt } export async function sendNativeTransaction( privateKey: string, to: string, value: string, jsonRpcProvider: string, ): Promise { const signer = await makeReadySigner(privateKey, jsonRpcProvider) const gasPrice = await signer.getGasPrice() const transaction = await signer.sendTransaction({ to, value, gasPrice }) const receipt = await transaction.wait(1) return { transaction, receipt } } export async function sendBzzTransaction( privateKey: string, to: string, value: string, jsonRpcProvider: string, ): Promise { const signer = await makeReadySigner(privateKey, jsonRpcProvider) const gasPrice = await signer.getGasPrice() const bzz = new Contract('0xdBF3Ea6F5beE45c02255B2c26a16F300502F68da', bzzContractInterface, signer) const transaction = await bzz.transfer(to, value, { gasPrice }) const receipt = await transaction.wait(1) return { transaction, receipt } } async function makeReadySigner(privateKey: string, jsonRpcProvider: string) { const provider = new providers.JsonRpcProvider(jsonRpcProvider, 100) await provider.ready const signer = new Wallet(privateKey, provider) return signer } export const Rpc = { sendNativeTransaction, sendBzzTransaction, _eth_getBalance: eth_getBalance, _eth_getBalanceERC20: eth_getBalanceERC20, eth_getBalance: debounce(eth_getBalance, 1_000), eth_getBalanceERC20: debounce(eth_getBalanceERC20, 1_000), eth_getBlockByNumber, }