ox 0.5.0 → 0.6.1

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 (50) hide show
  1. package/BlockOverrides/package.json +6 -0
  2. package/CHANGELOG.md +14 -0
  3. package/README.md +1 -0
  4. package/StateOverrides/package.json +6 -0
  5. package/_cjs/core/BlockOverrides.js +63 -0
  6. package/_cjs/core/BlockOverrides.js.map +1 -0
  7. package/_cjs/core/Provider.js +59 -6
  8. package/_cjs/core/Provider.js.map +1 -1
  9. package/_cjs/core/RpcResponse.js +32 -31
  10. package/_cjs/core/RpcResponse.js.map +1 -1
  11. package/_cjs/core/StateOverrides.js +48 -0
  12. package/_cjs/core/StateOverrides.js.map +1 -0
  13. package/_cjs/index.js +4 -2
  14. package/_cjs/index.js.map +1 -1
  15. package/_cjs/version.js +1 -1
  16. package/_esm/core/BlockOverrides.js +117 -0
  17. package/_esm/core/BlockOverrides.js.map +1 -0
  18. package/_esm/core/Provider.js +75 -6
  19. package/_esm/core/Provider.js.map +1 -1
  20. package/_esm/core/RpcResponse.js +48 -31
  21. package/_esm/core/RpcResponse.js.map +1 -1
  22. package/_esm/core/StateOverrides.js +78 -0
  23. package/_esm/core/StateOverrides.js.map +1 -0
  24. package/_esm/index.js +12 -0
  25. package/_esm/index.js.map +1 -1
  26. package/_esm/version.js +1 -1
  27. package/_types/core/BlockOverrides.d.ts +89 -0
  28. package/_types/core/BlockOverrides.d.ts.map +1 -0
  29. package/_types/core/Provider.d.ts +28 -1
  30. package/_types/core/Provider.d.ts.map +1 -1
  31. package/_types/core/RpcResponse.d.ts +22 -1
  32. package/_types/core/RpcResponse.d.ts.map +1 -1
  33. package/_types/core/StateOverrides.d.ts +79 -0
  34. package/_types/core/StateOverrides.d.ts.map +1 -0
  35. package/_types/core/internal/rpcSchemas/eth.d.ts +34 -2
  36. package/_types/core/internal/rpcSchemas/eth.d.ts.map +1 -1
  37. package/_types/erc4337/RpcSchema.d.ts +2 -2
  38. package/_types/erc4337/RpcSchema.d.ts.map +1 -1
  39. package/_types/index.d.ts +12 -0
  40. package/_types/index.d.ts.map +1 -1
  41. package/_types/version.d.ts +1 -1
  42. package/core/BlockOverrides.ts +146 -0
  43. package/core/Provider.ts +99 -9
  44. package/core/RpcResponse.ts +137 -22
  45. package/core/StateOverrides.ts +131 -0
  46. package/core/internal/rpcSchemas/eth.ts +43 -4
  47. package/erc4337/RpcSchema.ts +2 -2
  48. package/index.ts +14 -0
  49. package/package.json +11 -1
  50. package/version.ts +1 -1
@@ -2,6 +2,7 @@ import type { Errors, RpcRequest } from '../index.js'
2
2
  import type {
3
3
  Compute,
4
4
  IsNarrowable,
5
+ IsNever,
5
6
  OneOf,
6
7
  UnionPartialBy,
7
8
  } from './internal/types.js'
@@ -215,28 +216,7 @@ export function parse<
215
216
  const { raw = false } = options
216
217
  const response_ = response as RpcResponse
217
218
  if (raw) return response as never
