ox 1.0.0-beta.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/CHANGELOG.md +1143 -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/internal/abiParameters.d.ts.map +1 -1
  11. package/dist/core/internal/abiParameters.js +21 -3
  12. package/dist/core/internal/abiParameters.js.map +1 -1
  13. package/dist/core/internal/rpcSchemas/eth.d.ts +36 -0
  14. package/dist/core/internal/rpcSchemas/eth.d.ts.map +1 -1
  15. package/dist/erc4337/EntryPoint.d.ts +1072 -1
  16. package/dist/erc4337/EntryPoint.d.ts.map +1 -1
  17. package/dist/erc4337/EntryPoint.js +872 -0
  18. package/dist/erc4337/EntryPoint.js.map +1 -1
  19. package/dist/erc4337/RpcSchema.d.ts +2 -2
  20. package/dist/erc4337/RpcSchema.d.ts.map +1 -1
  21. package/dist/erc4337/UserOperation.d.ts +39 -10
  22. package/dist/erc4337/UserOperation.d.ts.map +1 -1
  23. package/dist/erc4337/UserOperation.js +62 -48
  24. package/dist/erc4337/UserOperation.js.map +1 -1
  25. package/dist/erc4337/UserOperationGas.d.ts +9 -5
  26. package/dist/erc4337/UserOperationGas.d.ts.map +1 -1
  27. package/dist/erc4337/UserOperationGas.js +17 -15
  28. package/dist/erc4337/UserOperationGas.js.map +1 -1
  29. package/dist/erc4337/UserOperationReceipt.d.ts +4 -4
  30. package/dist/erc4337/UserOperationReceipt.d.ts.map +1 -1
  31. package/dist/erc4337/UserOperationReceipt.js.map +1 -1
  32. package/dist/tempo/Channel.d.ts +8 -14
  33. package/dist/tempo/Channel.d.ts.map +1 -1
  34. package/dist/tempo/Channel.js +4 -8
  35. package/dist/tempo/Channel.js.map +1 -1
  36. package/dist/tempo/KeyAuthorization.d.ts +5 -5
  37. package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
  38. package/dist/tempo/KeyAuthorization.js +4 -4
  39. package/dist/tempo/KeyAuthorization.js.map +1 -1
  40. package/dist/tempo/MultisigConfig.d.ts +37 -85
  41. package/dist/tempo/MultisigConfig.d.ts.map +1 -1
  42. package/dist/tempo/MultisigConfig.js +39 -83
  43. package/dist/tempo/MultisigConfig.js.map +1 -1
  44. package/dist/tempo/PoolId.d.ts +8 -7
  45. package/dist/tempo/PoolId.d.ts.map +1 -1
  46. package/dist/tempo/PoolId.js +10 -6
  47. package/dist/tempo/PoolId.js.map +1 -1
  48. package/dist/tempo/SignatureEnvelope.d.ts +32 -30
  49. package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
  50. package/dist/tempo/SignatureEnvelope.js +56 -51
  51. package/dist/tempo/SignatureEnvelope.js.map +1 -1
  52. package/dist/tempo/Transaction.d.ts +16 -5
  53. package/dist/tempo/Transaction.d.ts.map +1 -1
  54. package/dist/tempo/Transaction.js +34 -7
  55. package/dist/tempo/Transaction.js.map +1 -1
  56. package/dist/tempo/TransactionReceipt.d.ts +3 -3
  57. package/dist/tempo/TransactionReceipt.d.ts.map +1 -1
  58. package/dist/tempo/TransactionReceipt.js +8 -1
  59. package/dist/tempo/TransactionReceipt.js.map +1 -1
  60. package/dist/tempo/TransactionRequest.d.ts +15 -2
  61. package/dist/tempo/TransactionRequest.d.ts.map +1 -1
  62. package/dist/tempo/TransactionRequest.js +65 -29
  63. package/dist/tempo/TransactionRequest.js.map +1 -1
  64. package/dist/tempo/TxEnvelopeTempo.d.ts +2 -3
  65. package/dist/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  66. package/dist/tempo/TxEnvelopeTempo.js +5 -6
  67. package/dist/tempo/TxEnvelopeTempo.js.map +1 -1
  68. package/dist/tempo/index.d.ts +6 -26
  69. package/dist/tempo/index.d.ts.map +1 -1
  70. package/dist/tempo/index.js +6 -26
  71. package/dist/tempo/index.js.map +1 -1
  72. package/dist/zod/Abi.d.ts +214 -0
  73. package/dist/zod/Abi.d.ts.map +1 -0
  74. package/dist/zod/Abi.js +5 -0
  75. package/dist/zod/Abi.js.map +1 -0
  76. package/dist/zod/AbiConstructor.d.ts +58 -0
  77. package/dist/zod/AbiConstructor.d.ts.map +1 -0
  78. package/dist/zod/AbiConstructor.js +18 -0
  79. package/dist/zod/AbiConstructor.js.map +1 -0
  80. package/dist/zod/AbiError.d.ts +20 -0
  81. package/dist/zod/AbiError.d.ts.map +1 -0
  82. package/dist/zod/AbiError.js +9 -0
  83. package/dist/zod/AbiError.js.map +1 -0
  84. package/dist/zod/AbiEvent.d.ts +23 -0
  85. package/dist/zod/AbiEvent.d.ts.map +1 -0
  86. package/dist/zod/AbiEvent.js +11 -0
  87. package/dist/zod/AbiEvent.js.map +1 -0
  88. package/dist/zod/AbiFallback.d.ts +16 -0
  89. package/dist/zod/AbiFallback.d.ts.map +1 -0
  90. package/dist/zod/AbiFallback.js +16 -0
  91. package/dist/zod/AbiFallback.js.map +1 -0
  92. package/dist/zod/AbiFunction.d.ts +109 -0
  93. package/dist/zod/AbiFunction.d.ts.map +1 -0
  94. package/dist/zod/AbiFunction.js +26 -0
  95. package/dist/zod/AbiFunction.js.map +1 -0
  96. package/dist/zod/AbiItem.d.ts +216 -0
  97. package/dist/zod/AbiItem.d.ts.map +1 -0
  98. package/dist/zod/AbiItem.js +26 -0
  99. package/dist/zod/AbiItem.js.map +1 -0
  100. package/dist/zod/AbiParameter.d.ts +32 -0
  101. package/dist/zod/AbiParameter.d.ts.map +1 -0
  102. package/dist/zod/AbiParameter.js +28 -0
  103. package/dist/zod/AbiParameter.js.map +1 -0
  104. package/dist/zod/AbiParameters.d.ts +30 -0
  105. package/dist/zod/AbiParameters.d.ts.map +1 -0
  106. package/dist/zod/AbiParameters.js +6 -0
  107. package/dist/zod/AbiParameters.js.map +1 -0
  108. package/dist/zod/AbiReceive.d.ts +6 -0
  109. package/dist/zod/AbiReceive.d.ts.map +1 -0
  110. package/dist/zod/AbiReceive.js +7 -0
  111. package/dist/zod/AbiReceive.js.map +1 -0
  112. package/dist/zod/RpcSchema.d.ts +1 -0
  113. package/dist/zod/RpcSchema.d.ts.map +1 -1
  114. package/dist/zod/Solidity.d.ts +15 -0
  115. package/dist/zod/Solidity.d.ts.map +1 -0
  116. package/dist/zod/Solidity.js +41 -0
  117. package/dist/zod/Solidity.js.map +1 -0
  118. package/dist/zod/TypedData.d.ts +226 -0
  119. package/dist/zod/TypedData.d.ts.map +1 -0
  120. package/dist/zod/TypedData.js +84 -0
  121. package/dist/zod/TypedData.js.map +1 -0
  122. package/dist/zod/internal/rpcSchemas/Eth.d.ts +1 -0
  123. package/dist/zod/internal/rpcSchemas/Eth.d.ts.map +1 -1
  124. package/dist/zod/internal/rpcSchemas/Eth.js +5 -0
  125. package/dist/zod/internal/rpcSchemas/Eth.js.map +1 -1
  126. package/dist/zod/tempo/AuthorizationTempo.d.ts +0 -20
  127. package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
  128. package/dist/zod/tempo/KeyAuthorization.d.ts +503 -67
  129. package/dist/zod/tempo/KeyAuthorization.d.ts.map +1 -1
  130. package/dist/zod/tempo/KeyAuthorization.js +32 -15
  131. package/dist/zod/tempo/KeyAuthorization.js.map +1 -1
  132. package/dist/zod/tempo/RpcSchemaTempo.d.ts +216 -34
  133. package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
  134. package/dist/zod/tempo/SignatureEnvelope.d.ts +0 -6
  135. package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
  136. package/dist/zod/tempo/SignatureEnvelope.js +0 -2
  137. package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
  138. package/dist/zod/tempo/Transaction.d.ts +1479 -333
  139. package/dist/zod/tempo/Transaction.d.ts.map +1 -1
  140. package/dist/zod/tempo/Transaction.js +65 -16
  141. package/dist/zod/tempo/Transaction.js.map +1 -1
  142. package/dist/zod/tempo/TransactionRequest.d.ts +410 -57
  143. package/dist/zod/tempo/TransactionRequest.d.ts.map +1 -1
  144. package/dist/zod/tempo/TransactionRequest.js +81 -18
  145. package/dist/zod/tempo/TransactionRequest.js.map +1 -1
  146. package/dist/zod/tempo/TxEnvelopeTempo.d.ts +225 -18
  147. package/dist/zod/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  148. package/dist/zod/tempo/TxEnvelopeTempo.js +1 -1
  149. package/dist/zod/tempo/TxEnvelopeTempo.js.map +1 -1
  150. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts +0 -3
  151. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts.map +1 -1
  152. package/dist/zod/tempo/z.d.ts +0 -1
  153. package/dist/zod/tempo/z.d.ts.map +1 -1
  154. package/dist/zod/tempo/z.js +0 -1
  155. package/dist/zod/tempo/z.js.map +1 -1
  156. package/dist/zod/z.d.ts +12 -0
  157. package/dist/zod/z.d.ts.map +1 -1
  158. package/dist/zod/z.js +12 -0
  159. package/dist/zod/z.js.map +1 -1
  160. package/package.json +62 -11
  161. package/src/core/AbiParameters.ts +3 -1
  162. package/src/core/Rlp.ts +66 -3
  163. package/src/core/RpcSchema.ts +1 -1
  164. package/src/core/_test/AbiParameters.decode.test.ts +88 -12
  165. package/src/core/_test/AbiParameters.encode.test.ts +68 -0
  166. package/src/core/_test/Rlp.test.ts +101 -0
  167. package/src/core/internal/abiParameters.ts +21 -3
  168. package/src/core/internal/rpcSchemas/eth.ts +36 -0
  169. package/src/erc4337/EntryPoint.ts +875 -1
  170. package/src/erc4337/RpcSchema.ts +4 -2
  171. package/src/erc4337/UserOperation.ts +130 -60
  172. package/src/erc4337/UserOperationGas.ts +36 -28
  173. package/src/erc4337/UserOperationReceipt.ts +15 -7
  174. package/src/erc4337/_test/EntryPoint.test.ts +48 -0
  175. package/src/erc4337/_test/RpcSchema.test-d.ts +56 -0
  176. package/src/erc4337/_test/UserOperation.snap-d.ts +31 -0
  177. package/src/erc4337/_test/UserOperation.test.ts +221 -5
  178. package/src/erc4337/_test/UserOperationGas.test.ts +30 -1
  179. package/src/tempo/Channel.test.ts +2 -23
  180. package/src/tempo/Channel.ts +10 -22
  181. package/src/tempo/KeyAuthorization.test.ts +22 -0
  182. package/src/tempo/KeyAuthorization.ts +9 -9
  183. package/src/tempo/MultisigConfig.test.ts +54 -37
  184. package/src/tempo/MultisigConfig.ts +59 -134
  185. package/src/tempo/PoolId.test.ts +7 -41
  186. package/src/tempo/PoolId.ts +15 -10
  187. package/src/tempo/SignatureEnvelope.test.ts +118 -17
  188. package/src/tempo/SignatureEnvelope.ts +77 -72
  189. package/src/tempo/Transaction.test.ts +0 -15
  190. package/src/tempo/Transaction.ts +63 -12
  191. package/src/tempo/TransactionReceipt.test.ts +76 -0
  192. package/src/tempo/TransactionReceipt.ts +11 -5
  193. package/src/tempo/TransactionRequest.test.ts +174 -1
  194. package/src/tempo/TransactionRequest.ts +84 -32
  195. package/src/tempo/TxEnvelopeTempo.test.ts +2 -2
  196. package/src/tempo/TxEnvelopeTempo.ts +7 -7
  197. package/src/tempo/e2e.test.ts +228 -50
  198. package/src/tempo/index.ts +6 -26
  199. package/src/version.ts +1 -1
  200. package/src/zod/Abi.ts +5 -0
  201. package/src/zod/AbiConstructor.ts +24 -0
  202. package/src/zod/AbiError.ts +9 -0
  203. package/src/zod/AbiEvent.ts +11 -0
  204. package/src/zod/AbiFallback.ts +22 -0
  205. package/src/zod/AbiFunction.ts +32 -0
  206. package/src/zod/AbiItem.ts +28 -0
  207. package/src/zod/AbiParameter.ts +36 -0
  208. package/src/zod/AbiParameters.ts +7 -0
  209. package/src/zod/AbiReceive.ts +7 -0
  210. package/src/zod/Solidity.ts +83 -0
  211. package/src/zod/TypedData.ts +111 -0
  212. package/src/zod/_test/Abi.test-d.ts +46 -0
  213. package/src/zod/_test/Abi.test.ts +163 -0
  214. package/src/zod/_test/TypedData.test-d.ts +20 -0
  215. package/src/zod/_test/TypedData.test.ts +87 -0
  216. package/src/zod/_test/z.test-d.ts +6 -0
  217. package/src/zod/_test/z.test.ts +17 -0
  218. package/src/zod/internal/rpcSchemas/Eth.ts +6 -0
  219. package/src/zod/tempo/KeyAuthorization.ts +34 -15
  220. package/src/zod/tempo/SignatureEnvelope.ts +0 -2
  221. package/src/zod/tempo/Transaction.ts +84 -22
  222. package/src/zod/tempo/TransactionRequest.ts +86 -20
  223. package/src/zod/tempo/TxEnvelopeTempo.ts +1 -1
  224. package/src/zod/tempo/_test/KeyAuthorization.test.ts +53 -0
  225. package/src/zod/tempo/_test/SignatureEnvelope.test.ts +0 -2
  226. package/src/zod/tempo/_test/Transaction.test.ts +155 -0
  227. package/src/zod/tempo/_test/TransactionRequest.test.ts +44 -0
  228. package/src/zod/tempo/z.ts +0 -1
  229. package/src/zod/z.ts +12 -0
  230. package/dist/tempo/TokenId.d.ts +0 -87
  231. package/dist/tempo/TokenId.d.ts.map +0 -1
  232. package/dist/tempo/TokenId.js +0 -123
  233. package/dist/tempo/TokenId.js.map +0 -1
  234. package/dist/zod/tempo/TokenId.d.ts +0 -6
  235. package/dist/zod/tempo/TokenId.d.ts.map +0 -1
  236. package/dist/zod/tempo/TokenId.js +0 -14
  237. package/dist/zod/tempo/TokenId.js.map +0 -1
  238. package/src/CHANGELOG.md +0 -820
  239. package/src/tempo/TokenId.bench.ts +0 -36
  240. package/src/tempo/TokenId.test.ts +0 -79
  241. package/src/tempo/TokenId.ts +0 -141
  242. package/src/zod/tempo/TokenId.ts +0 -15
  243. package/src/zod/tempo/_test/TokenId.test-d.ts +0 -17
  244. package/src/zod/tempo/_test/TokenId.test.ts +0 -21
