import { formatEther } from 'ethers'; export function sleep(s: number) { return new Promise((resolve) => setTimeout(resolve, s)); } export function log(...args: any) { console.log(new Date().toLocaleString('chinese', { hour12: false }), ...args); } export function getDate(timeStamp: number) { return new Date(timeStamp * 1000).toLocaleDateString('chinese'); } export async function retry( fn: () => Promise, onError?: (error: Error) => void, retries = 10 ): Promise { let attempt = 0; while (attempt < retries) { try { return await fn(); } catch (error) { attempt++; if (attempt >= retries) { throw error; } const message = `retry ${attempt}, ${error}`; if (onError) { onError(new Error(message)); } else { log(message); } await sleep(3 * 1000); } } throw new Error('retry failed'); } export async function bathRun( fn: (list: U[]) => Promise, list: U[], max: number ): Promise { const promiseList: Promise[] = []; for (let i = 0; i < list.length; i += max) { promiseList.push(fn(list.slice(i, i + max))); } return await Promise.all(promiseList); } export function printProgressBar(current: number, total: number, ...args: any) { const percentage = (current / total) * 100; const filled = '='.repeat(Math.floor(percentage / 2)); const empty = ' '.repeat(50 - Math.floor(percentage / 2)); process.stdout.write( `\r${new Date().toLocaleString('chinese', { hour12: false })} [${filled}>${empty}] ${percentage.toFixed(2)}%, ${args}${percentage === 100 ? '\n' : ''}` ); } export function getArrayEnd(list: T[]) { return list[list.length - 1]; } export async function longSleep(s: number) { for (; s > 0; s -= 2147483) { if (s > 2147483) { await sleep(2147483 * 1000); } else { await sleep(s * 1000); } } } export function formatTimeStamp(timeStamp: number) { let day = parseInt((timeStamp / 60 / 60 / 24).toString()); let hour = parseInt(((timeStamp / 60 / 60) % 24).toString()); let min = parseInt(((timeStamp / 60) % 60).toString()); let sec = parseInt((timeStamp % 60).toString()); let str = day + ' d ' + hour + ' : ' + min + ' : ' + sec; return str; } export function logEther(amount: bigint, fixed: number) { return Number(formatEther(amount)).toFixed(fixed); } export function getTimeStamp() { return Math.floor(Date.now() / 1000); }