您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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