ox 1.0.0-beta.9 → 1.0.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 (253) hide show
  1. package/CHANGELOG.md +1151 -0
  2. package/dist/core/AbiParameters.d.ts.map +1 -1
  3. package/dist/core/AbiParameters.js +4 -1
  4. package/dist/core/AbiParameters.js.map +1 -1
  5. package/dist/core/Rlp.d.ts +27 -5
  6. package/dist/core/Rlp.d.ts.map +1 -1
  7. package/dist/core/Rlp.js +40 -4
  8. package/dist/core/Rlp.js.map +1 -1
  9. package/dist/core/RpcSchema.d.ts +1 -1
  10. package/dist/core/Siwe.d.ts +4 -4
  11. package/dist/core/Siwe.js +5 -5
  12. package/dist/core/Siwe.js.map +1 -1
  13. package/dist/core/internal/abiParameters.d.ts +1 -1
  14. package/dist/core/internal/abiParameters.d.ts.map +1 -1
  15. package/dist/core/internal/abiParameters.js +22 -4
  16. package/dist/core/internal/abiParameters.js.map +1 -1
  17. package/dist/core/internal/rpcSchemas/eth.d.ts +36 -0
  18. package/dist/core/internal/rpcSchemas/eth.d.ts.map +1 -1
  19. package/dist/erc4337/EntryPoint.d.ts +1072 -1
  20. package/dist/erc4337/EntryPoint.d.ts.map +1 -1
  21. package/dist/erc4337/EntryPoint.js +872 -0
  22. package/dist/erc4337/EntryPoint.js.map +1 -1
  23. package/dist/erc4337/RpcSchema.d.ts +2 -2
  24. package/dist/erc4337/RpcSchema.d.ts.map +1 -1
  25. package/dist/erc4337/UserOperation.d.ts +39 -10
  26. package/dist/erc4337/UserOperation.d.ts.map +1 -1
  27. package/dist/erc4337/UserOperation.js +62 -48
  28. package/dist/erc4337/UserOperation.js.map +1 -1
  29. package/dist/erc4337/UserOperationGas.d.ts +9 -5
  30. package/dist/erc4337/UserOperationGas.d.ts.map +1 -1
  31. package/dist/erc4337/UserOperationGas.js +17 -15
  32. package/dist/erc4337/UserOperationGas.js.map +1 -1
  33. package/dist/erc4337/UserOperationReceipt.d.ts +4 -4
  34. package/dist/erc4337/UserOperationReceipt.d.ts.map +1 -1
  35. package/dist/erc4337/UserOperationReceipt.js.map +1 -1
  36. package/dist/index.d.ts +2 -2
  37. package/dist/index.js +2 -2
  38. package/dist/tempo/Channel.d.ts +8 -14
  39. package/dist/tempo/Channel.d.ts.map +1 -1
  40. package/dist/tempo/Channel.js +4 -8
  41. package/dist/tempo/Channel.js.map +1 -1
  42. package/dist/tempo/KeyAuthorization.d.ts +5 -5
  43. package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
  44. package/dist/tempo/KeyAuthorization.js +4 -4
  45. package/dist/tempo/KeyAuthorization.js.map +1 -1
  46. package/dist/tempo/MultisigConfig.d.ts +37 -85
  47. package/dist/tempo/MultisigConfig.d.ts.map +1 -1
  48. package/dist/tempo/MultisigConfig.js +39 -83
  49. package/dist/tempo/MultisigConfig.js.map +1 -1
  50. package/dist/tempo/PoolId.d.ts +8 -7
  51. package/dist/tempo/PoolId.d.ts.map +1 -1
  52. package/dist/tempo/PoolId.js +10 -6
  53. package/dist/tempo/PoolId.js.map +1 -1
  54. package/dist/tempo/SignatureEnvelope.d.ts +32 -30
  55. package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
  56. package/dist/tempo/SignatureEnvelope.js +56 -51
  57. package/dist/tempo/SignatureEnvelope.js.map +1 -1
  58. package/dist/tempo/Transaction.d.ts +16 -5
  59. package/dist/tempo/Transaction.d.ts.map +1 -1
  60. package/dist/tempo/Transaction.js +34 -7
  61. package/dist/tempo/Transaction.js.map +1 -1
  62. package/dist/tempo/TransactionReceipt.d.ts +3 -3
  63. package/dist/tempo/TransactionReceipt.d.ts.map +1 -1
  64. package/dist/tempo/TransactionReceipt.js +8 -1
  65. package/dist/tempo/TransactionReceipt.js.map +1 -1
  66. package/dist/tempo/TransactionRequest.d.ts +15 -2
  67. package/dist/tempo/TransactionRequest.d.ts.map +1 -1
  68. package/dist/tempo/TransactionRequest.js +65 -29
  69. package/dist/tempo/TransactionRequest.js.map +1 -1
  70. package/dist/tempo/TxEnvelopeTempo.d.ts +2 -3
  71. package/dist/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  72. package/dist/tempo/TxEnvelopeTempo.js +5 -6
  73. package/dist/tempo/TxEnvelopeTempo.js.map +1 -1
  74. package/dist/tempo/index.d.ts +6 -26
  75. package/dist/tempo/index.d.ts.map +1 -1
  76. package/dist/tempo/index.js +6 -26
  77. package/dist/tempo/index.js.map +1 -1
  78. package/dist/zod/Abi.d.ts +214 -0
  79. package/dist/zod/Abi.d.ts.map +1 -0
  80. package/dist/zod/Abi.js +5 -0
  81. package/dist/zod/Abi.js.map +1 -0
  82. package/dist/zod/AbiConstructor.d.ts +58 -0
  83. package/dist/zod/AbiConstructor.d.ts.map +1 -0
  84. package/dist/zod/AbiConstructor.js +18 -0
  85. package/dist/zod/AbiConstructor.js.map +1 -0
  86. package/dist/zod/AbiError.d.ts +20 -0
  87. package/dist/zod/AbiError.d.ts.map +1 -0
  88. package/dist/zod/AbiError.js +9 -0
  89. package/dist/zod/AbiError.js.map +1 -0
  90. package/dist/zod/AbiEvent.d.ts +23 -0
  91. package/dist/zod/AbiEvent.d.ts.map +1 -0
  92. package/dist/zod/AbiEvent.js +11 -0
  93. package/dist/zod/AbiEvent.js.map +1 -0
  94. package/dist/zod/AbiFallback.d.ts +16 -0
  95. package/dist/zod/AbiFallback.d.ts.map +1 -0
  96. package/dist/zod/AbiFallback.js +16 -0
  97. package/dist/zod/AbiFallback.js.map +1 -0
  98. package/dist/zod/AbiFunction.d.ts +109 -0
  99. package/dist/zod/AbiFunction.d.ts.map +1 -0
  100. package/dist/zod/AbiFunction.js +26 -0
  101. package/dist/zod/AbiFunction.js.map +1 -0
  102. package/dist/zod/AbiItem.d.ts +216 -0
  103. package/dist/zod/AbiItem.d.ts.map +1 -0
  104. package/dist/zod/AbiItem.js +26 -0
  105. package/dist/zod/AbiItem.js.map +1 -0
  106. package/dist/zod/AbiParameter.d.ts +32 -0
  107. package/dist/zod/AbiParameter.d.ts.map +1 -0
  108. package/dist/zod/AbiParameter.js +28 -0
  109. package/dist/zod/AbiParameter.js.map +1 -0
  110. package/dist/zod/AbiParameters.d.ts +30 -0
  111. package/dist/zod/AbiParameters.d.ts.map +1 -0
  112. package/dist/zod/AbiParameters.js +6 -0
  113. package/dist/zod/AbiParameters.js.map +1 -0
  114. package/dist/zod/AbiReceive.d.ts +6 -0
  115. package/dist/zod/AbiReceive.d.ts.map +1 -0
  116. package/dist/zod/AbiReceive.js +7 -0
  117. package/dist/zod/AbiReceive.js.map +1 -0
  118. package/dist/zod/RpcSchema.d.ts +1 -0
  119. package/dist/zod/RpcSchema.d.ts.map +1 -1
  120. package/dist/zod/Solidity.d.ts +15 -0
  121. package/dist/zod/Solidity.d.ts.map +1 -0
  122. package/dist/zod/Solidity.js +41 -0
  123. package/dist/zod/Solidity.js.map +1 -0
  124. package/dist/zod/TypedData.d.ts +226 -0
  125. package/dist/zod/TypedData.d.ts.map +1 -0
  126. package/dist/zod/TypedData.js +84 -0
  127. package/dist/zod/TypedData.js.map +1 -0
  128. package/dist/zod/internal/rpcSchemas/Eth.d.ts +1 -0
  129. package/dist/zod/internal/rpcSchemas/Eth.d.ts.map +1 -1
  130. package/dist/zod/internal/rpcSchemas/Eth.js +5 -0
  131. package/dist/zod/internal/rpcSchemas/Eth.js.map +1 -1
  132. package/dist/zod/tempo/AuthorizationTempo.d.ts +0 -20
  133. package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
  134. package/dist/zod/tempo/KeyAuthorization.d.ts +503 -67
  135. package/dist/zod/tempo/KeyAuthorization.d.ts.map +1 -1
  136. package/dist/zod/tempo/KeyAuthorization.js +32 -15
  137. package/dist/zod/tempo/KeyAuthorization.js.map +1 -1
  138. package/dist/zod/tempo/RpcSchemaTempo.d.ts +216 -34
  139. package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
  140. package/dist/zod/tempo/SignatureEnvelope.d.ts +0 -6
  141. package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
  142. package/dist/zod/tempo/SignatureEnvelope.js +0 -2
  143. package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
  144. package/dist/zod/tempo/Transaction.d.ts +1479 -333
  145. package/dist/zod/tempo/Transaction.d.ts.map +1 -1
  146. package/dist/zod/tempo/Transaction.js +65 -16
  147. package/dist/zod/tempo/Transaction.js.map +1 -1
  148. package/dist/zod/tempo/TransactionRequest.d.ts +410 -57
  149. package/dist/zod/tempo/TransactionRequest.d.ts.map +1 -1
  150. package/dist/zod/tempo/TransactionRequest.js +81 -18
  151. package/dist/zod/tempo/TransactionRequest.js.map +1 -1
  152. package/dist/zod/tempo/TxEnvelopeTempo.d.ts +225 -18
  153. package/dist/zod/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  154. package/dist/zod/tempo/TxEnvelopeTempo.js +1 -1
  155. package/dist/zod/tempo/TxEnvelopeTempo.js.map +1 -1
  156. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts +0 -3
  157. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts.map +1 -1
  158. package/dist/zod/tempo/z.d.ts +0 -1
  159. package/dist/zod/tempo/z.d.ts.map +1 -1
  160. package/dist/zod/tempo/z.js +0 -1
  161. package/dist/zod/tempo/z.js.map +1 -1
  162. package/dist/zod/z.d.ts +12 -0
  163. package/dist/zod/z.d.ts.map +1 -1
  164. package/dist/zod/z.js +12 -0
  165. package/dist/zod/z.js.map +1 -1
  166. package/package.json +62 -11
  167. package/src/core/AbiParameters.ts +3 -1
  168. package/src/core/Rlp.ts +66 -3
  169. package/src/core/RpcSchema.ts +1 -1
  170. package/src/core/Siwe.ts +6 -6
  171. package/src/core/_test/AbiParameters.decode.test.ts +101 -12
  172. package/src/core/_test/AbiParameters.encode.test.ts +68 -0
  173. package/src/core/_test/Rlp.test.ts +101 -0
  174. package/src/core/_test/Siwe.test.ts +6 -8
  175. package/src/core/internal/abiParameters.ts +22 -5
  176. package/src/core/internal/rpcSchemas/eth.ts +36 -0
  177. package/src/erc4337/EntryPoint.ts +875 -1
  178. package/src/erc4337/RpcSchema.ts +4 -2
  179. package/src/erc4337/UserOperation.ts +130 -60
  180. package/src/erc4337/UserOperationGas.ts +36 -28
  181. package/src/erc4337/UserOperationReceipt.ts +15 -7
  182. package/src/erc4337/_test/EntryPoint.test.ts +48 -0
  183. package/src/erc4337/_test/RpcSchema.test-d.ts +56 -0
  184. package/src/erc4337/_test/UserOperation.snap-d.ts +31 -0
  185. package/src/erc4337/_test/UserOperation.test.ts +221 -5
  186. package/src/erc4337/_test/UserOperationGas.test.ts +30 -1
  187. package/src/index.ts +2 -2
  188. package/src/tempo/Channel.test.ts +2 -23
  189. package/src/tempo/Channel.ts +10 -22
  190. package/src/tempo/KeyAuthorization.test.ts +22 -0
  191. package/src/tempo/KeyAuthorization.ts +9 -9
  192. package/src/tempo/MultisigConfig.test.ts +54 -37
  193. package/src/tempo/MultisigConfig.ts +59 -134
  194. package/src/tempo/PoolId.test.ts +7 -41
  195. package/src/tempo/PoolId.ts +15 -10
  196. package/src/tempo/SignatureEnvelope.test.ts +118 -17
  197. package/src/tempo/SignatureEnvelope.ts +77 -72
  198. package/src/tempo/Transaction.test.ts +0 -15
  199. package/src/tempo/Transaction.ts +63 -12
  200. package/src/tempo/TransactionReceipt.test.ts +76 -0
  201. package/src/tempo/TransactionReceipt.ts +11 -5
  202. package/src/tempo/TransactionRequest.test.ts +174 -1
  203. package/src/tempo/TransactionRequest.ts +84 -32
  204. package/src/tempo/TxEnvelopeTempo.test.ts +2 -2
  205. package/src/tempo/TxEnvelopeTempo.ts +7 -7
  206. package/src/tempo/e2e.test.ts +228 -50
  207. package/src/tempo/index.ts +6 -26
  208. package/src/version.ts +1 -1
  209. package/src/zod/Abi.ts +5 -0
  210. package/src/zod/AbiConstructor.ts +24 -0
  211. package/src/zod/AbiError.ts +9 -0
  212. package/src/zod/AbiEvent.ts +11 -0
  213. package/src/zod/AbiFallback.ts +22 -0
  214. package/src/zod/AbiFunction.ts +32 -0
  215. package/src/zod/AbiItem.ts +28 -0
  216. package/src/zod/AbiParameter.ts +36 -0
  217. package/src/zod/AbiParameters.ts +7 -0
  218. package/src/zod/AbiReceive.ts +7 -0
  219. package/src/zod/Solidity.ts +83 -0
  220. package/src/zod/TypedData.ts +111 -0
  221. package/src/zod/_test/Abi.test-d.ts +46 -0
  222. package/src/zod/_test/Abi.test.ts +163 -0
  223. package/src/zod/_test/TypedData.test-d.ts +20 -0
  224. package/src/zod/_test/TypedData.test.ts +87 -0
  225. package/src/zod/_test/z.test-d.ts +6 -0
  226. package/src/zod/_test/z.test.ts +17 -0
  227. package/src/zod/internal/rpcSchemas/Eth.ts +6 -0
  228. package/src/zod/tempo/KeyAuthorization.ts +34 -15
  229. package/src/zod/tempo/SignatureEnvelope.ts +0 -2
  230. package/src/zod/tempo/Transaction.ts +84 -22
  231. package/src/zod/tempo/TransactionRequest.ts +86 -20
  232. package/src/zod/tempo/TxEnvelopeTempo.ts +1 -1
  233. package/src/zod/tempo/_test/KeyAuthorization.test.ts +53 -0
  234. package/src/zod/tempo/_test/SignatureEnvelope.test.ts +0 -2
  235. package/src/zod/tempo/_test/Transaction.test.ts +155 -0
  236. package/src/zod/tempo/_test/TransactionRequest.test.ts +44 -0
  237. package/src/zod/tempo/z.ts +0 -1
  238. package/src/zod/z.ts +12 -0
  239. package/dist/tempo/TokenId.d.ts +0 -87
  240. package/dist/tempo/TokenId.d.ts.map +0 -1
  241. package/dist/tempo/TokenId.js +0 -123
  242. package/dist/tempo/TokenId.js.map +0 -1
  243. package/dist/zod/tempo/TokenId.d.ts +0 -6
  244. package/dist/zod/tempo/TokenId.d.ts.map +0 -1
  245. package/dist/zod/tempo/TokenId.js +0 -14
  246. package/dist/zod/tempo/TokenId.js.map +0 -1
  247. package/src/CHANGELOG.md +0 -820
  248. package/src/tempo/TokenId.bench.ts +0 -36
  249. package/src/tempo/TokenId.test.ts +0 -79
  250. package/src/tempo/TokenId.ts +0 -141
  251. package/src/zod/tempo/TokenId.ts +0 -15
  252. package/src/zod/tempo/_test/TokenId.test-d.ts +0 -17
  253. package/src/zod/tempo/_test/TokenId.test.ts +0 -21
