ox 1.0.0-beta.8 → 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 (413) hide show
  1. package/CHANGELOG.md +1143 -0
  2. package/dist/core/Abi.d.ts +6 -2
  3. package/dist/core/Abi.d.ts.map +1 -1
  4. package/dist/core/Abi.js +6 -3
  5. package/dist/core/Abi.js.map +1 -1
  6. package/dist/core/AbiConstructor.d.ts +2 -1
  7. package/dist/core/AbiConstructor.d.ts.map +1 -1
  8. package/dist/core/AbiConstructor.js +2 -2
  9. package/dist/core/AbiConstructor.js.map +1 -1
  10. package/dist/core/AbiError.d.ts +3 -1
  11. package/dist/core/AbiError.d.ts.map +1 -1
  12. package/dist/core/AbiError.js +2 -2
  13. package/dist/core/AbiError.js.map +1 -1
  14. package/dist/core/AbiEvent.d.ts +3 -1
  15. package/dist/core/AbiEvent.d.ts.map +1 -1
  16. package/dist/core/AbiEvent.js +2 -2
  17. package/dist/core/AbiEvent.js.map +1 -1
  18. package/dist/core/AbiFunction.d.ts +3 -1
  19. package/dist/core/AbiFunction.d.ts.map +1 -1
  20. package/dist/core/AbiFunction.js +2 -2
  21. package/dist/core/AbiFunction.js.map +1 -1
  22. package/dist/core/AbiItem.d.ts +6 -3
  23. package/dist/core/AbiItem.d.ts.map +1 -1
  24. package/dist/core/AbiItem.js +9 -7
  25. package/dist/core/AbiItem.js.map +1 -1
  26. package/dist/core/AbiParameter.d.ts +88 -0
  27. package/dist/core/AbiParameter.d.ts.map +1 -0
  28. package/dist/core/AbiParameter.js +82 -0
  29. package/dist/core/AbiParameter.js.map +1 -0
  30. package/dist/core/AbiParameters.d.ts +58 -2
  31. package/dist/core/AbiParameters.d.ts.map +1 -1
  32. package/dist/core/AbiParameters.js +60 -6
  33. package/dist/core/AbiParameters.js.map +1 -1
  34. package/dist/core/Rlp.d.ts +27 -5
  35. package/dist/core/Rlp.d.ts.map +1 -1
  36. package/dist/core/Rlp.js +40 -4
  37. package/dist/core/Rlp.js.map +1 -1
  38. package/dist/core/RpcSchema.d.ts +2 -2
  39. package/dist/core/internal/abiParameters.d.ts.map +1 -1
  40. package/dist/core/internal/abiParameters.js +21 -3
  41. package/dist/core/internal/abiParameters.js.map +1 -1
  42. package/dist/core/internal/human-readable/errors.d.ts +103 -0
  43. package/dist/core/internal/human-readable/errors.d.ts.map +1 -0
  44. package/dist/core/internal/human-readable/errors.js +142 -0
  45. package/dist/core/internal/human-readable/errors.js.map +1 -0
  46. package/dist/core/internal/human-readable/formatAbi.d.ts +19 -0
  47. package/dist/core/internal/human-readable/formatAbi.d.ts.map +1 -0
  48. package/dist/core/internal/human-readable/formatAbi.js +18 -0
  49. package/dist/core/internal/human-readable/formatAbi.js.map +1 -0
  50. package/dist/core/internal/human-readable/formatAbiItem.d.ts +23 -0
  51. package/dist/core/internal/human-readable/formatAbiItem.d.ts.map +1 -0
  52. package/dist/core/internal/human-readable/formatAbiItem.js +25 -0
  53. package/dist/core/internal/human-readable/formatAbiItem.js.map +1 -0
  54. package/dist/core/internal/human-readable/formatAbiParameter.d.ts +41 -0
  55. package/dist/core/internal/human-readable/formatAbiParameter.d.ts.map +1 -0
  56. package/dist/core/internal/human-readable/formatAbiParameter.js +36 -0
  57. package/dist/core/internal/human-readable/formatAbiParameter.js.map +1 -0
  58. package/dist/core/internal/human-readable/formatAbiParameters.d.ts +26 -0
  59. package/dist/core/internal/human-readable/formatAbiParameters.d.ts.map +1 -0
  60. package/dist/core/internal/human-readable/formatAbiParameters.js +19 -0
  61. package/dist/core/internal/human-readable/formatAbiParameters.js.map +1 -0
  62. package/dist/core/internal/human-readable/parseAbi.d.ts +22 -0
  63. package/dist/core/internal/human-readable/parseAbi.d.ts.map +1 -0
  64. package/dist/core/internal/human-readable/parseAbi.js +22 -0
  65. package/dist/core/internal/human-readable/parseAbi.js.map +1 -0
  66. package/dist/core/internal/human-readable/parseAbiItem.d.ts +23 -0
  67. package/dist/core/internal/human-readable/parseAbiItem.d.ts.map +1 -0
  68. package/dist/core/internal/human-readable/parseAbiItem.js +30 -0
  69. package/dist/core/internal/human-readable/parseAbiItem.js.map +1 -0
  70. package/dist/core/internal/human-readable/parseAbiParameter.d.ts +28 -0
  71. package/dist/core/internal/human-readable/parseAbiParameter.d.ts.map +1 -0
  72. package/dist/core/internal/human-readable/parseAbiParameter.js +32 -0
  73. package/dist/core/internal/human-readable/parseAbiParameter.js.map +1 -0
  74. package/dist/core/internal/human-readable/parseAbiParameters.d.ts +38 -0
  75. package/dist/core/internal/human-readable/parseAbiParameters.d.ts.map +1 -0
  76. package/dist/core/internal/human-readable/parseAbiParameters.js +39 -0
  77. package/dist/core/internal/human-readable/parseAbiParameters.js.map +1 -0
  78. package/dist/core/internal/human-readable/regex.d.ts +9 -0
  79. package/dist/core/internal/human-readable/regex.d.ts.map +1 -0
  80. package/dist/core/internal/human-readable/regex.js +12 -0
  81. package/dist/core/internal/human-readable/regex.js.map +1 -0
  82. package/dist/core/internal/human-readable/runtime/cache.d.ts +22 -0
  83. package/dist/core/internal/human-readable/runtime/cache.d.ts.map +1 -0
  84. package/dist/core/internal/human-readable/runtime/cache.js +86 -0
  85. package/dist/core/internal/human-readable/runtime/cache.js.map +1 -0
  86. package/dist/core/internal/human-readable/runtime/signatures.d.ts +39 -0
  87. package/dist/core/internal/human-readable/runtime/signatures.d.ts.map +1 -0
  88. package/dist/core/internal/human-readable/runtime/signatures.js +67 -0
  89. package/dist/core/internal/human-readable/runtime/signatures.js.map +1 -0
  90. package/dist/core/internal/human-readable/runtime/structs.d.ts +3 -0
  91. package/dist/core/internal/human-readable/runtime/structs.d.ts.map +1 -0
  92. package/dist/core/internal/human-readable/runtime/structs.js +79 -0
  93. package/dist/core/internal/human-readable/runtime/structs.js.map +1 -0
  94. package/dist/core/internal/human-readable/runtime/utils.d.ts +205 -0
  95. package/dist/core/internal/human-readable/runtime/utils.d.ts.map +1 -0
  96. package/dist/core/internal/human-readable/runtime/utils.js +232 -0
  97. package/dist/core/internal/human-readable/runtime/utils.js.map +1 -0
  98. package/dist/core/internal/human-readable/types/signatures.d.ts +38 -0
  99. package/dist/core/internal/human-readable/types/signatures.d.ts.map +1 -0
  100. package/dist/core/internal/human-readable/types/signatures.js +2 -0
  101. package/dist/core/internal/human-readable/types/signatures.js.map +1 -0
  102. package/dist/core/internal/human-readable/types/structs.d.ts +48 -0
  103. package/dist/core/internal/human-readable/types/structs.d.ts.map +1 -0
  104. package/dist/core/internal/human-readable/types/structs.js +2 -0
  105. package/dist/core/internal/human-readable/types/structs.js.map +1 -0
  106. package/dist/core/internal/human-readable/types/utils.d.ts +163 -0
  107. package/dist/core/internal/human-readable/types/utils.d.ts.map +1 -0
  108. package/dist/core/internal/human-readable/types/utils.js +2 -0
  109. package/dist/core/internal/human-readable/types/utils.js.map +1 -0
  110. package/dist/core/internal/human-readable/types.d.ts +29 -0
  111. package/dist/core/internal/human-readable/types.d.ts.map +1 -0
  112. package/dist/core/internal/human-readable/types.js +2 -0
  113. package/dist/core/internal/human-readable/types.js.map +1 -0
  114. package/dist/core/internal/rpcSchemas/eth.d.ts +36 -0
  115. package/dist/core/internal/rpcSchemas/eth.d.ts.map +1 -1
  116. package/dist/erc4337/EntryPoint.d.ts +1072 -1
  117. package/dist/erc4337/EntryPoint.d.ts.map +1 -1
  118. package/dist/erc4337/EntryPoint.js +872 -0
  119. package/dist/erc4337/EntryPoint.js.map +1 -1
  120. package/dist/erc4337/RpcSchema.d.ts +2 -2
  121. package/dist/erc4337/RpcSchema.d.ts.map +1 -1
  122. package/dist/erc4337/UserOperation.d.ts +39 -10
  123. package/dist/erc4337/UserOperation.d.ts.map +1 -1
  124. package/dist/erc4337/UserOperation.js +62 -48
  125. package/dist/erc4337/UserOperation.js.map +1 -1
  126. package/dist/erc4337/UserOperationGas.d.ts +9 -5
  127. package/dist/erc4337/UserOperationGas.d.ts.map +1 -1
  128. package/dist/erc4337/UserOperationGas.js +17 -15
  129. package/dist/erc4337/UserOperationGas.js.map +1 -1
  130. package/dist/erc4337/UserOperationReceipt.d.ts +4 -4
  131. package/dist/erc4337/UserOperationReceipt.d.ts.map +1 -1
  132. package/dist/erc4337/UserOperationReceipt.js.map +1 -1
  133. package/dist/index.d.ts +37 -0
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +37 -0
  136. package/dist/index.js.map +1 -1
  137. package/dist/tempo/Channel.d.ts +8 -14
  138. package/dist/tempo/Channel.d.ts.map +1 -1
  139. package/dist/tempo/Channel.js +4 -8
  140. package/dist/tempo/Channel.js.map +1 -1
  141. package/dist/tempo/KeyAuthorization.d.ts +5 -5
  142. package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
  143. package/dist/tempo/KeyAuthorization.js +4 -4
  144. package/dist/tempo/KeyAuthorization.js.map +1 -1
  145. package/dist/tempo/MultisigConfig.d.ts +37 -85
  146. package/dist/tempo/MultisigConfig.d.ts.map +1 -1
  147. package/dist/tempo/MultisigConfig.js +39 -83
  148. package/dist/tempo/MultisigConfig.js.map +1 -1
  149. package/dist/tempo/PoolId.d.ts +8 -7
  150. package/dist/tempo/PoolId.d.ts.map +1 -1
  151. package/dist/tempo/PoolId.js +10 -6
  152. package/dist/tempo/PoolId.js.map +1 -1
  153. package/dist/tempo/SignatureEnvelope.d.ts +32 -30
  154. package/dist/tempo/SignatureEnvelope.d.ts.map +1 -1
  155. package/dist/tempo/SignatureEnvelope.js +56 -51
  156. package/dist/tempo/SignatureEnvelope.js.map +1 -1
  157. package/dist/tempo/Transaction.d.ts +16 -5
  158. package/dist/tempo/Transaction.d.ts.map +1 -1
  159. package/dist/tempo/Transaction.js +34 -7
  160. package/dist/tempo/Transaction.js.map +1 -1
  161. package/dist/tempo/TransactionReceipt.d.ts +3 -3
  162. package/dist/tempo/TransactionReceipt.d.ts.map +1 -1
  163. package/dist/tempo/TransactionReceipt.js +8 -1
  164. package/dist/tempo/TransactionReceipt.js.map +1 -1
  165. package/dist/tempo/TransactionRequest.d.ts +15 -2
  166. package/dist/tempo/TransactionRequest.d.ts.map +1 -1
  167. package/dist/tempo/TransactionRequest.js +65 -29
  168. package/dist/tempo/TransactionRequest.js.map +1 -1
  169. package/dist/tempo/TxEnvelopeTempo.d.ts +2 -3
  170. package/dist/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  171. package/dist/tempo/TxEnvelopeTempo.js +5 -6
  172. package/dist/tempo/TxEnvelopeTempo.js.map +1 -1
  173. package/dist/tempo/index.d.ts +6 -26
  174. package/dist/tempo/index.d.ts.map +1 -1
  175. package/dist/tempo/index.js +6 -26
  176. package/dist/tempo/index.js.map +1 -1
  177. package/dist/zod/Abi.d.ts +214 -0
  178. package/dist/zod/Abi.d.ts.map +1 -0
  179. package/dist/zod/Abi.js +5 -0
  180. package/dist/zod/Abi.js.map +1 -0
  181. package/dist/zod/AbiConstructor.d.ts +58 -0
  182. package/dist/zod/AbiConstructor.d.ts.map +1 -0
  183. package/dist/zod/AbiConstructor.js +18 -0
  184. package/dist/zod/AbiConstructor.js.map +1 -0
  185. package/dist/zod/AbiError.d.ts +20 -0
  186. package/dist/zod/AbiError.d.ts.map +1 -0
  187. package/dist/zod/AbiError.js +9 -0
  188. package/dist/zod/AbiError.js.map +1 -0
  189. package/dist/zod/AbiEvent.d.ts +23 -0
  190. package/dist/zod/AbiEvent.d.ts.map +1 -0
  191. package/dist/zod/AbiEvent.js +11 -0
  192. package/dist/zod/AbiEvent.js.map +1 -0
  193. package/dist/zod/AbiFallback.d.ts +16 -0
  194. package/dist/zod/AbiFallback.d.ts.map +1 -0
  195. package/dist/zod/AbiFallback.js +16 -0
  196. package/dist/zod/AbiFallback.js.map +1 -0
  197. package/dist/zod/AbiFunction.d.ts +109 -0
  198. package/dist/zod/AbiFunction.d.ts.map +1 -0
  199. package/dist/zod/AbiFunction.js +26 -0
  200. package/dist/zod/AbiFunction.js.map +1 -0
  201. package/dist/zod/AbiItem.d.ts +216 -0
  202. package/dist/zod/AbiItem.d.ts.map +1 -0
  203. package/dist/zod/AbiItem.js +26 -0
  204. package/dist/zod/AbiItem.js.map +1 -0
  205. package/dist/zod/AbiParameter.d.ts +32 -0
  206. package/dist/zod/AbiParameter.d.ts.map +1 -0
  207. package/dist/zod/AbiParameter.js +28 -0
  208. package/dist/zod/AbiParameter.js.map +1 -0
  209. package/dist/zod/AbiParameters.d.ts +30 -0
  210. package/dist/zod/AbiParameters.d.ts.map +1 -0
  211. package/dist/zod/AbiParameters.js +6 -0
  212. package/dist/zod/AbiParameters.js.map +1 -0
  213. package/dist/zod/AbiReceive.d.ts +6 -0
  214. package/dist/zod/AbiReceive.d.ts.map +1 -0
  215. package/dist/zod/AbiReceive.js +7 -0
  216. package/dist/zod/AbiReceive.js.map +1 -0
  217. package/dist/zod/RpcSchema.d.ts +6 -5
  218. package/dist/zod/RpcSchema.d.ts.map +1 -1
  219. package/dist/zod/Solidity.d.ts +15 -0
  220. package/dist/zod/Solidity.d.ts.map +1 -0
  221. package/dist/zod/Solidity.js +41 -0
  222. package/dist/zod/Solidity.js.map +1 -0
  223. package/dist/zod/TypedData.d.ts +226 -0
  224. package/dist/zod/TypedData.d.ts.map +1 -0
  225. package/dist/zod/TypedData.js +84 -0
  226. package/dist/zod/TypedData.js.map +1 -0
  227. package/dist/zod/internal/rpcSchemas/Eth.d.ts +1 -0
  228. package/dist/zod/internal/rpcSchemas/Eth.d.ts.map +1 -1
  229. package/dist/zod/internal/rpcSchemas/Eth.js +5 -0
  230. package/dist/zod/internal/rpcSchemas/Eth.js.map +1 -1
  231. package/dist/zod/tempo/AuthorizationTempo.d.ts +0 -20
  232. package/dist/zod/tempo/AuthorizationTempo.d.ts.map +1 -1
  233. package/dist/zod/tempo/KeyAuthorization.d.ts +503 -67
  234. package/dist/zod/tempo/KeyAuthorization.d.ts.map +1 -1
  235. package/dist/zod/tempo/KeyAuthorization.js +32 -15
  236. package/dist/zod/tempo/KeyAuthorization.js.map +1 -1
  237. package/dist/zod/tempo/RpcSchemaTempo.d.ts +216 -34
  238. package/dist/zod/tempo/RpcSchemaTempo.d.ts.map +1 -1
  239. package/dist/zod/tempo/SignatureEnvelope.d.ts +0 -6
  240. package/dist/zod/tempo/SignatureEnvelope.d.ts.map +1 -1
  241. package/dist/zod/tempo/SignatureEnvelope.js +0 -2
  242. package/dist/zod/tempo/SignatureEnvelope.js.map +1 -1
  243. package/dist/zod/tempo/Transaction.d.ts +1479 -333
  244. package/dist/zod/tempo/Transaction.d.ts.map +1 -1
  245. package/dist/zod/tempo/Transaction.js +65 -16
  246. package/dist/zod/tempo/Transaction.js.map +1 -1
  247. package/dist/zod/tempo/TransactionRequest.d.ts +410 -57
  248. package/dist/zod/tempo/TransactionRequest.d.ts.map +1 -1
  249. package/dist/zod/tempo/TransactionRequest.js +81 -18
  250. package/dist/zod/tempo/TransactionRequest.js.map +1 -1
  251. package/dist/zod/tempo/TxEnvelopeTempo.d.ts +225 -18
  252. package/dist/zod/tempo/TxEnvelopeTempo.d.ts.map +1 -1
  253. package/dist/zod/tempo/TxEnvelopeTempo.js +1 -1
  254. package/dist/zod/tempo/TxEnvelopeTempo.js.map +1 -1
  255. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts +0 -3
  256. package/dist/zod/tempo/ZoneRpcAuthentication.d.ts.map +1 -1
  257. package/dist/zod/tempo/z.d.ts +0 -1
  258. package/dist/zod/tempo/z.d.ts.map +1 -1
  259. package/dist/zod/tempo/z.js +0 -1
  260. package/dist/zod/tempo/z.js.map +1 -1
  261. package/dist/zod/z.d.ts +12 -0
  262. package/dist/zod/z.d.ts.map +1 -1
  263. package/dist/zod/z.js +12 -0
  264. package/dist/zod/z.js.map +1 -1
  265. package/package.json +67 -11
  266. package/src/core/Abi.bench.ts +30 -0
  267. package/src/core/Abi.ts +13 -4
  268. package/src/core/AbiConstructor.ts +3 -2
  269. package/src/core/AbiError.ts +6 -2
  270. package/src/core/AbiEvent.ts +6 -2
  271. package/src/core/AbiFunction.ts +6 -2
  272. package/src/core/AbiItem.bench.ts +19 -0
  273. package/src/core/AbiItem.ts +20 -10
  274. package/src/core/AbiParameter.bench.ts +35 -0
  275. package/src/core/AbiParameter.ts +126 -0
  276. package/src/core/AbiParameters.bench.ts +22 -0
  277. package/src/core/AbiParameters.ts +77 -8
  278. package/src/core/Rlp.ts +66 -3
  279. package/src/core/RpcSchema.ts +2 -2
  280. package/src/core/_test/Abi.test.ts +4 -0
  281. package/src/core/_test/AbiItem.test.ts +3 -0
  282. package/src/core/_test/AbiParameter.test-d.ts +41 -0
  283. package/src/core/_test/AbiParameter.test.ts +84 -0
  284. package/src/core/_test/AbiParameters.decode.test.ts +88 -12
  285. package/src/core/_test/AbiParameters.encode.test.ts +68 -0
  286. package/src/core/_test/AbiParameters.test.ts +7 -0
  287. package/src/core/_test/Rlp.test.ts +101 -0
  288. package/src/core/_test/index.test.ts +1 -0
  289. package/src/core/internal/abiParameters.ts +21 -3
  290. package/src/core/internal/human-readable/_snap/formatAbi.test.ts.snap +74 -0
  291. package/src/core/internal/human-readable/_snap/parseAbi.test.ts.snap +2353 -0
  292. package/src/core/internal/human-readable/errors.test.ts +258 -0
  293. package/src/core/internal/human-readable/errors.ts +205 -0
  294. package/src/core/internal/human-readable/formatAbi.test-d.ts +144 -0
  295. package/src/core/internal/human-readable/formatAbi.test.ts +23 -0
  296. package/src/core/internal/human-readable/formatAbi.ts +37 -0
  297. package/src/core/internal/human-readable/formatAbiItem.test-d.ts +115 -0
  298. package/src/core/internal/human-readable/formatAbiItem.test.ts +102 -0
  299. package/src/core/internal/human-readable/formatAbiItem.ts +136 -0
  300. package/src/core/internal/human-readable/formatAbiParameter.test-d.ts +125 -0
  301. package/src/core/internal/human-readable/formatAbiParameter.test.ts +126 -0
  302. package/src/core/internal/human-readable/formatAbiParameter.ts +86 -0
  303. package/src/core/internal/human-readable/formatAbiParameters.test-d.ts +92 -0
  304. package/src/core/internal/human-readable/formatAbiParameters.test.ts +32 -0
  305. package/src/core/internal/human-readable/formatAbiParameters.ts +46 -0
  306. package/src/core/internal/human-readable/human-readable.bench-d.ts +58 -0
  307. package/src/core/internal/human-readable/integration.test.ts +68 -0
  308. package/src/core/internal/human-readable/parseAbi.test-d.ts +188 -0
  309. package/src/core/internal/human-readable/parseAbi.test.ts +82 -0
  310. package/src/core/internal/human-readable/parseAbi.ts +59 -0
  311. package/src/core/internal/human-readable/parseAbiItem.test-d.ts +183 -0
  312. package/src/core/internal/human-readable/parseAbiItem.test.ts +264 -0
  313. package/src/core/internal/human-readable/parseAbiItem.ts +91 -0
  314. package/src/core/internal/human-readable/parseAbiParameter.test-d.ts +68 -0
  315. package/src/core/internal/human-readable/parseAbiParameter.test.ts +207 -0
  316. package/src/core/internal/human-readable/parseAbiParameter.ts +95 -0
  317. package/src/core/internal/human-readable/parseAbiParameters.test-d.ts +160 -0
  318. package/src/core/internal/human-readable/parseAbiParameters.test.ts +80 -0
  319. package/src/core/internal/human-readable/parseAbiParameters.ts +123 -0
  320. package/src/core/internal/human-readable/regex.ts +15 -0
  321. package/src/core/internal/human-readable/runtime/cache.ts +96 -0
  322. package/src/core/internal/human-readable/runtime/signatures.test.ts +236 -0
  323. package/src/core/internal/human-readable/runtime/signatures.ts +106 -0
  324. package/src/core/internal/human-readable/runtime/structs.test.ts +210 -0
  325. package/src/core/internal/human-readable/runtime/structs.ts +97 -0
  326. package/src/core/internal/human-readable/runtime/utils.test.ts +717 -0
  327. package/src/core/internal/human-readable/runtime/utils.ts +344 -0
  328. package/src/core/internal/human-readable/types/signatures.test-d.ts +255 -0
  329. package/src/core/internal/human-readable/types/signatures.ts +369 -0
  330. package/src/core/internal/human-readable/types/structs.test-d.ts +221 -0
  331. package/src/core/internal/human-readable/types/structs.ts +88 -0
  332. package/src/core/internal/human-readable/types/utils.test-d.ts +1029 -0
  333. package/src/core/internal/human-readable/types/utils.ts +392 -0
  334. package/src/core/internal/human-readable/types.ts +69 -0
  335. package/src/core/internal/rpcSchemas/eth.ts +36 -0
  336. package/src/erc4337/EntryPoint.ts +875 -1
  337. package/src/erc4337/RpcSchema.ts +4 -2
  338. package/src/erc4337/UserOperation.ts +130 -60
  339. package/src/erc4337/UserOperationGas.ts +36 -28
  340. package/src/erc4337/UserOperationReceipt.ts +15 -7
  341. package/src/erc4337/_test/EntryPoint.test.ts +48 -0
  342. package/src/erc4337/_test/RpcSchema.test-d.ts +56 -0
  343. package/src/erc4337/_test/UserOperation.snap-d.ts +31 -0
  344. package/src/erc4337/_test/UserOperation.test.ts +221 -5
  345. package/src/erc4337/_test/UserOperationGas.test.ts +30 -1
  346. package/src/index.ts +38 -0
  347. package/src/tempo/Channel.test.ts +2 -23
  348. package/src/tempo/Channel.ts +10 -22
  349. package/src/tempo/KeyAuthorization.test.ts +22 -0
  350. package/src/tempo/KeyAuthorization.ts +9 -9
  351. package/src/tempo/MultisigConfig.test.ts +54 -37
  352. package/src/tempo/MultisigConfig.ts +59 -134
  353. package/src/tempo/PoolId.test.ts +7 -41
  354. package/src/tempo/PoolId.ts +15 -10
  355. package/src/tempo/SignatureEnvelope.test.ts +118 -17
  356. package/src/tempo/SignatureEnvelope.ts +77 -72
  357. package/src/tempo/Transaction.test.ts +0 -15
  358. package/src/tempo/Transaction.ts +63 -12
  359. package/src/tempo/TransactionReceipt.test.ts +76 -0
  360. package/src/tempo/TransactionReceipt.ts +11 -5
  361. package/src/tempo/TransactionRequest.test.ts +174 -1
  362. package/src/tempo/TransactionRequest.ts +84 -32
  363. package/src/tempo/TxEnvelopeTempo.test.ts +2 -2
  364. package/src/tempo/TxEnvelopeTempo.ts +7 -7
  365. package/src/tempo/e2e.test.ts +228 -50
  366. package/src/tempo/index.ts +6 -26
  367. package/src/version.ts +1 -1
  368. package/src/zod/Abi.ts +5 -0
  369. package/src/zod/AbiConstructor.ts +24 -0
  370. package/src/zod/AbiError.ts +9 -0
  371. package/src/zod/AbiEvent.ts +11 -0
  372. package/src/zod/AbiFallback.ts +22 -0
  373. package/src/zod/AbiFunction.ts +32 -0
  374. package/src/zod/AbiItem.ts +28 -0
  375. package/src/zod/AbiParameter.ts +36 -0
  376. package/src/zod/AbiParameters.ts +7 -0
  377. package/src/zod/AbiReceive.ts +7 -0
  378. package/src/zod/RpcSchema.ts +5 -5
  379. package/src/zod/Solidity.ts +83 -0
  380. package/src/zod/TypedData.ts +111 -0
  381. package/src/zod/_test/Abi.test-d.ts +46 -0
  382. package/src/zod/_test/Abi.test.ts +163 -0
  383. package/src/zod/_test/TypedData.test-d.ts +20 -0
  384. package/src/zod/_test/TypedData.test.ts +87 -0
  385. package/src/zod/_test/z.test-d.ts +6 -0
  386. package/src/zod/_test/z.test.ts +17 -0
  387. package/src/zod/internal/rpcSchemas/Eth.ts +6 -0
  388. package/src/zod/tempo/KeyAuthorization.ts +34 -15
  389. package/src/zod/tempo/SignatureEnvelope.ts +0 -2
  390. package/src/zod/tempo/Transaction.ts +84 -22
  391. package/src/zod/tempo/TransactionRequest.ts +86 -20
  392. package/src/zod/tempo/TxEnvelopeTempo.ts +1 -1
  393. package/src/zod/tempo/_test/KeyAuthorization.test.ts +53 -0
  394. package/src/zod/tempo/_test/SignatureEnvelope.test.ts +0 -2
  395. package/src/zod/tempo/_test/Transaction.test.ts +155 -0
  396. package/src/zod/tempo/_test/TransactionRequest.test.ts +44 -0
  397. package/src/zod/tempo/z.ts +0 -1
  398. package/src/zod/z.ts +12 -0
  399. package/dist/tempo/TokenId.d.ts +0 -87
  400. package/dist/tempo/TokenId.d.ts.map +0 -1
  401. package/dist/tempo/TokenId.js +0 -123
  402. package/dist/tempo/TokenId.js.map +0 -1
  403. package/dist/zod/tempo/TokenId.d.ts +0 -6
  404. package/dist/zod/tempo/TokenId.d.ts.map +0 -1
  405. package/dist/zod/tempo/TokenId.js +0 -14
  406. package/dist/zod/tempo/TokenId.js.map +0 -1
  407. package/src/CHANGELOG.md +0 -820
  408. package/src/tempo/TokenId.bench.ts +0 -36
  409. package/src/tempo/TokenId.test.ts +0 -79
  410. package/src/tempo/TokenId.ts +0 -141
  411. package/src/zod/tempo/TokenId.ts +0 -15
  412. package/src/zod/tempo/_test/TokenId.test-d.ts +0 -17
  413. package/src/zod/tempo/_test/TokenId.test.ts +0 -21