@@ -0,0 +1,7 @@
1
+ /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import * as z_AbiParameter from './AbiParameter.js'
3
+ import * as z from 'zod/mini'
4
+
5
+ export const AbiParameters = z.readonly(z.array(z_AbiParameter.AbiParameter))
6
+
7
+ export const Parameter = z_AbiParameter.AbiParameter
@@ -0,0 +1,7 @@
1
+ /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import * as z from 'zod/mini'
3
+
4
+ export const AbiReceive = z.object({
5
+ type: z.literal('receive'),
6
+ stateMutability: z.literal('payable'),
7
+ })
@@ -0,0 +1,83 @@
1
+ /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import type * as abitype from 'abitype'
3
+ import * as z from 'zod/mini'
4
+
5
+ export const Identifier = z
6
+ .string()
7
+ .check(
8
+ z.refine(
9
+ (value) => /^[a-zA-Z$_][a-zA-Z0-9$_]*$/.test(value),
10
+ 'expected identifier',
11
+ ),
12
+ )
13
+
14
+ export const Address = z.literal('address')
15
+ export const Bool = z.literal('bool')
16
+ export const Bytes = z
17
+ .string()
18
+ .check(
19
+ z.refine(
20
+ (value): value is abitype.SolidityBytes =>
21
+ /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(value),
22
+ 'expected Solidity bytes type',
23
+ ),
24
+ )
25
+ export const Function = z.literal('function')
26
+ export const String = z.literal('string')
27
+ export const Tuple = z.literal('tuple')
28
+ export const Int = z
29
+ .string()
30
+ .check(
31
+ z.refine(
32
+ (value): value is abitype.SolidityInt =>
33
+ /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(
34
+ value,
35
+ ),
36
+ 'expected Solidity integer type',
37
+ ),
38
+ )
39
+ export const ArrayWithoutTuple = z
40
+ .string()
41
+ .check(
42
+ z.refine(
43
+ (value): value is abitype.SolidityArrayWithoutTuple =>
44
+ /^(address|bool|function|string|bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?|u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?)(\[[0-9]{0,}\])+$/.test(
45
+ value,
46
+ ),
47
+ 'expected Solidity array type',
48
+ ),
49
+ )
50
+ export const ArrayWithTuple = z
51
+ .string()
52
+ .check(
53
+ z.refine(
54
+ (value): value is abitype.SolidityArrayWithTuple =>
55
+ /^tuple(\[[0-9]{0,}\])+$/.test(value),
56
+ 'expected Solidity tuple array type',
57
+ ),
58
+ )
59
+ export const Array = z.union([ArrayWithTuple, ArrayWithoutTuple])
60
+
61
+ export const Type = z.union([
62
+ Address,
63
+ Bool,
64
+ Bytes,
65
+ Function,
66
+ String,
67
+ Tuple,
68
+ Int,
69
+ Array,
70
+ ])
71
+
72
+ export function isType(type: string) {
73
+ return (
74
+ type === 'address' ||
75
+ type === 'bool' ||
76
+ type === 'function' ||
77
+ type === 'string' ||
78
+ /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(type) ||
79
+ /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(
80
+ type,
81
+ )
82
+ )
83
+ }
@@ -0,0 +1,111 @@
1
+ /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import type * as core_TypedData from '../core/TypedData.js'
3
+ import * as z_Address from './Address.js'
4
+ import * as z_Solidity from './Solidity.js'
5
+ import * as z from 'zod/mini'
6
+
7
+ export const Domain = z.object({
8
+ chainId: z.optional(z.union([z.number(), z.bigint()])),
9
+ name: z.optional(z_Solidity.Identifier),
10
+ salt: z.optional(z.string()),
11
+ verifyingContract: z.optional(z_Address.Address),
12
+ version: z.optional(z.string()),
13
+ })
14
+
15
+ export const Type = z.union([
16
+ z_Solidity.Address,
17
+ z_Solidity.Bool,
18
+ z_Solidity.Bytes,
19
+ z_Solidity.String,
20
+ z_Solidity.Int,
21
+ z_Solidity.Array,
22
+ ])
23
+
24
+ export const Parameter = z.object({
25
+ name: z_Solidity.Identifier,
26
+ type: z.string(),
27
+ })
28
+
29
+ const Raw = z.record(z_Solidity.Identifier, z.readonly(z.array(Parameter)))
30
+
31
+ export const TypedData = z.pipe(
32
+ Raw,
33
+ z.transform((value, ctx) => validate(value, ctx)),
34
+ )
35
+
36
+ function validate(
37
+ typedData: Record<string, readonly core_TypedData.Parameter[]>,
38
+ ctx: z.core.ParsePayload,
39
+ ) {
40
+ for (const key of Object.keys(typedData)) {
41
+ if (z_Solidity.isType(key)) {
42
+ ctx.issues.push({
43
+ code: 'custom',
44
+ input: key,
45
+ message: `Invalid key. ${key} is a solidity type.`,
46
+ })
47
+ return z.NEVER
48
+ }
49
+
50
+ validateParameters(key, typedData, ctx)
51
+ }
52
+
53
+ return typedData as core_TypedData.TypedData
54
+ }
55
+
56
+ const typeWithoutTupleRegex =
57
+ /^(?<type>[a-zA-Z$_][a-zA-Z0-9$_]*?)(?<array>(?:\[\d*?\])+?)?$/
58
+
59
+ function validateParameters(
60
+ key: string,
61
+ typedData: Record<string, readonly core_TypedData.Parameter[]>,
62
+ ctx: z.core.ParsePayload,
63
+ ancestors = new Set<string>(),
64
+ ) {
65
+ const value = typedData[key]
66
+ if (!value) return
67
+
68
+ for (const parameter of value) {
69
+ if (parameter.type === key) {
70
+ ctx.issues.push({
71
+ code: 'custom',
72
+ input: parameter.type,
73
+ message: `Invalid type. ${key} is a self reference.`,
74
+ })
75
+ return z.NEVER
76
+ }
77
+
78
+ const match = typeWithoutTupleRegex.exec(parameter.type)?.groups as
79
+ | { array?: string | undefined; type?: string | undefined }
80
+ | undefined
81
+ const type = match?.type
82
+ if (!type) {
83
+ ctx.issues.push({
84
+ code: 'custom',
85
+ input: parameter.type,
86
+ message: `Invalid type. ${key} does not have a type.`,
87
+ })
88
+ return z.NEVER
89
+ }
90
+
91
+ if (type in typedData) {
92
+ if (ancestors.has(type)) {
93
+ ctx.issues.push({
94
+ code: 'custom',
95
+ input: type,
96
+ message: `Invalid type. ${type} is a circular reference.`,
97
+ })
98
+ return z.NEVER
99
+ }
100
+
101
+ validateParameters(type, typedData, ctx, new Set([...ancestors, type]))
102
+ } else if (!z_Solidity.isType(type)) {
103
+ ctx.issues.push({
104
+ code: 'custom',
105
+ input: type,
106
+ message: `Invalid type. ${type} is not a valid EIP-712 type.`,
107
+ })
108
+ return z.NEVER
109
+ }
110
+ }
111
+ }
@@ -0,0 +1,46 @@
1
+ import type * as core_Abi from '../../core/Abi.js'
2
+ import type * as core_AbiConstructor from '../../core/AbiConstructor.js'
3
+ import type * as core_AbiError from '../../core/AbiError.js'
4
+ import type * as core_AbiEvent from '../../core/AbiEvent.js'
5
+ import type * as core_AbiFunction from '../../core/AbiFunction.js'
6
+ import type * as core_AbiItem from '../../core/AbiItem.js'
7
+ import type * as core_AbiParameter from '../../core/AbiParameter.js'
8
+ import type * as core_AbiParameters from '../../core/AbiParameters.js'
9
+ import { expectTypeOf, test } from 'vp/test'
10
+ import * as z_Abi from '../Abi.js'
11
+ import * as z_AbiConstructor from '../AbiConstructor.js'
12
+ import * as z_AbiError from '../AbiError.js'
13
+ import * as z_AbiEvent from '../AbiEvent.js'
14
+ import * as z_AbiFunction from '../AbiFunction.js'
15
+ import * as z_AbiItem from '../AbiItem.js'
16
+ import * as z_AbiParameter from '../AbiParameter.js'
17
+ import * as z_AbiParameters from '../AbiParameters.js'
18
+ import type * as z from 'zod/mini'
19
+
20
+ test('ABI schemas output Ox core ABI types', () => {
21
+ expectTypeOf<z.output<typeof z_Abi.Abi>>().toMatchTypeOf<core_Abi.Abi>()
22
+ expectTypeOf<
23
+ z.output<typeof z_AbiConstructor.AbiConstructor>
24
+ >().toMatchTypeOf<core_AbiConstructor.AbiConstructor>()
25
+ expectTypeOf<
26
+ z.output<typeof z_AbiError.AbiError>
27
+ >().toMatchTypeOf<core_AbiError.AbiError>()
28
+ expectTypeOf<
29
+ z.output<typeof z_AbiEvent.AbiEvent>
30
+ >().toMatchTypeOf<core_AbiEvent.AbiEvent>()
31
+ expectTypeOf<
32
+ z.output<typeof z_AbiFunction.AbiFunction>
33
+ >().toMatchTypeOf<core_AbiFunction.AbiFunction>()
34
+ expectTypeOf<
35
+ z.output<typeof z_AbiItem.AbiItem>
36
+ >().toMatchTypeOf<core_AbiItem.AbiItem>()
37
+ expectTypeOf<
38
+ z.output<typeof z_AbiParameter.AbiParameter>
39
+ >().toMatchTypeOf<core_AbiParameter.AbiParameter>()
40
+ expectTypeOf<
41
+ z.output<typeof z_AbiParameter.AbiEventParameter>
42
+ >().toMatchTypeOf<core_AbiParameter.AbiEventParameter>()
43
+ expectTypeOf<
44
+ z.output<typeof z_AbiParameters.AbiParameters>
45
+ >().toMatchTypeOf<core_AbiParameters.AbiParameters>()
46
+ })
@@ -0,0 +1,163 @@
1
+ import { describe, expect, test } from 'vp/test'
2
+ import * as z_Abi from '../Abi.js'
3
+ import * as z_AbiConstructor from '../AbiConstructor.js'
4
+ import * as z_AbiFunction from '../AbiFunction.js'
5
+ import * as z_AbiParameter from '../AbiParameter.js'
6
+ import * as z_Solidity from '../Solidity.js'
7
+ import * as z from 'zod/mini'
8
+
9
+ describe('Abi', () => {
10
+ test('decodes ABI items and normalizes legacy mutability fields', () => {
11
+ const input = [
12
+ {
13
+ constant: true,
14
+ inputs: [{ name: 'owner', type: 'address' }],
15
+ name: 'balanceOf',
16
+ outputs: [{ name: 'balance', type: 'uint256' }],
17
+ type: 'function',
18
+ },
19
+ {
20
+ inputs: [{ name: 'owner', type: 'address' }],
21
+ payable: true,
22
+ type: 'constructor',
23
+ },
24
+ {
25
+ payable: false,
26
+ type: 'fallback',
27
+ },
28
+ ] as const
29
+
30
+ expect(z.decode(z_Abi.Abi, input)).toMatchInlineSnapshot(`
31
+ [
32
+ {
33
+ "constant": true,
34
+ "inputs": [
35
+ {
36
+ "name": "owner",
37
+ "type": "address",
38
+ },
39
+ ],
40
+ "name": "balanceOf",
41
+ "outputs": [
42
+ {
43
+ "name": "balance",
44
+ "type": "uint256",
45
+ },
46
+ ],
47
+ "stateMutability": "view",
48
+ "type": "function",
49
+ },
50
+ {
51
+ "inputs": [
52
+ {
53
+ "name": "owner",
54
+ "type": "address",
55
+ },
56
+ ],
57
+ "payable": true,
58
+ "stateMutability": "payable",
59
+ "type": "constructor",
60
+ },
61
+ {
62
+ "payable": false,
63
+ "stateMutability": "nonpayable",
64
+ "type": "fallback",
65
+ },
66
+ ]
67
+ `)
68
+ expect(input[0]).not.toHaveProperty('stateMutability')
69
+ })
70
+
71
+ test('strips unknown keys', () => {
72
+ const input: unknown = {
73
+ type: 'function',
74
+ inputs: [],
75
+ name: 'totalSupply',
76
+ outputs: [{ type: 'uint256', extra: true }],
77
+ stateMutability: 'view',
78
+ extra: true,
79
+ }
80
+
81
+ expect(z.parse(z_AbiFunction.AbiFunction, input)).toMatchInlineSnapshot(`
82
+ {
83
+ "inputs": [],
84
+ "name": "totalSupply",
85
+ "outputs": [
86
+ {
87
+ "type": "uint256",
88
+ },
89
+ ],
90
+ "stateMutability": "view",
91
+ "type": "function",
92
+ }
93
+ `)
94
+ })
95
+
96
+ test('decodes tuple parameters recursively', () => {
97
+ expect(
98
+ z.decode(z_AbiParameter.AbiParameter, {
99
+ name: 'foo',
100
+ type: 'tuple[]',
101
+ components: [
102
+ { name: 'owner', type: 'address' },
103
+ { name: 'ids', type: 'uint256[]' },
104
+ ],
105
+ }),
106
+ ).toMatchInlineSnapshot(`
107
+ {
108
+ "components": [
109
+ {
110
+ "name": "owner",
111
+ "type": "address",
112
+ },
113
+ {
114
+ "name": "ids",
115
+ "type": "uint256[]",
116
+ },
117
+ ],
118
+ "name": "foo",
119
+ "type": "tuple[]",
120
+ }
121
+ `)
122
+ })
123
+
124
+ test('rejects invalid parameter types', () => {
125
+ expect(
126
+ z.safeDecode(z_AbiParameter.AbiParameter, { type: 'notAValidType' })
127
+ .success,
128
+ ).toBe(false)
129
+ })
130
+
131
+ test('decodes constructors with explicit mutability', () => {
132
+ expect(
133
+ z.decode(z_AbiConstructor.AbiConstructor, {
134
+ type: 'constructor',
135
+ inputs: [],
136
+ payable: true,
137
+ stateMutability: 'nonpayable',
138
+ }),
139
+ ).toMatchInlineSnapshot(`
140
+ {
141
+ "inputs": [],
142
+ "payable": true,
143
+ "stateMutability": "nonpayable",
144
+ "type": "constructor",
145
+ }
146
+ `)
147
+ })
148
+ })
149
+
150
+ describe('Solidity', () => {
151
+ test('decodes Solidity type tokens', () => {
152
+ expect(z.decode(z_Solidity.Address, 'address')).toMatchInlineSnapshot(
153
+ `"address"`,
154
+ )
155
+ expect(z.decode(z_Solidity.Int, 'uint256')).toMatchInlineSnapshot(
156
+ `"uint256"`,
157
+ )
158
+ expect(z.decode(z_Solidity.Array, 'tuple[2][]')).toMatchInlineSnapshot(
159
+ `"tuple[2][]"`,
160
+ )
161
+ expect(z.safeDecode(z_Solidity.Bytes, 'bytes33').success).toBe(false)
162
+ })
163
+ })
@@ -0,0 +1,20 @@
1
+ import type * as core_TypedData from '../../core/TypedData.js'
2
+ import { expectTypeOf, test } from 'vp/test'
3
+ import * as z_TypedData from '../TypedData.js'
4
+ import type * as z from 'zod/mini'
5
+
6
+ test('TypedData schemas output Ox core TypedData types', () => {
7
+ expectTypeOf<z.output<typeof z_TypedData.Domain>>().toMatchTypeOf<{
8
+ chainId?: number | bigint | undefined
9
+ name?: string | undefined
10
+ salt?: string | undefined
11
+ verifyingContract?: core_TypedData.Domain['verifyingContract'] | undefined
12
+ version?: string | undefined
13
+ }>()
14
+ expectTypeOf<
15
+ z.output<typeof z_TypedData.Parameter>
16
+ >().toMatchTypeOf<core_TypedData.Parameter>()
17
+ expectTypeOf<
18
+ z.output<typeof z_TypedData.TypedData>
19
+ >().toMatchTypeOf<core_TypedData.TypedData>()
20
+ })
@@ -0,0 +1,87 @@
1
+ import { describe, expect, test } from 'vp/test'
2
+ import * as z_TypedData from '../TypedData.js'
3
+ import * as z from 'zod/mini'
4
+
5
+ describe('TypedData', () => {
6
+ test('decodes EIP-712 types maps', () => {
7
+ expect(
8
+ z.decode(z_TypedData.TypedData, {
9
+ Person: [
10
+ { name: 'name', type: 'string' },
11
+ { name: 'wallet', type: 'address' },
12
+ ],
13
+ Mail: [
14
+ { name: 'from', type: 'Person' },
15
+ { name: 'to', type: 'Person' },
16
+ { name: 'contents', type: 'string' },
17
+ ],
18
+ }),
19
+ ).toMatchInlineSnapshot(`
20
+ {
21
+ "Mail": [
22
+ {
23
+ "name": "from",
24
+ "type": "Person",
25
+ },
26
+ {
27
+ "name": "to",
28
+ "type": "Person",
29
+ },
30
+ {
31
+ "name": "contents",
32
+ "type": "string",
33
+ },
34
+ ],
35
+ "Person": [
36
+ {
37
+ "name": "name",
38
+ "type": "string",
39
+ },
40
+ {
41
+ "name": "wallet",
42
+ "type": "address",
43
+ },
44
+ ],
45
+ }
46
+ `)
47
+ })
48
+
49
+ test('rejects invalid references', () => {
50
+ expect(
51
+ z.safeDecode(z_TypedData.TypedData, {
52
+ Mail: [{ name: 'from', type: 'Person' }],
53
+ }).success,
54
+ ).toBe(false)
55
+ expect(
56
+ z.safeDecode(z_TypedData.TypedData, {
57
+ Person: [{ name: 'parent', type: 'Person' }],
58
+ }).success,
59
+ ).toBe(false)
60
+ expect(
61
+ z.safeDecode(z_TypedData.TypedData, {
62
+ Foo: [{ name: 'bar', type: 'Bar' }],
63
+ Bar: [{ name: 'foo', type: 'Foo' }],
64
+ }).success,
65
+ ).toBe(false)
66
+ })
67
+
68
+ test('decodes domains with ABIType-compatible salt strings', () => {
69
+ expect(
70
+ z.decode(z_TypedData.Domain, {
71
+ chainId: 1,
72
+ name: 'EtherMail',
73
+ salt: 'not-hex',
74
+ verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
75
+ version: '1',
76
+ }),
77
+ ).toMatchInlineSnapshot(`
78
+ {
79
+ "chainId": 1,
80
+ "name": "EtherMail",
81
+ "salt": "not-hex",
82
+ "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC",
83
+ "version": "1",
84
+ }
85
+ `)
86
+ })
87
+ })
@@ -1,5 +1,6 @@
1
1
  import type * as core_AccountProof from '../../core/AccountProof.js'
