viem 0.3.0-main.20230411T230052 → 0.3.0-main.20230412T014743

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 (121) hide show
  1. package/dist/cjs/actions/public/createBlockFilter.js +5 -1
  2. package/dist/cjs/actions/public/createBlockFilter.js.map +1 -1
  3. package/dist/cjs/actions/public/createContractEventFilter.js +5 -0
  4. package/dist/cjs/actions/public/createContractEventFilter.js.map +1 -1
  5. package/dist/cjs/actions/public/createEventFilter.js +5 -0
  6. package/dist/cjs/actions/public/createEventFilter.js.map +1 -1
  7. package/dist/cjs/actions/public/createPendingTransactionFilter.js +5 -1
  8. package/dist/cjs/actions/public/createPendingTransactionFilter.js.map +1 -1
  9. package/dist/cjs/actions/public/getFilterChanges.js +2 -2
  10. package/dist/cjs/actions/public/getFilterChanges.js.map +1 -1
  11. package/dist/cjs/actions/public/getFilterLogs.js +2 -2
  12. package/dist/cjs/actions/public/getFilterLogs.js.map +1 -1
  13. package/dist/cjs/actions/public/uninstallFilter.js +2 -2
  14. package/dist/cjs/actions/public/uninstallFilter.js.map +1 -1
  15. package/dist/cjs/clients/transports/fallback.js +18 -1
  16. package/dist/cjs/clients/transports/fallback.js.map +1 -1
  17. package/dist/cjs/errors/base.js +27 -21
  18. package/dist/cjs/errors/base.js.map +1 -1
  19. package/dist/cjs/errors/index.js +27 -23
  20. package/dist/cjs/errors/index.js.map +1 -1
  21. package/dist/cjs/errors/request.js +50 -259
  22. package/dist/cjs/errors/request.js.map +1 -1
  23. package/dist/cjs/errors/rpc.js +271 -50
  24. package/dist/cjs/errors/rpc.js.map +1 -1
  25. package/dist/cjs/errors/version.js +1 -1
  26. package/dist/cjs/index.js +9 -5
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/utils/buildRequest.js +16 -1
  29. package/dist/cjs/utils/buildRequest.js.map +1 -1
  30. package/dist/cjs/utils/errors/getNodeError.js +28 -27
  31. package/dist/cjs/utils/errors/getNodeError.js.map +1 -1
  32. package/dist/cjs/utils/filters/createFilterRequestScope.js +14 -0
  33. package/dist/cjs/utils/filters/createFilterRequestScope.js.map +1 -0
  34. package/dist/cjs/utils/rpc.js +3 -3
  35. package/dist/cjs/utils/rpc.js.map +1 -1
  36. package/dist/esm/actions/public/createBlockFilter.js +5 -1
  37. package/dist/esm/actions/public/createBlockFilter.js.map +1 -1
  38. package/dist/esm/actions/public/createContractEventFilter.js +5 -0
  39. package/dist/esm/actions/public/createContractEventFilter.js.map +1 -1
  40. package/dist/esm/actions/public/createEventFilter.js +5 -0
  41. package/dist/esm/actions/public/createEventFilter.js.map +1 -1
  42. package/dist/esm/actions/public/createPendingTransactionFilter.js +5 -1
  43. package/dist/esm/actions/public/createPendingTransactionFilter.js.map +1 -1
  44. package/dist/esm/actions/public/getFilterChanges.js +2 -2
  45. package/dist/esm/actions/public/getFilterChanges.js.map +1 -1
  46. package/dist/esm/actions/public/getFilterLogs.js +2 -2
  47. package/dist/esm/actions/public/getFilterLogs.js.map +1 -1
  48. package/dist/esm/actions/public/uninstallFilter.js +2 -2
  49. package/dist/esm/actions/public/uninstallFilter.js.map +1 -1
  50. package/dist/esm/clients/transports/fallback.js +18 -1
  51. package/dist/esm/clients/transports/fallback.js.map +1 -1
  52. package/dist/esm/errors/base.js +27 -21
  53. package/dist/esm/errors/base.js.map +1 -1
  54. package/dist/esm/errors/index.js +4 -4
  55. package/dist/esm/errors/index.js.map +1 -1
  56. package/dist/esm/errors/request.js +45 -241
  57. package/dist/esm/errors/request.js.map +1 -1
  58. package/dist/esm/errors/rpc.js +249 -45
  59. package/dist/esm/errors/rpc.js.map +1 -1
  60. package/dist/esm/errors/version.js +1 -1
  61. package/dist/esm/index.js +1 -1
  62. package/dist/esm/index.js.map +1 -1
  63. package/dist/esm/utils/buildRequest.js +16 -1
  64. package/dist/esm/utils/buildRequest.js.map +1 -1
  65. package/dist/esm/utils/errors/getNodeError.js +3 -2
  66. package/dist/esm/utils/errors/getNodeError.js.map +1 -1
  67. package/dist/esm/utils/filters/createFilterRequestScope.js +10 -0
  68. package/dist/esm/utils/filters/createFilterRequestScope.js.map +1 -0
  69. package/dist/esm/utils/rpc.js +4 -4
  70. package/dist/esm/utils/rpc.js.map +1 -1
  71. package/dist/types/actions/public/createBlockFilter.d.ts.map +1 -1
  72. package/dist/types/actions/public/createContractEventFilter.d.ts.map +1 -1
  73. package/dist/types/actions/public/createEventFilter.d.ts.map +1 -1
  74. package/dist/types/actions/public/createPendingTransactionFilter.d.ts.map +1 -1
  75. package/dist/types/actions/public/getFilterChanges.d.ts +1 -1
  76. package/dist/types/actions/public/getFilterChanges.d.ts.map +1 -1
  77. package/dist/types/actions/public/getFilterLogs.d.ts +1 -1
  78. package/dist/types/actions/public/getFilterLogs.d.ts.map +1 -1
  79. package/dist/types/actions/public/uninstallFilter.d.ts +1 -1
  80. package/dist/types/actions/public/uninstallFilter.d.ts.map +1 -1
  81. package/dist/types/clients/transports/fallback.d.ts +14 -0
  82. package/dist/types/clients/transports/fallback.d.ts.map +1 -1
  83. package/dist/types/errors/base.d.ts +1 -0
  84. package/dist/types/errors/base.d.ts.map +1 -1
  85. package/dist/types/errors/index.d.ts +4 -4
  86. package/dist/types/errors/index.d.ts.map +1 -1
  87. package/dist/types/errors/request.d.ts +42 -80
  88. package/dist/types/errors/request.d.ts.map +1 -1
  89. package/dist/types/errors/rpc.d.ts +189 -43
  90. package/dist/types/errors/rpc.d.ts.map +1 -1
  91. package/dist/types/errors/version.d.ts +1 -1
  92. package/dist/types/index.d.ts +1 -1
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/types/types/filter.d.ts +2 -0
  95. package/dist/types/types/filter.d.ts.map +1 -1
  96. package/dist/types/utils/buildRequest.d.ts.map +1 -1
  97. package/dist/types/utils/errors/getNodeError.d.ts +1 -1
  98. package/dist/types/utils/errors/getNodeError.d.ts.map +1 -1
  99. package/dist/types/utils/filters/createFilterRequestScope.d.ts +16 -0
  100. package/dist/types/utils/filters/createFilterRequestScope.d.ts.map +1 -0
  101. package/dist/types/utils/rpc.d.ts.map +1 -1
  102. package/package.json +1 -1
  103. package/src/actions/public/createBlockFilter.ts +5 -1
  104. package/src/actions/public/createContractEventFilter.ts +6 -0
  105. package/src/actions/public/createEventFilter.ts +7 -0
  106. package/src/actions/public/createPendingTransactionFilter.ts +5 -1
  107. package/src/actions/public/getFilterChanges.ts +2 -2
  108. package/src/actions/public/getFilterLogs.ts +2 -2
  109. package/src/actions/public/uninstallFilter.ts +2 -2
  110. package/src/clients/transports/fallback.ts +46 -2
  111. package/src/errors/base.ts +6 -4
  112. package/src/errors/index.ts +15 -11
  113. package/src/errors/request.ts +82 -175
  114. package/src/errors/rpc.ts +355 -89
  115. package/src/errors/version.ts +1 -1
  116. package/src/index.ts +5 -1
  117. package/src/types/filter.ts +3 -0
  118. package/src/utils/buildRequest.ts +19 -1
  119. package/src/utils/errors/getNodeError.ts +2 -3
  120. package/src/utils/filters/createFilterRequestScope.ts +42 -0
  121. package/src/utils/rpc.ts +6 -4
