@coinmeca/ethers
Version:
Solidty helpers and utilities for using ethers.
113 lines (112 loc) • 5.03 kB
JavaScript
;
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;