218
- if (response_.error) {
219
- const { code } = response_.error
220
- const JsonRpcError = (() => {
221
- if (code === InternalError.code) return InternalError
222
- if (code === InvalidInputError.code) return InvalidInputError
223
- if (code === InvalidParamsError.code) return InvalidParamsError
224
- if (code === InvalidRequestError.code) return InvalidRequestError
225
- if (code === LimitExceededError.code) return LimitExceededError
226
- if (code === MethodNotFoundError.code) return MethodNotFoundError
227
- if (code === MethodNotSupportedError.code) return MethodNotSupportedError
228
- if (code === ParseError.code) return ParseError
229
- if (code === ResourceNotFoundError.code) return ResourceNotFoundError
230
- if (code === ResourceUnavailableError.code)
231
- return ResourceUnavailableError
232
- if (code === TransactionRejectedError.code)
233
- return TransactionRejectedError
234
- if (code === VersionNotSupportedError.code)
235
- return VersionNotSupportedError
236
- return BaseError
237
- })()
238
- throw new JsonRpcError(response_.error)
239
- }
219
+ if (response_.error) throw parseErrorObject(response_.error)
240
220
  return response_.result as never
241
221
  }
242
222
 
@@ -283,6 +263,141 @@ export declare namespace parse {
283
263
  | Errors.GlobalErrorType
284
264
  }
285
265
 
