@subql/node-ethereum 4.7.2 → 4.7.4-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +10 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/configure/SubqueryProject.d.ts +3 -3
  4. package/dist/configure/SubqueryProject.js +1 -4
  5. package/dist/configure/SubqueryProject.js.map +1 -1
  6. package/dist/ethereum/api.ethereum.d.ts +4 -3
  7. package/dist/ethereum/api.ethereum.js +18 -5
  8. package/dist/ethereum/api.ethereum.js.map +1 -1
  9. package/dist/ethereum/api.ethereum.test.js.map +1 -1
  10. package/dist/ethereum/api.service.ethereum.d.ts +1 -1
  11. package/dist/ethereum/api.service.ethereum.js +11 -1
  12. package/dist/ethereum/api.service.ethereum.js.map +1 -1
  13. package/dist/ethereum/block.ethereum.d.ts +1 -1
  14. package/dist/ethereum/block.ethereum.js.map +1 -1
  15. package/dist/ethereum/ethers/celo/celo-provider.d.ts +54 -54
  16. package/dist/ethereum/ethers/celo/celo-ws-provider.spec.js.map +1 -1
  17. package/dist/ethereum/ethers/json-rpc-batch-provider.d.ts +2 -2
  18. package/dist/ethereum/ethers/json-rpc-batch-provider.js +4 -4
  19. package/dist/ethereum/ethers/json-rpc-batch-provider.js.map +1 -1
  20. package/dist/ethereum/ethers/json-rpc-batch-provider.spec.js.map +1 -1
  21. package/dist/ethereum/ethers/json-rpc-provider.js +3 -3
  22. package/dist/ethereum/ethers/json-rpc-provider.js.map +1 -1
  23. package/dist/ethereum/ethers/op/op-provider.d.ts +72 -72
  24. package/dist/ethereum/ethers/op/op-provider.spec.js +2 -2
  25. package/dist/ethereum/ethers/op/op-provider.spec.js.map +1 -1
  26. package/dist/ethereum/ethers/web/geturl.js +17 -14
  27. package/dist/ethereum/ethers/web/geturl.js.map +1 -1
  28. package/dist/ethereum/ethers/web/index.d.ts +1 -1
  29. package/dist/ethereum/ethers/web/index.js +18 -16
  30. package/dist/ethereum/ethers/web/index.js.map +1 -1
  31. package/dist/ethereum/ethers/web/types.d.ts +1 -1
  32. package/dist/ethereum/ethers/web/types.js.map +1 -1
  33. package/dist/ethereum/utils.ethereum.d.ts +3 -3
  34. package/dist/ethereum/utils.ethereum.js +1 -1
  35. package/dist/ethereum/utils.ethereum.js.map +1 -1
  36. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +1 -1
  37. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
  38. package/dist/indexer/dictionary/v1/ethDictionaryV1.d.ts +2 -2
  39. package/dist/indexer/dictionary/v1/ethDictionaryV1.js +3 -1
  40. package/dist/indexer/dictionary/v1/ethDictionaryV1.js.map +1 -1
  41. package/dist/indexer/dictionary/v1/ethDictionaryV1.spec.js +1 -1
  42. package/dist/indexer/dictionary/v1/ethDictionaryV1.spec.js.map +1 -1
  43. package/dist/indexer/dictionary/v2/ethDictionaryV2.js +11 -6
  44. package/dist/indexer/dictionary/v2/ethDictionaryV2.js.map +1 -1
  45. package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js +2 -1
  46. package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js.map +1 -1
  47. package/dist/indexer/dictionary/v2/types.d.ts +1 -1
  48. package/dist/indexer/dictionary/v2/types.js.map +1 -1
  49. package/dist/indexer/dictionary/v2/utils.js +1 -3
  50. package/dist/indexer/dictionary/v2/utils.js.map +1 -1
  51. package/dist/indexer/dynamic-ds.service.js.map +1 -1
  52. package/dist/indexer/fetch.service.js +1 -1
  53. package/dist/indexer/fetch.service.js.map +1 -1
  54. package/dist/indexer/indexer.manager.js.map +1 -1
  55. package/dist/indexer/project.service.test.js.map +1 -1
  56. package/dist/indexer/unfinalizedBlocks.service.js +3 -0
  57. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
  58. package/dist/indexer/worker/worker.js.map +1 -1
  59. package/dist/init.js +1 -9
  60. package/dist/init.js.map +1 -1
  61. package/dist/meta/meta.controller.d.ts +12 -12
  62. package/dist/meta/meta.service.d.ts +2 -2
  63. package/dist/meta/meta.service.js +2 -2
  64. package/dist/meta/meta.service.js.map +1 -1
  65. package/dist/utils/string.d.ts +1 -1
  66. package/dist/utils/string.js.map +1 -1
  67. package/package.json +6 -5