@@ -103,18 +103,40 @@ export type Tempo<
103
103
  export type TempoRpc<pending extends boolean = false> = Compute<
104
104
  Omit<
105
105
  Tempo<pending, Hex.Hex, Hex.Hex, ToRpcType['tempo']>,
106
- 'authorizationList' | 'calls' | 'keyAuthorization' | 'signature'
106
+ | 'authorizationList'
107
+ | 'calls'
108
+ | 'feePayerSignature'
109
+ | 'gasPrice'
110
+ | 'keyAuthorization'
111
+ | 'nonceKey'
112
+ | 'signature'
113
+ | 'validAfter'
114
+ | 'validBefore'
107
115
  > & {
108
116
  aaAuthorizationList?: AuthorizationTempo.ListRpc | undefined
109
117
  calls:
110
118
  | readonly {
111
- input?: Hex.Hex | undefined
112
- to?: Hex.Hex | undefined
113
- value?: Hex.Hex | undefined
119
+ data?: Hex.Hex | null | undefined
120
+ input?: Hex.Hex | null | undefined
121
+ to?: Hex.Hex | null | undefined
122
+ value?: Hex.Hex | null | undefined
114
123
  }[]
115
124
  | undefined
116
- keyAuthorization?: KeyAuthorization.Rpc | undefined
125
+ feePayerSignature?:
126
+ | {
127
+ r: Hex.Hex
128
+ s: Hex.Hex
129
+ v?: Hex.Hex | undefined
130
+ yParity: Hex.Hex
131
+ }
132
+ | null
133
+ | undefined
134
+ gasPrice?: Hex.Hex | null | undefined
135
+ keyAuthorization?: KeyAuthorization.Rpc | null | undefined
136
+ nonceKey?: Hex.Hex | null | undefined
117
137
  signature: SignatureEnvelope.SignatureEnvelopeRpc
138
+ validAfter?: Hex.Hex | null | undefined
139
+ validBefore?: Hex.Hex | null | undefined
118
140
  }