266
+ /**
267
+ * Parses a JSON-RPC error object into an error instance.
268
+ *
269
+ * @example
270
+ * ```ts twoslash
271
+ * import { RpcResponse } from 'ox'
272
+ *
273
+ * const error = RpcResponse.parseError({ code: -32000, message: 'unsupported method' })
274
+ *
275
+ * error
276
+ * // ^?
277
+ *
278
+ * ```
279
+ *
280
+ * @param errorObject - JSON-RPC error object.
281
+ * @returns Error instance.
282
+ */
283
+ export function parseErrorObject<
284
+ const errorObject extends ErrorObject | unknown,
285
+ >(
286
+ errorObject: errorObject | ErrorObject,
287
+ ): parseErrorObject.ReturnType<errorObject> {
288
+ const errorObject_ = errorObject as ErrorObject
289
+ const { code } = errorObject_
290
+ if (code === InternalError.code)
291
+ return new InternalError(errorObject_) as never
292
+ if (code === InvalidInputError.code)
293
+ return new InvalidInputError(errorObject_) as never
294
+ if (code === InvalidParamsError.code)
295
+ return new InvalidParamsError(errorObject_) as never
296
+ if (code === InvalidRequestError.code)
297
+ return new InvalidRequestError(errorObject_) as never
298
+ if (code === LimitExceededError.code)
299
+ return new LimitExceededError(errorObject_) as never
300
+ if (code === MethodNotFoundError.code)
301
+ return new MethodNotFoundError(errorObject_) as never
302
+ if (code === MethodNotSupportedError.code)
303
+ return new MethodNotSupportedError(errorObject_) as never
304
+ if (code === ParseError.code) return new ParseError(errorObject_) as never
305
+ if (code === ResourceNotFoundError.code)
306
+ return new ResourceNotFoundError(errorObject_) as never
307
+ if (code === ResourceUnavailableError.code)
308
+ return new ResourceUnavailableError(errorObject_) as never
309
+ if (code === TransactionRejectedError.code)
310
+ return new TransactionRejectedError(errorObject_) as never
311
+ if (code === VersionNotSupportedError.code)
312
+ return new VersionNotSupportedError(errorObject_) as never
313
+ return new BaseError(errorObject_) as never
314
+ }
315
+
316
+ export declare namespace parseErrorObject {
317
+ type ReturnType<
318
+ errorObject extends ErrorObject | unknown,
319
+ //
320
+ error = errorObject extends ErrorObject
321
+ ?
322
+ | (errorObject['code'] extends InternalError['code']
323
+ ? InternalError
324
+ : never)
325
+ | (IsNarrowable<errorObject['code'], number> extends false
326
+ ? InternalError
327
+ : never)
328
+ | (errorObject['code'] extends InvalidInputError['code']
329
+ ? InvalidInputError
330
+ : never)
331
+ | (IsNarrowable<errorObject['code'], number> extends false
332
+ ? InvalidInputError
333
+ : never)
334
+ | (errorObject['code'] extends ResourceNotFoundError['code']
335
+ ? ResourceNotFoundError
336
+ : never)
337
+ | (IsNarrowable<errorObject['code'], number> extends false
338
+ ? ResourceNotFoundError
339
+ : never)
340
+ | (errorObject['code'] extends ResourceUnavailableError['code']
341
+ ? ResourceUnavailableError
342
+ : never)
343
+ | (IsNarrowable<errorObject['code'], number> extends false
344
+ ? ResourceUnavailableError
345
+ : never)
346
+ | (errorObject['code'] extends TransactionRejectedError['code']
347
+ ? TransactionRejectedError
348
+ : never)
349
+ | (IsNarrowable<errorObject['code'], number> extends false
350
+ ? TransactionRejectedError
351
+ : never)
352
+ | (errorObject['code'] extends ParseError['code']
353
+ ? ParseError
354
+ : never)
355
+ | (IsNarrowable<errorObject['code'], number> extends false
356
+ ? ParseError
357
+ : never)
358
+ | (errorObject['code'] extends MethodNotSupportedError['code']
359
+ ? MethodNotSupportedError
360
+ : never)
361
+ | (IsNarrowable<errorObject['code'], number> extends false
362
+ ? MethodNotSupportedError
363
+ : never)
364
+ | (errorObject['code'] extends LimitExceededError['code']
365
+ ? LimitExceededError
366
+ : never)
367
+ | (IsNarrowable<errorObject['code'], number> extends false
368
+ ? LimitExceededError
369
+ : never)
370
+ | (errorObject['code'] extends VersionNotSupportedError['code']
371
+ ? VersionNotSupportedError
372
+ : never)
373
+ | (IsNarrowable<errorObject['code'], number> extends false
374
+ ? VersionNotSupportedError
375
+ : never)
376
+ | (errorObject['code'] extends InvalidRequestError['code']
377
+ ? InvalidRequestError
378
+ : never)
379
+ | (IsNarrowable<errorObject['code'], number> extends false
380
+ ? InvalidRequestError
381
+ : never)
382
+ | (errorObject['code'] extends MethodNotFoundError['code']
383
+ ? MethodNotFoundError
384
+ : never)
385
+ | (IsNarrowable<errorObject['code'], number> extends false
386
+ ? MethodNotFoundError
387
+ : never)
388
+ | (errorObject['code'] extends InvalidParamsError['code']
389
+ ? InvalidParamsError
390
+ : never)
391
+ | (IsNarrowable<errorObject['code'], number> extends false
392
+ ? InvalidParamsError
393
+ : never)
394
+ | (IsNarrowable<errorObject['code'], number> extends false
395
+ ? BaseError
396
+ : never)
397
+ : parseErrorObject.ReturnType<ErrorObject>,
398
+ > = IsNever<error> extends true ? BaseError : error
399
+ }
400
+
286
401
  export type BaseErrorType = BaseError & { name: 'BaseError' }
287
402
 
288
403
  /** Thrown when a JSON-RPC error has occurred. */