2
2
  import type * as core_AccessList from '../../core/AccessList.js'
3
+ import type * as core_Abi from '../../core/Abi.js'
3
4
  import type * as core_Authorization from '../../core/Authorization.js'
4
5
  import type * as core_Block from '../../core/Block.js'
5
6
  import type * as core_BlockOverrides from '../../core/BlockOverrides.js'
@@ -12,12 +13,17 @@ import type * as core_Transaction from '../../core/Transaction.js'
12
13
  import type * as core_TransactionEnvelope from '../../core/TxEnvelope.js'
13
14
  import type * as core_TransactionReceipt from '../../core/TransactionReceipt.js'
14
15
  import type * as core_TransactionRequest from '../../core/TransactionRequest.js'
16
+ import type * as core_TypedData from '../../core/TypedData.js'
15
17
  import type * as core_TxEnvelopeEip1559 from '../../core/TxEnvelopeEip1559.js'
16
18
  import { z } from 'ox/zod'
17
19
  import type * as zod from 'zod/mini'
18
20
  import { expectTypeOf, test } from 'vp/test'
19
21
 
20
22
  test('z entrypoint exposes module and direct integer schema types', () => {
23
+ expectTypeOf<zod.output<typeof z.Abi.Abi>>().toMatchTypeOf<core_Abi.Abi>()
24
+ expectTypeOf<
25
+ zod.output<typeof z.TypedData.TypedData>
26
+ >().toMatchTypeOf<core_TypedData.TypedData>()
21
27
  expectTypeOf<
22
28
  zod.output<typeof z.AccountProof.AccountProof>
23
29
  >().toEqualTypeOf<core_AccountProof.AccountProof>()
@@ -5,6 +5,23 @@ const address = '0x0000000000000000000000000000000000000000'
5
5
  const storageKey = `0x${'11'.repeat(32)}` as const
6
6
 
7
7
  test('exports zod mini utilities, modules, and integer schemas', () => {
8
+ expect(
9
+ z.decode(z.Abi.Abi, [
10
+ {
11
+ inputs: [],
12
+ name: 'totalSupply',
13
+ outputs: [{ type: 'uint256' }],
14
+ stateMutability: 'view',
15
+ type: 'function',
16
+ },
17
+ ]),
18
+ ).toMatchObject([{ name: 'totalSupply', type: 'function' }])
19
+ expect(z.decode(z.Solidity.Int, 'uint256')).toBe('uint256')
20
+ expect(
21
+ z.decode(z.TypedData.TypedData, {
22
+ Person: [{ name: 'wallet', type: 'address' }],
23
+ }),
24
+ ).toMatchObject({ Person: [{ name: 'wallet', type: 'address' }] })
8
25
  expect(
9
26
  z.decode(z.AccountProof.AccountProof, {
10
27
  address,
@@ -181,6 +181,12 @@ export const eth_getProof = from({
181
181
  returns: z_AccountProof.AccountProof,
182
182
  })
183
183
 
184
+ export const eth_getRawTransactionByHash = from({
185
+ method: 'eth_getRawTransactionByHash',
186
+ params: z.tuple([z_Hex.Hex]),
187
+ returns: z.nullable(z_Hex.Hex),
188
+ })
189
+
184
190
  export const eth_getStorageAt = from({
185
191
  method: 'eth_getStorageAt',
186
192
  params: z.tuple([z_Address.Address, z_Hex.Hex, BlockNumberOrTagOrIdentifier]),
@@ -12,31 +12,34 @@ import * as z_SignatureEnvelope from './SignatureEnvelope.js'
12
12
  /** RPC token spending limit schema. */
13
13
  export const RpcTokenLimit = z.object({
14
14
  limit: z_Hex.Hex,
15
- period: z.optional(z_Hex.Hex),
15
+ period: z.optional(z.nullable(z_Hex.Hex)),
16
16
  token: z_Address.Address,
17
17
  })
18
18
 
19
19
  /** RPC selector rule schema. */
20
20
  export const RpcSelectorRule = z.object({
21
- recipients: z.optional(z.readonly(z.array(z_Address.Address))),
21
+ recipients: z.optional(z.nullable(z.readonly(z.array(z_Address.Address)))),
22
22
  selector: z_Hex.Hex,
23
23
  })
24
24
 
25
25
  /** RPC call scope schema. */
26
26
  export const RpcCallScope = z.object({
27
- selectorRules: z.optional(z.readonly(z.array(RpcSelectorRule))),
27
+ selectorRules: z.optional(z.nullable(z.readonly(z.array(RpcSelectorRule)))),
28
28
  target: z_Address.Address,
29
29
  })
30
30
 
31
31
  /** RPC key authorization schema. */
32
32
  export const Rpc = z.object({
33
- allowedCalls: z.optional(z.readonly(z.array(RpcCallScope))),
33
+ account: z.optional(z.nullable(z_Address.Address)),
34
+ allowedCalls: z.optional(z.nullable(z.readonly(z.array(RpcCallScope)))),
34
35
  chainId: z_Hex.Hex,
35
36
  expiry: z.optional(z.nullable(z_Hex.Hex)),
37
+ isAdmin: z.optional(z.nullable(z.boolean())),
36
38
  keyId: z_Address.Address,
37
39
  keyType: z_SignatureEnvelope.Type,
38
- limits: z.optional(z.readonly(z.array(RpcTokenLimit))),
40
+ limits: z.optional(z.nullable(z.readonly(z.array(RpcTokenLimit)))),
39
41
  signature: z_SignatureEnvelope.Rpc,
42
+ witness: z.optional(z.nullable(z_Hex.Hex)),
40
43
  })
41
44
 
42
45
  /** Token spending limit schema. */
@@ -60,8 +63,7 @@ export const Scope = z.object({
60
63
  selector: z.optional(z.union([z_Hex.Hex, z.string()])),
61
64
  })
62
65
 
63
- /** Decoded key authorization schema. */
64
- export const Domain = z.object({
66
+ const domainShape = {
65
67
  address: z_Address.Address,
66
68
  chainId: z.bigint(),
67
69
  expiry: z.optional(z.number()),
@@ -69,18 +71,35 @@ export const Domain = z.object({
69
71
  scopes: z.optional(z.readonly(z.array(Scope))),
70
72
  signature: z_SignatureEnvelope.Domain,
71
73
  type: z_SignatureEnvelope.Type,
72
- })
74
+ witness: z.optional(z_Hex.Hex),
75
+ }
73
76
 
74
- /** Encode-only decoded key authorization schema accepting numberish `toRpc` inputs. */
75
- export const DomainToRpc = z.object({
76
- address: z_Address.Address,
77
+ /** Decoded key authorization schema (TIP-1049 admin fields are paired: both or neither). */
78
+ export const Domain = z.union([
79
+ z.object({
80
+ ...domainShape,
81
+ account: z_Address.Address,
82
+ isAdmin: z.boolean(),
83
+ }),
84
+ z.object(domainShape),
85
+ ])
86
+
87
+ const domainToRpcShape = {
88
+ ...domainShape,
77
89
  chainId: uintBigintNumberish(),
78
90
  expiry: z.optional(uintNumberNumberish()),
79
91
  limits: z.optional(z.readonly(z.array(TokenLimitToRpc))),
80
- scopes: z.optional(z.readonly(z.array(Scope))),
81
- signature: z_SignatureEnvelope.Domain,
82
- type: z_SignatureEnvelope.Type,
83
- })
92
+ }
93
+
94
+ /** Encode-only decoded key authorization schema accepting numberish `toRpc` inputs. */
95
+ export const DomainToRpc = z.union([
96
+ z.object({
97
+ ...domainToRpcShape,
98
+ account: z_Address.Address,
99
+ isAdmin: z.boolean(),
100
+ }),
101
+ z.object(domainToRpcShape),
102
+ ])
84
103
 
85
104
  /** Codec decoding an RPC key authorization into a signed key authorization. */
86
105
  export const KeyAuthorization = z.codec(Rpc, Domain, {