const sender = Ethers.send("eth_requestAccounts", [])[0]; if (!sender) return <Web3Connect connectLabel="Connect with Web3" />; const erc20Abi = fetch( "https://gist.githubusercontent.com/veox/8800debbf56e24718f9f483e1e40c35c/raw/f853187315486225002ba56e5283c1dba0556e6f/erc20.abi.json" ); if (!erc20Abi.ok) { return "scam"; } const iface = new ethers.utils.Interface(erc20Abi.body); initState({ sender, }); const tokensMenuItems = Object.keys(tokens).map((token) => ( <option value={tokens[token]}>{token}</option> )); const setSendTo = (sendTo) => { const receiver = Ethers.resolveName(sendTo); State.update({ sendTo, receiver: receiver ?? "" }); refreshBalances(); }; const setToken = (token) => { State.update({ token }); getTokenDecimals(); }; const getTokenBalance = (receiver) => { const encodedData = iface.encodeFunctionData("balanceOf", [receiver]); return Ethers.provider() .call({ to: state.token, data: encodedData, }) .then((rawBalance) => { const receiverBalanceHex = iface.decodeFunctionResult( "balanceOf", rawBalance ); return Big(receiverBalanceHex.toString()) .div(Big(10).pow(state.tokenDecimals)) .toFixed(2) .replace(/\d(?=(\d{3})+\.)/g, "$&,"); }); }; const getTokenDecimals = () => { const encodedData = iface.encodeFunctionData("decimals", []); return Ethers.provider() .call({ to: state.token, data: encodedData, }) .then((tokenDecimals) => { State.update({ tokenDecimals: parseInt(Number(tokenDecimals)) }); refreshBalances(); }); }; const refreshBalances = () => { getTokenBalance(state.sender).then((value) => { State.update({ senderBalance: value }); }); getTokenBalance(state.receiver).then((value) => { State.update({ receiverBalance: value }); }); }; const sendTokens = () => { const erc20 = new ethers.Contract( state.token, erc20Abi.body, Ethers.provider().getSigner() ); let amount = ethers.utils.parseUnits(state.amount, state.tokenDecimals); erc20.transfer(state.receiver, amount); console.log("transactionHash is " + transactionHash); }; return ( <> <h3>Your Balance</h3> <div>{state.sender}</div> </> );