import {JsonRpcProvider} from 'ethers' import { readFileSync, writeFileSync } from 'fs'; let providerUtil: JsonRpcProvider = null; function getElapsed(time: number,lens: number = 1000): number { let elapsed = Date.now() - time; return elapsed / lens; //return Math.floor(elapsed/lens); } async function sleep(ms: number, message: string = 'wait..... ') { //console.log(message); return new Promise((resolve) => { setTimeout(resolve, ms); }); } function setProvider(provider: JsonRpcProvider) { providerUtil = provider; } async function checkReceipt(txids: any[], label: string = ''): Promise { const now = Date.now(); let counter = 0; if(label != '') console.log(`wait... ${label}`); let finCounter = 0; while(true) { for(let i = 0; i < txids.length; i++) { let txid = txids[i].txid; if(txids[i].finished) { continue; } const receipt = await providerUtil.send('eth_getTransactionReceipt',[txid]); if(receipt != null) { txids[i].finished = true; ++finCounter; if(receipt.status = 1) { // if(label != '') { // console.log(`${label} finished`); // } txids[i].status = true; } else { txids[i].status = false; } //console.log(receipt); } sleep(5) } //console.log(`finsounter = ${finCounter}`); if(finCounter == txids.length) { // console.log(`finCounter = ${finCounter}`); const elapsed = getElapsed(now,1000); console.log(`receipt check elapsed = ${elapsed}`); return true } counter++; if(counter > 300) { console.log(`Receipt check timed out ${finCounter}`); return false; } await sleep(50); } return false; } async function checkReceipt2(txids: Map,startEndTx: string[], label: string = ''): Promise> { const now = Date.now(); let counter = 0; if(label != '') { console.log(`${label}`); } else { console.log(`wait for txs is finished... `); } let returnMap = new Map(); const loop = 300; let finCounter = 0; let receipts = []; while(true) { receipts = []; //console.log(`size of sended tx... ${txids.size}`); if(txids.size == 0) { console.log('all tx finalized'); return returnMap; } txids.forEach( (value: boolean, key: string) => { if(!value) { // console.log(key); const receipt = providerUtil.send('eth_getTransactionReceipt',[key]); receipts.push(receipt); } }); let recs = await Promise.all(receipts); recs.forEach( res => { if(res != null) { //console.log(res.transactionHash); startEndTx.forEach(txid => { if(res.transactionHash == txid) { returnMap.set(txid,res.blockHash); } }) txids.delete(res.transactionHash); } }) counter++; if(counter > loop) { console.log(`Receipt check timed out ${finCounter}`); return returnMap; } await sleep(50); } return returnMap; } async function getBlockInfo(blockHash: string, verbose: boolean = true): Promise { const info = await providerUtil.send('eth_getBlockByHash',[blockHash,verbose]); return info; } async function getNonce(addr: string): Promise { const nonce = await providerUtil.getTransactionCount(addr); return nonce; } const DEPLOYMENTS_JSON_FILE = 'deployments.json'; export function saveDeploymentAddresses( name: string, deployments: any, ) { const filename = name + '_' + DEPLOYMENTS_JSON_FILE; try { writeFileSync(filename, JSON.stringify(deployments, null, 2), 'utf-8'); } catch (_) { console.log(`❕ no deployments file found with name ${filename}`); } } export function getDeploymentAddresses(name:string): any { const filename = name + '_' + DEPLOYMENTS_JSON_FILE; try { return JSON.parse(readFileSync(filename, 'utf-8')); } catch (_) { console.log(`❕ no deployments file found with name ${filename}`); return {}; } } export {checkReceipt,checkReceipt2, sleep, getElapsed, setProvider,getBlockInfo,getNonce }