UNPKG

@coinmeca/ethers

Version:

Solidty helpers and utilities for using ethers.

253 lines (252 loc) 9.91 kB
"use strict"; 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; } }