UNPKG

@coinmeca/ethers

Version:

Solidty helpers and utilities for using ethers.

113 lines (112 loc) 5.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ERC20 = ERC20; const utils_1 = require("../utils"); const accounts_1 = require("../accounts"); const hardhat_1 = require("hardhat"); const hardhat_network_helpers_1 = require("@nomicfoundation/hardhat-network-helpers"); const Native = { address: (0, utils_1.a)(0), name: "Ethereum", symbol: "ETH", decimals: 18, }; async function ERC20(token, init = Native) { const isNative = typeof token === "string" && token === (0, utils_1.a)(0); token = isNative ? (0, utils_1.a)(0) : typeof token === "string" ? await hardhat_1.ethers.getContractAtFromArtifact(JSON.parse(require("fs").readFileSync(require("path").resolve(__dirname, "../artifacts/ERC20.sol/ERC20.json"))), token) : token; const name = isNative ? init.name : typeof token?.name === "function" ? await token?.name() : typeof token?.name === "string" ? token?.name : null; const symbol = isNative ? init.symbol : typeof token?.symbol === "function" ? await token?.symbol() : typeof token?.symbol === "string" ? token?.symbol : null; const decimals = parseInt((isNative ? init.decimals : typeof token?.decimals === "function" ? await token?.decimals() : typeof token?.decimals === "number" ? token?.decimals : 18).toString()); const address = isNative ? init.address : typeof token?.getAddress === "function" ? await token?.getAddress() : typeof token?.address === "string" ? token?.address : null; const module = (token, user) => { const totalSupply = async () => { return isNative ? (0, utils_1.u)(hardhat_1.ethers.MaxUint256, decimals) : (0, utils_1.u)(await token?.totalSupply(), decimals); }; const balanceOf = async (owner) => { return (0, utils_1.u)(isNative ? await hardhat_1.ethers.provider.getBalance((0, utils_1.a)(owner)) : await token.balanceOf((0, utils_1.a)(owner)), decimals); }; const transfer = async (to, amount) => { return isNative ? await (user?.signer ? user?.signer : accounts_1.signers[0]).sendTransaction({ to: (0, utils_1.a)(to), value: (0, utils_1.n)(amount) }) : await token.transfer((0, utils_1.a)(to), (0, utils_1.n)(amount, decimals)); }; const transferFrom = async (from, to, amount) => { const signer = user?.signer ? user?.signer : accounts_1.signers[0]; return isNative ? await signer.sendTransaction({ to: (0, utils_1.a)(to), value: (0, utils_1.n)(amount) }) : await (signer ? token.connect(signer) : token).transferFrom((0, utils_1.a)(from), (0, utils_1.a)(to), (0, utils_1.n)(amount, decimals)); }; const allowance = async (owner, spender) => { return isNative ? (0, utils_1.u)(hardhat_1.ethers.MaxUint256, decimals) : (0, utils_1.u)(await token.allowance((0, utils_1.a)(owner), (0, utils_1.a)(spender)), decimals); }; const approve = async (spender, amount) => { const signer = user?.signer ? user?.signer : accounts_1.signers[0]; return isNative ? true : await (signer ? token.connect(signer) : token).approve((0, utils_1.a)(spender), amount === "max" ? hardhat_1.ethers.MaxUint256 : (0, utils_1.n)(amount, decimals)); }; const faucet = async (to, amount) => { if (isNative) { return await (0, hardhat_network_helpers_1.setBalance)((0, utils_1.a)(to), (0, utils_1.n)((await balanceOf(to)) + parseFloat(amount.toString()))); } else { try { return await token.connect(accounts_1.signers[0]).faucet((0, utils_1.a)(to), (0, utils_1.n)(amount, decimals)); } catch { try { return await token.connect(accounts_1.signers[0]).mint((0, utils_1.a)(to), (0, utils_1.n)(amount, decimals)); } catch { return await token.connect(accounts_1.signers[0]).transfer((0, utils_1.a)(to), (0, utils_1.n)(amount, decimals)); } } } }; return { name, symbol, decimals, address, totalSupply, balanceOf, transfer, transferFrom, allowance, approve, faucet, isNative, contract: isNative ? hardhat_1.ethers.provider : token, }; }; const use = (user) => { return module(isNative ? token : token.connect(user.signer), user); }; return { ...module(token), use, }; } exports.default = ERC20;