119
141
  >
120
142
 
@@ -199,19 +221,26 @@ export function fromRpc<
199
221
  transaction as ox_Transaction.Rpc<pending>,
200
222
  ) as Transaction<pending>
201
223
 
202
- transaction_.type = fromRpcType[transaction.type as keyof typeof fromRpcType]
224
+ if (transaction.type !== '0x76') return transaction_ as never
225
+
226
+ transaction_.type = 'tempo'
203
227
 
204
- if (transaction.aaAuthorizationList) {
228
+ // Tempo transactions carry `calls`; scrub the flat call fields the generic
229
+ // decoder fabricates.
230
+ delete (transaction_ as any).data
231
+ delete (transaction_ as any).input
232
+ delete (transaction_ as any).to
233
+ delete (transaction_ as any).value
234
+
235
+ if (transaction.aaAuthorizationList?.length)
205
236
  transaction_.authorizationList = AuthorizationTempo.fromRpcList(
206
237
  transaction.aaAuthorizationList,
207
238
  )
208
- delete (transaction_ as any).aaAuthorizationList
209
- }
239
+ delete (transaction_ as any).aaAuthorizationList
210
240
  if (transaction.calls)
211
241
  transaction_.calls = transaction.calls.map((call) => ({
212
- to: call.to,
242
+ to: call.to ?? undefined,
213
243
  value: call.value && call.value !== '0x' ? BigInt(call.value) : undefined,
214
- // @ts-expect-error
215
244
  data: call.input || call.data || '0x',
216
245
  }))
