You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import {JsonRpcProvider} from 'ethers'
  2. import { readFileSync, writeFileSync } from 'fs';
  3. let providerUtil: JsonRpcProvider = null;
  4. function getElapsed(time: number,lens: number = 1000): number {
  5. let elapsed = Date.now() - time;
  6. return elapsed / lens;
  7. //return Math.floor(elapsed/lens);
  8. }
  9. async function sleep(ms: number, message: string = '') {
  10. if(message != '') {
  11. console.log(message);
  12. }
  13. return new Promise((resolve) => {
  14. setTimeout(resolve, ms);
  15. });
  16. }
  17. function setProvider(provider: JsonRpcProvider) {
  18. providerUtil = provider;
  19. }
  20. async function checkReceipt(txids: any[], label: string = ''): Promise<boolean> {
  21. const now = Date.now();
  22. let counter = 0;
  23. if(label != '')
  24. console.log(`wait... ${label}`);
  25. let finCounter = 0;
  26. while(true) {
  27. for(let i = 0; i < txids.length; i++) {
  28. let txid = txids[i].txid;
  29. if(txids[i].finished) {
  30. continue;
  31. }
  32. const receipt = await providerUtil.send('eth_getTransactionReceipt',[txid]);
  33. if(receipt != null) {
  34. txids[i].finished = true;
  35. ++finCounter;
  36. if(receipt.status = 1) {
  37. // if(label != '') {
  38. // console.log(`${label} finished`);
  39. // }
  40. txids[i].status = true;
  41. } else {
  42. txids[i].status = false;
  43. }
  44. //console.log(receipt);
  45. }
  46. sleep(5)
  47. }
  48. //console.log(`finsounter = ${finCounter}`);
  49. if(finCounter == txids.length) {
  50. // console.log(`finCounter = ${finCounter}`);
  51. const elapsed = getElapsed(now,1000);
  52. console.log(`receipt check elapsed = ${elapsed}`);
  53. return true
  54. }
  55. counter++;
  56. if(counter > 300) {
  57. console.log(`Receipt check timed out ${finCounter}`);
  58. return false;
  59. }
  60. await sleep(50);
  61. }
  62. return false;
  63. }
  64. async function checkReceipt2(txids: Map<string,boolean>,startEndTx: string[], label: string = ''): Promise<Map<string,any>> {
  65. const now = Date.now();
  66. let counter = 0;
  67. if(label != '') {
  68. console.log(`${label}`);
  69. } else {
  70. console.log(`wait for txs is finished... `);
  71. }
  72. let returnMap = new Map<string,string>();
  73. const loop = 300;
  74. let finCounter = 0;
  75. let receipts = [];
  76. while(true) {
  77. receipts = [];
  78. //console.log(`size of sended tx... ${txids.size}`);
  79. if(txids.size == 0) {
  80. console.log('all tx finalized');
  81. return returnMap;
  82. }
  83. txids.forEach( (value: boolean, key: string) => {
  84. if(!value) {
  85. // console.log(key);
  86. const receipt = providerUtil.send('eth_getTransactionReceipt',[key]);
  87. receipts.push(receipt);
  88. }
  89. });
  90. let recs = await Promise.all(receipts);
  91. recs.forEach( res => {
  92. if(res != null) {
  93. //console.log(res.transactionHash);
  94. startEndTx.forEach(txid => {
  95. if(res.transactionHash == txid) {
  96. returnMap.set(txid,res.blockHash);
  97. }
  98. })
  99. txids.delete(res.transactionHash);
  100. }
  101. })
  102. counter++;
  103. if(counter > loop) {
  104. console.log(`Receipt check timed out ${finCounter}`);
  105. return returnMap;
  106. }
  107. await sleep(50);
  108. }
  109. return returnMap;
  110. }
  111. async function getBlockInfo(blockHash: string, verbose: boolean = true): Promise<any> {
  112. const info = await providerUtil.send('eth_getBlockByHash',[blockHash,verbose]);
  113. return info;
  114. }
  115. async function getNonce(addr: string): Promise<number> {
  116. const nonce = await providerUtil.getTransactionCount(addr);
  117. return nonce;
  118. }
  119. const DEPLOYMENTS_JSON_FILE = 'deployments.json';
  120. export function saveDeploymentAddresses(
  121. name: string,
  122. deployments: any,
  123. ) {
  124. const filename = name + '_' + DEPLOYMENTS_JSON_FILE;
  125. try {
  126. writeFileSync(filename, JSON.stringify(deployments, null, 2), 'utf-8');
  127. } catch (_) {
  128. console.log(`❕ no deployments file found with name ${filename}`);
  129. }
  130. }
  131. export function getDeploymentAddresses(name:string): any {
  132. const filename = name + '_' + DEPLOYMENTS_JSON_FILE;
  133. try {
  134. return JSON.parse(readFileSync(filename, 'utf-8'));
  135. } catch (_) {
  136. console.log(`❕ no deployments file found with name ${filename}`);
  137. return {};
  138. }
  139. }
  140. export {checkReceipt,checkReceipt2, sleep, getElapsed, setProvider,getBlockInfo,getNonce }