@@ -50,7 +50,7 @@ export type Bundler<
50
50
  method: 'eth_getUserOperationByHash'
51
51
  params: [hash: Hex.Hex]
52
52
  }
53
- ReturnType: UserOperation.Rpc<entryPointVersion> | null
53
+ ReturnType: UserOperation.RpcTransactionInfo<entryPointVersion> | null
54
54
  }
55
55
  | {
56
56
  Request: {
@@ -105,7 +105,9 @@ export type BundlerDebug<
105
105
  method: 'debug_bundler_dumpMempool'
106
106
  params: [entryPoint: Address.Address]
107
107
  }
108
- ReturnType: readonly { userOp: UserOperation.Rpc }[]
108
+ ReturnType: readonly {
109
+ userOp: UserOperation.Rpc<entryPointVersion>
110
+ }[]
109
111
  }
110
112
  | {
111
113
  Request: {
@@ -5,7 +5,7 @@ import type * as Errors from '../core/Errors.js'
5
5
  import * as Hash from '../core/Hash.js'
6
6
  import * as Hex from '../core/Hex.js'
7
7
  import * as Quantity from '../core/internal/quantity.js'
8
- import type { Assign, Compute, OneOf } from '../core/internal/types.js'
8
+ import type { Assign, Compute, Omit, OneOf } from '../core/internal/types.js'
9
9
  import * as Signature from '../core/Signature.js'
10
10
  import * as TypedData from '../core/TypedData.js'
11
11
  import type * as EntryPoint from './EntryPoint.js'
@@ -15,6 +15,9 @@ import type * as EntryPoint from './EntryPoint.js'
15
15
  /** keccak256 of empty bytes (`0x`). Reused for empty initCode/paymasterAndData. */
16
16
  const EMPTY_KECCAK = /*#__PURE__*/ Hash.keccak256('0x')
17
17
 
18
+ /** Magic suffix for an independently encoded paymaster signature. */
19
+ const paymasterSignatureMagic = '0x22e325a297439656' as const
20
+
18
21
  /** ABI parameters for v0.6 user operation packed encoding. */
19
22
  const v06HashParameters = [
20
23
  { type: 'address' },
@@ -74,6 +77,9 @@ export type UserOperation<
74
77
  | (entryPointVersion extends '0.8'
75
78
  ? V08<signed, bigintType, numberType>
76
79
  : never)
80
+ | (entryPointVersion extends '0.9'
81
+ ? V09<signed, bigintType, numberType>
82
+ : never)
77
83
  >
78
84
 
79
85
  /**
@@ -107,9 +113,10 @@ export type Rpc<
107
113
  entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
108
114
  signed extends boolean = true,
109
115
  > = OneOf<
110
- | (entryPointVersion extends '0.6' ? V06<signed, Hex.Hex> : never)
111
- | (entryPointVersion extends '0.7' ? V07<signed, Hex.Hex> : never)
112
- | (entryPointVersion extends '0.8' ? V08<signed, Hex.Hex, Hex.Hex> : never)
116
+ | (entryPointVersion extends '0.6' ? RpcV06<signed> : never)
117
+ | (entryPointVersion extends '0.7' ? RpcV07<signed> : never)
118
+ | (entryPointVersion extends '0.8' ? RpcV08<signed> : never)
119
+ | (entryPointVersion extends '0.9' ? RpcV09<signed> : never)
113
120
  >
114
121
 
115
122
  /** Transaction Info. */
@@ -127,7 +134,18 @@ export type TransactionInfo<
127
134
  /** RPC Transaction Info. */
128
135
  export type RpcTransactionInfo<
129
136
  entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
130
- > = TransactionInfo<entryPointVersion, Hex.Hex>
137
+ > = {
138
+ /** Block hash containing the User Operation, or `null` while pending. */
139
+ blockHash: Hex.Hex | null
140
+ /** Block number containing the User Operation, or `null` while pending. */
141
+ blockNumber: Hex.Hex | null
142
+ /** EntryPoint that handled the User Operation. */
143
+ entryPoint: Address.Address
144
+ /** Transaction hash containing the User Operation, or `null` while pending. */
145
+ transactionHash: Hex.Hex | null
146
+ /** RPC User Operation included in the transaction. */
147
+ userOperation: Rpc<entryPointVersion>
148
+ }
131
149
 
132
150
  /** Type for User Operation on EntryPoint 0.6 */
133
151
  export type V06<signed extends boolean = boolean, bigintType = bigint> = {
@@ -236,11 +254,32 @@ export type V08<
236
254
  } & (signed extends true ? { signature: Hex.Hex } : {})
237
255
 
238
256
  /** RPC User Operation on EntryPoint 0.8 */
239
- export type RpcV08<signed extends boolean = true> = V08<
240
- signed,
241
- Hex.Hex,
242
- Hex.Hex
243
- >
257
+ export type RpcV08<signed extends boolean = true> = Omit<
258
+ V08<signed, Hex.Hex, Hex.Hex>,
259
+ 'authorization'
260
+ > & {
261
+ /** EIP-7702 authorization carried by Bundler RPC methods. */
262
+ eip7702Auth?: Authorization.Rpc | undefined
263
+ }
264
+
265
+ /** Type for User Operation on EntryPoint 0.9 */
266
+ export type V09<
267
+ signed extends boolean = boolean,
268
+ bigintType = bigint,
269
+ numberType = number,
270
+ > = V08<signed, bigintType, numberType> & {
271
+ /** Paymaster signature provided independently from account signing. */
272
+ paymasterSignature?: Hex.Hex | undefined
273
+ }
274
+
275
+ /** RPC User Operation on EntryPoint 0.9 */
276
+ export type RpcV09<signed extends boolean = true> = Omit<
277
+ V09<signed, Hex.Hex, Hex.Hex>,
278
+ 'authorization'
279
+ > & {
280
+ /** EIP-7702 authorization carried by Bundler RPC methods. */
281
+ eip7702Auth?: Authorization.Rpc | undefined
282
+ }
244
283
 
245
284
  /**
246
285
  * Instantiates a {@link ox#UserOperation.UserOperation} from a provided input.
@@ -392,26 +431,31 @@ export declare namespace from {
392
431
  * @param rpc - The RPC user operation to convert.
393
432
  * @returns An instantiated {@link ox#UserOperation.UserOperation}.
394
433
  */
395
- export function fromRpc(rpc: Rpc): UserOperation {
396
- const authorization = (rpc as Rpc<'0.8'>).authorization
434
+ export function fromRpc<
435
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
436
+ >(rpc: Rpc<entryPointVersion>): UserOperation<entryPointVersion, true> {
437
+ const rpc_ = rpc as Rpc
438
+ const { eip7702Auth, ...userOperation } = rpc_ as Rpc & {
439
+ eip7702Auth?: Authorization.Rpc | undefined
440
+ }
397
441
  return {
398
- ...rpc,
399
- callGasLimit: BigInt(rpc.callGasLimit),
400
- maxFeePerGas: BigInt(rpc.maxFeePerGas),
401
- maxPriorityFeePerGas: BigInt(rpc.maxPriorityFeePerGas),
402
- nonce: BigInt(rpc.nonce),
403
- preVerificationGas: BigInt(rpc.preVerificationGas),
404
- verificationGasLimit: BigInt(rpc.verificationGasLimit),
405
- ...(rpc.paymasterPostOpGasLimit && {
406
- paymasterPostOpGasLimit: BigInt(rpc.paymasterPostOpGasLimit),
442
+ ...userOperation,
443
+ callGasLimit: BigInt(rpc_.callGasLimit),
444
+ maxFeePerGas: BigInt(rpc_.maxFeePerGas),
445
+ maxPriorityFeePerGas: BigInt(rpc_.maxPriorityFeePerGas),
446
+ nonce: BigInt(rpc_.nonce),
447
+ preVerificationGas: BigInt(rpc_.preVerificationGas),
448
+ verificationGasLimit: BigInt(rpc_.verificationGasLimit),
449
+ ...(rpc_.paymasterPostOpGasLimit && {
450
+ paymasterPostOpGasLimit: BigInt(rpc_.paymasterPostOpGasLimit),
407
451
  }),
408
- ...(rpc.paymasterVerificationGasLimit && {
409
- paymasterVerificationGasLimit: BigInt(rpc.paymasterVerificationGasLimit),
452
+ ...(rpc_.paymasterVerificationGasLimit && {
453
+ paymasterVerificationGasLimit: BigInt(rpc_.paymasterVerificationGasLimit),
410
454
  }),
411
- ...(authorization && {
412
- authorization: Authorization.fromRpc(authorization as Authorization.Rpc),
455
+ ...(eip7702Auth && {
456
+ authorization: Authorization.fromRpc(eip7702Auth),
413
457
  }),
414
- } as UserOperation
458
+ } as UserOperation<entryPointVersion, true>
415
459
  }
416
460
 
417
461
  export declare namespace fromRpc {
@@ -531,11 +575,11 @@ export function hash<
531
575
  verificationGasLimit,
532
576
  } = userOperation as UserOperation
533
577
 
534
- if (entryPointVersion === '0.8') {
535
- const typedData = toTypedData(userOperation as UserOperation<'0.8', true>, {
536
- chainId,
537
- entryPointAddress,
538
- })
578
+ if (entryPointVersion === '0.8' || entryPointVersion === '0.9') {
579
+ const typedData = toTypedData(
580
+ userOperation as UserOperation<'0.8' | '0.9', true>,
581
+ { chainId, entryPointAddress },
582
+ )
539
583
  return TypedData.getSignPayload(typedData)
540
584
  }
541
585
 
@@ -699,7 +743,8 @@ export function toInitCode(userOperation: Partial<UserOperation>): Hex.Hex {
699
743
  * @returns The packed user operation.
700
744
  */
701
745
  export function toPacked(
702
- userOperation: UserOperation<'0.7' | '0.8', true>,
746
+ userOperation: UserOperation<'0.7' | '0.8' | '0.9', true>,
747
+ options: toPacked.Options = {},
703
748
  ): Packed {
704
749
  const {
705
750
  callGasLimit,
@@ -715,6 +760,7 @@ export function toPacked(
715
760
  signature,
716
761
  verificationGasLimit,
717
762
  } = userOperation
763
+ const { paymasterSignature } = userOperation as V09<true>
718
764
 
719
765
  const accountGasLimits = packUint128Pair(
720
766
  verificationGasLimit || 0n,
@@ -731,6 +777,15 @@ export function toPacked(
731
777
  Hex.padLeft(Hex.fromNumber(paymasterVerificationGasLimit || 0n), 16),
732
778
  Hex.padLeft(Hex.fromNumber(paymasterPostOpGasLimit || 0n), 16),
733
779
  paymasterData || '0x',
780
+ ...(paymasterSignature
781
+ ? options.forHash
782
+ ? [paymasterSignatureMagic]
783
+ : [
784
+ paymasterSignature,
785
+ Hex.padLeft(Hex.fromNumber(Hex.size(paymasterSignature)), 2),
786
+ paymasterSignatureMagic,
787
+ ]
788
+ : []),
734
789
  )
735
790
  : '0x'
736
791
  const preVerificationGas = userOperation.preVerificationGas ?? 0n
@@ -749,6 +804,12 @@ export function toPacked(
749
804
  }
750
805
 
751
806
  export declare namespace toPacked {
807
+ /** Packing options. */
808
+ export type Options = {
809
+ /** Omits the paymaster signature while retaining its marker. */
810
+ forHash?: boolean | undefined
811
+ }
812
+
752
813
  export type ErrorType = Errors.GlobalErrorType
753
814
  }
754
815
 
@@ -888,54 +949,63 @@ export declare namespace fromPacked {
888
949
  * @param userOperation - The user operation to convert.
889
950
  * @returns An RPC-formatted user operation.
890
951
  */
891
- export function toRpc(userOperation: toRpc.Input): Rpc {
952
+ export function toRpc<
953
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
954
+ >(userOperation: toRpc.Input<entryPointVersion>): Rpc<entryPointVersion> {
955
+ const userOperation_ = userOperation as toRpc.Input
892
956
  const rpc = {} as Rpc
893
957
 
894
- rpc.callData = userOperation.callData
895
- rpc.callGasLimit = Quantity.fromNumberish(userOperation.callGasLimit)
896
- rpc.maxFeePerGas = Quantity.fromNumberish(userOperation.maxFeePerGas)
958
+ rpc.callData = userOperation_.callData
959
+ rpc.callGasLimit = Quantity.fromNumberish(userOperation_.callGasLimit)
960
+ rpc.maxFeePerGas = Quantity.fromNumberish(userOperation_.maxFeePerGas)
897
961
  rpc.maxPriorityFeePerGas = Quantity.fromNumberish(
898
- userOperation.maxPriorityFeePerGas,
962
+ userOperation_.maxPriorityFeePerGas,
899
963
  )
900
- rpc.nonce = Quantity.fromNumberish(userOperation.nonce)
964
+ rpc.nonce = Quantity.fromNumberish(userOperation_.nonce)
901
965
  rpc.preVerificationGas = Quantity.fromNumberish(
902
- userOperation.preVerificationGas,
966
+ userOperation_.preVerificationGas,
903
967
  )
904
- rpc.sender = userOperation.sender
968
+ rpc.sender = userOperation_.sender
905
969
  rpc.verificationGasLimit = Quantity.fromNumberish(
906
- userOperation.verificationGasLimit,
970
+ userOperation_.verificationGasLimit,
907
971
  )
908
972
 
909
- if (userOperation.factory) rpc.factory = userOperation.factory
910
- if (userOperation.factoryData) rpc.factoryData = userOperation.factoryData
911
- if (userOperation.initCode) rpc.initCode = userOperation.initCode
912
- if (userOperation.paymaster) rpc.paymaster = userOperation.paymaster
913
- if (userOperation.paymasterData)
914
- rpc.paymasterData = userOperation.paymasterData
915
- if (userOperation.paymasterPostOpGasLimit !== undefined)
973
+ if (userOperation_.factory) rpc.factory = userOperation_.factory
974
+ if (userOperation_.factoryData) rpc.factoryData = userOperation_.factoryData
975
+ if (userOperation_.initCode) rpc.initCode = userOperation_.initCode
976
+ if (userOperation_.paymaster) rpc.paymaster = userOperation_.paymaster
977
+ if (userOperation_.paymasterAndData !== undefined)
978
+ rpc.paymasterAndData = userOperation_.paymasterAndData
979
+ if (userOperation_.paymasterData)
980
+ rpc.paymasterData = userOperation_.paymasterData
981
+ if (userOperation_.paymasterPostOpGasLimit !== undefined)
916
982
  rpc.paymasterPostOpGasLimit = Quantity.fromNumberish(
917
- userOperation.paymasterPostOpGasLimit,
983
+ userOperation_.paymasterPostOpGasLimit,
918
984
  )
919
- if (userOperation.paymasterVerificationGasLimit !== undefined)
985
+ if (userOperation_.paymasterVerificationGasLimit !== undefined)
920
986
  rpc.paymasterVerificationGasLimit = Quantity.fromNumberish(
921
- userOperation.paymasterVerificationGasLimit,
987
+ userOperation_.paymasterVerificationGasLimit,
922
988
  )
923
- if (userOperation.signature) rpc.signature = userOperation.signature
989
+ if (userOperation_.paymasterSignature)
990
+ rpc.paymasterSignature = userOperation_.paymasterSignature
991
+ if (userOperation_.signature) rpc.signature = userOperation_.signature
924
992
 
925
- const authorization = (userOperation as UserOperation<'0.8', true>)
993
+ const authorization = (userOperation_ as UserOperation<'0.8' | '0.9', true>)
926
994
  .authorization
927
995
  if (authorization)
928
- (rpc as Rpc<'0.8'>).authorization = Authorization.toRpc(
996
+ (rpc as Rpc<'0.8' | '0.9'>).eip7702Auth = Authorization.toRpc(
929
997
  authorization as Authorization.Signed,
930
- ) as Rpc<'0.8'>['authorization']
998
+ )
931
999
 
932
- return rpc
1000
+ return rpc as Rpc<entryPointVersion>
933
1001
  }
934
1002
 
935
1003
  export declare namespace toRpc {
936
1004
  /** Numberish input accepted by {@link ox#UserOperation.(toRpc:function)}. */
937
- export type Input = UserOperation<
938
- EntryPoint.Version,
1005
+ export type Input<
1006
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
1007
+ > = UserOperation<
1008
+ entryPointVersion,
939
1009
  boolean,
940
1010
  Hex.Hex | bigint | number,
941
1011
  Hex.Hex | number
@@ -984,12 +1054,12 @@ export declare namespace toRpc {
984
1054
  * @returns A Typed Data definition.
985
1055
  */
986
1056
  export function toTypedData(
987
- userOperation: UserOperation<'0.8', true>,
1057
+ userOperation: UserOperation<'0.8' | '0.9', true>,
988
1058
  options: toTypedData.Options,
989
1059
  ): TypedData.Definition<typeof toTypedData.types, 'PackedUserOperation'> {
990
1060
  const { chainId, entryPointAddress } = options
991
1061
 
992
- const packedUserOp = toPacked(userOperation)
1062
+ const packedUserOp = toPacked(userOperation, { forHash: true })
993
1063
 
994
1064
  return {
995
1065
  domain: {
@@ -11,9 +11,10 @@ export type UserOperationGas<
11
11
  | (entryPointVersion extends '0.6' ? V06<bigintType> : never)
12
12
  | (entryPointVersion extends '0.7' ? V07<bigintType> : never)
13
13
  | (entryPointVersion extends '0.8' ? V08<bigintType> : never)
14
+ | (entryPointVersion extends '0.9' ? V09<bigintType> : never)
14
15
  >
15
16
 
16
- /** RPC User Operation Gas on EntryPoint 0.6 */
17
+ /** RPC User Operation Gas. */
17
18
  export type Rpc<
18
19
  entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
19
20
  > = UserOperationGas<entryPointVersion, Hex.Hex>
@@ -46,6 +47,12 @@ export type V08<bigintType = bigint> = V07<bigintType>
46
47
  /** RPC User Operation Gas on EntryPoint 0.8 */
47
48
  export type RpcV08 = V08<Hex.Hex>
48
49
 
50
+ /** Type for User Operation Gas on EntryPoint 0.9 */
51
+ export type V09<bigintType = bigint> = V08<bigintType>
52
+
53
+ /** RPC User Operation Gas on EntryPoint 0.9 */
54
+ export type RpcV09 = V09<Hex.Hex>
55
+
49
56
  /**
50
57
  * Converts an {@link ox#UserOperationGas.Rpc} to an {@link ox#UserOperationGas.UserOperationGas}.
51
58
  *
@@ -63,19 +70,22 @@ export type RpcV08 = V08<Hex.Hex>
63
70
  * @param rpc - The RPC user operation gas to convert.
64
71
  * @returns An instantiated {@link ox#UserOperationGas.UserOperationGas}.
65
72
  */
66
- export function fromRpc(rpc: Rpc): UserOperationGas {
73
+ export function fromRpc<
74
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
75
+ >(rpc: Rpc<entryPointVersion>): UserOperationGas<entryPointVersion> {
76
+ const gas = rpc as Rpc
67
77
  return {
68
- ...rpc,
69
- callGasLimit: BigInt(rpc.callGasLimit),
70
- preVerificationGas: BigInt(rpc.preVerificationGas),
71
- verificationGasLimit: BigInt(rpc.verificationGasLimit),
72
- ...(rpc.paymasterVerificationGasLimit && {
73
- paymasterVerificationGasLimit: BigInt(rpc.paymasterVerificationGasLimit),
78
+ ...gas,
79
+ callGasLimit: BigInt(gas.callGasLimit),
80
+ preVerificationGas: BigInt(gas.preVerificationGas),
81
+ verificationGasLimit: BigInt(gas.verificationGasLimit),
82
+ ...(gas.paymasterVerificationGasLimit && {
83
+ paymasterVerificationGasLimit: BigInt(gas.paymasterVerificationGasLimit),
74
84
  }),
75
- ...(rpc.paymasterPostOpGasLimit && {
76
- paymasterPostOpGasLimit: BigInt(rpc.paymasterPostOpGasLimit),
85
+ ...(gas.paymasterPostOpGasLimit && {
86
+ paymasterPostOpGasLimit: BigInt(gas.paymasterPostOpGasLimit),
77
87
  }),
78
- } as UserOperationGas
88
+ } as UserOperationGas<entryPointVersion>
79
89
  }
80
90
 
81
91
  /**
@@ -95,33 +105,31 @@ export function fromRpc(rpc: Rpc): UserOperationGas {
95
105
  * @param userOperationGas - The user operation gas to convert.
96
106
  * @returns An RPC-formatted user operation gas.
97
107
  */
98
- export function toRpc(userOperationGas: toRpc.Input): Rpc {
108
+ export function toRpc<
109
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
110
+ >(userOperationGas: toRpc.Input<entryPointVersion>): Rpc<entryPointVersion> {
111
+ const gas = userOperationGas as toRpc.Input
99
112
  const rpc = {} as Rpc
100
113
 
101
- rpc.callGasLimit = Quantity.fromNumberish(userOperationGas.callGasLimit)
102
- rpc.preVerificationGas = Quantity.fromNumberish(
103
- userOperationGas.preVerificationGas,
104
- )
105
- rpc.verificationGasLimit = Quantity.fromNumberish(
106
- userOperationGas.verificationGasLimit,
107
- )
114
+ rpc.callGasLimit = Quantity.fromNumberish(gas.callGasLimit)
115
+ rpc.preVerificationGas = Quantity.fromNumberish(gas.preVerificationGas)
116
+ rpc.verificationGasLimit = Quantity.fromNumberish(gas.verificationGasLimit)
108
117
 
109
- if (userOperationGas.paymasterVerificationGasLimit !== undefined)
118
+ if (gas.paymasterVerificationGasLimit !== undefined)
110
119
  rpc.paymasterVerificationGasLimit = Quantity.fromNumberish(
111
- userOperationGas.paymasterVerificationGasLimit,
120
+ gas.paymasterVerificationGasLimit,
112
121
  )
113
- if (userOperationGas.paymasterPostOpGasLimit !== undefined)
122
+ if (gas.paymasterPostOpGasLimit !== undefined)
114
123
  rpc.paymasterPostOpGasLimit = Quantity.fromNumberish(
115
- userOperationGas.paymasterPostOpGasLimit,
124
+ gas.paymasterPostOpGasLimit,
116
125
  )
117
126
 
118
- return rpc
127
+ return rpc as Rpc<entryPointVersion>
119
128
  }
120
129
 
121
130
  export declare namespace toRpc {
122
131
  /** Numberish input accepted by {@link ox#UserOperationGas.(toRpc:function)}. */
123
- export type Input = UserOperationGas<
124
- EntryPoint.Version,
125
- Hex.Hex | bigint | number
126
- >
132
+ export type Input<
133
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
134
+ > = UserOperationGas<entryPointVersion, Hex.Hex | bigint | number>
127
135
  }
@@ -45,7 +45,7 @@ export type UserOperationReceipt<
45
45
  userOpHash: Hex.Hex
46
46
  }
47
47
 
48
- /** RPC User Operation Receipt on EntryPoint 0.6 */
48
+ /** RPC User Operation Receipt. */
49
49
  export type Rpc<
50
50
  entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
51
51
  > = UserOperationReceipt<
@@ -84,7 +84,9 @@ export type Rpc<
84
84
  * @param rpc - The RPC user operation receipt to convert.
85
85
  * @returns An instantiated {@link ox#UserOperationReceipt.UserOperationReceipt}.
86
86
  */
87
- export function fromRpc(rpc: Rpc): UserOperationReceipt {
87
+ export function fromRpc<
88
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
89
+ >(rpc: Rpc<entryPointVersion>): UserOperationReceipt<entryPointVersion> {
88
90
  return {
89
91
  ...rpc,
90
92
  actualGasCost: BigInt(rpc.actualGasCost),
@@ -92,7 +94,7 @@ export function fromRpc(rpc: Rpc): UserOperationReceipt {
92
94
  logs: rpc.logs.map((log) => Log.fromRpc(log)),
93
95
  nonce: BigInt(rpc.nonce),
94
96
  receipt: TransactionReceipt.fromRpc(rpc.receipt),
95
- } as UserOperationReceipt
97
+ } as UserOperationReceipt<entryPointVersion>
96
98
  }
97
99
 
98
100
  /**
@@ -119,7 +121,11 @@ export function fromRpc(rpc: Rpc): UserOperationReceipt {
119
121
  * @param userOperationReceipt - The user operation receipt to convert.
120
122
  * @returns An RPC-formatted user operation receipt.
121
123
  */
122
- export function toRpc(userOperationReceipt: toRpc.Input): Rpc {
124
+ export function toRpc<
125
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
126
+ >(
127
+ userOperationReceipt: toRpc.Input<entryPointVersion>,
128
+ ): Rpc<entryPointVersion> {
123
129
  const rpc = {} as Rpc
124
130
 
125
131
  rpc.actualGasCost = Quantity.fromNumberish(userOperationReceipt.actualGasCost)
@@ -136,13 +142,15 @@ export function toRpc(userOperationReceipt: toRpc.Input): Rpc {
136
142
  rpc.paymaster = userOperationReceipt.paymaster
137
143
  if (userOperationReceipt.reason) rpc.reason = userOperationReceipt.reason
138
144
 
139
- return rpc
145
+ return rpc as Rpc<entryPointVersion>
140
146
  }
141
147
 
142
148
  export declare namespace toRpc {
143
149
  /** Numberish input accepted by {@link ox#UserOperationReceipt.(toRpc:function)}. */
144
- export type Input = UserOperationReceipt<
145
- EntryPoint.Version,
150
+ export type Input<
151
+ entryPointVersion extends EntryPoint.Version = EntryPoint.Version,
152
+ > = UserOperationReceipt<
153
+ entryPointVersion,
146
154
  Hex.Hex | bigint | number,
147
155
  Hex.Hex | number
148
156
  >
@@ -0,0 +1,48 @@
1
+ import { EntryPoint } from 'ox/erc4337'
2
+ import { describe, expect, test } from 'vp/test'
3
+
4
+ describe('abiV09', () => {
5
+ test('default', () => {
6
+ const names = new Set([
7
+ 'EIP7702AccountInitialized',
8
+ 'IgnoredInitCode',
9
+ 'InvalidPaymasterSignatureLength',
10
+ 'getCurrentUserOpHash',
11
+ ])
12
+
13
+ expect(
14
+ EntryPoint.abiV09
15
+ .filter((item) => 'name' in item && names.has(item.name))
16
+ .map((item) =>
17
+ 'name' in item ? { name: item.name, type: item.type } : item,
18
+ ),
19
+ ).toMatchInlineSnapshot(`
20
+ [
21
+ {
22
+ "name": "InvalidPaymasterSignatureLength",
23
+ "type": "error",
24
+ },
25
+ {
26
+ "name": "EIP7702AccountInitialized",
27
+ "type": "event",
28
+ },
29
+ {
30
+ "name": "IgnoredInitCode",
31
+ "type": "event",
32
+ },
33
+ {
34
+ "name": "getCurrentUserOpHash",
35
+ "type": "function",
36
+ },
37
+ ]
38
+ `)
39
+ })
40
+ })
41
+
42
+ describe('addressV09', () => {
43
+ test('default', () => {
44
+ expect(EntryPoint.addressV09).toMatchInlineSnapshot(
45
+ `"0x433709009B8330FDa32311DF1C2AFA402eD8D009"`,
46
+ )
47
+ })
48
+ })
@@ -0,0 +1,56 @@
1
+ import { type Address, type Hex, RpcSchema as CoreRpcSchema } from 'ox'
2
+ import {
3
+ RpcSchema,
4
+ UserOperation,
5
+ UserOperationGas,
6
+ UserOperationReceipt,
7
+ } from 'ox/erc4337'
8
+ import { expectTypeOf, test } from 'vp/test'
9
+
10
+ test('Bundler: EntryPoint 0.9 methods', () => {
11
+ type Schema = RpcSchema.Bundler<'0.9'>
12
+
13
+ type Estimate = CoreRpcSchema.ExtractReturnType<
14
+ Schema,
15
+ 'eth_estimateUserOperationGas'
16
+ >
17
+ expectTypeOf<Estimate>().toEqualTypeOf<UserOperationGas.Rpc<'0.9'>>()
18
+
19
+ type Receipt = CoreRpcSchema.ExtractReturnType<
20
+ Schema,
21
+ 'eth_getUserOperationReceipt'
22
+ >
23
+ expectTypeOf<Receipt>().toEqualTypeOf<UserOperationReceipt.Rpc<'0.9'> | null>()
24
+
25
+ type Send = CoreRpcSchema.ExtractParams<Schema, 'eth_sendUserOperation'>
26
+ expectTypeOf<Send>().toEqualTypeOf<
27
+ [userOperation: UserOperation.Rpc<'0.9'>, entrypoint: Address.Address]
28
+ >()
29
+ })
30
+
31
+ test('Bundler: eth_getUserOperationByHash result', () => {
32
+ type Result = CoreRpcSchema.ExtractReturnType<
33
+ RpcSchema.Bundler<'0.9'>,
34
+ 'eth_getUserOperationByHash'
35
+ >
36
+ type Info = Exclude<Result, null>
37
+
38
+ expectTypeOf<Result>().toEqualTypeOf<UserOperation.RpcTransactionInfo<'0.9'> | null>()
39
+ expectTypeOf<Info['blockHash']>().toEqualTypeOf<Hex.Hex | null>()
40
+ expectTypeOf<Info['blockNumber']>().toEqualTypeOf<Hex.Hex | null>()
41
+ expectTypeOf<Info['transactionHash']>().toEqualTypeOf<Hex.Hex | null>()
42
+ expectTypeOf<Info['userOperation']>().toEqualTypeOf<
43
+ UserOperation.Rpc<'0.9'>
44
+ >()
45
+ })
46
+
47
+ test('BundlerDebug: EntryPoint 0.9 mempool', () => {
48
+ type Result = CoreRpcSchema.ExtractReturnType<
49
+ RpcSchema.BundlerDebug<'0.9'>,
50
+ 'debug_bundler_dumpMempool'
51
+ >
52
+
53
+ expectTypeOf<Result>().toEqualTypeOf<
54
+ readonly { userOp: UserOperation.Rpc<'0.9'> }[]
55
+ >()
56
+ })
@@ -54,3 +54,34 @@ describe('from', () => {
54
54
  }`)
55
55
  })
56
56
  })
57
+
58
+ describe('v0.9', () => {
59
+ test('RPC round-trip', () => {
60
+ const rpc = {
61
+ callData: '0xdeadbeef',
62
+ callGasLimit: '0x0',
63
+ eip7702Auth: {
64
+ address: '0x1234567890123456789012345678901234567890',
65
+ chainId: '0x1',
66
+ nonce: '0x0',
67
+ r: '0x0000000000000000000000000000000000000000000000000000000000000001',
68
+ s: '0x0000000000000000000000000000000000000000000000000000000000000002',
69
+ yParity: '0x0',
70
+ },
71
+ maxFeePerGas: '0x0',
72
+ maxPriorityFeePerGas: '0x0',
73
+ nonce: '0x0',
74
+ paymasterSignature: '0xcafebabe',
75
+ preVerificationGas: '0x0',
76
+ sender: '0x1234567890123456789012345678901234567890',
77
+ signature: '0x',
78
+ verificationGasLimit: '0x0',
79
+ } as const satisfies UserOperation.Rpc<'0.9'>
80
+
81
+ const userOperation = UserOperation.fromRpc(rpc)
82
+ const rpc_roundTrip = UserOperation.toRpc(userOperation)
83
+
84
+ attest<UserOperation.UserOperation<'0.9', true>, typeof userOperation>()
85
+ attest<UserOperation.Rpc<'0.9'>, typeof rpc_roundTrip>()
86
+ })
87
+ })