package/src/errors/rpc.ts CHANGED
@@ -1,98 +1,364 @@
1
- import { stringify } from '../utils/index.js'
2
1
  import { BaseError } from './base.js'
3
- import { getUrl } from './utils.js'
4
-
5
- export class HttpRequestError extends BaseError {
6
- override name = 'HttpRequestError'
7
-
8
- body: { [key: string]: unknown }
9
- headers?: Headers
10
- status?: number
11
- url: string
12
-
13
- constructor({
14
- body,
15
- details,
16
- headers,
17
- status,
18
- url,
19
- }: {
20
- body: { [key: string]: unknown }
21
- details?: string
22
- headers?: Headers
23
- status?: number
24
- url: string
25
- }) {
26
- super('HTTP request failed.', {
27
- details,
28
- metaMessages: [
29
- status && `Status: ${status}`,
30
- `URL: ${getUrl(url)}`,
31
- `Request body: ${stringify(body)}`,
32
- ].filter(Boolean) as string[],
33
- })
34
- this.body = body
35
- this.headers = headers
36
- this.status = status
37
- this.url = url
38
- }
39
- }
40
-
41
- export class WebSocketRequestError extends BaseError {
42
- override name = 'WebSocketRequestError'
43
-
44
- constructor({
45
- body,
46
- details,
47
- url,
48
- }: {
49
- body: { [key: string]: unknown }
50
- details: string
51
- url: string
52
- }) {
53
- super('WebSocket request failed.', {
54
- details,
55
- metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],
56
- })
57
- }
2
+ import { RpcRequestError } from './request.js'
3
+
4
+ const unknownErrorCode = -1
5
+
6
+ type RpcErrorOptions = {
7
+ code?: number
8
+ docsPath?: string
9
+ metaMessages?: string[]
10
+ shortMessage: string
58
11
  }
