| 8 | "": "const sender = Ethers.send(\\\\\\\"eth_requestAccounts\\\\\\\", [])[0];\\\\n\\\\nif (!sender) return <Web3Connect connectLabel=\\\\\\\"Connect with Web3\\\\\\\" />;\\\\n\\\\nif (state.balance === undefined && sender) {\\\\n Ethers.provider()\\\\n .getBalance(sender)\\\\n .then((balance) => {\\\\n State.update({ balance: Big(balance).div(Big(10).pow(18)).toFixed(2) });\\\\n });\\\\n}\\\\n\\\\ninitState({\\\\n token: \\\\\\\"\\\\\\\",\\\\n tokenDecimals: \\\\\\\"\\\\\\\",\\\\n sendTo: \\\\\\\"\\\\\\\",\\\\n sender,\\\\n senderBalance: \\\\\\\"0\\\\\\\",\\\\n receiverBalance: \\\\\\\"0\\\\\\\",\\\\n receiver: \\\\\\\"\\\\\\\",\\\\n amount: \\\\\\\"1\\\\\\\",\\\\n});\\\\n\\\\n// const erc20Abi = fetch(\\\\n// \\\\\\\"https://gist.githubusercontent.com/veox/8800debbf56e24718f9f483e1e40c35c/raw/f853187315486225002ba56e5283c1dba0556e6f/erc20.abi.json\\\\\\\"\\\\n// );\\\\n// if (!erc20Abi.ok) {\\\\n// return \\\\\\\"scam\\\\\\\";\\\\n// }\\\\n\\\\n// const iface = new ethers.utils.Interface(erc20Abi.body);\\\\n\\\\nconst tokens = {\\\\n \\\\\\\"Select Token\\\\\\\": \\\\\\\"\\\\\\\",\\\\n USDT: \\\\\\\"0xdac17f958d2ee523a2206206994597c13d831ec7\\\\\\\",\\\\n DAI: \\\\\\\"0x6b175474e89094c44da98b954eedeac495271d0f\\\\\\\",\\\\n USDC: \\\\\\\"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\\\\\\\",\\\\n MKR: \\\\\\\"0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2\\\\\\\",\\\\n};\\\\n\\\\nconst tokensMenuItems = Object.keys(tokens).map((token) => (\\\\n <option value={tokens[token]}>{token}</option>\\\\n));\\\\n\\\\nconst setSendTo = (sendTo) => {\\\\n const receiver = Ethers.resolveName(sendTo);\\\\n State.update({ sendTo, receiver: receiver ?? \\\\\\\"\\\\\\\" });\\\\n refreshBalances();\\\\n};\\\\n\\\\nconst setToken = (token) => {\\\\n State.update({ token });\\\\n getTokenDecimals();\\\\n};\\\\n\\\\nconst getTokenBalance = (receiver) => {\\\\n const encodedData = iface.encodeFunctionData(\\\\\\\"balanceOf\\\\\\\", [receiver]);\\\\n\\\\n return Ethers.provider()\\\\n .call({\\\\n to: state.token,\\\\n data: encodedData,\\\\n })\\\\n .then((rawBalance) => {\\\\n const receiverBalanceHex = iface.decodeFunctionResult(\\\\n \\\\\\\"balanceOf\\\\\\\",\\\\n rawBalance\\\\n );\\\\n\\\\n return Big(receiverBalanceHex.toString())\\\\n .div(Big(10).pow(state.tokenDecimals))\\\\n .toFixed(2)\\\\n .replace(/\\\\\\\\d(?=(\\\\\\\\d{3})+\\\\\\\\.)/g, \\\\\\\"$&,\\\\\\\");\\\\n });\\\\n};\\\\n\\\\nconst getTokenDecimals = () => {\\\\n const encodedData = iface.encodeFunctionData(\\\\\\\"decimals\\\\\\\", []);\\\\n\\\\n return Ethers.provider()\\\\n .call({\\\\n to: state.token,\\\\n data: encodedData,\\\\n })\\\\n .then((tokenDecimals) => {\\\\n State.update({ tokenDecimals: parseInt(Number(tokenDecimals)) });\\\\n refreshBalances();\\\\n });\\\\n};\\\\n\\\\nconst refreshBalances = () => {\\\\n getTokenBalance(state.sender).then((value) => {\\\\n State.update({ senderBalance: value });\\\\n });\\\\n\\\\n getTokenBalance(state.receiver).then((value) => {\\\\n State.update({ receiverBalance: value });\\\\n });\\\\n};\\\\n\\\\nconst sendTokens = () => {\\\\n const erc20 = new ethers.Contract(\\\\n state.token,\\\\n erc20Abi.body,\\\\n Ethers.provider().getSigner()\\\\n );\\\\n\\\\n let amount = ethers.utils.parseUnits(state.amount, state.tokenDecimals);\\\\n\\\\n erc20.transfer(state.receiver, amount);\\\\n\\\\n console.log(\\\\\\\"transactionHash is \\\\\\\" + transactionHash);\\\\n};\\\\n\\\\nreturn (\\\\n <>\\\\n <h3>Wallet Balance</h3>\\\\n <div class=\\\\\\\"mb-3\\\\\\\">\\\\n <label for=\\\\\\\"selectToken\\\\\\\">Select token</label>\\\\n <select\\\\n class=\\\\\\\"form-select\\\\\\\"\\\\n id=\\\\\\\"selectToken\\\\\\\"\\\\n onChange={(e) => {\\\\n setToken(e.target.value);\\\\n }}\\\\n >\\\\n {tokensMenuItems}\\\\n </select>\\\\n </div>\\\\n\\\\n <div class=\\\\\\\"mb-3\\\\\\\">\\\\n <label for=\\\\\\\"send-to\\\\\\\" class=\\\\\\\"form-label\\\\\\\">\\\\n Recepient address\\\\n </label>\\\\n <input\\\\n value={state.sendTo}\\\\n class=\\\\\\\"form-control\\\\\\\"\\\\n id=\\\\\\\"send-to\\\\\\\"\\\\n placeholder=\\\\\\\"vitalik.eth\\\\\\\"\\\\n onChange={(e) => setSendTo(e.target.value)}\\\\n />\\\\n {state.receiver && (\\\\n <div class=\\\\\\\"text-secondary mt-3\\\\\\\">Resolved to {state.receiver}</div>\\\\n )}\\\\n {state.receiverBalance != \\\\\\\"0\\\\\\\" && (\\\\n <div class=\\\\\\\"text-secondary mt-3\\\\\\\">\\\\n Receiver\\\\\\'s balance: {state.receiverBalance}\\\\n </div>\\\\n )}\\\\n\\\\n {state.senderBalance != \\\\\\\"0\\\\\\\" && (\\\\n <div class=\\\\\\\"text-secondary mt-3\\\\\\\">\\\\n Sender\\\\\\'s balance: {state.senderBalance}\\\\n </div>\\\\n )}\\\\n </div>\\\\n\\\\n <div class=\\\\\\\"mb-3\\\\\\\">\\\\n <label for=\\\\\\\"amount\\\\\\\" class=\\\\\\\"form-label\\\\\\\">\\\\n Enter the amount\\\\n </label>\\\\n <input\\\\n value={state.amount}\\\\n class=\\\\\\\"form-control\\\\\\\"\\\\n id=\\\\\\\"amount\\\\\\\"\\\\n placeholder=\\\\\\\"\\\\\\\"\\\\n onChange={(e) => State.update({ amount: e.target.value })}\\\\n />\\\\n </div>\\\\n <div class=\\\\\\\"mb-3\\\\\\\">\\\\n <button onClick={sendTokens}>Send</button>\\\\n </div>\\\\n </>\\\\n);\\\\n" |