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
@@ -3,6 +3,8 @@ import * as Address from './Address.js'
3
3
  import * as Bytes from './Bytes.js'
4
4
  import * as Errors from './Errors.js'
5
5
  import * as Hex from './Hex.js'
6
+ import * as formatAbiParameters from './internal/human-readable/formatAbiParameters.js'
7
+ import * as parseAbiParameters from './internal/human-readable/parseAbiParameters.js'
6
8
  import * as internal from './internal/abiParameters.js'
7
9
  import * as Cursor from './internal/cursor.js'
8
10
  import * as Solidity from './Solidity.js'
@@ -13,6 +15,16 @@ export type AbiParameters = readonly abitype.AbiParameter[]
13
15
  /** A parameter on an {@link ox#AbiParameters.AbiParameters}. */
14
16
  export type Parameter = abitype.AbiParameter
15
17
 
18
+ export {
19
+ InvalidAbiParametersError,
20
+ InvalidAbiTypeParameterError,
21
+ InvalidFunctionModifierError,
22
+ InvalidModifierError,
23
+ InvalidParameterError,
24
+ SolidityProtectedKeywordError,
25
+ } from './internal/human-readable/errors.js'
26
+ export { InvalidParenthesisError } from './internal/human-readable/errors.js'
27
+
16
28
  /** A packed ABI type. */
17
29
  export type PackedAbiType =
18
30
  | abitype.SolidityAddress