@@ -31,7 +31,7 @@ export declare const CeloWsProvider: {
31
31
  disableCcipRead: boolean;
32
32
  _ready(): Promise<import("@ethersproject/providers").Network>;
33
33
  readonly ready: Promise<import("@ethersproject/providers").Network>;
34
- ccipReadFetch(tx: import("ethers").Transaction, calldata: string, urls: string[]): Promise<string>;
34
+ ccipReadFetch(tx: import("ethers").Transaction, calldata: string, urls: string[]): Promise<string | null>;
35
35
  _getInternalBlockNumber(maxAge: number): Promise<number>;
36
36
  poll(): Promise<void>;
37
37
  resetEventsBlock(blockNumber: number): void;
@@ -43,7 +43,7 @@ export declare const CeloWsProvider: {
43
43
  pollingInterval: number;
44
44
  _getFastBlockNumber(): Promise<number>;
45
45
  _setFastBlockNumber(blockNumber: number): void;
46
- waitForTransaction(transactionHash: string, confirmations?: number, timeout?: number): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
46
+ waitForTransaction(transactionHash: string, confirmations?: number | undefined, timeout?: number | undefined): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
47
47
  _waitForTransaction(transactionHash: string, confirmations: number, timeout: number, replaceable: {
48
48
  data: string;
49
49
  from: string;
@@ -54,19 +54,19 @@ export declare const CeloWsProvider: {
54
54
  }): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
55
55
  getBlockNumber(): Promise<number>;
56
56
  getGasPrice(): Promise<BigNumber>;
57
- getBalance(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<BigNumber>;
58
- getTransactionCount(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<number>;
59
- getCode(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
60
- getStorageAt(addressOrName: string | Promise<string>, position: import("ethers").BigNumberish | Promise<import("ethers").BigNumberish>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
61
- _wrapTransaction(tx: import("ethers").Transaction, hash?: string, startBlock?: number): import("@ethersproject/abstract-provider").TransactionResponse;
57
+ getBalance(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<BigNumber>;
58
+ getTransactionCount(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<number>;
59
+ getCode(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
60
+ getStorageAt(addressOrName: string | Promise<string>, position: import("ethers").BigNumberish | Promise<import("ethers").BigNumberish>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
61
+ _wrapTransaction(tx: import("ethers").Transaction, hash?: string | undefined, startBlock?: number | undefined): import("@ethersproject/abstract-provider").TransactionResponse;
62
62
  sendTransaction(signedTransaction: string | Promise<string>): Promise<import("@ethersproject/abstract-provider").TransactionResponse>;
63
63
  _getTransactionRequest(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>): Promise<import("ethers").Transaction>;
64
64
  _getFilter(filter: import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash | Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>): Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>;
65
65
  _call(transaction: import("@ethersproject/abstract-provider").TransactionRequest, blockTag: import("@ethersproject/abstract-provider").BlockTag, attempt: number): Promise<string>;
66
- call(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
66
+ call(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
67
67
  estimateGas(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>): Promise<BigNumber>;
68
68
  _getAddress(addressOrName: string | Promise<string>): Promise<string>;
69
- _getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>, includeTransactions?: boolean): Promise<import("@ethersproject/abstract-provider").Block | import("@ethersproject/abstract-provider").BlockWithTransactions>;
69
+ _getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>, includeTransactions?: boolean | undefined): Promise<import("@ethersproject/abstract-provider").Block | import("@ethersproject/abstract-provider").BlockWithTransactions>;
70
70
  getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").Block>;
71
71
  getBlockWithTransactions(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").BlockWithTransactions>;
72
72
  getTransaction(transactionHash: string | Promise<string>): Promise<import("@ethersproject/abstract-provider").TransactionResponse>;
@@ -74,11 +74,11 @@ export declare const CeloWsProvider: {
74
74
  getLogs(filter: import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash | Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>): Promise<import("@ethersproject/abstract-provider").Log[]>;
75
75
  getEtherPrice(): Promise<number>;
76
76
  _getBlockTag(blockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").BlockTag>;
77
- getResolver(name: string): Promise<import("@ethersproject/providers").Resolver>;
78
- _getResolver(name: string, operation?: string): Promise<string>;
79
- resolveName(name: string | Promise<string>): Promise<string>;
80
- lookupAddress(address: string | Promise<string>): Promise<string>;
81
- getAvatar(nameOrAddress: string): Promise<string>;
77
+ getResolver(name: string): Promise<import("@ethersproject/providers").Resolver | null>;
78
+ _getResolver(name: string, operation?: string | undefined): Promise<string>;
79
+ resolveName(name: string | Promise<string>): Promise<string | null>;
80
+ lookupAddress(address: string | Promise<string>): Promise<string | null>;
81
+ getAvatar(nameOrAddress: string): Promise<string | null>;
82
82
  perform(method: string, params: any): Promise<any>;
83
83
  _startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
84
84
  _stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
@@ -86,10 +86,10 @@ export declare const CeloWsProvider: {
86
86
  on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
87
87
  once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
88
88
  emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: any[]): boolean;
89
- listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
90
- listeners(eventName?: import("@ethersproject/abstract-provider").EventType): import("@ethersproject/abstract-provider").Listener[];
91
- off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
92
- removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
89
+ listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): number;
90
+ listeners(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): import("@ethersproject/abstract-provider").Listener[];
91
+ off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener | undefined): any;
92
+ removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): any;
93
93
  getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
94
94
  addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
95
95
  removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
@@ -124,7 +124,7 @@ export declare const CeloJsonRpcProvider: {
124
124
  disableCcipRead: boolean;
125
125
  _ready(): Promise<import("@ethersproject/providers").Network>;
126
126
  readonly ready: Promise<import("@ethersproject/providers").Network>;
127
- ccipReadFetch(tx: import("ethers").Transaction, calldata: string, urls: string[]): Promise<string>;
127
+ ccipReadFetch(tx: import("ethers").Transaction, calldata: string, urls: string[]): Promise<string | null>;
128
128
  _getInternalBlockNumber(maxAge: number): Promise<number>;
129
129
  poll(): Promise<void>;
130
130
  resetEventsBlock(blockNumber: number): void;
@@ -136,7 +136,7 @@ export declare const CeloJsonRpcProvider: {
136
136
  pollingInterval: number;
137
137
  _getFastBlockNumber(): Promise<number>;
138
138
  _setFastBlockNumber(blockNumber: number): void;
139
- waitForTransaction(transactionHash: string, confirmations?: number, timeout?: number): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
139
+ waitForTransaction(transactionHash: string, confirmations?: number | undefined, timeout?: number | undefined): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
140
140
  _waitForTransaction(transactionHash: string, confirmations: number, timeout: number, replaceable: {
141
141
  data: string;
142
142
  from: string;
@@ -147,19 +147,19 @@ export declare const CeloJsonRpcProvider: {
147
147
  }): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
148
148
  getBlockNumber(): Promise<number>;
149
149
  getGasPrice(): Promise<BigNumber>;
150
- getBalance(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<BigNumber>;
151
- getTransactionCount(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<number>;
152
- getCode(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
153
- getStorageAt(addressOrName: string | Promise<string>, position: import("ethers").BigNumberish | Promise<import("ethers").BigNumberish>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
154
- _wrapTransaction(tx: import("ethers").Transaction, hash?: string, startBlock?: number): import("@ethersproject/abstract-provider").TransactionResponse;
150
+ getBalance(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<BigNumber>;
151
+ getTransactionCount(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<number>;
152
+ getCode(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
153
+ getStorageAt(addressOrName: string | Promise<string>, position: import("ethers").BigNumberish | Promise<import("ethers").BigNumberish>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
154
+ _wrapTransaction(tx: import("ethers").Transaction, hash?: string | undefined, startBlock?: number | undefined): import("@ethersproject/abstract-provider").TransactionResponse;
155
155
  sendTransaction(signedTransaction: string | Promise<string>): Promise<import("@ethersproject/abstract-provider").TransactionResponse>;
156
156
  _getTransactionRequest(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>): Promise<import("ethers").Transaction>;
157
157
  _getFilter(filter: import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash | Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>): Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>;
158
158
  _call(transaction: import("@ethersproject/abstract-provider").TransactionRequest, blockTag: import("@ethersproject/abstract-provider").BlockTag, attempt: number): Promise<string>;
159
- call(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
159
+ call(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
160
160
  estimateGas(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>): Promise<BigNumber>;
161
161
  _getAddress(addressOrName: string | Promise<string>): Promise<string>;
162
- _getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>, includeTransactions?: boolean): Promise<import("@ethersproject/abstract-provider").Block | import("@ethersproject/abstract-provider").BlockWithTransactions>;
162
+ _getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>, includeTransactions?: boolean | undefined): Promise<import("@ethersproject/abstract-provider").Block | import("@ethersproject/abstract-provider").BlockWithTransactions>;
163
163
  getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").Block>;
164
164
  getBlockWithTransactions(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").BlockWithTransactions>;
165
165
  getTransaction(transactionHash: string | Promise<string>): Promise<import("@ethersproject/abstract-provider").TransactionResponse>;
@@ -167,11 +167,11 @@ export declare const CeloJsonRpcProvider: {
167
167
  getLogs(filter: import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash | Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>): Promise<import("@ethersproject/abstract-provider").Log[]>;
168
168
  getEtherPrice(): Promise<number>;
169
169
  _getBlockTag(blockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").BlockTag>;
170
- getResolver(name: string): Promise<import("@ethersproject/providers").Resolver>;
171
- _getResolver(name: string, operation?: string): Promise<string>;
172
- resolveName(name: string | Promise<string>): Promise<string>;
173
- lookupAddress(address: string | Promise<string>): Promise<string>;
174
- getAvatar(nameOrAddress: string): Promise<string>;
170
+ getResolver(name: string): Promise<import("@ethersproject/providers").Resolver | null>;
171
+ _getResolver(name: string, operation?: string | undefined): Promise<string>;
172
+ resolveName(name: string | Promise<string>): Promise<string | null>;
173
+ lookupAddress(address: string | Promise<string>): Promise<string | null>;
174
+ getAvatar(nameOrAddress: string): Promise<string | null>;
175
175
  perform(method: string, params: any): Promise<any>;
176
176
  _startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
177
177
  _stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
@@ -179,10 +179,10 @@ export declare const CeloJsonRpcProvider: {
179
179
  on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
180
180
  once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
181
181
  emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: any[]): boolean;
182
- listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
183
- listeners(eventName?: import("@ethersproject/abstract-provider").EventType): import("@ethersproject/abstract-provider").Listener[];
184
- off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
185
- removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
182
+ listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): number;
183
+ listeners(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): import("@ethersproject/abstract-provider").Listener[];
184
+ off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener | undefined): any;
185
+ removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): any;
186
186
  getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
187
187
  addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
188
188
  removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
@@ -217,7 +217,7 @@ export declare const CeloJsonRpcBatchProvider: {
217
217
  disableCcipRead: boolean;
218
218
  _ready(): Promise<import("@ethersproject/providers").Network>;
219
219
  readonly ready: Promise<import("@ethersproject/providers").Network>;
220
- ccipReadFetch(tx: import("ethers").Transaction, calldata: string, urls: string[]): Promise<string>;
220
+ ccipReadFetch(tx: import("ethers").Transaction, calldata: string, urls: string[]): Promise<string | null>;
221
221
  _getInternalBlockNumber(maxAge: number): Promise<number>;
222
222
  poll(): Promise<void>;
223
223
  resetEventsBlock(blockNumber: number): void;
@@ -229,7 +229,7 @@ export declare const CeloJsonRpcBatchProvider: {
229
229
  pollingInterval: number;
230
230
  _getFastBlockNumber(): Promise<number>;
231
231
  _setFastBlockNumber(blockNumber: number): void;
232
- waitForTransaction(transactionHash: string, confirmations?: number, timeout?: number): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
232
+ waitForTransaction(transactionHash: string, confirmations?: number | undefined, timeout?: number | undefined): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
233
233
  _waitForTransaction(transactionHash: string, confirmations: number, timeout: number, replaceable: {
234
234
  data: string;
235
235
  from: string;
@@ -240,19 +240,19 @@ export declare const CeloJsonRpcBatchProvider: {
240
240
  }): Promise<import("@ethersproject/abstract-provider").TransactionReceipt>;
241
241
  getBlockNumber(): Promise<number>;
242
242
  getGasPrice(): Promise<BigNumber>;
243
- getBalance(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<BigNumber>;
244
- getTransactionCount(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<number>;
245
- getCode(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
246
- getStorageAt(addressOrName: string | Promise<string>, position: import("ethers").BigNumberish | Promise<import("ethers").BigNumberish>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
247
- _wrapTransaction(tx: import("ethers").Transaction, hash?: string, startBlock?: number): import("@ethersproject/abstract-provider").TransactionResponse;
243
+ getBalance(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<BigNumber>;
244
+ getTransactionCount(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<number>;
245
+ getCode(addressOrName: string | Promise<string>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
246
+ getStorageAt(addressOrName: string | Promise<string>, position: import("ethers").BigNumberish | Promise<import("ethers").BigNumberish>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
247
+ _wrapTransaction(tx: import("ethers").Transaction, hash?: string | undefined, startBlock?: number | undefined): import("@ethersproject/abstract-provider").TransactionResponse;
248
248
  sendTransaction(signedTransaction: string | Promise<string>): Promise<import("@ethersproject/abstract-provider").TransactionResponse>;
249
249
  _getTransactionRequest(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>): Promise<import("ethers").Transaction>;
250
250
  _getFilter(filter: import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash | Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>): Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>;
251
251
  _call(transaction: import("@ethersproject/abstract-provider").TransactionRequest, blockTag: import("@ethersproject/abstract-provider").BlockTag, attempt: number): Promise<string>;
252
- call(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<string>;
252
+ call(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>, blockTag?: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag> | undefined): Promise<string>;
253
253
  estimateGas(transaction: import("@ethersproject/properties").Deferrable<import("@ethersproject/abstract-provider").TransactionRequest>): Promise<BigNumber>;
254
254
  _getAddress(addressOrName: string | Promise<string>): Promise<string>;
255
- _getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>, includeTransactions?: boolean): Promise<import("@ethersproject/abstract-provider").Block | import("@ethersproject/abstract-provider").BlockWithTransactions>;
255
+ _getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>, includeTransactions?: boolean | undefined): Promise<import("@ethersproject/abstract-provider").Block | import("@ethersproject/abstract-provider").BlockWithTransactions>;
256
256
  getBlock(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").Block>;
257
257
  getBlockWithTransactions(blockHashOrBlockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").BlockWithTransactions>;
258
258
  getTransaction(transactionHash: string | Promise<string>): Promise<import("@ethersproject/abstract-provider").TransactionResponse>;
@@ -260,11 +260,11 @@ export declare const CeloJsonRpcBatchProvider: {
260
260
  getLogs(filter: import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash | Promise<import("@ethersproject/abstract-provider").Filter | import("@ethersproject/abstract-provider").FilterByBlockHash>): Promise<import("@ethersproject/abstract-provider").Log[]>;
261
261
  getEtherPrice(): Promise<number>;
262
262
  _getBlockTag(blockTag: import("@ethersproject/abstract-provider").BlockTag | Promise<import("@ethersproject/abstract-provider").BlockTag>): Promise<import("@ethersproject/abstract-provider").BlockTag>;
263
- getResolver(name: string): Promise<import("@ethersproject/providers").Resolver>;
264
- _getResolver(name: string, operation?: string): Promise<string>;
265
- resolveName(name: string | Promise<string>): Promise<string>;
266
- lookupAddress(address: string | Promise<string>): Promise<string>;
267
- getAvatar(nameOrAddress: string): Promise<string>;
263
+ getResolver(name: string): Promise<import("@ethersproject/providers").Resolver | null>;
264
+ _getResolver(name: string, operation?: string | undefined): Promise<string>;
265
+ resolveName(name: string | Promise<string>): Promise<string | null>;
266
+ lookupAddress(address: string | Promise<string>): Promise<string | null>;
267
+ getAvatar(nameOrAddress: string): Promise<string | null>;
268
268
  perform(method: string, params: any): Promise<any>;
269
269
  _startEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
270
270
  _stopEvent(event: import("@ethersproject/providers/lib/base-provider").Event): void;
@@ -272,10 +272,10 @@ export declare const CeloJsonRpcBatchProvider: {
272
272
  on(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
273
273
  once(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): any;
274
274
  emit(eventName: import("@ethersproject/abstract-provider").EventType, ...args: any[]): boolean;
275
- listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType): number;
276
- listeners(eventName?: import("@ethersproject/abstract-provider").EventType): import("@ethersproject/abstract-provider").Listener[];
277
- off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener): any;
278
- removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType): any;
275
+ listenerCount(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): number;
276
+ listeners(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): import("@ethersproject/abstract-provider").Listener[];
277
+ off(eventName: import("@ethersproject/abstract-provider").EventType, listener?: import("@ethersproject/abstract-provider").Listener | undefined): any;
278
+ removeAllListeners(eventName?: import("@ethersproject/abstract-provider").EventType | undefined): any;
279
279
  getFeeData(): Promise<import("@ethersproject/abstract-provider").FeeData>;
280
280
  addListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
281
281
  removeListener(eventName: import("@ethersproject/abstract-provider").EventType, listener: import("@ethersproject/abstract-provider").Listener): import("@ethersproject/abstract-provider").Provider;
@@ -1 +1 @@
1
- {"version":3,"file":"celo-ws-provider.spec.js","sourceRoot":"","sources":["../../../../src/ethereum/ethers/celo/celo-ws-provider.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAGnC,mCAAqD;AACrD,yDAAmD;AACnD,mDAIyB;AAEzB,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,oDAAoD;IACpD,MAAM,SAAS,GAAG;QAChB,IAAI,8BAAc,CAAC,yBAAyB,CAAC;QAC7C,IAAI,mCAAmB,CAAC,aAAa,CAAC;QACtC,IAAI,wCAAwB,CAAC,aAAa,CAAC;KAC5C,CAAC;IACF,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAuB,EAAE,OAAO,EAAE,EAAE,CAAC,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,wDAAwD;IACxD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CACrB,6DAA6D,EAC7D,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,IAAA,4BAAW,EACvB,MAAM,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC1C,cAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC1B,IAAI;SACL,CAAC,CACH,CAAC;QACF,MAAM,CAAC,kBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAS,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAChB,gEAAgE,EAChE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,IAAA,4BAAW,EACvB,MAAM,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAC9D,CAAC;QACF,MAAM,CAAC,kBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,kBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC1E,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { WebSocketProvider } from '@ethersproject/providers';\nimport { BigNumber, constants, utils } from 'ethers';\nimport { formatBlock } from '../../utils.ethereum';\nimport {\n CeloJsonRpcBatchProvider,\n CeloJsonRpcProvider,\n CeloWsProvider,\n} from './celo-provider';\n\nconst HTTP_ENDPOINT = 'https://forno.celo.org';\nconst TEST_BLOCK = 16068684;\n\ndescribe('CeloRPCProviders', () => {\n // For some reason defining this in before all fails\n const providers = [\n new CeloWsProvider('wss://forno.celo.org/ws'),\n new CeloJsonRpcProvider(HTTP_ENDPOINT),\n new CeloJsonRpcBatchProvider(HTTP_ENDPOINT),\n ];\n afterAll(async () => {\n await Promise.all(\n providers.map((p) => (p as WebSocketProvider)?.destroy?.()),\n );\n });\n\n // This returns a value now, needs further investigation\n it.skip.each(providers)(\n 'should set gasLimit to zero for blocks before the hard fork',\n async (provider) => {\n const block = formatBlock(\n await provider.send('eth_getBlockByNumber', [\n utils.hexValue(TEST_BLOCK),\n true,\n ]),\n );\n expect(BigNumber.from(block.gasLimit)).toEqual(constants.Zero);\n },\n );\n\n it.each(providers)(\n 'should not set gasLimit to zero for blocks after the hard fork',\n async (provider) => {\n const block = formatBlock(\n await provider.send('eth_getBlockByNumber', ['latest', true]),\n );\n expect(BigNumber.from(block.gasLimit).gte(constants.Zero)).toBeTruthy();\n },\n );\n});\n"]}
1
+ {"version":3,"file":"celo-ws-provider.spec.js","sourceRoot":"","sources":["../../../../src/ethereum/ethers/celo/celo-ws-provider.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAGnC,mCAAqD;AACrD,yDAAmD;AACnD,mDAIyB;AAEzB,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,oDAAoD;IACpD,MAAM,SAAS,GAAG;QAChB,IAAI,8BAAc,CAAC,yBAAyB,CAAC;QAC7C,IAAI,mCAAmB,CAAC,aAAa,CAAC;QACtC,IAAI,wCAAwB,CAAC,aAAa,CAAC;KAC5C,CAAC;IACF,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,wDAAwD;IACxD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CACrB,6DAA6D,EAC7D,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,IAAA,4BAAW,EACvB,MAAM,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC1C,cAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC1B,IAAI;SACL,CAAC,CACH,CAAC;QACF,MAAM,CAAC,kBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAS,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAChB,gEAAgE,EAChE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,IAAA,4BAAW,EACvB,MAAM,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAC9D,CAAC;QACF,MAAM,CAAC,kBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,kBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC1E,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { WebSocketProvider } from '@ethersproject/providers';\nimport { BigNumber, constants, utils } from 'ethers';\nimport { formatBlock } from '../../utils.ethereum';\nimport {\n CeloJsonRpcBatchProvider,\n CeloJsonRpcProvider,\n CeloWsProvider,\n} from './celo-provider';\n\nconst HTTP_ENDPOINT = 'https://forno.celo.org';\nconst TEST_BLOCK = 16068684;\n\ndescribe('CeloRPCProviders', () => {\n // For some reason defining this in before all fails\n const providers = [\n new CeloWsProvider('wss://forno.celo.org/ws'),\n new CeloJsonRpcProvider(HTTP_ENDPOINT),\n new CeloJsonRpcBatchProvider(HTTP_ENDPOINT),\n ];\n afterAll(async () => {\n await Promise.all(providers.map((p) => (p as any)?.destroy?.()));\n });\n\n // This returns a value now, needs further investigation\n it.skip.each(providers)(\n 'should set gasLimit to zero for blocks before the hard fork',\n async (provider) => {\n const block = formatBlock(\n await provider.send('eth_getBlockByNumber', [\n utils.hexValue(TEST_BLOCK),\n true,\n ]),\n );\n expect(BigNumber.from(block.gasLimit)).toEqual(constants.Zero);\n },\n );\n\n it.each(providers)(\n 'should not set gasLimit to zero for blocks after the hard fork',\n async (provider) => {\n const block = formatBlock(\n await provider.send('eth_getBlockByNumber', ['latest', true]),\n );\n expect(BigNumber.from(block.gasLimit).gte(constants.Zero)).toBeTruthy();\n },\n );\n});\n"]}
@@ -7,7 +7,7 @@ export declare class JsonRpcBatchProvider extends JsonRpcProvider {
7
7
  private successfulBatchCount;
8
8
  private failedBatchCount;
9
9
  private batchSizeAdjustmentInterval;
10
- _pendingBatchAggregator: NodeJS.Timer;
10
+ _pendingBatchAggregator: NodeJS.Timer | null;
11
11
  _pendingBatch: Array<{
12
12
  request: {
13
13
  method: string;
@@ -17,7 +17,7 @@ export declare class JsonRpcBatchProvider extends JsonRpcProvider {
17
17
  };
18
18
  resolve: (result: any) => void;
19
19
  reject: (error: Error) => void;
20
- }>;
20
+ }> | null;
21
21
  _chainIdCache: string | null;
22
22
  constructor(url: string | ConnectionInfo, network?: Networkish);
23
23
  setBatchSize(batchSize: number): void;
@@ -13,8 +13,8 @@ class JsonRpcBatchProvider extends providers_1.JsonRpcProvider {
13
13
  successfulBatchCount = 0;
14
14
  failedBatchCount = 0;
15
15
  batchSizeAdjustmentInterval = 10; // Adjust batch size after every 10 batches
16
- _pendingBatchAggregator;
17
- _pendingBatch;
16
+ _pendingBatchAggregator = null;
17
+ _pendingBatch = null;
18
18
  _chainIdCache = null;
19
19
  constructor(url, network) {
20
20
  super(url, network);
@@ -61,7 +61,7 @@ class JsonRpcBatchProvider extends providers_1.JsonRpcProvider {
61
61
  runRequests() {
62
62
  // Get teh current batch and clear it, so new requests
63
63
  // go into the next batch
64
- const batch = this._pendingBatch;
64
+ const batch = this._pendingBatch ?? [];
65
65
  this._pendingBatch = null;
66
66
  this._pendingBatchAggregator = null;
67
67
  // Get the request as an array of requests
@@ -139,7 +139,7 @@ class JsonRpcBatchProvider extends providers_1.JsonRpcProvider {
139
139
  }
140
140
  else {
141
141
  if (inflightRequest.request.method === 'eth_chainId') {
142
- this._chainIdCache = payload.result;
142
+ this._chainIdCache = payload.result ?? null;
143
143
  }
144
144
  inflightRequest.resolve(payload.result);
145
145
  }
@@ -1 +1 @@
1
- {"version":3,"file":"json-rpc-batch-provider.js","sourceRoot":"","sources":["../../../src/ethereum/ethers/json-rpc-batch-provider.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable */\nimport { deepCopy } from '@ethersproject/properties';\n\nimport { JsonRpcProvider } from '@ethersproject/providers';\nimport { Networkish } from '@ethersproject/networks';\nimport { ConnectionInfo, fetchJson } from './web';\nimport { getLogger } from '@subql/node-core';\n\nconst logger = getLogger('JsonRpcBatchProvider');\n\ninterface RpcResult {\n jsonrpc: '2.0';\n id: number;\n result?: string;\n error?: {\n code: number;\n message: string;\n data?: any;\n };\n}\n\n// Experimental\n\nexport class JsonRpcBatchProvider extends JsonRpcProvider {\n private batchSize = 1;\n private successfulBatchCount = 0;\n private failedBatchCount = 0;\n private batchSizeAdjustmentInterval = 10; // Adjust batch size after every 10 batches\n\n _pendingBatchAggregator: NodeJS.Timer;\n _pendingBatch: Array<{\n request: { method: string; params: Array<any>; id: number; jsonrpc: '2.0' };\n resolve: (result: any) => void;\n reject: (error: Error) => void;\n }>;\n\n _chainIdCache: string | null = null;\n\n constructor(url: string | ConnectionInfo, network?: Networkish) {\n super(url, network);\n }\n\n setBatchSize(batchSize: number) {\n this.batchSize = batchSize;\n }\n\n send(method: string, params: Array<any>): Promise<any> {\n if (method === 'eth_chainId' && this._chainIdCache !== null) {\n return Promise.resolve(this._chainIdCache);\n }\n\n const request = {\n method: method,\n params: params,\n id: this._nextId++,\n jsonrpc: '2.0',\n };\n\n if (this._pendingBatch == null) {\n this._pendingBatch = [];\n }\n\n const inflightRequest: any = { request, resolve: null, reject: null };\n\n const promise = new Promise((resolve, reject) => {\n inflightRequest.resolve = resolve;\n inflightRequest.reject = reject;\n });\n\n this._pendingBatch.push(inflightRequest);\n\n if (!this._pendingBatchAggregator) {\n // Schedule batch for next event loop + short duration\n this._pendingBatchAggregator = setTimeout(() => {\n this.runRequests();\n }, 1);\n }\n\n if (this._pendingBatch.length > this.batchSize) {\n this.flush();\n }\n\n return promise;\n }\n\n flush(): void {\n if (this._pendingBatchAggregator) {\n clearTimeout(this._pendingBatchAggregator);\n this.runRequests();\n }\n }\n\n private runRequests() {\n // Get teh current batch and clear it, so new requests\n // go into the next batch\n const batch = this._pendingBatch;\n this._pendingBatch = null;\n this._pendingBatchAggregator = null;\n\n // Get the request as an array of requests\n const request = batch.map((inflight) => inflight.request);\n\n this.emit('debug', {\n action: 'requestBatch',\n request: deepCopy(request),\n provider: this,\n });\n\n return fetchJson(this.connection, JSON.stringify(request))\n .then((result: RpcResult[]) => {\n this.emit('debug', {\n action: 'response',\n request: request,\n response: result,\n provider: this,\n });\n\n // if (!Array.isArray(result)) {\n // result = [result];\n // }\n\n // https://github.com/ethers-io/ethers.js/pull/2657\n if (!Array.isArray(result)) {\n const error = new Error(\n 'Invalid response \\n' + JSON.stringify(result),\n );\n batch.forEach((inflightRequest) => {\n inflightRequest.reject(error);\n });\n if (\n (result as RpcResult).error?.message === 'Batch size is too large'\n ) {\n this.adjustBatchSize(false);\n }\n return;\n }\n\n // BSC returns a 200 response with this when being rate limited, we need a special case for it\n /*\n [\n {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32005,\n message: 'method eth_getLogs in batch triggered rate limit'\n }\n }\n ]\n */\n if (result.length === 1 && result[0].id === null) {\n batch.forEach((inflightRequest) => {\n inflightRequest.reject(new Error(result[0].error?.message));\n });\n this.adjustBatchSize(false);\n return;\n }\n\n const resultMap = result.reduce((resultMap, payload) => {\n resultMap[payload.id] = payload;\n return resultMap;\n }, {} as Record<number, RpcResult>);\n\n // For each result, feed it to the correct Promise, depending\n // on whether it was a success or error\n batch.forEach((inflightRequest) => {\n const payload = resultMap[inflightRequest.request.id];\n if (!payload) {\n inflightRequest.reject(\n new Error(\n `Missing payload in response for request ${inflightRequest.request.id}`,\n ),\n );\n } else if (payload.error) {\n const error = new Error(payload.error.message);\n (<any>error).code = payload.error.code;\n (<any>error).data = payload.error.data;\n if (\n payload.error.message === 'Batch size limit exceeded' || // onfinality\n payload.error.message === 'exceeded project rate limit' || // infura\n payload.error.message.includes(\n 'Failed to buffer the request body',\n ) ||\n payload.error.message.includes('Too Many Requests') ||\n payload.error.message.includes('Request Entity Too Large')\n ) {\n this.adjustBatchSize(false);\n }\n inflightRequest.reject(error);\n } else {\n if (inflightRequest.request.method === 'eth_chainId') {\n this._chainIdCache = payload.result;\n }\n inflightRequest.resolve(payload.result);\n }\n });\n\n this.adjustBatchSize(true);\n })\n .catch((error) => {\n this.emit('debug', {\n action: 'response',\n error: error,\n request: request,\n provider: this,\n });\n\n //logger.error(error);\n\n batch.forEach((inflightRequest) => {\n inflightRequest.reject(error);\n });\n\n //this.adjustBatchSize(false);\n });\n }\n\n private adjustBatchSize(success: boolean) {\n success ? this.successfulBatchCount++ : this.failedBatchCount++;\n const totalBatches = this.successfulBatchCount + this.failedBatchCount;\n\n if (totalBatches % this.batchSizeAdjustmentInterval === 0) {\n const successRate = this.successfulBatchCount / totalBatches;\n\n // Adjust the batch size based on the success rate.\n if (successRate < 0.9 && this.batchSize > 1) {\n this.batchSize--;\n } else if (successRate > 0.95 && this.batchSize < 10) {\n this.batchSize++;\n }\n\n // Reset the counters\n this.successfulBatchCount = 0;\n this.failedBatchCount = 0;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"json-rpc-batch-provider.js","sourceRoot":"","sources":["../../../src/ethereum/ethers/json-rpc-batch-provider.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable */\nimport { deepCopy } from '@ethersproject/properties';\n\nimport { JsonRpcProvider } from '@ethersproject/providers';\nimport { Networkish } from '@ethersproject/networks';\nimport { ConnectionInfo, fetchJson } from './web';\nimport { getLogger } from '@subql/node-core';\n\nconst logger = getLogger('JsonRpcBatchProvider');\n\ninterface RpcResult {\n jsonrpc: '2.0';\n id: number;\n result?: string;\n error?: {\n code: number;\n message: string;\n data?: any;\n };\n}\n\n// Experimental\n\nexport class JsonRpcBatchProvider extends JsonRpcProvider {\n private batchSize = 1;\n private successfulBatchCount = 0;\n private failedBatchCount = 0;\n private batchSizeAdjustmentInterval = 10; // Adjust batch size after every 10 batches\n\n _pendingBatchAggregator: NodeJS.Timer | null = null;\n _pendingBatch: Array<{\n request: { method: string; params: Array<any>; id: number; jsonrpc: '2.0' };\n resolve: (result: any) => void;\n reject: (error: Error) => void;\n }> | null = null;\n\n _chainIdCache: string | null = null;\n\n constructor(url: string | ConnectionInfo, network?: Networkish) {\n super(url, network);\n }\n\n setBatchSize(batchSize: number) {\n this.batchSize = batchSize;\n }\n\n send(method: string, params: Array<any>): Promise<any> {\n if (method === 'eth_chainId' && this._chainIdCache !== null) {\n return Promise.resolve(this._chainIdCache);\n }\n\n const request = {\n method: method,\n params: params,\n id: this._nextId++,\n jsonrpc: '2.0',\n };\n\n if (this._pendingBatch == null) {\n this._pendingBatch = [];\n }\n\n const inflightRequest: any = { request, resolve: null, reject: null };\n\n const promise = new Promise((resolve, reject) => {\n inflightRequest.resolve = resolve;\n inflightRequest.reject = reject;\n });\n\n this._pendingBatch.push(inflightRequest);\n\n if (!this._pendingBatchAggregator) {\n // Schedule batch for next event loop + short duration\n this._pendingBatchAggregator = setTimeout(() => {\n this.runRequests();\n }, 1);\n }\n\n if (this._pendingBatch.length > this.batchSize) {\n this.flush();\n }\n\n return promise;\n }\n\n flush(): void {\n if (this._pendingBatchAggregator) {\n clearTimeout(this._pendingBatchAggregator);\n this.runRequests();\n }\n }\n\n private runRequests() {\n // Get teh current batch and clear it, so new requests\n // go into the next batch\n const batch = this._pendingBatch ?? [];\n this._pendingBatch = null;\n this._pendingBatchAggregator = null;\n\n // Get the request as an array of requests\n const request = batch.map((inflight) => inflight.request);\n\n this.emit('debug', {\n action: 'requestBatch',\n request: deepCopy(request),\n provider: this,\n });\n\n return fetchJson(this.connection, JSON.stringify(request))\n .then((result: RpcResult[]) => {\n this.emit('debug', {\n action: 'response',\n request: request,\n response: result,\n provider: this,\n });\n\n // if (!Array.isArray(result)) {\n // result = [result];\n // }\n\n // https://github.com/ethers-io/ethers.js/pull/2657\n if (!Array.isArray(result)) {\n const error = new Error(\n 'Invalid response \\n' + JSON.stringify(result),\n );\n batch.forEach((inflightRequest) => {\n inflightRequest.reject(error);\n });\n if (\n (result as RpcResult).error?.message === 'Batch size is too large'\n ) {\n this.adjustBatchSize(false);\n }\n return;\n }\n\n // BSC returns a 200 response with this when being rate limited, we need a special case for it\n /*\n [\n {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32005,\n message: 'method eth_getLogs in batch triggered rate limit'\n }\n }\n ]\n */\n if (result.length === 1 && result[0].id === null) {\n batch.forEach((inflightRequest) => {\n inflightRequest.reject(new Error(result[0].error?.message));\n });\n this.adjustBatchSize(false);\n return;\n }\n\n const resultMap = result.reduce((resultMap, payload) => {\n resultMap[payload.id] = payload;\n return resultMap;\n }, {} as Record<number, RpcResult>);\n\n // For each result, feed it to the correct Promise, depending\n // on whether it was a success or error\n batch.forEach((inflightRequest) => {\n const payload = resultMap[inflightRequest.request.id];\n if (!payload) {\n inflightRequest.reject(\n new Error(\n `Missing payload in response for request ${inflightRequest.request.id}`,\n ),\n );\n } else if (payload.error) {\n const error = new Error(payload.error.message);\n (<any>error).code = payload.error.code;\n (<any>error).data = payload.error.data;\n if (\n payload.error.message === 'Batch size limit exceeded' || // onfinality\n payload.error.message === 'exceeded project rate limit' || // infura\n payload.error.message.includes(\n 'Failed to buffer the request body',\n ) ||\n payload.error.message.includes('Too Many Requests') ||\n payload.error.message.includes('Request Entity Too Large')\n ) {\n this.adjustBatchSize(false);\n }\n inflightRequest.reject(error);\n } else {\n if (inflightRequest.request.method === 'eth_chainId') {\n this._chainIdCache = payload.result ?? null;\n }\n inflightRequest.resolve(payload.result);\n }\n });\n\n this.adjustBatchSize(true);\n })\n .catch((error) => {\n this.emit('debug', {\n action: 'response',\n error: error,\n request: request,\n provider: this,\n });\n\n //logger.error(error);\n\n batch.forEach((inflightRequest) => {\n inflightRequest.reject(error);\n });\n\n //this.adjustBatchSize(false);\n });\n }\n\n private adjustBatchSize(success: boolean) {\n success ? this.successfulBatchCount++ : this.failedBatchCount++;\n const totalBatches = this.successfulBatchCount + this.failedBatchCount;\n\n if (totalBatches % this.batchSizeAdjustmentInterval === 0) {\n const successRate = this.successfulBatchCount / totalBatches;\n\n // Adjust the batch size based on the success rate.\n if (successRate < 0.9 && this.batchSize > 1) {\n this.batchSize--;\n } else if (successRate > 0.95 && this.batchSize < 10) {\n this.batchSize++;\n }\n\n // Reset the counters\n this.successfulBatchCount = 0;\n this.failedBatchCount = 0;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"json-rpc-batch-provider.spec.js","sourceRoot":"","sources":["../../../src/ethereum/ethers/json-rpc-batch-provider.spec.ts"],"names":[],"mappings":";;AAAA,oBAAoB;AACpB,uEAAiE;AAGjE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,aAAmC,CAAC;IACxC,IAAI,aAA+B,CAAC;IAEpC,UAAU,CAAC,GAAG,EAAE;QACd,qEAAqE;QACrE,aAAa,GAAG,IAAI,8CAAoB,CAAC,uBAAuB,CAAC,CAAC;QAElE,mFAAmF;QACnF,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,2CAA2C;QAC3C,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACnF,iDAAiD;QACjD,aAAa,CAAC,kBAAkB,CAC9B,KAAK,EAAE,UAA0B,EAAE,OAAe,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,KAAK;aACd,CAAC,CAAC,CAAC;QACN,CAAC,CACF,CAAC;QAEF,yEAAyE;QACzE,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACxB;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5B,gEAAgE;QAChE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEtD,kDAAkD;QAClD,aAAa,CAAC,kBAAkB,CAC9B,KAAK,EAAE,UAA0B,EAAE,OAAe,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,2BAA2B,EAAE;aAC9D,CAAC,CAAC,CAAC;QACN,CAAC,CACF,CAAC;QAEF,qEAAqE;QACrE,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACzD,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SACpC;QAED,IAAI;YACF,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;SACnC;QAAC,MAAM;YACN,eAAe;SAChB;QAED,gEAAgE;QAChE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable */\nimport { JsonRpcBatchProvider } from './json-rpc-batch-provider';\nimport { ConnectionInfo } from './web';\n\ndescribe('JsonRpcBatchProvider', () => {\n let batchProvider: JsonRpcBatchProvider;\n let fetchJsonMock: jest.SpyInstance;\n\n beforeEach(() => {\n // Create a new instance of the JsonRpcBatchProvider before each test\n batchProvider = new JsonRpcBatchProvider('http://localhost:8545');\n\n // Mock the fetchJson function from the ethers package to simulate server responses\n fetchJsonMock = jest.spyOn(require('./web'), 'fetchJson');\n });\n\n afterEach(() => {\n // Reset the fetchJson mock after each test\n fetchJsonMock.mockRestore();\n });\n\n test('adjustBatchSize properly adjusts batch size based on success rate', async () => {\n // Mock fetchJson to return a successful response\n fetchJsonMock.mockImplementation(\n async (connection: ConnectionInfo, payload: string) => {\n const requests = JSON.parse(payload);\n return requests.map((request: any) => ({\n id: request.id,\n jsonrpc: '2.0',\n result: '0x1',\n }));\n },\n );\n\n // Execute the send method multiple times to simulate successful requests\n const requestCount = 20;\n const promises = [];\n for (let i = 0; i < requestCount; i++) {\n const promise = batchProvider.send('eth_call', []);\n promises.push(promise);\n }\n await Promise.all(promises);\n\n // Check if the batch size has increased due to the success rate\n expect(batchProvider['batchSize']).toBeGreaterThan(1);\n\n // Now, mock fetchJson to return an error response\n fetchJsonMock.mockImplementation(\n async (connection: ConnectionInfo, payload: string) => {\n const requests = JSON.parse(payload);\n return requests.map((request: any) => ({\n id: request.id,\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Batch size limit exceeded' },\n }));\n },\n );\n\n // Execute the send method multiple times to simulate failed requests\n const failedPromises = [];\n for (let i = 0; i < requestCount + 10; i++) {\n const failedPromise = batchProvider.send('eth_call', []);\n failedPromises.push(failedPromise);\n }\n\n try {\n await Promise.all(failedPromises);\n } catch {\n // ignore error\n }\n\n // Check if the batch size has decreased due to the failure rate\n expect(batchProvider['batchSize']).toBeLessThan(2);\n });\n});\n"]}
1
+ {"version":3,"file":"json-rpc-batch-provider.spec.js","sourceRoot":"","sources":["../../../src/ethereum/ethers/json-rpc-batch-provider.spec.ts"],"names":[],"mappings":";;AAAA,oBAAoB;AACpB,uEAAiE;AAGjE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,aAAmC,CAAC;IACxC,IAAI,aAA+B,CAAC;IAEpC,UAAU,CAAC,GAAG,EAAE;QACd,qEAAqE;QACrE,aAAa,GAAG,IAAI,8CAAoB,CAAC,uBAAuB,CAAC,CAAC;QAElE,mFAAmF;QACnF,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,2CAA2C;QAC3C,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACnF,iDAAiD;QACjD,aAAa,CAAC,kBAAkB,CAC9B,KAAK,EAAE,UAA0B,EAAE,OAAe,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,KAAK;aACd,CAAC,CAAC,CAAC;QACN,CAAC,CACF,CAAC;QAEF,yEAAyE;QACzE,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACxB;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5B,gEAAgE;QAChE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEtD,kDAAkD;QAClD,aAAa,CAAC,kBAAkB,CAC9B,KAAK,EAAE,UAA0B,EAAE,OAAe,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,2BAA2B,EAAE;aAC9D,CAAC,CAAC,CAAC;QACN,CAAC,CACF,CAAC;QAEF,qEAAqE;QACrE,MAAM,cAAc,GAAmB,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACzD,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SACpC;QAED,IAAI;YACF,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;SACnC;QAAC,MAAM;YACN,eAAe;SAChB;QAED,gEAAgE;QAChE,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable */\nimport { JsonRpcBatchProvider } from './json-rpc-batch-provider';\nimport { ConnectionInfo } from './web';\n\ndescribe('JsonRpcBatchProvider', () => {\n let batchProvider: JsonRpcBatchProvider;\n let fetchJsonMock: jest.SpyInstance;\n\n beforeEach(() => {\n // Create a new instance of the JsonRpcBatchProvider before each test\n batchProvider = new JsonRpcBatchProvider('http://localhost:8545');\n\n // Mock the fetchJson function from the ethers package to simulate server responses\n fetchJsonMock = jest.spyOn(require('./web'), 'fetchJson');\n });\n\n afterEach(() => {\n // Reset the fetchJson mock after each test\n fetchJsonMock.mockRestore();\n });\n\n test('adjustBatchSize properly adjusts batch size based on success rate', async () => {\n // Mock fetchJson to return a successful response\n fetchJsonMock.mockImplementation(\n async (connection: ConnectionInfo, payload: string) => {\n const requests = JSON.parse(payload);\n return requests.map((request: any) => ({\n id: request.id,\n jsonrpc: '2.0',\n result: '0x1',\n }));\n },\n );\n\n // Execute the send method multiple times to simulate successful requests\n const requestCount = 20;\n const promises: Promise<any>[] = [];\n for (let i = 0; i < requestCount; i++) {\n const promise = batchProvider.send('eth_call', []);\n promises.push(promise);\n }\n await Promise.all(promises);\n\n // Check if the batch size has increased due to the success rate\n expect(batchProvider['batchSize']).toBeGreaterThan(1);\n\n // Now, mock fetchJson to return an error response\n fetchJsonMock.mockImplementation(\n async (connection: ConnectionInfo, payload: string) => {\n const requests = JSON.parse(payload);\n return requests.map((request: any) => ({\n id: request.id,\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Batch size limit exceeded' },\n }));\n },\n );\n\n // Execute the send method multiple times to simulate failed requests\n const failedPromises: Promise<any>[] = [];\n for (let i = 0; i < requestCount + 10; i++) {\n const failedPromise = batchProvider.send('eth_call', []);\n failedPromises.push(failedPromise);\n }\n\n try {\n await Promise.all(failedPromises);\n } catch {\n // ignore error\n }\n\n // Check if the batch size has decreased due to the failure rate\n expect(batchProvider['batchSize']).toBeLessThan(2);\n });\n});\n"]}
@@ -33,8 +33,8 @@ class JsonRpcProvider extends providers_1.JsonRpcProvider {
33
33
  });
34
34
  // We can expand this in the future to any call, but for now these
35
35
  // are the biggest wins and do not require any serializing parameters.
36
- const cache = ['eth_chainId', 'eth_blockNumber'].indexOf(method) >= 0;
37
- if (cache && this._cache[method]) {
36
+ const cache = ['eth_chainId', 'eth_blockNumber'].includes(method);
37
+ if (cache && !!this._cache[method]) {
38
38
  return this._cache[method];
39
39
  }
40
40
  const result = (0, web_1.fetchJson)(this.connection, JSON.stringify(request), getResult).then((result) => {
@@ -58,7 +58,7 @@ class JsonRpcProvider extends providers_1.JsonRpcProvider {
58
58
  if (cache) {
59
59
  this._cache[method] = result;
60
60
  setTimeout(() => {
61
- this._cache[method] = null;
61
+ delete this._cache[method];
62
62
  }, 0);
63
63
  }
64
64
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"json-rpc-provider.js","sourceRoot":"","sources":["../../../src/ethereum/ethers/json-rpc-provider.ts"],"names":[],"mappings":";;;AAAA,oBAAoB;AACpB,0DAAqD;AAErD,wDAAkF;AAElF,+BAAkD;AAElD,SAAS,SAAS,CAAC,OAGlB;IACC,IAAI,OAAO,CAAC,KAAK,EAAE;QACjB,iBAAiB;QACjB,MAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,MAAM,KAAK,CAAC;KACb;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,MAAa,eAAgB,SAAQ,2BAAmB;IACtD,YAAY,GAA4B,EAAE,OAAoB;QAC5D,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,MAAkB;QACrC,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,IAAA,qBAAQ,EAAC,OAAO,CAAC;YAC1B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,kEAAkE;QAClE,sEAAsE;QACtE,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAChC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC5B;QAED,MAAM,MAAM,GAAG,IAAA,eAAS,EACtB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,SAAS,CACV,CAAC,IAAI,CACJ,CAAC,MAAM,EAAE,EAAE;YACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC;QACd,CAAC,CACF,CAAC;QAEF,uDAAuD;QACvD,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAC7B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;SACP;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["/* eslint-disable */\nimport { deepCopy } from '@ethersproject/properties';\n\nimport { JsonRpcProvider as BaseJsonRpcProvider } from '@ethersproject/providers';\nimport { Networkish } from '@ethersproject/networks';\nimport { ConnectionInfo, fetchJson } from './web';\n\nfunction getResult(payload: {\n error?: { code?: number; data?: any; message?: string };\n result?: any;\n}): any {\n if (payload.error) {\n // @TODO: not any\n const error: any = new Error(payload.error.message);\n error.code = payload.error.code;\n error.data = payload.error.data;\n throw error;\n }\n\n return payload.result;\n}\n\nexport class JsonRpcProvider extends BaseJsonRpcProvider {\n constructor(url: string | ConnectionInfo, network?: Networkish) {\n super(url, network);\n }\n\n send(method: string, params: Array<any>): Promise<any> {\n const request = {\n method: method,\n params: params,\n id: this._nextId++,\n jsonrpc: '2.0',\n };\n\n this.emit('debug', {\n action: 'request',\n request: deepCopy(request),\n provider: this,\n });\n\n // We can expand this in the future to any call, but for now these\n // are the biggest wins and do not require any serializing parameters.\n const cache = ['eth_chainId', 'eth_blockNumber'].indexOf(method) >= 0;\n if (cache && this._cache[method]) {\n return this._cache[method];\n }\n\n const result = fetchJson(\n this.connection,\n JSON.stringify(request),\n getResult,\n ).then(\n (result) => {\n this.emit('debug', {\n action: 'response',\n request: request,\n response: result,\n provider: this,\n });\n\n return result;\n },\n (error) => {\n this.emit('debug', {\n action: 'response',\n error: error,\n request: request,\n provider: this,\n });\n\n throw error;\n },\n );\n\n // Cache the fetch, but clear it on the next event loop\n if (cache) {\n this._cache[method] = result;\n setTimeout(() => {\n this._cache[method] = null;\n }, 0);\n }\n\n return result;\n }\n}\n"]}
1
+ {"version":3,"file":"json-rpc-provider.js","sourceRoot":"","sources":["../../../src/ethereum/ethers/json-rpc-provider.ts"],"names":[],"mappings":";;;AAAA,oBAAoB;AACpB,0DAAqD;AAErD,wDAAkF;AAElF,+BAAkD;AAElD,SAAS,SAAS,CAAC,OAGlB;IACC,IAAI,OAAO,CAAC,KAAK,EAAE;QACjB,iBAAiB;QACjB,MAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,MAAM,KAAK,CAAC;KACb;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,MAAa,eAAgB,SAAQ,2BAAmB;IACtD,YAAY,GAA4B,EAAE,OAAoB;QAC5D,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,MAAkB;QACrC,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,IAAA,qBAAQ,EAAC,OAAO,CAAC;YAC1B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,kEAAkE;QAClE,sEAAsE;QACtE,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC5B;QAED,MAAM,MAAM,GAAG,IAAA,eAAS,EACtB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,SAAS,CACV,CAAC,IAAI,CACJ,CAAC,MAAM,EAAE,EAAE;YACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC;QACd,CAAC,CACF,CAAC;QAEF,uDAAuD;QACvD,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAC7B,UAAU,CAAC,GAAG,EAAE;gBACd,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;SACP;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["/* eslint-disable */\nimport { deepCopy } from '@ethersproject/properties';\n\nimport { JsonRpcProvider as BaseJsonRpcProvider } from '@ethersproject/providers';\nimport { Networkish } from '@ethersproject/networks';\nimport { ConnectionInfo, fetchJson } from './web';\n\nfunction getResult(payload: {\n error?: { code?: number; data?: any; message?: string };\n result?: any;\n}): any {\n if (payload.error) {\n // @TODO: not any\n const error: any = new Error(payload.error.message);\n error.code = payload.error.code;\n error.data = payload.error.data;\n throw error;\n }\n\n return payload.result;\n}\n\nexport class JsonRpcProvider extends BaseJsonRpcProvider {\n constructor(url: string | ConnectionInfo, network?: Networkish) {\n super(url, network);\n }\n\n send(method: string, params: Array<any>): Promise<any> {\n const request = {\n method: method,\n params: params,\n id: this._nextId++,\n jsonrpc: '2.0',\n };\n\n this.emit('debug', {\n action: 'request',\n request: deepCopy(request),\n provider: this,\n });\n\n // We can expand this in the future to any call, but for now these\n // are the biggest wins and do not require any serializing parameters.\n const cache = ['eth_chainId', 'eth_blockNumber'].includes(method);\n if (cache && !!this._cache[method]) {\n return this._cache[method];\n }\n\n const result = fetchJson(\n this.connection,\n JSON.stringify(request),\n getResult,\n ).then(\n (result) => {\n this.emit('debug', {\n action: 'response',\n request: request,\n response: result,\n provider: this,\n });\n\n return result;\n },\n (error) => {\n this.emit('debug', {\n action: 'response',\n error: error,\n request: request,\n provider: this,\n });\n\n throw error;\n },\n );\n\n // Cache the fetch, but clear it on the next event loop\n if (cache) {\n this._cache[method] = result;\n setTimeout(() => {\n delete this._cache[method];\n }, 0);\n }\n\n return result;\n }\n}\n"]}