217
246
  if (transaction.feeToken) transaction_.feeToken = transaction.feeToken
@@ -235,6 +264,18 @@ export function fromRpc<
235
264
  )
236
265
  }
237
266
 
267
+ // The node serializes absent optional fields as `null`; scrub them.
268
+ for (const key of [
269
+ 'feePayer',
270
+ 'feePayerSignature',
271
+ 'gasPrice',
272
+ 'keyAuthorization',
273
+ 'nonceKey',
274
+ 'validAfter',
275
+ 'validBefore',
276
+ ] as const)
277
+ if ((transaction_ as any)[key] === null) delete (transaction_ as any)[key]
278
+
238
279
  return transaction_ as never
239
280
  }
240
281
 
@@ -300,7 +341,15 @@ export function toRpc<pending extends boolean = false>(
300
341
  transaction as ox_Transaction.Transaction<pending>,
301
342
  ) as Rpc<pending>
302
343
 
303
- rpc.type = toRpcType[transaction.type as keyof typeof toRpcType]
344
+ if (transaction.type !== 'tempo') return rpc
345
+
346
+ rpc.type = '0x76'
347
+
348
+ // Tempo transactions carry `calls`; scrub the flat call fields the generic
349
+ // encoder fabricates.
350
+ delete (rpc as any).input
351
+ delete (rpc as any).to
352
+ delete (rpc as any).value
304
353
 
