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
@@ -110,7 +110,6 @@ test('behavior: default (secp256k1)', async () => {
110
110
  expect(rest).toMatchInlineSnapshot(`
111
111
  {
112
112
  "accessList": [],
113
- "authorizationList": [],
114
113
  "calls": [
115
114
  {
116
115
  "data": "0x",
@@ -118,14 +117,9 @@ test('behavior: default (secp256k1)', async () => {
118
117
  "value": 0n,
119
118
  },
120
119
  ],
121
- "data": undefined,
122
- "feePayerSignature": null,
123
120
  "gas": 500000n,
124
121
  "nonceKey": 0n,
125
122
  "type": "tempo",
126
- "validAfter": null,
127
- "validBefore": null,
128
- "value": 0n,
129
123
  }
130
124
  `)
131
125
  }
@@ -164,7 +158,7 @@ test('behavior: default (secp256k1)', async () => {
164
158
  "contractAddress": null,
165
159
  "status": "success",
166
160
  "to": "0x0000000000000000000000000000000000000000",
167
- "type": "0x76",
161
+ "type": "tempo",
168
162
  }
169
163
  `)
170
164
  })
@@ -323,7 +317,6 @@ test('behavior: default (p256)', async () => {
323
317
  expect(rest).toMatchInlineSnapshot(`
324
318
  {
325
319
  "accessList": [],
326
- "authorizationList": [],
327
320
  "calls": [
328
321
  {
329
322
  "data": "0x",
@@ -331,14 +324,9 @@ test('behavior: default (p256)', async () => {
331
324
  "value": 0n,
332
325
  },
333
326
  ],
334
- "data": undefined,
335
- "feePayerSignature": null,
336
327
  "gas": 500000n,
337
328
  "nonceKey": 0n,
338
329
  "type": "tempo",
339
- "validAfter": null,
340
- "validBefore": null,
341
- "value": 0n,
342
330
  }
343
331
  `)
344
332
  }
@@ -377,7 +365,7 @@ test('behavior: default (p256)', async () => {
377
365
  "contractAddress": null,
378
366
  "status": "success",
379
367
  "to": "0x0000000000000000000000000000000000000000",
380
- "type": "0x76",
368
+ "type": "tempo",
381
369
  }
382
370
  `)
383
371
  })
@@ -468,7 +456,6 @@ test('behavior: default (p256 - webcrypto)', async () => {
468
456
  expect(rest).toMatchInlineSnapshot(`
469
457
  {
470
458
  "accessList": [],
471
- "authorizationList": [],
472
459
  "calls": [
473
460
  {
474
461
  "data": "0x",
@@ -476,14 +463,9 @@ test('behavior: default (p256 - webcrypto)', async () => {
476
463
  "value": 0n,
477
464
  },
478
465
  ],
479
- "data": undefined,
480
- "feePayerSignature": null,
481
466
  "gas": 500000n,
482
467
  "nonceKey": 0n,
483
468
  "type": "tempo",
484
- "validAfter": null,
485
- "validBefore": null,
486
- "value": 0n,
487
469
  }
488
470
  `)
489
471
  }
@@ -522,7 +504,7 @@ test('behavior: default (p256 - webcrypto)', async () => {
522
504
  "contractAddress": null,
523
505
  "status": "success",
524
506
  "to": "0x0000000000000000000000000000000000000000",
525
- "type": "0x76",
507
+ "type": "tempo",
526
508
  }
527
509
  `)
528
510
  })
@@ -620,7 +602,6 @@ test('behavior: default (webauthn)', async () => {
620
602
  expect(rest).toMatchInlineSnapshot(`
621
603
  {
622
604
  "accessList": [],
623
- "authorizationList": [],
624
605
  "calls": [
625
606
  {
626
607
  "data": "0x",
@@ -628,14 +609,9 @@ test('behavior: default (webauthn)', async () => {
628
609
  "value": 0n,
629
610
  },
630
611
  ],
631
- "data": undefined,
632
- "feePayerSignature": null,
633
612
  "gas": 500000n,
634
613
  "nonceKey": 0n,
635
614
  "type": "tempo",
636
- "validAfter": null,
637
- "validBefore": null,
638
- "value": 0n,
639
615
  }
640
616
  `)
641
617
  }
@@ -674,7 +650,7 @@ test('behavior: default (webauthn)', async () => {
674
650
  "contractAddress": null,
675
651
  "status": "success",
676
652
  "to": "0x0000000000000000000000000000000000000000",
677
- "type": "0x76",
653
+ "type": "tempo",
678
654
  }
679
655
  `)
680
656
  })
@@ -783,7 +759,7 @@ test('behavior: feePayerSignature (user → feePayer)', async () => {
783
759
  "contractAddress": null,
784
760
  "status": "success",
785
761
  "to": "0x0000000000000000000000000000000000000000",
786
- "type": "0x76",
762
+ "type": "tempo",
787
763
  }
788
764
  `)
789
765
  }
@@ -1003,7 +979,6 @@ describe('behavior: keyAuthorization', () => {
1003
979
  expect(rest).toMatchInlineSnapshot(`
1004
980
  {
1005
981
  "accessList": [],
1006
- "authorizationList": [],
1007
982
  "calls": [
1008
983
  {
1009
984
  "data": "0x",
@@ -1011,15 +986,10 @@ describe('behavior: keyAuthorization', () => {
1011
986
  "value": 0n,
1012
987
  },
1013
988
  ],
1014
- "data": undefined,
1015
- "feePayerSignature": null,
1016
989
  "feeToken": "0x20c0000000000000000000000000000000000001",
1017
990
  "gas": 1000000n,
1018
991
  "nonceKey": 0n,
1019
992
  "type": "tempo",
1020
- "validAfter": null,
1021
- "validBefore": null,
1022
- "value": 0n,
1023
993
  }
1024
994
  `)
1025
995
  }
@@ -1059,7 +1029,7 @@ describe('behavior: keyAuthorization', () => {
1059
1029
  "contractAddress": null,
1060
1030
  "status": "success",
1061
1031
  "to": "0x0000000000000000000000000000000000000000",
1062
- "type": "0x76",
1032
+ "type": "tempo",
1063
1033
  }
1064
1034
  `)
1065
1035
 
@@ -1223,7 +1193,6 @@ describe('behavior: keyAuthorization', () => {
1223
1193
  expect(rest).toMatchInlineSnapshot(`
1224
1194
  {
1225
1195
  "accessList": [],
1226
- "authorizationList": [],
1227
1196
  "calls": [
1228
1197
  {
1229
1198
  "data": "0x",
@@ -1231,15 +1200,10 @@ describe('behavior: keyAuthorization', () => {
1231
1200
  "value": 0n,
1232
1201
  },
1233
1202
  ],
1234
- "data": undefined,
1235
- "feePayerSignature": null,
1236
1203
  "feeToken": "0x20c0000000000000000000000000000000000001",
1237
1204
  "gas": 500000n,
1238
1205
  "nonceKey": 0n,
1239
1206
  "type": "tempo",
1240
- "validAfter": null,
1241
- "validBefore": null,
1242
- "value": 0n,
1243
1207
  }
1244
1208
  `)
1245
1209
  }
@@ -1279,7 +1243,7 @@ describe('behavior: keyAuthorization', () => {
1279
1243
  "contractAddress": null,
1280
1244
  "status": "success",
1281
1245
  "to": "0x0000000000000000000000000000000000000000",
1282
- "type": "0x76",
1246
+ "type": "tempo",
1283
1247
  }
1284
1248
  `)
1285
1249
 
@@ -1445,7 +1409,6 @@ describe('behavior: keyAuthorization', () => {
1445
1409
  expect(rest).toMatchInlineSnapshot(`
1446
1410
  {
1447
1411
  "accessList": [],
1448
- "authorizationList": [],
1449
1412
  "calls": [
1450
1413
  {
1451
1414
  "data": "0x",
@@ -1453,15 +1416,10 @@ describe('behavior: keyAuthorization', () => {
1453
1416
  "value": 0n,
1454
1417
  },
1455
1418
  ],
1456
- "data": undefined,
1457
- "feePayerSignature": null,
1458
1419
  "feeToken": "0x20c0000000000000000000000000000000000001",
1459
1420
  "gas": 500000n,
1460
1421
  "nonceKey": 0n,
1461
1422
  "type": "tempo",
1462
- "validAfter": null,
1463
- "validBefore": null,
1464
- "value": 0n,
1465
1423
  }
1466
1424
  `)
1467
1425
  }
@@ -3028,7 +2986,7 @@ describe.skip('behavior: multisig (TIP-1061)', () => {
3028
2986
 
3029
2987
  const genesisConfig = MultisigConfig.from({
3030
2988
  // A fresh random salt yields a distinct account each run, exercising the
3031
- // salt-inclusive config-ID derivation against the node.
2989
+ // salt-inclusive account derivation against the node.
3032
2990
  salt: Hex.random(32),
3033
2991
  threshold,
3034
2992
  owners: ownerKeys.map((key) => ({
@@ -3204,4 +3162,224 @@ describe.skip('behavior: multisig (TIP-1061)', () => {
3204
3162
  }),
3205
3163
  ).rejects.toThrow()
3206
3164
  })
3165
+
3166
+ test('behavior: keychain access key (authorize via AccountKeychain + spend)', async () => {
3167
+ const { account, genesisConfig, ownerKeys } = setup({
3168
+ count: 2,
3169
+ threshold: 2,
3170
+ })
3171
+
3172
+ await fundAddress(client, { address: account })
3173
+
3174
+ // Fresh secp256k1 access key for the multisig account.
3175
+ const access = (() => {
3176
+ const privateKey = Secp256k1.randomPrivateKey()
3177
+ const address = Address.fromPublicKey(
3178
+ Secp256k1.getPublicKey({ privateKey }),
3179
+ )
3180
+ return { address, privateKey } as const
3181
+ })()
3182
+
3183
+ // Bootstrap the multisig (nonce 0).
3184
+ const bootstrap = TxEnvelopeTempo.from({
3185
+ calls: [{ to: '0x0000000000000000000000000000000000000000' }],
3186
+ chainId,
3187
+ feeToken: '0x20c0000000000000000000000000000000000001',
3188
+ nonce: 0n,
3189
+ gas: 2_000_000n,
3190
+ maxFeePerGas: Value.fromGwei('20'),
3191
+ maxPriorityFeePerGas: Value.fromGwei('10'),
3192
+ })
3193
+
3194
+ const bootstrap_signed = TxEnvelopeTempo.serialize(bootstrap, {
3195
+ signature: SignatureEnvelope.from({
3196
+ genesisConfig,
3197
+ init: true,
3198
+ signatures: approve({
3199
+ genesisConfig,
3200
+ payload: TxEnvelopeTempo.getSignPayload(bootstrap),
3201
+ signers: ownerKeys,
3202
+ }),
3203
+ }),
3204
+ })
3205
+
3206
+ const bootstrap_receipt = (await client
3207
+ .request({
3208
+ method: 'eth_sendRawTransactionSync',
3209
+ params: [bootstrap_signed],
3210
+ })
3211
+ .then((tx) => TransactionReceipt.fromRpc(tx as any)))!
3212
+ expect(bootstrap_receipt.status).toBe('success')
3213
+
3214
+ // Authorize the access key (nonce 1): multisig transactions cannot carry
3215
+ // a TIP-1049 `keyAuthorization`, so the multisig account calls the
3216
+ // AccountKeychain precompile's `authorizeKey` directly.
3217
+ const authorizeKey = AbiFunction.from(
3218
+ 'function authorizeKey(address keyId, uint8 signatureType, (uint64 expiry, bool enforceLimits, (address token, uint256 amount, uint64 period)[] limits, bool allowAnyCalls, (address target, (bytes4 selector, address[] recipients)[] selectorRules)[] allowedCalls) config)',
3219
+ )
3220
+
3221
+ const authorize = TxEnvelopeTempo.from({
3222
+ calls: [
3223
+ {
3224
+ to: '0xaaaaaaaa00000000000000000000000000000000',
3225
+ data: AbiFunction.encodeData(authorizeKey, [
3226
+ access.address,
3227
+ 0, // secp256k1
3228
+ {
3229
+ expiry: 18446744073709551615n, // u64 max (never expires)
3230
+ enforceLimits: false,
3231
+ limits: [],
3232
+ allowAnyCalls: true,
3233
+ allowedCalls: [],
3234
+ },
3235
+ ]),
3236
+ },
3237
+ ],
3238
+ chainId,
3239
+ feeToken: '0x20c0000000000000000000000000000000000001',
3240
+ nonce: 1n,
3241
+ gas: 2_000_000n,
3242
+ maxFeePerGas: Value.fromGwei('20'),
3243
+ maxPriorityFeePerGas: Value.fromGwei('10'),
3244
+ })
3245
+
3246
+ const authorize_signed = TxEnvelopeTempo.serialize(authorize, {
3247
+ signature: SignatureEnvelope.from({
3248
+ genesisConfig,
3249
+ signatures: approve({
3250
+ genesisConfig,
3251
+ payload: TxEnvelopeTempo.getSignPayload(authorize),
3252
+ signers: ownerKeys,
3253
+ }),
3254
+ }),
3255
+ })
3256
+
3257
+ const authorize_receipt = (await client
3258
+ .request({
3259
+ method: 'eth_sendRawTransactionSync',
3260
+ params: [authorize_signed],
3261
+ })
3262
+ .then((tx) => TransactionReceipt.fromRpc(tx as any)))!
3263
+ expect(authorize_receipt.status).toBe('success')
3264
+ expect(authorize_receipt.from).toBe(account)
3265
+
3266
+ // Spend with the access key (nonce 2): outer keychain signature with the
3267
+ // multisig account as `userAddress` — no owner approvals involved.
3268
+ const nonce = await getTransactionCount(client, {
3269
+ address: account,
3270
+ blockTag: 'pending',
3271
+ })
3272
+
3273
+ const spend = TxEnvelopeTempo.from({
3274
+ calls: [{ to: '0x0000000000000000000000000000000000000000' }],
3275
+ chainId,
3276
+ feeToken: '0x20c0000000000000000000000000000000000001',
3277
+ nonce: BigInt(nonce),
3278
+ gas: 2_000_000n,
3279
+ maxFeePerGas: Value.fromGwei('20'),
3280
+ maxPriorityFeePerGas: Value.fromGwei('10'),
3281
+ })
3282
+
3283
+ const spend_signature = Secp256k1.sign({
3284
+ payload: TxEnvelopeTempo.getSignPayload(spend, { from: account }),
3285
+ privateKey: access.privateKey,
3286
+ })
3287
+
3288
+ const spend_signed = TxEnvelopeTempo.serialize(spend, {
3289
+ signature: SignatureEnvelope.from({
3290
+ userAddress: account,
3291
+ inner: SignatureEnvelope.from(spend_signature),
3292
+ type: 'keychain',
3293
+ }),
3294
+ })
3295
+
3296
+ const spend_receipt = (await client
3297
+ .request({
3298
+ method: 'eth_sendRawTransactionSync',
3299
+ params: [spend_signed],
3300
+ })
3301
+ .then((tx) => TransactionReceipt.fromRpc(tx as any)))!
3302
+ expect(spend_receipt.status).toBe('success')
3303
+ expect(spend_receipt.from).toBe(account)
3304
+
3305
+ {
3306
+ const response = await client
3307
+ .request({
3308
+ method: 'eth_getTransactionByHash',
3309
+ params: [spend_receipt.transactionHash],
3310
+ })
3311
+ .then((tx) => Transaction.fromRpc(tx as any))
3312
+ if (!response) throw new Error()
3313
+ expect(response.from).toBe(account)
3314
+ expect(response.signature?.type).toBe('keychain')
3315
+ expect(
3316
+ (response.signature as SignatureEnvelope.Keychain | undefined)
3317
+ ?.userAddress,
3318
+ ).toBe(account)
3319
+ }
3320
+ })
3321
+
3322
+ test('behavior: rejects `keyAuthorization` on multisig transactions', async () => {
3323
+ const { account, genesisConfig, ownerKeys } = setup({
3324
+ count: 1,
3325
+ threshold: 1,
3326
+ })
3327
+
3328
+ await fundAddress(client, { address: account })
3329
+
3330
+ const access = (() => {
3331
+ const privateKey = Secp256k1.randomPrivateKey()
3332
+ const address = Address.fromPublicKey(
3333
+ Secp256k1.getPublicKey({ privateKey }),
3334
+ )
3335
+ return { address, privateKey } as const
3336
+ })()
3337
+
3338
+ // TIP-1049 key authorizations are only valid on primitive/keychain
3339
+ // transactions; multisig accounts must call the AccountKeychain
3340
+ // precompile instead.
3341
+ const keyAuth = KeyAuthorization.from({
3342
+ address: access.address,
3343
+ chainId: BigInt(chainId),
3344
+ type: 'secp256k1',
3345
+ })
3346
+ const keyAuth_signed = KeyAuthorization.from(keyAuth, {
3347
+ signature: SignatureEnvelope.from(
3348
+ Secp256k1.sign({
3349
+ payload: KeyAuthorization.getSignPayload(keyAuth),
3350
+ privateKey: ownerKeys[0]!.privateKey,
3351
+ }),
3352
+ ),
3353
+ })
3354
+
3355
+ const bootstrap = TxEnvelopeTempo.from({
3356
+ calls: [{ to: '0x0000000000000000000000000000000000000000' }],
3357
+ chainId,
3358
+ feeToken: '0x20c0000000000000000000000000000000000001',
3359
+ keyAuthorization: keyAuth_signed,
3360
+ nonce: 0n,
3361
+ gas: 2_000_000n,
3362
+ maxFeePerGas: Value.fromGwei('20'),
3363
+ maxPriorityFeePerGas: Value.fromGwei('10'),
3364
+ })
3365
+
3366
+ const serialized_signed = TxEnvelopeTempo.serialize(bootstrap, {
3367
+ signature: SignatureEnvelope.from({
3368
+ genesisConfig,
3369
+ init: true,
3370
+ signatures: approve({
3371
+ genesisConfig,
3372
+ payload: TxEnvelopeTempo.getSignPayload(bootstrap),
3373
+ signers: ownerKeys,
3374
+ }),
3375
+ }),
3376
+ })
3377
+
3378
+ await expect(
3379
+ client.request({
3380
+ method: 'eth_sendRawTransactionSync',
3381
+ params: [serialized_signed],
3382
+ }),
3383
+ ).rejects.toThrow()
3384
+ })
3207
3385
  })
@@ -57,7 +57,7 @@ export * as AuthorizationTempo from './AuthorizationTempo.js'
57
57
  * payee: '0x2222222222222222222222222222222222222222',
58
58
  * payer: '0x1111111111111111111111111111111111111111',
59
59
  * salt: '0x0000000000000000000000000000000000000000000000000000000000000001',
60
- * token: 1n
60
+ * token: '0x20c0000000000000000000000000000000000001'
61
61
  * })
62
62
  *
63
63
  * const channelId = Channel.computeId(channel, {
@@ -122,8 +122,8 @@ export * as KeyAuthorization from './KeyAuthorization.js'
122
122
  /**
123
123
  * Native multisig account utilities (TIP-1061).
124
124
  *
125
- * Derives stable multisig account addresses and permanent config IDs from a weighted
126
- * owner configuration, and computes the owner approval digest that owners sign.
125
+ * Derives stable multisig account addresses from a weighted owner
126
+ * configuration, and computes the owner approval digest that owners sign.
127
127
  *
128
128
  * [TIP-1061](https://tips.sh/1061)
129
129
  *
@@ -196,8 +196,9 @@ export * as Period from './Period.js'
196
196
  * import { PoolId } from 'ox/tempo'
197
197
  *
198
198
  * const poolId = PoolId.from({
199
- * userToken: 1n,
200
- * validatorToken: 2n
199
+ * userToken: '0x20c0000000000000000000000000000000000001',
200
+ * validatorToken:
201
+ * '0x20c0000000000000000000000000000000000002'
201
202
  * })
202
203
  * ```
203
204
  *
@@ -292,27 +293,6 @@ export * as SignatureEnvelope from './SignatureEnvelope.js'
292
293
  * @category Reference
293
294
  */
294
295
  export * as Tick from './Tick.js'
295
- /**
296
- * TIP-20 token ID utilities for converting between token IDs and addresses.
297
- *
298
- * TIP-20 is Tempo's native token standard for stablecoins with deterministic addresses
299
- * derived from sequential token IDs. TIP-20 extends ERC-20 with payment features like
300
- * configurable fee tokens, transfer memos, and built-in role-based access control.
301
- *
302
- * [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)
303
- *
304
- * @example
305
- * ```ts twoslash
306
- * import { TokenId } from 'ox/tempo'
307
- *
308
- * const tokenId = TokenId.from(1n)
309
- * const address = TokenId.toAddress(1n)
310
- * // '0x20c0000000000000000000000000000000000001'
311
- * ```
312
- *
313
- * @category Reference
314
- */
315
- export * as TokenId from './TokenId.js'
316
296
  /**
317
297
  * Token role utilities for serializing role identifiers to keccak256 hashes.
318
298
  *
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** @internal */
2
- export const version = '1.0.0-beta.9'
2
+ export const version = '1.0.0'
package/src/zod/Abi.ts ADDED
@@ -0,0 +1,5 @@
1
+ /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import * as z_AbiItem from './AbiItem.js'
3
+ import * as z from 'zod/mini'
4
+
5
+ export const Abi = z.readonly(z.array(z_AbiItem.AbiItem))
@@ -0,0 +1,24 @@
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 StateMutability = z.union([
6
+ z.literal('nonpayable'),
7
+ z.literal('payable'),
8
+ ])
9
+
10
+ const Raw = z.object({
11
+ type: z.literal('constructor'),
12
+ inputs: z.readonly(z.array(z_AbiParameter.AbiParameter)),
13
+ payable: z.optional(z.boolean()),
14
+ stateMutability: z.optional(StateMutability),
15
+ })
16
+
17
+ export const AbiConstructor = z.pipe(
18
+ Raw,
19
+ z.transform((value) => ({
20
+ ...value,
21
+ stateMutability:
22
+ value.stateMutability ?? (value.payable ? 'payable' : 'nonpayable'),
23
+ })),
24
+ )
@@ -0,0 +1,9 @@
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 AbiError = z.object({
6
+ type: z.literal('error'),
7
+ inputs: z.readonly(z.array(z_AbiParameter.AbiParameter)),
8
+ name: z.string(),
9
+ })
@@ -0,0 +1,11 @@
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_Solidity from './Solidity.js'
4
+ import * as z from 'zod/mini'
5
+
6
+ export const AbiEvent = z.object({
7
+ type: z.literal('event'),
8
+ anonymous: z.optional(z.boolean()),
9
+ inputs: z.readonly(z.array(z_AbiParameter.AbiEventParameter)),
10
+ name: z_Solidity.Identifier,
11
+ })
@@ -0,0 +1,22 @@
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 StateMutability = z.union([
5
+ z.literal('nonpayable'),
6
+ z.literal('payable'),
7
+ ])
8
+
9
+ const Raw = z.object({
10
+ type: z.literal('fallback'),
11
+ payable: z.optional(z.boolean()),
12
+ stateMutability: z.optional(StateMutability),
13
+ })
14
+
15
+ export const AbiFallback = z.pipe(
16
+ Raw,
17
+ z.transform((value) => ({
18
+ ...value,
19
+ stateMutability:
20
+ value.stateMutability ?? (value.payable ? 'payable' : 'nonpayable'),
21
+ })),
22
+ )
@@ -0,0 +1,32 @@
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_Solidity from './Solidity.js'
4
+ import * as z from 'zod/mini'
5
+
6
+ export const StateMutability = z.union([
7
+ z.literal('pure'),
8
+ z.literal('view'),
9
+ z.literal('nonpayable'),
10
+ z.literal('payable'),
11
+ ])
12
+
13
+ const Raw = z.object({
14
+ type: z.literal('function'),
15
+ constant: z.optional(z.boolean()),
16
+ gas: z.optional(z.number()),
17
+ inputs: z.readonly(z.array(z_AbiParameter.AbiParameter)),
18
+ name: z_Solidity.Identifier,
19
+ outputs: z.readonly(z.array(z_AbiParameter.AbiParameter)),
20
+ payable: z.optional(z.boolean()),
21
+ stateMutability: z.optional(StateMutability),
22
+ })
23
+
24
+ export const AbiFunction = z.pipe(
25
+ Raw,
26
+ z.transform((value) => ({
27
+ ...value,
28
+ stateMutability:
29
+ value.stateMutability ??
30
+ (value.constant ? 'view' : value.payable ? 'payable' : 'nonpayable'),
31
+ })),
32
+ )
@@ -0,0 +1,28 @@
1
+ /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import * as z_AbiConstructor from './AbiConstructor.js'
3
+ import * as z_AbiError from './AbiError.js'
4
+ import * as z_AbiEvent from './AbiEvent.js'
5
+ import * as z_AbiFallback from './AbiFallback.js'
6
+ import * as z_AbiFunction from './AbiFunction.js'
7
+ import * as z_AbiReceive from './AbiReceive.js'
8
+ import * as z from 'zod/mini'
9
+
10
+ export const Type = z.union([
11
+ z.literal('constructor'),
12
+ z.literal('event'),
13
+ z.literal('error'),
14
+ z.literal('fallback'),
15
+ z.literal('function'),
16
+ z.literal('receive'),
17
+ ])
18
+
19
+ export const AbiItem = z.union([
20
+ z_AbiConstructor.AbiConstructor,
21
+ z_AbiError.AbiError,
22
+ z_AbiEvent.AbiEvent,
23
+ z_AbiFallback.AbiFallback,
24
+ z_AbiFunction.AbiFunction,
25
+ z_AbiReceive.AbiReceive,
26
+ ])
27
+
28
+ export const AbiItemType = Type
@@ -0,0 +1,36 @@
1
+ /* eslint-disable jsdoc-js/require-jsdoc, jsdoc-js/require-description, jsdoc-js/require-example */
2
+ import * as z_Solidity from './Solidity.js'
3
+ import * as z from 'zod/mini'
4
+
5
+ const Name = z.union([z.optional(z_Solidity.Identifier), z.literal('')])
6
+ const SimpleType = z.union([
7
+ z_Solidity.Address,
8
+ z_Solidity.Bool,
9
+ z_Solidity.Bytes,
10
+ z_Solidity.Function,
11
+ z_Solidity.String,
12
+ z_Solidity.Int,
13
+ z_Solidity.ArrayWithoutTuple,
14
+ ])
15
+ const TupleType = z.union([z_Solidity.Tuple, z_Solidity.ArrayWithTuple])
16
+
17
+ export const AbiParameter = z.intersection(
18
+ z.object({
19
+ name: Name,
20
+ internalType: z.optional(z.string()),
21
+ }),
22
+ z.union([
23
+ z.object({ type: SimpleType }),
24
+ z.object({
25
+ type: TupleType,
26
+ get components() {
27
+ return z.readonly(z.array(AbiParameter))
28
+ },
29
+ }),
30
+ ]),
31
+ )
32
+
33
+ export const AbiEventParameter = z.intersection(
34
+ AbiParameter,
35
+ z.object({ indexed: z.optional(z.boolean()) }),
36
+ )