@@ -0,0 +1,131 @@
1
+ import type * as Address from './Address.js'
2
+ import * as Hex from './Hex.js'
3
+ import type { Compute, OneOf } from './internal/types.js'
4
+
5
+ /**
6
+ * State override set to specify state to be ephemerally overridden prior to executing a call.
7
+ */
8
+ export type StateOverrides<bigintType = bigint> = Compute<{
9
+ [address: Address.Address]: AccountOverrides<bigintType>
10
+ }>
11
+
12
+ /**
13
+ * RPC state overrides.
14
+ */
15
+ export type Rpc = StateOverrides<Hex.Hex>
16
+
17
+ /**
18
+ * Details of an account to be overridden.
19
+ */
20
+ export type AccountOverrides<bigintType = bigint> = Compute<
21
+ {
22
+ /** Balance to set for the account. */
23
+ balance?: bigintType | undefined
24
+ /** Code to set for the account. */
25
+ code?: Hex.Hex | undefined
26
+ /** Address to move the precompile to. */
27
+ movePrecompileToAddress?: Address.Address | undefined
28
+ /** Nonce to set for the account. */
29
+ nonce?: bigintType | undefined
30
+ } & OneOf<
31
+ | {
32
+ /** Key-value mapping to override all slots in the account storage. */
33
+ state?: AccountStorage | undefined
34
+ }
35
+ | {
36
+ /** Key-value mapping to override individual slots in the account storage. */
37
+ stateDiff?: AccountStorage | undefined
38
+ }
39
+ >
40
+ >
41
+
42
+ /**
43
+ * RPC account overrides.
44
+ */
45
+ export type RpcAccountOverrides = AccountOverrides<Hex.Hex>
46
+
47
+ /**
48
+ * Key-value mapping to override all slots in the account storage before executing the call.
49
+ */
50
+ export type AccountStorage = Compute<{
51
+ [slot: Hex.Hex]: Hex.Hex
52
+ }>
53
+
54
+ /**
55
+ * Converts an {@link ox#StateOverrides.Rpc} to an {@link ox#StateOverrides.StateOverrides}.
56
+ *
57
+ * @example
58
+ * ```ts twoslash
59
+ * import { StateOverrides } from 'ox'
60
+ *
61
+ * const stateOverrides = StateOverrides.fromRpc({
62
+ * '0x0000000000000000000000000000000000000000': {
63
+ * balance: '0x1',
64
+ * },
65
+ * })
66
+ * ```
67
+ *
68
+ * @param rpcStateOverrides - The RPC state overrides to convert.
69
+ * @returns An instantiated {@link ox#StateOverrides.StateOverrides}.
70
+ */
71
+ export function fromRpc(rpcStateOverrides: Rpc): StateOverrides {
72
+ const stateOverrides: StateOverrides = {}
73
+ for (const [address, accountOverridesRpc] of Object.entries(
74
+ rpcStateOverrides,
75
+ )) {
76
+ const accountOverrides: AccountOverrides = {}
77
+ if (accountOverridesRpc.balance)
78
+ accountOverrides.balance = BigInt(accountOverridesRpc.balance)
79
+ if (accountOverridesRpc.code)
80
+ accountOverrides.code = accountOverridesRpc.code
81
+ if (accountOverridesRpc.movePrecompileToAddress)
82
+ accountOverrides.movePrecompileToAddress =
83
+ accountOverridesRpc.movePrecompileToAddress
84
+ if (accountOverridesRpc.nonce)
85
+ accountOverrides.nonce = BigInt(accountOverridesRpc.nonce)
86
+ if (accountOverridesRpc.state)
87
+ accountOverrides.state = accountOverridesRpc.state
88
+ if (accountOverridesRpc.stateDiff)
89
+ accountOverrides.stateDiff = accountOverridesRpc.stateDiff
90
+ ;(stateOverrides as any)[address] = accountOverrides
91
+ }
92
+ return stateOverrides
93
+ }
94
+
95
+ /**
96
+ * Converts an {@link ox#StateOverrides.StateOverrides} to an {@link ox#StateOverrides.Rpc}.
97
+ *
98
+ * @example
99
+ * ```ts twoslash
100
+ * import { StateOverrides } from 'ox'
101
+ *
102
+ * const stateOverrides = StateOverrides.toRpc({
103
+ * '0x0000000000000000000000000000000000000000': {
104
+ * balance: 1n,
105
+ * },
106
+ * })
107
+ * ```
108
+ *
109
+ * @param stateOverrides - The state overrides to convert.
110
+ * @returns An instantiated {@link ox#StateOverrides.Rpc}.
111
+ */
112
+ export function toRpc(stateOverrides: StateOverrides): Rpc {
113
+ const rpcStateOverrides: Rpc = {}
114
+ for (const [address, accountOverrides] of Object.entries(stateOverrides)) {
115
+ const accountOverridesRpc: RpcAccountOverrides = {}
116
+ if (typeof accountOverrides.balance === 'bigint')
117
+ accountOverridesRpc.balance = Hex.fromNumber(accountOverrides.balance)
118
+ if (accountOverrides.code) accountOverridesRpc.code = accountOverrides.code
119
+ if (accountOverrides.movePrecompileToAddress)
120
+ accountOverridesRpc.movePrecompileToAddress =
121
+ accountOverrides.movePrecompileToAddress
122
+ if (typeof accountOverrides.nonce === 'bigint')
123
+ accountOverridesRpc.nonce = Hex.fromNumber(accountOverrides.nonce)
124
+ if (accountOverrides.state)
125
+ accountOverridesRpc.state = accountOverrides.state
126
+ if (accountOverrides.stateDiff)
127
+ accountOverridesRpc.stateDiff = accountOverrides.stateDiff
128
+ ;(rpcStateOverrides as any)[address] = accountOverridesRpc
129
+ }
130
+ return rpcStateOverrides
131
+ }
@@ -1,11 +1,13 @@
1
1
  import type * as AccountProof from '../../AccountProof.js'