305
354
  if (transaction.authorizationList)
306
355
  rpc.aaAuthorizationList = AuthorizationTempo.toRpcList(
@@ -323,6 +372,8 @@ export function toRpc<pending extends boolean = false>(
323
372
  Signature.yParityToV(Number(transaction.feePayerSignature.yParity)),
324
373
  )
325
374
  }
375
+ if (transaction.nonceKey !== undefined)
376
+ rpc.nonceKey = Quantity.fromNumberish(transaction.nonceKey)
326
377
  if (transaction.signature)
327
378
  rpc.signature = SignatureEnvelope.toRpc(transaction.signature)
328
379
  if (transaction.validAfter !== undefined)
@@ -0,0 +1,76 @@
1
+ import { TransactionReceipt } from 'ox/tempo'
2
+ import { describe, expect, test } from 'vite-plus/test'
3
+
4
+ const rpc = {
5
+ blockHash:
6
+ '0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',
7
+ blockNumber: '0x12f296f',
8
+ contractAddress: null,
9
+ cumulativeGasUsed: '0x82515',
10
+ effectiveGasPrice: '0x21c2f6c09',
11
+ feePayer: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
12
+ feeToken: '0x20c0000000000000000000000000000000000001',
13
+ from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',
14
+ gasUsed: '0x2abba',
15
+ logs: [],
16
+ logsBloom: `0x${'00'.repeat(256)}`,
17
+ status: '0x1',
18
+ to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',
19
+ transactionHash:
20
+ '0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',
21
+ transactionIndex: '0x2',
22
+ type: '0x76',
23
+ } as const satisfies TransactionReceipt.Rpc
24
+
25
+ describe('fromRpc', () => {
26
+ test('default', () => {
27
+ const receipt = TransactionReceipt.fromRpc(rpc)
28
+ expect(receipt).toMatchInlineSnapshot(`
29
+ {
30
+ "blobGasPrice": undefined,
31
+ "blobGasUsed": undefined,
32
+ "blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b",
33
+ "blockNumber": 19868015n,
34
+ "contractAddress": null,
35
+ "cumulativeGasUsed": 533781n,
36
+ "effectiveGasPrice": 9062804489n,
37
+ "feePayer": "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
38
+ "feeToken": "0x20c0000000000000000000000000000000000001",
39
+ "from": "0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6",
40
+ "gasUsed": 175034n,
41
+ "logs": [],
42
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
43
+ "status": "success",
44
+ "to": "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad",
45
+ "transactionHash": "0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0",
46
+ "transactionIndex": 2,
47
+ "type": "tempo",
48
+ }
49
+ `)
50
+ })
51
+
52
+ test('behavior: non-tempo type passes through the generic mapping', () => {
53
+ const receipt = TransactionReceipt.fromRpc({ ...rpc, type: '0x2' })
54
+ expect(receipt.type).toBe('eip1559')
55
+ })
56
+
57
+ test('behavior: null', () => {
58
+ expect(TransactionReceipt.fromRpc(null)).toBeNull()
59
+ })
60
+ })
61
+
62
+ describe('toRpc', () => {
63
+ test('default', () => {
64
+ const receipt = TransactionReceipt.fromRpc(rpc)
65
+ const encoded = TransactionReceipt.toRpc(receipt)
66
+ expect(encoded.type).toBe('0x76')
67
+ expect(encoded.feePayer).toBe(rpc.feePayer)
68
+ expect(encoded.feeToken).toBe(rpc.feeToken)
69
+ expect(TransactionReceipt.fromRpc(encoded)).toEqual(receipt)
70
+ })
71
+
72
+ test('behavior: non-tempo type passes through the generic mapping', () => {
73
+ const receipt = TransactionReceipt.fromRpc({ ...rpc, type: '0x2' })
74
+ expect(TransactionReceipt.toRpc(receipt).type).toBe('0x2')
75
+ })
76
+ })
@@ -13,7 +13,7 @@ import * as ox_TransactionReceipt from '../core/TransactionReceipt.js'
13
13
  */
