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.
- package/dist/cjs/actions/public/createBlockFilter.js +5 -1
- package/dist/cjs/actions/public/createBlockFilter.js.map +1 -1
- package/dist/cjs/actions/public/createContractEventFilter.js +5 -0
- package/dist/cjs/actions/public/createContractEventFilter.js.map +1 -1
- package/dist/cjs/actions/public/createEventFilter.js +5 -0
- package/dist/cjs/actions/public/createEventFilter.js.map +1 -1
- package/dist/cjs/actions/public/createPendingTransactionFilter.js +5 -1
- package/dist/cjs/actions/public/createPendingTransactionFilter.js.map +1 -1
- package/dist/cjs/actions/public/getFilterChanges.js +2 -2
- package/dist/cjs/actions/public/getFilterChanges.js.map +1 -1
- package/dist/cjs/actions/public/getFilterLogs.js +2 -2
- package/dist/cjs/actions/public/getFilterLogs.js.map +1 -1
- package/dist/cjs/actions/public/uninstallFilter.js +2 -2
- package/dist/cjs/actions/public/uninstallFilter.js.map +1 -1
- package/dist/cjs/clients/transports/fallback.js +18 -1
- package/dist/cjs/clients/transports/fallback.js.map +1 -1
- package/dist/cjs/errors/base.js +27 -21
- package/dist/cjs/errors/base.js.map +1 -1
- package/dist/cjs/errors/index.js +27 -23
- package/dist/cjs/errors/index.js.map +1 -1
- package/dist/cjs/errors/request.js +50 -259
- package/dist/cjs/errors/request.js.map +1 -1
- package/dist/cjs/errors/rpc.js +271 -50
- package/dist/cjs/errors/rpc.js.map +1 -1
- package/dist/cjs/errors/version.js +1 -1
- package/dist/cjs/index.js +9 -5
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/buildRequest.js +16 -1
- package/dist/cjs/utils/buildRequest.js.map +1 -1
- package/dist/cjs/utils/errors/getNodeError.js +28 -27
- package/dist/cjs/utils/errors/getNodeError.js.map +1 -1
- package/dist/cjs/utils/filters/createFilterRequestScope.js +14 -0
- package/dist/cjs/utils/filters/createFilterRequestScope.js.map +1 -0
- package/dist/cjs/utils/rpc.js +3 -3
- package/dist/cjs/utils/rpc.js.map +1 -1
- package/dist/esm/actions/public/createBlockFilter.js +5 -1
- package/dist/esm/actions/public/createBlockFilter.js.map +1 -1
- package/dist/esm/actions/public/createContractEventFilter.js +5 -0
- package/dist/esm/actions/public/createContractEventFilter.js.map +1 -1
- package/dist/esm/actions/public/createEventFilter.js +5 -0
- package/dist/esm/actions/public/createEventFilter.js.map +1 -1
- package/dist/esm/actions/public/createPendingTransactionFilter.js +5 -1
- package/dist/esm/actions/public/createPendingTransactionFilter.js.map +1 -1
- package/dist/esm/actions/public/getFilterChanges.js +2 -2
- package/dist/esm/actions/public/getFilterChanges.js.map +1 -1
- package/dist/esm/actions/public/getFilterLogs.js +2 -2
- package/dist/esm/actions/public/getFilterLogs.js.map +1 -1
- package/dist/esm/actions/public/uninstallFilter.js +2 -2
- package/dist/esm/actions/public/uninstallFilter.js.map +1 -1
- package/dist/esm/clients/transports/fallback.js +18 -1
- package/dist/esm/clients/transports/fallback.js.map +1 -1
- package/dist/esm/errors/base.js +27 -21
- package/dist/esm/errors/base.js.map +1 -1
- package/dist/esm/errors/index.js +4 -4
- package/dist/esm/errors/index.js.map +1 -1
- package/dist/esm/errors/request.js +45 -241
- package/dist/esm/errors/request.js.map +1 -1
- package/dist/esm/errors/rpc.js +249 -45
- package/dist/esm/errors/rpc.js.map +1 -1
- package/dist/esm/errors/version.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/buildRequest.js +16 -1
- package/dist/esm/utils/buildRequest.js.map +1 -1
- package/dist/esm/utils/errors/getNodeError.js +3 -2
- package/dist/esm/utils/errors/getNodeError.js.map +1 -1
- package/dist/esm/utils/filters/createFilterRequestScope.js +10 -0
- package/dist/esm/utils/filters/createFilterRequestScope.js.map +1 -0
- package/dist/esm/utils/rpc.js +4 -4
- package/dist/esm/utils/rpc.js.map +1 -1
- package/dist/types/actions/public/createBlockFilter.d.ts.map +1 -1
- package/dist/types/actions/public/createContractEventFilter.d.ts.map +1 -1
- package/dist/types/actions/public/createEventFilter.d.ts.map +1 -1
- package/dist/types/actions/public/createPendingTransactionFilter.d.ts.map +1 -1
- package/dist/types/actions/public/getFilterChanges.d.ts +1 -1
- package/dist/types/actions/public/getFilterChanges.d.ts.map +1 -1
- package/dist/types/actions/public/getFilterLogs.d.ts +1 -1
- package/dist/types/actions/public/getFilterLogs.d.ts.map +1 -1
- package/dist/types/actions/public/uninstallFilter.d.ts +1 -1
- package/dist/types/actions/public/uninstallFilter.d.ts.map +1 -1
- package/dist/types/clients/transports/fallback.d.ts +14 -0
- package/dist/types/clients/transports/fallback.d.ts.map +1 -1
- package/dist/types/errors/base.d.ts +1 -0
- package/dist/types/errors/base.d.ts.map +1 -1
- package/dist/types/errors/index.d.ts +4 -4
- package/dist/types/errors/index.d.ts.map +1 -1
- package/dist/types/errors/request.d.ts +42 -80
- package/dist/types/errors/request.d.ts.map +1 -1
- package/dist/types/errors/rpc.d.ts +189 -43
- package/dist/types/errors/rpc.d.ts.map +1 -1
- package/dist/types/errors/version.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/filter.d.ts +2 -0
- package/dist/types/types/filter.d.ts.map +1 -1
- package/dist/types/utils/buildRequest.d.ts.map +1 -1
- package/dist/types/utils/errors/getNodeError.d.ts +1 -1
- package/dist/types/utils/errors/getNodeError.d.ts.map +1 -1
- package/dist/types/utils/filters/createFilterRequestScope.d.ts +16 -0
- package/dist/types/utils/filters/createFilterRequestScope.d.ts.map +1 -0
- package/dist/types/utils/rpc.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/actions/public/createBlockFilter.ts +5 -1
- package/src/actions/public/createContractEventFilter.ts +6 -0
- package/src/actions/public/createEventFilter.ts +7 -0
- package/src/actions/public/createPendingTransactionFilter.ts +5 -1
- package/src/actions/public/getFilterChanges.ts +2 -2
- package/src/actions/public/getFilterLogs.ts +2 -2
- package/src/actions/public/uninstallFilter.ts +2 -2
- package/src/clients/transports/fallback.ts +46 -2
- package/src/errors/base.ts +6 -4
- package/src/errors/index.ts +15 -11
- package/src/errors/request.ts +82 -175
- package/src/errors/rpc.ts +355 -89
- package/src/errors/version.ts +1 -1
- package/src/index.ts +5 -1
- package/src/types/filter.ts +3 -0
- package/src/utils/buildRequest.ts +19 -1
- package/src/utils/errors/getNodeError.ts +2 -3
- package/src/utils/filters/createFilterRequestScope.ts +42 -0
- 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 {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
this.code =
|
80
|
-
}
|
81
|
-
}
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
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
|
}
|
package/src/errors/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = '0.3.0-main.
|
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,
|
package/src/types/filter.ts
CHANGED
@@ -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)
|
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
|
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
|
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
|
-
|
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
|
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
|
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?.(
|
227
|
+
onError?.(
|
228
|
+
new RpcRequestError({ body, error: message.error, url: socket.url }),
|
229
|
+
)
|
228
230
|
} else {
|
229
231
|
onData?.(message)
|
230
232
|
}
|