2
2
  import type * as Address from '../../Address.js'
3
3
  import type * as Block from '../../Block.js'
4
+ import type * as BlockOverrides from '../../BlockOverrides.js'
4
5
  import type * as Fee from '../../Fee.js'
5
6
  import type * as Filter from '../../Filter.js'
6
7
  import type * as Hex from '../../Hex.js'
7
8
  import type * as Log from '../../Log.js'
8
9
  import type * as RpcSchema from '../../RpcSchema.js'
10
+ import type * as StateOverrides from '../../StateOverrides.js'
9
11
  import type * as Transaction from '../../Transaction.js'
10
12
  import type * as TransactionReceipt from '../../TransactionReceipt.js'
11
13
  import type * as TransactionRequest from '../../TransactionRequest.js'
@@ -111,8 +113,7 @@ export type Eth = RpcSchema.From<
111
113
  | Block.Tag
112
114
  | Block.Hash
113
115
  | Block.Identifier,
114
- // TODO: add type
115
- stateOverride: unknown,
116
+ stateOverrides: StateOverrides.Rpc,
116
117
  ]
117
118
  }
118
119
  ReturnType: Hex.Hex
@@ -181,8 +182,7 @@ export type Eth = RpcSchema.From<
181
182
  | Block.Tag
182
183
  | Block.Hash
183
184
  | Block.Identifier,
184
- // TODO: add type
185
- stateOverride: unknown,
185
+ stateOverrides: StateOverrides.Rpc,
186
186
  ]
187
187
  }
188
188
  ReturnType: Hex.Hex
@@ -707,6 +707,45 @@ export type Eth = RpcSchema.From<
707
707
  }
708
708
  ReturnType: Hex.Hex
709
709
  }
