@coinmeca/ethers
Version:
Solidty helpers and utilities for using ethers.
253 lines (252 loc) • 9.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.color = exports.font = void 0;
exports.repeat = repeat;
exports.n = n;
exports.u = u;
exports.f = f;
exports.a = a;
exports.t = t;
exports.duration = duration;
exports.ft = ft;
exports.revert = revert;
exports._ = _;
exports.result = result;
exports.getMultiplier = getMultiplier;
exports.getNetworkName = getNetworkName;
exports.saveAddress = saveAddress;
exports.addAddress = addAddress;
exports.loadAddress = loadAddress;
const process_1 = require("process");
const console_1 = require("console");
const chai_1 = require("chai");
const hardhat_1 = require("hardhat");
const ethers_1 = require("ethers");
const fs_1 = require("fs");
const hardhat_network_helpers_1 = require("@nomicfoundation/hardhat-network-helpers");
// repeat
async function repeat(fn, times) {
for (let i = 0; i < times; i++) {
await fn(i);
}
}
// number to big number
function n(number, decimals) {
number = number.toString().replaceAll(',', '');
const e = number.split('e');
const d = e[0].split('.');
return hardhat_1.ethers.parseUnits((e.length > 1
? e[1].startsWith('-')
? d[0].length > Math.abs(parseInt(e[1]))
? d[0].substring(0, d[0].length - Math.abs(parseInt(e[1])) - 1) + '.' + d[0].substring(d[0].length - Math.abs(parseInt(e[1])), d[0].length) + (d?.length > 1 ? d[1] : '')
: '0.' + '0'.repeat(Math.abs(parseInt(e[1])) - d[0].length) + d[0] + (d?.length > 1 ? d[1] : '')
: d.length > 1
? d[1].length > parseInt(e[1])
? d[0] + d[1].substring(0, d[1].length - parseInt(e[1])) + '.' + d[1].substring(d[1].length - parseInt(e[1]), d[1].length)
: d[0] + d[1] + '0'.repeat(parseInt(e[1]) - d[1].length)
: d[0] + '0'.repeat(parseInt(e[1]))
: number).substring(0, 18), decimals
? parseInt(decimals.toString())
: undefined);
}
// big number to number
function u(number, decimals) {
return parseFloat(decimals ? hardhat_1.ethers.formatUnits(number, decimals) : hardhat_1.ethers.formatUnits(number));
}
function f(n) {
return n?.toLocaleString();
}
// get address
function a(c, display) {
const result = (typeof c === 'number' && c == 0
? '0x0000000000000000000000000000000000000000'
: typeof c === 'string' && c.length === 42 && c.indexOf('x') === 1 && c !== ''
? c
: c?.address);
typeof result === 'string' && display && console.log(_('Address:', 13), result);
return result;
}
// spend time
async function t(n, u) {
if (typeof n === 'number') {
if (u) {
switch (u) {
case 'm': {
n *= 60;
break;
}
case 'h': {
n *= 3600;
break;
}
case 'd': {
n *= 86400;
break;
}
case 'w': {
n *= 86400 * 7;
}
case 'y': {
n *= 86400 * 365;
}
}
}
await hardhat_network_helpers_1.time.increase(n);
return n;
}
else if (n === 'now') {
return (0, ethers_1.toNumber)(BigInt(await hardhat_network_helpers_1.time.latest()));
}
return 0;
}
async function duration(start, display) {
const duration = (await t('now')) - (0, ethers_1.toNumber)(BigInt(start));
display &&
console.log(_('Duration:', 13), _(`${exports.font.bold(exports.color.yellow(duration))}`, 26), ' from ', _(`${exports.font.bold(exports.color.yellow(start))}`, 26), ' ', exports.color.lightGray('('), ft(duration), exports.color.lightGray(')'));
return duration;
}
// format time
function ft(n) {
n = (0, ethers_1.toNumber)(BigInt(n));
const format = ['Y', 'M', 'w', 'd', 'h', 'm', 's'];
const date = [
Math.floor(n / 31536000),
Math.floor((n % 31536000) / 2592000),
Math.floor((n % 2592000) / 604800),
Math.floor((n % 604800) / 86400),
Math.floor((n % 86400) / 3600),
Math.floor((n % 3600) / 60),
Math.floor(n % 60)
];
let check = false;
let start = 0;
let time = date.map((t, i) => {
if (!check && t !== 0) {
check = true;
start = i;
}
if (check) {
return `${exports.font.bold(start <= 4 && i > start && t < 10 ? `0${t}` : t)}${exports.color.lightGray(format[i])}`;
}
});
let result = time.join(' ');
return result
.substring(result[0] === ' ' ? 1 : 0, result.length)
.replaceAll(' ', '')
.replaceAll(' ', '');
}
async function revert(call, message, value) {
console.log(exports.color.lightGray(`-------------------------------------------------------------`));
try {
await (0, chai_1.expect)(call, message).to.be.reverted;
if (message && value)
console.warn(exports.font.bold(`${exports.color.lightGreen(`emit`)} ${exports.color.lightCyan(`Revert: ${message}(`)}${exports.color.lightWhite(value)}${exports.color.lightCyan(`)`)}`));
else if (message && !value)
console.warn(exports.font.bold(`${exports.color.lightGreen(`emit`)} ${exports.color.lightCyan(`Revert: ${message}`)}`));
else if (!message && !value)
console.warn(exports.font.bold(`${exports.color.lightGreen(`emit`)} ${exports.color.lightCyan(`Revert`)}`));
}
catch (e) {
if (message && value)
throw (0, console_1.error)(`${exports.font.bold(`${exports.color.red(`Wrong Revert: ${message}(`)}${exports.color.white(value)}${exports.color.red(`)`)}`)}${e ? `\n\n${exports.color.red(e)}` : ''}`);
else if (message && !value)
throw (0, console_1.error)(`${exports.font.bold(exports.color.red(`Wrong Revert: ${message}`))}${e ? exports.color.red(e) : ''}`);
else if (!message && !value)
throw (0, console_1.error)(`${exports.font.bold(exports.color.red(`Wrong Revert`))}${e ? exports.color.red(e) : ''}`);
}
console.log(exports.color.lightGray(`-------------------------------------------------------------`));
}
exports.font = {
bold: (msg) => `\x1b[1m${msg}\x1b[0m`
};
exports.color = {
black: (msg) => `\x1b[30m${msg}\x1b[39m`,
red: (msg) => `\x1b[31m${msg}\x1b[39m`,
green: (msg) => `\x1b[32m${msg}\x1b[39m`,
yellow: (msg) => `\x1b[33m${msg}\x1b[39m`,
blue: (msg) => `\x1b[34m${msg}\x1b[39m`,
magenta: (msg) => `\x1b[35m${msg}\x1b[39m`,
cyan: (msg) => `\x1b[36m${msg}\x1b[39m`,
white: (msg) => `\x1b[37m${msg}\x1b[39m`,
normal: (msg) => `\x1b[39m${msg}\x1b[39m`,
lightGray: (msg) => `\x1b[90m${msg}\x1b[39m`,
lightRed: (msg) => `\x1b[91m${msg}\x1b[39m`,
lightGreen: (msg) => `\x1b[92m${msg}\x1b[39m`,
lightYellow: (msg) => `\x1b[93m${msg}\x1b[39m`,
lightBlue: (msg) => `\x1b[94m${msg}\x1b[39m`,
lightMagenta: (msg) => `\x1b[95m${msg}\x1b[39m`,
lightCyan: (msg) => `\x1b[96m${msg}\x1b[39m`,
lightWhite: (msg) => `\x1b[97m${msg}\x1b[39m`
};
function _(x, s, d = 'l') {
const msg = x.toString();
const length = msg.length;
const gap = s <= length ? 0 : s - length;
let result = msg;
if (d === 'l') {
if (gap > 0)
result += ' '.repeat(gap);
}
else {
if (gap > 0)
result = ' '.repeat(gap) + result;
}
return result;
}
function result(result, message, option) {
if (result) {
console.log(exports.color.green(exports.font.bold('✓')), exports.color.green(` ${message || 'Success'}\n`));
option && (option[0] && Array.isArray(option)) ? option.map((o) => { console.log(exports.color.lightGray(' - ' + o), '\n'); }) : console.log(exports.color.lightGray(option));
}
else {
console.log(exports.color.red(exports.font.bold('❌')), exports.color.red(` ${message || 'Failure'}\n\n`), option && exports.color.lightGray(option), '\n');
}
}
function getMultiplier(size, leverage) {
const margin = size - leverage;
return size === 0 ? 0 : leverage === 0 ? 0 : size > margin ? size / margin : size;
}
function getNetworkName() {
const filter = ['.', '-', '_'];
const name = filter.map((f) => {
return hardhat_1.network.name.includes(f) ? hardhat_1.network.name.replaceAll(f, ' ') : hardhat_1.network.name;
})[0];
const capitalize = name
.split(' ')
.map((word) => word.substring(0, 1).toUpperCase() + word.substring(1, word.length).toLowerCase())[0];
return { name, capitalize };
}
function saveAddress(result) {
const n = getNetworkName();
const path = (process_1.env.DEPLOY_INFO_PATH || 'scripts/deploy/address') + '/' + n.name + '/';
const name = process_1.env.DEPLOY_INFO || 'deploy-info.json';
const file = `${path}/${name}`;
try {
(0, fs_1.writeFileSync)(file, JSON.stringify({ network: n.capitalize, contracts: result?.contracts ? { ...result?.contracts } : result }, null, 4));
}
catch (e) {
if (e?.toString().includes('no such file or directory')) {
(0, fs_1.mkdirSync)(path, { recursive: true });
saveAddress(result);
}
else if (e) {
console.error(e);
}
}
}
function addAddress(contract, address) {
const load = loadAddress();
saveAddress({ ...load?.contracts, [`${contract}`]: address });
}
function loadAddress() {
const n = getNetworkName();
const path = (process_1.env.DEPLOY_INFO_PATH || 'scripts/deploy/address') + '/' + n.name + '/';
const name = process_1.env.DEPLOY_INFO || 'deploy-info.json';
const file = `${path}/${name}`;
try {
return JSON.parse((0, fs_1.readFileSync)(file, 'utf8'));
}
catch {
return undefined;
}
}