14
14
  export type TransactionReceipt<
15
15
  status = ox_TransactionReceipt.Status,
16
- type = ox_TransactionReceipt.Type,
16
+ type = Type,
17
17
  bigintType = bigint,
18
18
  numberType = number,
19
19
  > = Compute<
@@ -32,7 +32,7 @@ export type TransactionReceipt<
32
32
 
33
33
  export type Rpc = TransactionReceipt<
34
34
  ox_TransactionReceipt.RpcStatus,
35
- ox_TransactionReceipt.RpcType,
35
+ RpcType,
36
36
  Hex.Hex,
37
37
  Hex.Hex
38
38
  >
@@ -118,9 +118,14 @@ export const toRpcType = {
118
118
  export function fromRpc<const receipt extends Rpc | null>(
119
119
  receipt: receipt | Rpc | null,
120
120
  ): receipt extends Rpc ? TransactionReceipt : null {
121
- return ox_TransactionReceipt.fromRpc(
121
+ const decoded = ox_TransactionReceipt.fromRpc(
122
122
  receipt as ox_TransactionReceipt.Rpc,
123
- ) as never
123
+ )
124
+ if (!decoded) return null as never
125
+ return {
126
+ ...decoded,
127
+ type: (fromRpcType as any)[receipt!.type] ?? receipt!.type,
128
+ } as never
124
129
  }
125
130
 
126
131
  export declare namespace fromRpc {
@@ -192,6 +197,7 @@ export function toRpc(receipt: toRpc.Input): Rpc {
192
197
  ...rpc,
193
198
  feePayer: receipt.feePayer,
194
199
  feeToken: receipt.feeToken,
200
+ type: (toRpcType as any)[receipt.type] ?? receipt.type,
195
201
  }
196
202
  }
197
203
 
@@ -199,7 +205,7 @@ export declare namespace toRpc {
199
205
  /** Numberish input accepted by {@link ox#TransactionReceipt.(toRpc:function)}. */
200
206
  export type Input = TransactionReceipt<
201
207
  ox_TransactionReceipt.Status,
202
- ox_TransactionReceipt.Type,
208
+ Type,
203
209
  Hex.Hex | bigint | number,
204
210
  Hex.Hex | number
205
211
  >
@@ -69,6 +69,40 @@ describe('fromRpc', () => {
69
69
  expect(request.nonceKey).toBe(255n)
70
70
  })
71
71
 
72
+ test('behavior: gas-model hints and capabilities pass through', () => {
73
+ const request = TransactionRequest.fromRpc({
74
+ calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
75
+ capabilities: { balanceDiffs: true },
76
+ feePayer: true,
77
+ keyData: '0x0578',
78
+ keyId: '0xcccccccccccccccccccccccccccccccccccccccc',
79
+ keyType: 'webAuthn',
80
+ multisigInit: {
81
+ salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
82
+ threshold: 2,
83
+ owners: [
84
+ {
85
+ owner: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
86
+ weight: 1,
87
+ },
88
+ {
89
+ owner: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
90
+ weight: 1,
91
+ },
92
+ ],
93
+ },
94
+ multisigSignatureCount: 2,
95
+ type: '0x76',
96
+ })
97
+ expect(request.capabilities).toEqual({ balanceDiffs: true })
98
+ expect(request.feePayer).toBe(true)
99
+ expect(request.keyData).toBe('0x0578')
100
+ expect(request.keyId).toBe('0xcccccccccccccccccccccccccccccccccccccccc')
101
+ expect(request.keyType).toBe('webAuthn')
102
+ expect(request.multisigInit).toMatchObject({ threshold: 2 })
103
+ expect(request.multisigSignatureCount).toBe(2)
104
+ })
105
+
72
106
  test('behavior: empty', () => {
73
107
  const request = TransactionRequest.fromRpc({})
74
108
  expect(request).toMatchInlineSnapshot('{}')
@@ -123,6 +157,101 @@ describe('toRpc', () => {
123
157
  `)
124
158
  })
125
159
 
160
+ test('behavior: gas-model hints and capabilities are carried', () => {
161
+ const request = TransactionRequest.toRpc({
162
+ calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
163
+ capabilities: { balanceDiffs: true },
164
+ feePayer: false,
165
+ keyData: '0x0578',
166
+ keyId: '0xcccccccccccccccccccccccccccccccccccccccc',
167
+ keyType: 'webAuthn',
168
+ multisigInit: {
169
+ salt: '0x0000000000000000000000000000000000000000000000000000000000000000',
170
+ threshold: 2,
171
+ owners: [
172
+ {
173
+ owner: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
174
+ weight: 1,
175
+ },
176
+ {
177
+ owner: '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
178
+ weight: 1,
179
+ },
180
+ ],
181
+ },
182
+ multisigSignatureCount: 2,
183
+ })
184
+ expect(request.capabilities).toEqual({ balanceDiffs: true })
185
+ expect(request.feePayer).toBe(false)
186
+ expect(request.keyData).toBe('0x0578')
187
+ expect(request.keyId).toBe('0xcccccccccccccccccccccccccccccccccccccccc')
188
+ expect(request.keyType).toBe('webAuthn')
189
+ expect(request.multisigInit).toMatchObject({ threshold: 2 })
190
+ expect(request.multisigSignatureCount).toBe(2)
191
+ expect(request.type).toBe('0x76')
192
+ })
193
+
194
+ test('behavior: key data longer than 4 bytes shims into a length hint', () => {
195
+ const request = TransactionRequest.toRpc({
196
+ calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
197
+ keyData: `0x${'aa'.repeat(1400)}`,
198
+ keyType: 'webAuthn',
199
+ })
200
+ // 1400 bytes -> 0x0578 big-endian length hint.
201
+ expect(request.keyData).toBe('0x0578')
202
+ })
203
+
204
+ test('behavior: feeToken is withheld until the fee payer signs (TIP-76)', () => {
205
+ const pending = TransactionRequest.toRpc({
206
+ calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
207
+ feePayer: true,
208
+ feeToken: '0x20c0000000000000000000000000000000000000',
209
+ })
210
+ expect(pending.feeToken).toBeUndefined()
211
+ expect(pending.feePayer).toBe(true)
212
+
213
+ const signed = TransactionRequest.toRpc({
214
+ calls: [{ to: '0xcafebabecafebabecafebabecafebabecafebabe' }],
215
+ feePayer: true,
216
+ feePayerSignature: {
217
+ r: '0x0000000000000000000000000000000000000000000000000000000000000001',
218
+ s: '0x0000000000000000000000000000000000000000000000000000000000000002',
219
+ yParity: 1,
220
+ },
221
+ feeToken: '0x20c0000000000000000000000000000000000000',
222
+ })
223
+ expect(signed.feeToken).toBe('0x20c0000000000000000000000000000000000000')
224
+ })
225
+
226
+ test('behavior: data-less call defaults to the zero address', () => {
227
+ const flat = TransactionRequest.toRpc({
228
+ feeToken: '0x20c0000000000000000000000000000000000000',
229
+ value: 100n,
230
+ })
231
+ expect(flat.calls).toMatchInlineSnapshot(`
232
+ [
233
+ {
234
+ "data": "0x",
235
+ "to": "0x0000000000000000000000000000000000000000",
236
+ "value": "0x64",
237
+ },
238
+ ]
239
+ `)
240
+
241
+ const bare = TransactionRequest.toRpc({
242
+ feeToken: '0x20c0000000000000000000000000000000000000',
243
+ })
244
+ expect(bare.calls).toMatchInlineSnapshot(`
245
+ [
246
+ {
247
+ "data": "0x",
248
+ "to": "0x0000000000000000000000000000000000000000",
249
+ "value": "0x",
250
+ },
251
+ ]
252
+ `)
253
+ })
254
+
126
255
  test("behavior: nonceKey 'random' generates a 192-bit value", () => {
127
256
  const request = TransactionRequest.toRpc({
128
257
  calls: [
@@ -311,9 +440,53 @@ describe('toEnvelope', () => {
311
440
  expect(envelope.validAfter).toBe(100)
312
441
  })
313
442
 
314
- test('error: empty calls throws via envelope assert', () => {
443
+ test('behavior: data-less request defaults to a zero-address call', () => {
444
+ const envelope = TransactionRequest.toEnvelope({
445
+ chainId: 1,
446
+ maxFeePerGas: 1n,
447
+ })
448
+ expect(envelope.calls).toEqual([
449
+ { to: '0x0000000000000000000000000000000000000000' },
450
+ ])
451
+ })
452
+
453
+ test('behavior: feePayer marks the envelope as pending a fee payer signature (TIP-76)', () => {
454
+ const envelope = TransactionRequest.toEnvelope({
455
+ calls: [{ to: '0x0000000000000000000000000000000000000000' }],
456
+ chainId: 1,
457
+ feePayer: true,
458
+ feeToken: '0x20c0000000000000000000000000000000000000',
459
+ maxFeePerGas: 1n,
460
+ })
461
+ expect(envelope.feePayerSignature).toBeNull()
462
+
463
+ // An explicit fee payer signature wins over the marker.
464
+ const signed = TransactionRequest.toEnvelope({
465
+ calls: [{ to: '0x0000000000000000000000000000000000000000' }],
466
+ chainId: 1,
467
+ feePayer: true,
468
+ feePayerSignature: {
469
+ r: '0x0000000000000000000000000000000000000000000000000000000000000001',
470
+ s: '0x0000000000000000000000000000000000000000000000000000000000000002',
471
+ yParity: 1,
472
+ },
473
+ maxFeePerGas: 1n,
474
+ })
475
+ expect(signed.feePayerSignature).not.toBeNull()
476
+
477
+ // No fee payer, no marker.
478
+ const plain = TransactionRequest.toEnvelope({
479
+ calls: [{ to: '0x0000000000000000000000000000000000000000' }],
480
+ chainId: 1,
481
+ maxFeePerGas: 1n,
482
+ })
483
+ expect(plain.feePayerSignature).toBeUndefined()
484
+ })
485
+
486
+ test('error: explicit empty calls throws via envelope assert', () => {
315
487
  expect(() =>
316
488
  TransactionRequest.toEnvelope({
489
+ calls: [],
317
490
  chainId: 1,
318
491
  maxFeePerGas: 1n,
319
492
  }),
@@ -1,3 +1,4 @@
1
+ import type * as Address from '../core/Address.js'
1
2
  import type * as Errors from '../core/Errors.js'
2
3
  import * as Hex from '../core/Hex.js'
3
4
  import * as Quantity from '../core/internal/quantity.js'
@@ -6,14 +7,21 @@ import * as Signature from '../core/Signature.js'
6
7
  import * as ox_TransactionRequest from '../core/TransactionRequest.js'
7
8
  import * as AuthorizationTempo from './AuthorizationTempo.js'
8
9
  import * as KeyAuthorization from './KeyAuthorization.js'
10
+ import type * as MultisigConfig from './MultisigConfig.js'
9
11
  import * as SignatureEnvelope from './SignatureEnvelope.js'
10
- import * as TokenId from './TokenId.js'
11
12
  import * as Transaction from './Transaction.js'
12
13
  import * as TxEnvelopeTempo from './TxEnvelopeTempo.js'
13
14
  import type { Call } from './TxEnvelopeTempo.js'
14
15
 
15
16
  type KeyType = 'secp256k1' | 'p256' | 'webAuthn'
16
17
 
18
+ /**
19
+ * Bootstrap multisig config hint for node-side gas modeling (TIP-1061).
20
+ * The node prices multisig gas from it during simulation, and ignores it
21
+ * for registered senders.
22
+ */
23
+ export type MultisigInit = Compute<MultisigConfig.Config & { salt: Hex.Hex }>
24
+
17
25
  /**
18
26
  * A Transaction Request that is generic to all transaction types.
19
27
  *
@@ -35,12 +43,16 @@ export type TransactionRequest<
35
43
  | AuthorizationTempo.ListSigned<bigintType, numberType>
36
44
  | undefined
37
45
  calls?: readonly Call<bigintType>[] | undefined
46
+ capabilities?: Record<string, unknown> | undefined
38
47
  feePayerSignature?: Signature.Signature<true, numberType> | null | undefined
39
48
  keyAuthorization?: KeyAuthorization.KeyAuthorization<true> | undefined
40
49
  keyData?: Hex.Hex | undefined
50
+ keyId?: Address.Address | undefined
41
51
  keyType?: KeyType | undefined
42
52
  feePayer?: boolean | undefined
43
- feeToken?: TokenId.TokenIdOrAddress | undefined
53
+ feeToken?: Address.Address | undefined
54
+ multisigInit?: MultisigInit | undefined
55
+ multisigSignatureCount?: number | undefined
44
56
  nonceKey?: 'random' | bigintType | undefined
45
57
  signature?: SignatureEnvelope.SignatureEnvelope<numberType> | undefined
46
58
  validBefore?: numberType | undefined
@@ -202,6 +214,22 @@ export function toRpc(request: toRpc.Input): Rpc {
202
214
  authorizationList: undefined,
203
215
  }) as Rpc
204
216
 
217
+ const tempo =
218
+ typeof request.calls !== 'undefined' ||
219
+ typeof request.capabilities !== 'undefined' ||
220
+ typeof request.feePayer !== 'undefined' ||
221
+ typeof request.feeToken !== 'undefined' ||
222
+ typeof request.keyAuthorization !== 'undefined' ||
223
+ typeof request.keyData !== 'undefined' ||
224
+ typeof request.keyId !== 'undefined' ||
225
+ typeof request.keyType !== 'undefined' ||
226
+ typeof request.multisigInit !== 'undefined' ||
227
+ typeof request.multisigSignatureCount !== 'undefined' ||
228
+ typeof request.nonceKey !== 'undefined' ||
229
+ typeof request.validBefore !== 'undefined' ||
230
+ typeof request.validAfter !== 'undefined' ||
231
+ request.type === 'tempo'
232
+
205
233
  if (request.authorizationList)
206
234
  request_rpc.authorizationList = AuthorizationTempo.toRpcList(
207
235
  request.authorizationList,
@@ -216,20 +244,40 @@ export function toRpc(request: toRpc.Input): Rpc {
216
244
  value: call.value ? Quantity.fromNumberish(call.value) : '0x',
217
245
  data: call.data ?? '0x',
218
246
  }))
219
- else if (request.to || request.data || request.value)
247
+ else if (request.to || request.data || request.value || tempo)
220
248
  request_rpc.calls = [
221
249
  {
222
- to: request.to ?? undefined,
250
+ to:
251
+ request.to ||
252
+ (tempo && (!request.data || request.data === '0x')
253
+ ? '0x0000000000000000000000000000000000000000'
254
+ : undefined),
223
255
  value: request.value ? Quantity.fromNumberish(request.value) : '0x',
224
256
  data: request.data ?? '0x',
225
257
  },
226
258
  ]
227
- if (typeof request.feeToken !== 'undefined')
228
- request_rpc.feeToken = TokenId.toAddress(request.feeToken)
259
+ if (
260
+ typeof request.feeToken !== 'undefined' &&
261
+ !(request.feePayer === true && !request.feePayerSignature)
262
+ )
263
+ request_rpc.feeToken = request.feeToken
229
264
  if (request.keyAuthorization)
230
265
  request_rpc.keyAuthorization = KeyAuthorization.toRpc(
231
266
  request.keyAuthorization,
232
267
  )
268
+ if (typeof request.capabilities !== 'undefined')
269
+ request_rpc.capabilities = request.capabilities
270
+ if (typeof request.feePayer !== 'undefined')
271
+ request_rpc.feePayer = request.feePayer
272
+ if (typeof request.keyData !== 'undefined')
273
+ request_rpc.keyData = shimKeyData(request.keyData)
274
+ if (typeof request.keyId !== 'undefined') request_rpc.keyId = request.keyId
275
+ if (typeof request.keyType !== 'undefined')
276
+ request_rpc.keyType = request.keyType
277
+ if (typeof request.multisigInit !== 'undefined')
278
+ request_rpc.multisigInit = request.multisigInit
279
+ if (typeof request.multisigSignatureCount !== 'undefined')
280
+ request_rpc.multisigSignatureCount = request.multisigSignatureCount
233
281
  if (typeof request.validBefore !== 'undefined')
234
282
  request_rpc.validBefore = Quantity.fromNumberish(request.validBefore)
235
283
  if (typeof request.validAfter !== 'undefined')
@@ -243,16 +291,7 @@ export function toRpc(request: toRpc.Input): Rpc {
243
291
  })()
244
292
  if (nonceKey) request_rpc.nonceKey = nonceKey
245
293
 
246
- if (
247
- typeof request.calls !== 'undefined' ||
248
- typeof request.feePayer !== 'undefined' ||
249
- typeof request.feeToken !== 'undefined' ||
250
- typeof request.keyAuthorization !== 'undefined' ||
251
- typeof request.nonceKey !== 'undefined' ||
252
- typeof request.validBefore !== 'undefined' ||
253
- typeof request.validAfter !== 'undefined' ||
254
- request.type === 'tempo'
255
- ) {
294
+ if (tempo) {
256
295
  request_rpc.type = Transaction.toRpcType.tempo
257
296
  delete request_rpc.data
258
297
  delete request_rpc.input
@@ -306,21 +345,20 @@ export function toEnvelope(
306
345
  ): TxEnvelopeTempo.TxEnvelopeTempo {
307
346
  const calls = (() => {
308
347
  if (request.calls) return request.calls
309
- if (request.to || request.data || request.value)
310
- return [
311
- {
312
- ...(typeof request.to !== 'undefined' && request.to !== null
313
- ? { to: request.to }
314
- : {}),
315
- ...(typeof request.data !== 'undefined'
316
- ? { data: request.data }
317
- : {}),
318
- ...(typeof request.value !== 'undefined'
319
- ? { value: request.value }
320
- : {}),
321
- },
322
- ] satisfies readonly Call[]
323
- return [] as readonly Call[]
348
+ const to =
349
+ request.to ||
350
+ (!request.data || request.data === '0x'
351
+ ? '0x0000000000000000000000000000000000000000'
352
+ : undefined)
353
+ return [
354
+ {
355
+ ...(typeof to !== 'undefined' ? { to } : {}),
356
+ ...(typeof request.data !== 'undefined' ? { data: request.data } : {}),
357
+ ...(typeof request.value !== 'undefined'
358
+ ? { value: request.value }
359
+ : {}),
360
+ },
361
+ ] satisfies readonly Call[]
324
362
  })()
325
363
 
326
364
  const nonceKey = (() => {
@@ -342,7 +380,9 @@ export function toEnvelope(
342
380
  : {}),
343
381
  ...(typeof request.feePayerSignature !== 'undefined'
344
382
  ? { feePayerSignature: request.feePayerSignature }
345
- : {}),
383
+ : request.feePayer
384
+ ? { feePayerSignature: null }
385
+ : {}),
346
386
  ...(typeof request.feeToken !== 'undefined'
347
387
  ? { feeToken: request.feeToken }
348
388
  : {}),
@@ -387,3 +427,15 @@ export declare namespace toEnvelope {
387
427
  | Hex.toBigInt.ErrorType
388
428
  | Errors.GlobalErrorType
389
429
  }
430
+
431
+ /**
432
+ * Shims key data longer than 4 bytes into a 2-byte big-endian length hint.
433
+ * The node's gas estimator only accepts 1, 2, or 4-byte key data as a
434
+ * signature-size hint; anything else silently falls back to the default.
435
+ * @internal
436
+ */
437
+ function shimKeyData(data: Hex.Hex): Hex.Hex {
438
+ const byteLength = Hex.size(data)
439
+ if (byteLength <= 4) return data
440
+ return Hex.fromNumber(byteLength, { size: 2 })
441
+ }
@@ -1464,7 +1464,7 @@ describe('encodeForSigning', () => {
1464
1464
  },
1465
1465
  ],
1466
1466
  feePayerSignature: null,
1467
- feeToken: 1n,
1467
+ feeToken: '0x20c0000000000000000000000000000000000001',
1468
1468
  nonce: 0n,
1469
1469
  })
1470
1470
  const signature = Secp256k1.sign({
@@ -1485,7 +1485,7 @@ describe('encodeForSigning', () => {
1485
1485
  const sponsored = TxEnvelopeTempo.from({
1486
1486
  ...signed,
1487
1487
  feePayerSignature,
1488
- feeToken: 2n,
1488
+ feeToken: '0x20c0000000000000000000000000000000000002',
1489
1489
  })
1490
1490
 
1491
1491
  expect(TxEnvelopeTempo.encodeForSigning(sponsored)).toBe(