710
+ | {
711
+ Request: {
712
+ method: 'eth_simulateV1'
713
+ params: [
714
+ {
715
+ blockStateCalls: readonly {
716
+ blockOverrides?: BlockOverrides.Rpc | undefined
717
+ calls?: readonly TransactionRequest.Rpc[] | undefined
718
+ stateOverrides?: StateOverrides.Rpc | undefined
719
+ }[]
720
+ returnFullTransactions?: boolean | undefined
721
+ traceTransfers?: boolean | undefined
722
+ validation?: boolean | undefined
723
+ },
724
+ block:
725
+ | Block.Number<Hex.Hex>
726
+ | Block.Tag
727
+ | Block.Hash
728
+ | Block.Identifier,
729
+ ]
730
+ }
731
+ ReturnType: readonly (Block.Rpc & {
732
+ calls?:
733
+ | readonly {
734
+ error?:
735
+ | {
736
+ data?: Hex.Hex | undefined
737
+ code: number
738
+ message: string
739
+ }
740
+ | undefined
741
+ logs?: readonly Log.Rpc[] | undefined
742
+ gasUsed: Hex.Hex
743
+ returnData: Hex.Hex
744
+ status: Hex.Hex
745
+ }[]
746
+ | undefined
747
+ })[]
748
+ }
710
749
  /**
711
750
  * Signs a transaction that can be submitted to the network at a later time using with `eth_sendRawTransaction`
712
751
  *
@@ -1,6 +1,7 @@
1
1
  import type * as Address from '../core/Address.js'
2
2
  import type * as Hex from '../core/Hex.js'
3
3
  import type * as RpcSchema from '../core/RpcSchema.js'
4
+ import type * as StateOverrides from '../core/StateOverrides.js'
4
5
  import type * as EntryPoint from './EntryPoint.js'
5
6
  import type * as UserOperation from './UserOperation.js'
6
7
  import type * as UserOperationGas from './UserOperationGas.js'
@@ -49,8 +50,7 @@ export type Bundler<
49
50
  | [
50
51
  userOperation: UserOperation.Rpc<entryPointVersion>,
51
52
  entrypoint: Address.Address,
52
- /** TODO: Add type. */
53
- stateOverrides: unknown,
53
+ stateOverrides: StateOverrides.Rpc,
54
54
  ]
55
55
  }
56
56
  ReturnType: UserOperationGas.Rpc<entryPointVersion>
package/index.ts CHANGED
@@ -986,6 +986,13 @@ export * as Blobs from './core/Blobs.js'
986
986
  */
987
987
  export * as Block from './core/Block.js'
988
988
 
989
+ /**
990
+ * Utilities & types for working with **Block Overrides**.
991
+ *
992
+ * @category Execution Spec
993
+ */
994
+ export * as BlockOverrides from './core/BlockOverrides.js'
995
+
989
996
  /**
990
997
  * Utility functions for working with Bloom Filters as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/block.yaml)
991
998
  *
@@ -2275,6 +2282,13 @@ export * as Siwe from './core/Siwe.js'
2275
2282
 
2276
2283
  export * as Solidity from './core/Solidity.js'
2277
2284
 
2285
+ /**
2286
+ * Utilities & types for working with **State Overrides**.
2287
+ *
2288
+ * @category Execution Spec
2289
+ */
2290
+ export * as StateOverrides from './core/StateOverrides.js'
2291
+
2278
2292
  /**
2279
2293
  * Utilities & types for working with **Transactions** as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml)
2280
2294
  *
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ox",
3
3
  "description": "Ethereum Standard Library",
4
- "version": "0.5.0",
4
+ "version": "0.6.1",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
@@ -132,6 +132,11 @@
132
132
  "import": "./_esm/core/Block.js",
133
133
  "default": "./_cjs/core/Block.js"
134
134
  },
135
+ "./BlockOverrides": {
136
+ "types": "./_types/core/BlockOverrides.d.ts",
137
+ "import": "./_esm/core/BlockOverrides.js",
138
+ "default": "./_cjs/core/BlockOverrides.js"
139
+ },
135
140
  "./Bloom": {
136
141
  "types": "./_types/core/Bloom.d.ts",
137
142
  "import": "./_esm/core/Bloom.js",
@@ -282,6 +287,11 @@
282
287
  "import": "./_esm/core/Solidity.js",
283
288
  "default": "./_cjs/core/Solidity.js"
284
289
  },
290
+ "./StateOverrides": {
291
+ "types": "./_types/core/StateOverrides.d.ts",
292
+ "import": "./_esm/core/StateOverrides.js",
293
+ "default": "./_cjs/core/StateOverrides.js"
294
+ },
285
295
  "./Transaction": {
286
296
  "types": "./_types/core/Transaction.d.ts",
287
297
  "import": "./_esm/core/Transaction.js",
package/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** @internal */
2
- export const version = '0.5.0'
2
+ export const version = '0.6.1'