59
12
 
13
+ /**
14
+ * Error subclass implementing JSON RPC 2.0 errors and Ethereum RPC errors per EIP-1474.
15
+ *
16
+ * - EIP https://eips.ethereum.org/EIPS/eip-1474
17
+ */
60
18
  export class RpcError extends BaseError {
61
19
  code: number
62
20
 
63
- override name = 'RpcError'
64
-
65
- constructor({
66
- body,
67
- error,
68
- url,
69
- }: {
70
- body: { [key: string]: unknown }
71
- error: { code: number; message: string }
72
- url: string
73
- }) {
74
- super('RPC Request failed.', {
75
- cause: error as any,
76
- details: error.message,
77
- metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],
78
- })
79
- this.code = error.code
80
- }
81
- }
82
-
83
- export class TimeoutError extends BaseError {
84
- override name = 'TimeoutError'
85
-
86
- constructor({
87
- body,
88
- url,
89
- }: {
90
- body: { [key: string]: unknown }
91
- url: string
92
- }) {
93
- super('The request took too long to respond.', {
94
- details: 'The request timed out.',
95
- metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],
21
+ constructor(
22
+ cause: Error,
23
+ {
24
+ code = unknownErrorCode,
25
+ docsPath,
26
+ metaMessages,
27
+ shortMessage,
28
+ }: RpcErrorOptions,
29
+ ) {
30
+ super(shortMessage, {
31
+ cause,
32
+ docsPath,
33
+ metaMessages:
34
+ metaMessages || (cause as { metaMessages?: string[] })?.metaMessages,
35
+ })
36
+ this.name = cause.name
37
+ this.code = cause instanceof RpcRequestError ? cause.code : code
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Error subclass implementing Ethereum Provider errors per EIP-1193.
43
+ *
44
+ * - EIP https://eips.ethereum.org/EIPS/eip-1193
45
+ */
46
+ export class ProviderRpcError<T = undefined> extends RpcError {
47
+ override name = 'ProviderRpcError'
48
+
49
+ data?: T
50
+
51
+ constructor(
52
+ cause: Error,
53
+ options: RpcErrorOptions & {
54
+ data?: T
55
+ },
56
+ ) {
57
+ super(cause, options)
58
+
59
+ this.data = options.data
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Subclass for a "Parse error" EIP-1474 error.
65
+ *
66
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
67
+ */
68
+ export class ParseRpcError extends RpcError {
69
+ override name = 'ParseRpcError'
70
+
71
+ constructor(cause: Error) {
72
+ super(cause, {
73
+ code: -32700,
74
+ shortMessage:
75
+ 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.',
76
+ })
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Subclass for a "Invalid request" EIP-1474 error.
82
+ *
83
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
84
+ */
85
+ export class InvalidRequestRpcError extends RpcError {
86
+ override name = 'InvalidRequestRpcError'
87
+
88
+ constructor(cause: Error) {
89
+ super(cause, {
90
+ code: -32600,
91
+ shortMessage: 'JSON is not a valid request object.',
92
+ })
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Subclass for a "Method not found" EIP-1474 error.
98
+ *
99
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
100
+ */
101
+ export class MethodNotFoundRpcError extends RpcError {
102
+ override name = 'MethodNotFoundRpcError'
103
+
104
+ constructor(cause: Error) {
105
+ super(cause, {
106
+ code: -32601,
107
+ shortMessage: 'The method does not exist / is not available.',
108
+ })
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Subclass for an "Invalid params" EIP-1474 error.
114
+ *
115
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
116
+ */
117
+ export class InvalidParamsRpcError extends RpcError {
118
+ override name = 'InvalidParamsRpcError'
119
+
120
+ constructor(cause: Error) {
121
+ super(cause, {
122
+ code: -32602,
123
+ shortMessage: [
124
+ 'Invalid parameters were provided to the RPC method.',
125
+ 'Double check you have provided the correct parameters.',
126
+ ].join('\n'),
127
+ })
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Subclass for an "Internal error" EIP-1474 error.
133
+ *
134
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
135
+ */
136
+ export class InternalRpcError extends RpcError {
137
+ override name = 'InternalRpcError'
138
+
139
+ constructor(cause: Error) {
140
+ super(cause, {
141
+ code: -32603,
142
+ shortMessage: 'An internal error was received.',
143
+ })
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Subclass for an "Invalid input" EIP-1474 error.
149
+ *
150
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
151
+ */
152
+ export class InvalidInputRpcError extends RpcError {
153
+ override name = 'InvalidInputRpcError'
154
+
155
+ constructor(cause: Error) {
156
+ super(cause, {
157
+ code: -32000,
158
+ shortMessage: [
159
+ 'Missing or invalid parameters.',
160
+ 'Double check you have provided the correct parameters.',
161
+ ].join('\n'),
162
+ })
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Subclass for a "Resource not found" EIP-1474 error.
168
+ *
169
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
170
+ */
171
+ export class ResourceNotFoundRpcError extends RpcError {
172
+ override name = 'ResourceNotFoundRpcError'
173
+
174
+ constructor(cause: Error) {
175
+ super(cause, {
176
+ code: -32001,
177
+ shortMessage: 'Requested resource not found.',
178
+ })
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Subclass for a "Resource unavailable" EIP-1474 error.
184
+ *
185
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
186
+ */
187
+ export class ResourceUnavailableRpcError extends RpcError {
188
+ override name = 'ResourceUnavailableRpcError'
189
+
190
+ constructor(cause: Error) {
191
+ super(cause, {
192
+ code: -32002,
193
+ shortMessage: 'Requested resource not available.',
194
+ })
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Subclass for a "Transaction rejected" EIP-1474 error.
200
+ *
201
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
202
+ */
203
+ export class TransactionRejectedRpcError extends RpcError {
204
+ override name = 'TransactionRejectedRpcError'
205
+
206
+ constructor(cause: Error) {
207
+ super(cause, { code: -32003, shortMessage: 'Transaction creation failed.' })
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Subclass for a "Method not supported" EIP-1474 error.
213
+ *
214
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
215
+ */
216
+ export class MethodNotSupportedRpcError extends RpcError {
217
+ override name = 'MethodNotSupportedRpcError'
218
+
219
+ constructor(cause: Error) {
220
+ super(cause, { code: -32004, shortMessage: 'Method is not implemented.' })
221
+ }
222
+ }
223
+
224
+ /**
225
+ * Subclass for a "Limit exceeded" EIP-1474 error.
226
+ *
227
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
228
+ */
229
+ export class LimitExceededRpcError extends RpcError {
230
+ override name = 'LimitExceededRpcError'
231
+
232
+ constructor(cause: Error) {
233
+ super(cause, {
234
+ code: -32005,
235
+ shortMessage: 'Request exceeds defined limit.',
236
+ })
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Subclass for a "JSON-RPC version not supported" EIP-1474 error.
242
+ *
243
+ * EIP https://eips.ethereum.org/EIPS/eip-1474#error-codes
244
+ */
245
+ export class JsonRpcVersionUnsupportedError extends RpcError {
246
+ override name = 'JsonRpcVersionUnsupportedError'
247
+
248
+ constructor(cause: Error) {
249
+ super(cause, {
250
+ code: -32006,
251
+ shortMessage: 'Version of JSON-RPC protocol is not supported.',
252
+ })
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Subclass for a "User Rejected Request" EIP-1193 error.
258
+ *
259
+ * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors
260
+ */
261
+ export class UserRejectedRequestError extends ProviderRpcError {
262
+ override name = 'UserRejectedRequestError'
263
+
264
+ constructor(cause: Error) {
265
+ super(cause, {
266
+ code: 4001,
267
+ shortMessage: 'User rejected the request.',
268
+ })
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Subclass for an "Unauthorized" EIP-1193 error.
274
+ *
275
+ * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors
276
+ */
277
+ export class UnauthorizedProviderError extends ProviderRpcError {
278
+ override name = 'UnauthorizedProviderError'
279
+
280
+ constructor(cause: Error) {
281
+ super(cause, {
282
+ code: 4100,
283
+ shortMessage:
284
+ 'The requested method and/or account has not been authorized by the user.',
285
+ })
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Subclass for an "Unsupported Method" EIP-1193 error.
291
+ *
292
+ * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors
293
+ */
294
+ export class UnsupportedProviderMethodError extends ProviderRpcError {
295
+ override name = 'UnsupportedProviderMethodError'
296
+
297
+ constructor(cause: Error) {
298
+ super(cause, {
299
+ code: 4200,
300
+ shortMessage: 'The Provider does not support the requested method.',
301
+ })
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Subclass for an "Disconnected" EIP-1193 error.
307
+ *
308
+ * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors
309
+ */
310
+ export class ProviderDisconnectedError extends ProviderRpcError {
311
+ override name = 'ProviderDisconnectedError'
312
+
313
+ constructor(cause: Error) {
314
+ super(cause, {
315
+ code: 4900,
316
+ shortMessage: 'The Provider is disconnected from all chains.',
317
+ })
318
+ }
319
+ }
320
+
321
+ /**
322
+ * Subclass for an "Chain Disconnected" EIP-1193 error.
323
+ *
324
+ * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors
325
+ */
326
+ export class ChainDisconnectedError extends ProviderRpcError {
327
+ override name = 'ChainDisconnectedError'
328
+
329
+ constructor(cause: Error) {
330
+ super(cause, {
331
+ code: 4901,
332
+ shortMessage: 'The Provider is not connected to the requested chain.',
333
+ })
334
+ }
335
+ }
336
+
337
+ /**
338
+ * Subclass for an "Switch Chain" EIP-1193 error.
339
+ *
340
+ * EIP https://eips.ethereum.org/EIPS/eip-1193#provider-errors
341
+ */
342
+ export class SwitchChainError extends ProviderRpcError {
343
+ override name = 'SwitchChainError'
344
+
345
+ constructor(cause: Error) {
346
+ super(cause, {
347
+ code: 4902,
348
+ shortMessage: 'An error occurred when attempting to switch chain.',
349
+ })
350
+ }
351
+ }
352
+
353
+ /**
354
+ * Subclass for an unknown RPC error.
355
+ */
356
+ export class UnknownRpcError extends RpcError {
357
+ override name = 'UnknownRpcError'
358
+
359
+ constructor(cause: Error) {
360
+ super(cause, {
361
+ shortMessage: 'An unknown RPC error occurred.',
96
362
  })
97
363
  }
98
364
  }
@@ -1 +1 @@
1
- export const version = '0.3.0-main.20230411T230052'
1
+ export const version = '0.3.0-main.20230412T014743'
package/src/index.ts CHANGED
@@ -180,6 +180,7 @@ export {
180
180
  BaseError,
181
181
  BlockNotFoundError,
182
182
  CallExecutionError,
183
+ ChainDisconnectedError,
183
184
  ChainDoesNotSupportContract,
184
185
  ContractFunctionExecutionError,
185
186
  ContractFunctionRevertedError,
@@ -220,8 +221,9 @@ export {
220
221
  NonceTooLowError,
221
222
  OffsetOutOfBoundsError,
222
223
  ParseRpcError,
224
+ ProviderDisconnectedError,
225
+ ProviderRpcError,
223
226
  RawContractError,
224
- RequestError,
225
227
  ResourceNotFoundRpcError,
226
228
  ResourceUnavailableRpcError,
227
229
  RpcError,
@@ -235,7 +237,9 @@ export {
235
237
  TransactionReceiptNotFoundError,
236
238
  TransactionRejectedRpcError,
237
239
  SwitchChainError,
240
+ UnauthorizedProviderError,
238
241
  UnknownRpcError,
242
+ UnsupportedProviderMethodError,
239
243
  UrlRequiredError,
240
244
  UserRejectedRequestError,
241
245
  WaitForTransactionReceiptTimeoutError,
@@ -1,6 +1,7 @@
1
1
  import type { Abi } from 'abitype'
2
2
  import type { MaybeExtractEventArgsFromAbi } from './contract.js'
3
3
  import type { Hex } from './misc.js'
4
+ import type { Requests } from './eip1193.js'
4
5
 
5
6
  export type FilterType = 'transaction' | 'block' | 'event'
6
7
 
@@ -13,6 +14,8 @@ export type Filter<
13
14
  | undefined = MaybeExtractEventArgsFromAbi<TAbi, TEventName>,
14
15
  > = {
15
16
  id: Hex
17
+ // TODO: Narrow `request` to filter-based methods (ie. `eth_getFilterLogs`, etc).
18
+ request: Requests['request']
16
19
  type: TFilterType
17
20
  } & (TFilterType extends 'event'
18
21
  ? TAbi extends Abi
@@ -18,10 +18,23 @@ import {
18
18
  UnknownRpcError,
19
19
  UserRejectedRequestError,
20
20
  } from '../errors/index.js'
21
+ import {
22
+ ChainDisconnectedError,
23
+ ProviderDisconnectedError,
24
+ UnauthorizedProviderError,
25
+ UnsupportedProviderMethodError,
26
+ } from '../errors/rpc.js'
21
27
  import { withRetry } from './promise/index.js'
22
28
 
23
29
  export const isDeterministicError = (error: Error) => {
24
- if ('code' in error) return error.code !== -32603 && error.code !== -32005
30
+ if ('code' in error)
31
+ return (
32
+ error.code !== -1 &&
33
+ error.code !== -32004 &&
34
+ error.code !== -32005 &&
35
+ error.code !== -32042 &&
36
+ error.code !== -32603
37
+ )
25
38
  if (error instanceof HttpRequestError && error.status)
26
39
  return (
27
40
  error.status !== 408 &&
@@ -66,7 +79,12 @@ export function buildRequest<TRequest extends (args: any) => Promise<any>>(
66
79
  if (err.code === -32004) throw new MethodNotSupportedRpcError(err)
67
80
  if (err.code === -32005) throw new LimitExceededRpcError(err)
68
81
  if (err.code === -32006) throw new JsonRpcVersionUnsupportedError(err)
82
+ if (err.code === -32042) throw new MethodNotSupportedRpcError(err)
69
83
  if (err.code === 4001) throw new UserRejectedRequestError(err)
84
+ if (err.code === 4100) throw new UnauthorizedProviderError(err)
85
+ if (err.code === 4200) throw new UnsupportedProviderMethodError(err)
86
+ if (err.code === 4900) throw new ProviderDisconnectedError(err)
87
+ if (err.code === 4901) throw new ChainDisconnectedError(err)
70
88
  if (err.code === 4902) throw new SwitchChainError(err)
71
89
  if (err_ instanceof BaseError) throw err_
72
90
  throw new UnknownRpcError(err as Error)
@@ -1,5 +1,5 @@
1
1
  import type { SendTransactionParameters } from '../../actions/index.js'
2
- import type { BaseError } from '../../errors/index.js'
2
+ import { RpcRequestError, type BaseError } from '../../errors/index.js'
3
3
  import {
4
4
  ExecutionRevertedError,
5
5
  FeeCapTooHighError,
@@ -11,7 +11,6 @@ import {
11
11
  NonceMaxValueError,
12
12
  NonceTooHighError,
13
13
  NonceTooLowError,
14
- RpcError,
15
14
  TipAboveFeeCapError,
16
15
  TransactionRejectedRpcError,
17
16
  TransactionTypeNotSupportedError,
@@ -22,7 +21,7 @@ export function containsNodeError(err: BaseError) {
22
21
  return (
23
22
  err instanceof TransactionRejectedRpcError ||
24
23
  err instanceof InvalidInputRpcError ||
25
- (err instanceof RpcError && err.code === ExecutionRevertedError.code)
24
+ (err instanceof RpcRequestError && err.code === ExecutionRevertedError.code)
26
25
  )
27
26
  }
28
27
 
@@ -0,0 +1,42 @@
1
+ import type { Chain } from '../../chains.js'
2
+ import type { PublicClient, Transport } from '../../clients/index.js'
3
+ import type { OnResponseFn } from '../../clients/transports/fallback.js'
4
+ import type { Requests } from '../../types/eip1193.js'
5
+ import type { Hex } from '../../types/index.js'
6
+
7
+ type CreateFilterRequestScopeParameters = {
8
+ method:
9
+ | 'eth_newFilter'
10
+ | 'eth_newPendingTransactionFilter'
11
+ | 'eth_newBlockFilter'
12
+ }
13
+ // TODO: Narrow `request` to filter-based methods (ie. `eth_getFilterLogs`, etc).
14
+ type CreateFilterRequestScopeReturnType = (id: Hex) => Requests['request']
15
+
16
+ /**
17
+ * Scopes `request` to the filter ID. If the client is a fallback, it will
18
+ * listen for responses and scope the child transport `request` function
19
+ * to the successful filter ID.
20
+ */
21
+ export function createFilterRequestScope<TChain extends Chain | undefined>(
22
+ client: PublicClient<Transport, TChain>,
23
+ { method }: CreateFilterRequestScopeParameters,
24
+ ): CreateFilterRequestScopeReturnType {
25
+ const requestMap: Record<Hex, PublicClient<Transport, TChain>['request']> = {}
26
+
27
+ if (client.transport.type === 'fallback')
28
+ client.transport.onResponse?.(
29
+ ({
30
+ method: method_,
31
+ response: id,
32
+ status,
33
+ transport,
34
+ }: Parameters<OnResponseFn>[0]) => {
35
+ if (status === 'success' && method === method_)
36
+ requestMap[id as Hex] = transport.request
37
+ },
38
+ )
39
+
40
+ return ((id) =>
41
+ requestMap[id] || client.request) as CreateFilterRequestScopeReturnType
42
+ }
package/src/utils/rpc.ts CHANGED
@@ -2,7 +2,7 @@ import WebSocket from 'isomorphic-ws'
2
2
  import type { MessageEvent } from 'isomorphic-ws'
3
3
  import {
4
4
  HttpRequestError,
5
- RpcError,
5
+ RpcRequestError,
6
6
  TimeoutError,
7
7
  WebSocketRequestError,
8
8
  } from '../errors/index.js'
@@ -107,12 +107,12 @@ async function http(
107
107
  }
108
108
 
109
109
  if (data.error) {
110
- throw new RpcError({ body, error: data.error, url })
110
+ throw new RpcRequestError({ body, error: data.error, url })
111
111
  }
112
112
  return data as RpcResponse
113
113
  } catch (err) {
114
114
  if (err instanceof HttpRequestError) throw err
115
- if (err instanceof RpcError) throw err
115
+ if (err instanceof RpcRequestError) throw err
116
116
  if (err instanceof TimeoutError) throw err
117
117
  throw new HttpRequestError({
118
118
  body,
@@ -224,7 +224,9 @@ function webSocket(
224
224
  if (typeof message.id === 'number' && id_ !== message.id) return
225
225
 
226
226
  if (message.error) {
227
- onError?.(new RpcError({ body, error: message.error, url: socket.url }))
227
+ onError?.(
228
+ new RpcRequestError({ body, error: message.error, url: socket.url }),
229
+ )
228
230
  } else {
229
231
  onData?.(message)
230
232
  }