@@ -97,7 +109,9 @@ export function decode(
97
109
  for (let i = 0; i < parameters.length; ++i) {
98
110
  const param = parameters[i] as Parameter
99
111
  try {
100
- cursor.setPosition(consumed)
112
+ // Zero-width types (e.g. `uint256[0]`, empty tuples) at the end of the
113
+ // data consume no bytes, so the cursor may already be exhausted.
114
+ if (consumed < bytes.length) cursor.setPosition(consumed)
101
115
  const [data_, consumed_] = internal.decodeParameter(cursor, param, {
102
116
  checksumAddress,
103
117
  staticPosition: 0,
@@ -386,11 +400,18 @@ export function format<
386
400
  Parameter | abitype.AbiEventParameter,
387
401
  ...(readonly (Parameter | abitype.AbiEventParameter)[]),
388
402
  ],
389
- ): abitype.FormatAbiParameters<parameters> {
390
- return abitype.formatAbiParameters(parameters)
403
+ ): format.ReturnType<parameters> {
404
+ return formatAbiParameters.formatAbiParameters(parameters)
391
405
  }
392
406
 
393
407
  export declare namespace format {
408
+ type ReturnType<
409
+ parameters extends readonly [
410
+ Parameter | abitype.AbiEventParameter,
411
+ ...(readonly (Parameter | abitype.AbiEventParameter)[]),
412
+ ] = readonly [Parameter, ...(readonly Parameter[])],
413
+ > = formatAbiParameters.FormatAbiParameters<parameters>
414
+
394
415
  type ErrorType = Errors.GlobalErrorType
395
416
  }
396
417
 
@@ -416,6 +437,22 @@ export declare namespace format {
416
437
  *
417
438
  * parameters
418
439
  * //^?
440
+ * //
441
+ * //
442
+ * //
443
+ * //
444
+ * //
445
+ * //
446
+ * //
447
+ * //
448
+ * //
449
+ * //
450
+ * //
451
+ * //
452
+ * //
453
+ * //
454
+ * //
455
+ * //
419
456
  * ```
420
457
  *
421
458
  * @example
@@ -432,6 +469,22 @@ export declare namespace format {
432
469
  *
433
470
  * parameters
434
471
  * //^?
472
+ * //
473
+ * //
474
+ * //
475
+ * //
476
+ * //
477
+ * //
478
+ * //
479
+ * //
480
+ * //
481
+ * //
482
+ * //
483
+ * //
484
+ * //
485
+ * //
486
+ * //
487
+ * //
435
488
  * ```
436
489
  *
437
490
  * @example
@@ -447,6 +500,22 @@ export declare namespace format {
447
500
  *
448
501
  * parameters
449
502
  * //^?
503
+ * //
504
+ * //
505
+ * //
506
+ * //
507
+ * //
508
+ * //
509
+ * //
510
+ * //
511
+ * //
512
+ * //
513
+ * //
514
+ * //
515
+ * //
516
+ * //
517
+ * //
518
+ * //
450
519
  * ```
451
520
  *
452
521
  *
@@ -460,9 +529,9 @@ export function from<
460
529
  parameters: parameters | AbiParameters | string | readonly string[],
461
530
  ): from.ReturnType<parameters> {
462
531
  if (Array.isArray(parameters) && typeof parameters[0] === 'string')
463
- return abitype.parseAbiParameters(parameters) as never
532
+ return parseAbiParameters.parseAbiParameters(parameters) as never
464
533
  if (typeof parameters === 'string')
465
- return abitype.parseAbiParameters(parameters) as never
534
+ return parseAbiParameters.parseAbiParameters(parameters) as never
466
535
  return parameters as never
467
536
  }
468
537
 
@@ -470,9 +539,9 @@ export declare namespace from {
470
539
  type ReturnType<
471
540
  parameters extends AbiParameters | string | readonly string[],
472
541
  > = parameters extends string
473
- ? abitype.ParseAbiParameters<parameters>
542
+ ? parseAbiParameters.ParseAbiParameters<parameters>
474
543
  : parameters extends readonly string[]
475
- ? abitype.ParseAbiParameters<parameters>
544
+ ? parseAbiParameters.ParseAbiParameters<parameters>
476
545
  : parameters
477
546
 
478
547
  type ErrorType = Errors.GlobalErrorType
@@ -519,7 +588,7 @@ export class DataSizeTooSmallError extends Errors.BaseError {
519
588
  }) {
520
589
  super(`Data size of ${size} bytes is too small for given parameters.`, {
521
590
  metaMessages: [
522
- `Params: (${abitype.formatAbiParameters(parameters as readonly [Parameter])})`,
591
+ `Params: (${formatAbiParameters.formatAbiParameters(parameters as readonly [Parameter])})`,
523
592
  `Data: ${data} (${size} bytes)`,
524
593
  ],
525
594
  })
package/src/core/Rlp.ts CHANGED
@@ -5,6 +5,9 @@ import * as internal_bytes from './internal/bytes.js'
5
5
  import * as Cursor from './internal/cursor.js'
6
6
  import type { ExactPartial, RecursiveArray } from './internal/types.js'
7
7
 
8
+ /** Maximum nesting depth permitted when decoding an RLP value. */
9
+ const depthLimit = 1_024
10
+
8
11
  /**
9
12
  * Decodes a Recursive-Length Prefix (RLP) value into a {@link ox#Bytes.Bytes} value.
10
13
  *
@@ -68,6 +71,12 @@ export function to<
68
71
  })
69
72
  const result = decodeRlpCursor(cursor, to_)
70
73
 
74
+ // RLP payloads encode exactly one item (Yellow Paper, Appendix B).
75
+ if (cursor.position < cursor.bytes.length)
76
+ throw new TrailingBytesError({
77
+ count: cursor.bytes.length - cursor.position,
78
+ })
79
+
71
80
  return result as to.ReturnType<to>
72
81
  }
73
82
 
@@ -82,6 +91,7 @@ export declare namespace to {
82
91
  | decodeRlpCursor.ErrorType
83
92
  | Cursor.create.ErrorType
84
93
  | Hex.InvalidLengthError
94
+ | TrailingBytesError
85
95
  | Errors.GlobalErrorType
86
96
  }
87
97
 
@@ -91,7 +101,11 @@ export declare namespace to {
91
101
  export function decodeRlpCursor<to extends 'Hex' | 'Bytes' = 'Hex'>(
92
102
  cursor: Cursor.Cursor,
93
103
  to: to | 'Hex' | 'Bytes' | undefined = 'Hex',
104
+ depth = 0,
94
105
  ): decodeRlpCursor.ReturnType<to> {
106
+ if (depth >= depthLimit)
107
+ throw new DepthLimitExceededError({ limit: depthLimit })
108
+
95
109
  if (cursor.bytes.length === 0)
96
110
  return (
97
111
  to === 'Hex' ? Hex.fromBytes(cursor.bytes) : cursor.bytes
@@ -111,7 +125,12 @@ export function decodeRlpCursor<to extends 'Hex' | 'Bytes' = 'Hex'>(
111
125
 
112
126
  // list
113
127
  const length = readLength(cursor, prefix, 0xc0)
114
- return readList(cursor, length, to) as {} as decodeRlpCursor.ReturnType<to>
128
+ return readList(
129
+ cursor,
130
+ length,
131
+ to,
132
+ depth + 1,
133
+ ) as {} as decodeRlpCursor.ReturnType<to>
115
134
  }
116
135
 
117
136
  /** @internal */
@@ -121,6 +140,7 @@ export declare namespace decodeRlpCursor {
121
140
  | Hex.fromBytes.ErrorType
122
141
  | readLength.ErrorType
123
142
  | readList.ErrorType
143
+ | DepthLimitExceededError
124
144
  | Errors.GlobalErrorType
125
145
  }
126
146
 
@@ -149,17 +169,27 @@ export function readList<to extends 'Hex' | 'Bytes'>(
149
169
  cursor: Cursor.Cursor,
150
170
  length: number,
151
171
  to: to | 'Hex' | 'Bytes',
172
+ depth = 0,
152
173
  ) {
153
174
  const position = cursor.position
154
175
  const value: decodeRlpCursor.ReturnType<to>[] = []
155
176
  while (cursor.position - position < length)
156
- value.push(decodeRlpCursor(cursor, to))
177
+ value.push(decodeRlpCursor(cursor, to, depth))
178
+ // Items must consume exactly the declared list length.
179
+ if (cursor.position - position !== length)
180
+ throw new ListBoundaryExceededError({
181
+ consumed: cursor.position - position,
182
+ declared: length,
183
+ })
157
184
  return value
158
185
  }
159
186
 
160
187
  /** @internal */
161
188
  export declare namespace readList {
162
- type ErrorType = Errors.GlobalErrorType
189
+ type ErrorType =
190
+ | DepthLimitExceededError
191
+ | ListBoundaryExceededError
192
+ | Errors.GlobalErrorType
163
193
  }
164
194
 
165
195
  /**
@@ -643,3 +673,36 @@ function writeBigEndian(
643
673
  function invalidNibble(hex: Hex.Hex): Errors.BaseError {
644
674
  return new Errors.BaseError(`Invalid hex string \`${hex}\`.`)
645
675
  }
676
+
677
+ /** Thrown when an RLP value nests deeper than the decode depth limit. */
678
+ export class DepthLimitExceededError extends Errors.BaseError {
679
+ override readonly name = 'Rlp.DepthLimitExceededError'
680
+
681
+ constructor({ limit }: { limit: number }) {
682
+ super(`RLP depth limit of \`${limit}\` exceeded.`)
683
+ }
684
+ }
685
+
686
+ /** Thrown when RLP list items overrun the list's declared length. */
687
+ export class ListBoundaryExceededError extends Errors.BaseError {
688
+ override readonly name = 'Rlp.ListBoundaryExceededError'
689
+
690
+ constructor({ consumed, declared }: { consumed: number; declared: number }) {
691
+ super(
692
+ `RLP list items consumed \`${consumed}\` bytes but the list declared a length of \`${declared}\`.`,
693
+ )
694
+ }
695
+ }
696
+
697
+ /** Thrown when an RLP payload contains bytes after the decoded item. */
698
+ export class TrailingBytesError extends Errors.BaseError {
699
+ override readonly name = 'Rlp.TrailingBytesError'
700
+
701
+ constructor({ count }: { count: number }) {
702
+ super(
703
+ `RLP payload encodes a single item, but \`${count}\` trailing ${
704
+ count === 1 ? 'byte remains' : 'bytes remain'
705
+ }.`,
706
+ )
707
+ }
708
+ }
@@ -289,7 +289,7 @@ export type FromViem<schema extends readonly ViemSchemaItem[]> = {
289
289
  * Each method's name comes from its key. Both `params` and `ReturnType` are
290
290
  * derived from the Zod schema's input (wire) type, since raw JSON-RPC clients
291
291
  * send and receive wire values. Decode wire results to their native
292
- * representation explicitly via {@link ox#zod/RpcSchema.decodeReturns}.
292
+ * representation explicitly via `zod.RpcSchema.decodeReturns`.
293
293
  *
294
294
  * @example
295
295
  * ```ts twoslash
@@ -331,7 +331,7 @@ export type Schema = Generic | FromZod.Namespace
331
331
 
332
332
  /**
333
333
  * Resolves a {@link ox#RpcSchema.Schema} input to an Ox {@link ox#RpcSchema.Generic}.
334
- * A Zod namespace is converted via {@link ox#RpcSchema.FromZod}; a `Generic` is
334
+ * A Zod namespace is converted via {@link ox#RpcSchema.(FromZod:type)}; a `Generic` is
335
335
  * passed through; otherwise falls back to {@link ox#RpcSchema.Default}.
336
336
  */
337
337
  export type ToGeneric<schema extends Schema | undefined> =
@@ -117,6 +117,10 @@ describe('from', () => {
117
117
  test('exports', () => {
118
118
  expect(Object.keys(Abi)).toMatchInlineSnapshot(`
119
119
  [
120
+ "InvalidSignatureError",
121
+ "InvalidStructSignatureError",
122
+ "UnknownSignatureError",
123
+ "CircularReferenceError",
120
124
  "format",
121
125
  "from",
122
126
  ]
@@ -2107,6 +2107,9 @@ describe('getSignatureHash', () => {
2107
2107
  test('exports', () => {
2108
2108
  expect(Object.keys(AbiItem)).toMatchInlineSnapshot(`
2109
2109
  [
2110
+ "InvalidAbiItemError",
2111
+ "UnknownSolidityTypeError",
2112
+ "UnknownTypeError",
2110
2113
  "format",
2111
2114
  "from",
2112
2115
  "fromAbi",
@@ -0,0 +1,41 @@
1
+ import { AbiParameter } from 'ox'
2
+ import { describe, expectTypeOf, test } from 'vp/test'
3
+
4
+ describe('AbiParameter.format', () => {
5
+ test('infers parameter', () => {
6
+ const formatted = AbiParameter.format(value)
7
+ expectTypeOf(formatted).toEqualTypeOf<'address spender'>()
8
+ })
9
+
10
+ test('not narrowable', () => {
11
+ const formatted = AbiParameter.format({} as AbiParameter.AbiParameter)
12
+ expectTypeOf(formatted).toEqualTypeOf<string>()
13
+ })
14
+
15
+ const value = {
16
+ name: 'spender',
17
+ type: 'address',
18
+ } as const
19
+ })
20
+
21
+ describe('AbiParameter.from', () => {
22
+ test('infers parameter', () => {
23
+ const parameter = AbiParameter.from(value)
24
+ expectTypeOf(parameter).toEqualTypeOf(value)
25
+ })
26
+
27
+ test('from signature', () => {
28
+ const parameter = AbiParameter.from('address spender')
29
+ expectTypeOf(parameter).toEqualTypeOf(value)
30
+ })
31
+
32
+ test('not narrowable', () => {
33
+ const parameter = AbiParameter.from({} as AbiParameter.AbiParameter)
34
+ expectTypeOf(parameter).toEqualTypeOf<AbiParameter.AbiParameter>()
35
+ })
36
+
37
+ const value = {
38
+ name: 'spender',
39
+ type: 'address',
40
+ } as const
41
+ })
@@ -0,0 +1,84 @@
1
+ import { AbiParameter } from 'ox'
2
+ import { describe, expect, test } from 'vp/test'
3
+
4
+ describe('from', () => {
5
+ test('json parameter', () => {
6
+ expect(AbiParameter.from({ name: 'spender', type: 'address' }))
7
+ .toMatchInlineSnapshot(`
8
+ {
9
+ "name": "spender",
10
+ "type": "address",
11
+ }
12
+ `)
13
+ })
14
+
15
+ test('human-readable parameter', () => {
16
+ expect(AbiParameter.from('address spender')).toMatchInlineSnapshot(`
17
+ {
18
+ "name": "spender",
19
+ "type": "address",
20
+ }
21
+ `)
22
+ })
23
+
24
+ test('human-readable parameter with structs', () => {
25
+ expect(
26
+ AbiParameter.from([
27
+ 'struct Foo { address spender; uint256 amount; }',
28
+ 'Foo foo',
29
+ ]),
30
+ ).toMatchInlineSnapshot(`
31
+ {
32
+ "components": [
33
+ {
34
+ "name": "spender",
35
+ "type": "address",
36
+ },
37
+ {
38
+ "name": "amount",
39
+ "type": "uint256",
40
+ },
41
+ ],
42
+ "name": "foo",
43
+ "type": "tuple",
44
+ }
45
+ `)
46
+ })
47
+ })
48
+
49
+ describe('format', () => {
50
+ test('parameter', () => {
51
+ expect(
52
+ AbiParameter.format({ name: 'spender', type: 'address' }),
53
+ ).toMatchInlineSnapshot(`"address spender"`)
54
+ })
55
+
56
+ test('tuple parameter', () => {
57
+ expect(
58
+ AbiParameter.format({
59
+ components: [
60
+ { name: 'spender', type: 'address' },
61
+ { name: 'amount', type: 'uint256' },
62
+ ],
63
+ name: 'foo',
64
+ type: 'tuple',
65
+ }),
66
+ ).toMatchInlineSnapshot(`"(address spender, uint256 amount) foo"`)
67
+ })
68
+ })
69
+
70
+ test('exports', () => {
71
+ expect(Object.keys(AbiParameter)).toMatchInlineSnapshot(`
72
+ [
73
+ "InvalidAbiParameterError",
74
+ "InvalidAbiTypeParameterError",
75
+ "InvalidFunctionModifierError",
76
+ "InvalidModifierError",
77
+ "InvalidParameterError",
78
+ "SolidityProtectedKeywordError",
79
+ "InvalidParenthesisError",
80
+ "format",
81
+ "from",
82
+ ]
83
+ `)
84
+ })
@@ -1601,22 +1601,12 @@ test('zst', () => {
1601
1601
  expect(() =>
1602
1602
  AbiParameters.decode([{ type: 'uint256[0][4294967295]' }], payload),
1603
1603
  ).toThrowErrorMatchingInlineSnapshot(
1604
- `
1605
- [AbiParameters.DataSizeTooSmallError: Data size of 64 bytes is too small for given parameters.
1606
-
1607
- Params: (uint256[0][4294967295])
1608
- Data: 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000FFFFFFFF (64 bytes)]
1609
- `,
1604
+ '[Cursor.RecursiveReadLimitExceededError: Recursive read limit of `8192` exceeded (recursive read count: `8193`).]',
1610
1605
  )
1611
1606
  expect(() =>
1612
1607
  AbiParameters.decode([{ type: 'uint32[0][4294967295]' }], payload),
1613
1608
  ).toThrowErrorMatchingInlineSnapshot(
1614
- `
1615
- [AbiParameters.DataSizeTooSmallError: Data size of 64 bytes is too small for given parameters.
1616
-
1617
- Params: (uint32[0][4294967295])
1618
- Data: 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000FFFFFFFF (64 bytes)]
1619
- `,
1609
+ '[Cursor.RecursiveReadLimitExceededError: Recursive read limit of `8192` exceeded (recursive read count: `8193`).]',
1620
1610
  )
1621
1611
  expect(() =>
1622
1612
  AbiParameters.decode(
@@ -1798,3 +1788,89 @@ test('recursive 2', () => {
1798
1788
  '[Cursor.RecursiveReadLimitExceededError: Recursive read limit of `8192` exceeded (recursive read count: `8193`).]',
1799
1789
  )
1800
1790
  })
1791
+
1792
+ describe('zero-width types', () => {
1793
+ test('zero-length fixed array', () => {
1794
+ expect(
1795
+ AbiParameters.decode(
1796
+ [{ type: 'uint256[0]' }, { type: 'uint256' }],
1797
+ '0x0000000000000000000000000000000000000000000000000000000000000003',
1798
+ ),
1799
+ ).toEqual([[], 3n])
1800
+ })
1801
+
1802
+ test('trailing empty tuple', () => {
1803
+ expect(
1804
+ AbiParameters.decode(
1805
+ [{ type: 'uint256' }, { type: 'tuple', components: [] }],
1806
+ '0x0000000000000000000000000000000000000000000000000000000000000005',
1807
+ ),
1808
+ ).toEqual([5n, []])
1809
+ })
1810
+
1811
+ test('zero-length fixed array of dynamic type', () => {
1812
+ expect(
1813
+ AbiParameters.decode(
1814
+ [{ type: 'string[0]' }, { type: 'uint256' }],
1815
+ '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003',
1816
+ ),
1817
+ ).toEqual([[], 3n])
1818
+ })
1819
+
1820
+ test('standalone zero-length fixed array of dynamic type', () => {
1821
+ // The head is a single offset word pointing at an empty tail.
1822
+ expect(
1823
+ AbiParameters.decode(
1824
+ [{ type: 'string[0]' }],
1825
+ '0x0000000000000000000000000000000000000000000000000000000000000020',
1826
+ ),
1827
+ ).toEqual([[]])
1828
+ expect(
1829
+ AbiParameters.decode(
1830
+ [{ type: 'bytes[0]' }],
1831
+ '0x0000000000000000000000000000000000000000000000000000000000000020',
1832
+ ),
1833
+ ).toEqual([[]])
1834
+ })
1835
+
1836
+ test('round-trip', () => {
1837
+ const cases = [
1838
+ {
1839
+ parameters: [{ type: 'uint256[0]' }, { type: 'uint256' }],
1840
+ values: [[], 3n],
1841
+ },
1842
+ {
1843
+ parameters: [{ type: 'uint256' }, { type: 'tuple', components: [] }],
1844
+ values: [5n, []],
1845
+ },
1846
+ {
1847
+ parameters: [{ type: 'string[0]' }, { type: 'uint256' }],
1848
+ values: [[], 3n],
1849
+ },
1850
+ {
1851
+ parameters: [{ type: 'uint256[0]' }, { type: 'string' }],
1852
+ values: [[], 'hello'],
1853
+ },
1854
+ {
1855
+ parameters: [{ type: 'uint256[0][2]' }, { type: 'uint256' }],
1856
+ values: [[[], []], 9n],
1857
+ },
1858
+ {
1859
+ parameters: [{ type: 'string[0]' }],
1860
+ values: [[]],
1861
+ },
1862
+ {
1863
+ parameters: [{ type: 'tuple', components: [{ type: 'string[0]' }] }],
1864
+ values: [[[]]],
1865
+ },
1866
+ ] as const
1867
+ for (const { parameters, values } of cases) {
1868
+ expect(
1869
+ AbiParameters.decode(
1870
+ parameters,
1871
+ AbiParameters.encode(parameters, values as never),
1872
+ ),
1873
+ ).toEqual(values)
1874
+ }
1875
+ })
1876
+ })
@@ -1963,3 +1963,71 @@ test('https://github.com/wevm/viem/issues/1960', () => {
1963
1963
  `[BaseError: Invalid boolean value: "true" (type: string). Expected: \`true\` or \`false\`.]`,
1964
1964
  )
1965
1965
  })
1966
+
1967
+ describe('zero-width types', () => {
1968
+ // Per the ABI spec, `enc(T[0])` and `enc(())` are zero-length: a zero-length
1969
+ // fixed array or empty tuple contributes no bytes. Expected values verified
1970
+ // against ethers `AbiCoder.defaultAbiCoder()`.
1971
+ test('zero-length fixed array', () => {
1972
+ expect(
1973
+ AbiParameters.encode(
1974
+ [{ type: 'uint256[0]' }, { type: 'uint256' }],
1975
+ [[], 3n],
1976
+ ),
1977
+ ).toBe('0x0000000000000000000000000000000000000000000000000000000000000003')
1978
+ })
1979
+
1980
+ test('empty tuple', () => {
1981
+ expect(
1982
+ AbiParameters.encode(
1983
+ [{ type: 'uint256' }, { type: 'tuple', components: [] }],
1984
+ [5n, []],
1985
+ ),
1986
+ ).toBe('0x0000000000000000000000000000000000000000000000000000000000000005')
1987
+ })
1988
+
1989
+ test('empty tuple only', () => {
1990
+ expect(
1991
+ AbiParameters.encode([{ type: 'tuple', components: [] }], [[]]),
1992
+ ).toBe('0x')
1993
+ })
1994
+
1995
+ test('nested zero-length fixed arrays', () => {
1996
+ expect(
1997
+ AbiParameters.encode(
1998
+ [{ type: 'uint256[0][2]' }, { type: 'uint256' }],
1999
+ [[[], []], 9n],
2000
+ ),
2001
+ ).toBe('0x0000000000000000000000000000000000000000000000000000000000000009')
2002
+ expect(
2003
+ AbiParameters.encode(
2004
+ [{ type: 'uint256[2][0]' }, { type: 'uint256' }],
2005
+ [[], 9n],
2006
+ ),
2007
+ ).toBe('0x0000000000000000000000000000000000000000000000000000000000000009')
2008
+ })
2009
+
2010
+ test('offsets skip zero-width parameters', () => {
2011
+ expect(
2012
+ AbiParameters.encode(
2013
+ [{ type: 'uint256[0]' }, { type: 'string' }],
2014
+ [[], 'hello'],
2015
+ ),
2016
+ ).toBe(
2017
+ '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000',
2018
+ )
2019
+ })
2020
+
2021
+ // `T[0]` of a dynamic `T` is dynamic per the ABI spec: 32-byte offset
2022
+ // pointing at a zero-length tail.
2023
+ test('zero-length fixed array of dynamic type', () => {
2024
+ expect(
2025
+ AbiParameters.encode(
2026
+ [{ type: 'string[0]' }, { type: 'uint256' }],
2027
+ [[], 3n],
2028
+ ),
2029
+ ).toBe(
2030
+ '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003',
2031
+ )
2032
+ })
2033
+ })
@@ -360,6 +360,13 @@ describe('format', () => {
360
360
  test('exports', () => {
361
361
  expect(Object.keys(AbiParameters)).toMatchInlineSnapshot(`
362
362
  [
363
+ "InvalidAbiParametersError",
364
+ "InvalidAbiTypeParameterError",
365
+ "InvalidFunctionModifierError",
366
+ "InvalidModifierError",
367
+ "InvalidParameterError",
368
+ "SolidityProtectedKeywordError",
369
+ "InvalidParenthesisError",
363
370
  "decode",
364
371
  "encode",
365
372
  "encodePacked",