viem 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (483) hide show
  1. package/chains/package.json +1 -1
  2. package/clients/package.json +1 -1
  3. package/dist/{rpc-655c0ba4.d.ts → chain-32f56cfa.d.ts} +78 -17
  4. package/dist/chain-f12cdc7f.d.ts +5 -0
  5. package/dist/chains.d.ts +1291 -74
  6. package/dist/chains.js +125 -129
  7. package/dist/chains.js.map +1 -0
  8. package/dist/chains.mjs +129 -0
  9. package/dist/chains.mjs.map +1 -0
  10. package/dist/{chunk-YQRTXQ2G.js → chunk-46BO7YAQ.mjs} +3 -15
  11. package/dist/chunk-46BO7YAQ.mjs.map +1 -0
  12. package/dist/chunk-57ZOFERP.mjs +256 -0
  13. package/dist/chunk-57ZOFERP.mjs.map +1 -0
  14. package/dist/{chunk-3EOU525X.js → chunk-62VTYU2V.mjs} +1207 -564
  15. package/dist/chunk-62VTYU2V.mjs.map +1 -0
  16. package/dist/{chunk-4HNVS7AM.js → chunk-DGO77E2H.mjs} +330 -539
  17. package/dist/chunk-DGO77E2H.mjs.map +1 -0
  18. package/dist/chunk-DSPMAIDO.mjs +176 -0
  19. package/dist/chunk-DSPMAIDO.mjs.map +1 -0
  20. package/dist/chunk-EC3NUIJE.js +176 -0
  21. package/dist/chunk-EC3NUIJE.js.map +1 -0
  22. package/dist/chunk-KEHGSYDO.js +259 -0
  23. package/dist/chunk-KEHGSYDO.js.map +1 -0
  24. package/dist/chunk-KZMJR27B.js +889 -0
  25. package/dist/chunk-KZMJR27B.js.map +1 -0
  26. package/dist/chunk-O2GYLJVD.js +2689 -0
  27. package/dist/chunk-O2GYLJVD.js.map +1 -0
  28. package/dist/chunk-W7BWWAC4.js +256 -0
  29. package/dist/chunk-W7BWWAC4.js.map +1 -0
  30. package/dist/clients/index.d.ts +8 -7
  31. package/dist/clients/index.js +24 -25
  32. package/dist/clients/index.js.map +1 -0
  33. package/dist/clients/index.mjs +24 -0
  34. package/dist/clients/index.mjs.map +1 -0
  35. package/dist/contract-9af4608b.d.ts +142 -0
  36. package/dist/createClient-5d316c7e.d.ts +62 -0
  37. package/dist/createPublicClient-9d2b42e1.d.ts +19 -0
  38. package/dist/createTestClient-79498dab.d.ts +34 -0
  39. package/dist/createWalletClient-f69a5230.d.ts +30 -0
  40. package/dist/{eip1193-8f7c22ce.d.ts → eip1193-6c485d63.d.ts} +13 -10
  41. package/dist/index.d.ts +424 -11
  42. package/dist/index.js +395 -292
  43. package/dist/index.js.map +1 -0
  44. package/dist/index.mjs +395 -0
  45. package/dist/index.mjs.map +1 -0
  46. package/dist/{parseGwei-fd7a0f7d.d.ts → parseGwei-4308ad80.d.ts} +82 -139
  47. package/dist/public.d.ts +11 -0
  48. package/dist/public.js +59 -0
  49. package/dist/public.js.map +1 -0
  50. package/dist/public.mjs +59 -0
  51. package/dist/public.mjs.map +1 -0
  52. package/dist/{rpc-3c0e3985.d.ts → rpc-26932bae.d.ts} +1 -38
  53. package/dist/sendTransaction-1c8290a9.d.ts +12 -0
  54. package/dist/stopImpersonatingAccount-7781842a.d.ts +156 -0
  55. package/dist/test.d.ts +6 -0
  56. package/dist/test.js +60 -0
  57. package/dist/test.js.map +1 -0
  58. package/dist/test.mjs +60 -0
  59. package/dist/test.mjs.map +1 -0
  60. package/dist/transactionRequest-341b6ed2.d.ts +15 -0
  61. package/dist/utils/index.d.ts +51 -8
  62. package/dist/utils/index.js +171 -156
  63. package/dist/utils/index.js.map +1 -0
  64. package/dist/utils/index.mjs +171 -0
  65. package/dist/utils/index.mjs.map +1 -0
  66. package/dist/wallet.d.ts +8 -0
  67. package/dist/wallet.js +24 -0
  68. package/dist/wallet.js.map +1 -0
  69. package/dist/wallet.mjs +24 -0
  70. package/dist/wallet.mjs.map +1 -0
  71. package/dist/watchAsset-afaad3c7.d.ts +38 -0
  72. package/dist/{watchAsset-04ab8db5.d.ts → watchPendingTransactions-3b722547.d.ts} +67 -217
  73. package/dist/{webSocket-c6e0d26f.d.ts → webSocket-b180e679.d.ts} +4 -9
  74. package/dist/window.d.ts +3 -2
  75. package/dist/window.js +1 -0
  76. package/dist/window.js.map +1 -0
  77. package/dist/window.mjs +1 -0
  78. package/dist/window.mjs.map +1 -0
  79. package/package.json +30 -66
  80. package/src/_test/abis.ts +1413 -0
  81. package/src/_test/bench.ts +15 -0
  82. package/src/_test/constants.ts +60 -0
  83. package/src/_test/globalSetup.ts +11 -0
  84. package/src/_test/index.ts +23 -0
  85. package/src/_test/setup.ts +8 -0
  86. package/src/_test/utils.ts +112 -0
  87. package/src/actions/index.test.ts +78 -0
  88. package/src/actions/index.ts +174 -0
  89. package/src/actions/public/call.bench.ts +48 -0
  90. package/src/actions/public/call.test.ts +99 -0
  91. package/src/actions/public/call.ts +97 -0
  92. package/src/actions/public/createBlockFilter.bench.ts +11 -0
  93. package/src/actions/public/createBlockFilter.test.ts +9 -0
  94. package/src/actions/public/createBlockFilter.ts +14 -0
  95. package/src/actions/public/createContractEventFilter.test.ts +119 -0
  96. package/src/actions/public/createContractEventFilter.ts +69 -0
  97. package/src/actions/public/createEventFilter.test.ts +245 -0
  98. package/src/actions/public/createEventFilter.ts +76 -0
  99. package/src/actions/public/createPendingTransactionFilter.bench.ts +11 -0
  100. package/src/actions/public/createPendingTransactionFilter.test.ts +9 -0
  101. package/src/actions/public/createPendingTransactionFilter.ts +14 -0
  102. package/src/actions/public/deployContract.test.ts +56 -0
  103. package/src/actions/public/deployContract.ts +38 -0
  104. package/src/actions/public/estimateGas.bench.ts +46 -0
  105. package/src/actions/public/estimateGas.test.ts +92 -0
  106. package/src/actions/public/estimateGas.ts +61 -0
  107. package/src/actions/public/getBalance.test.ts +83 -0
  108. package/src/actions/public/getBalance.ts +37 -0
  109. package/src/actions/public/getBlock.bench.ts +28 -0
  110. package/src/actions/public/getBlock.test.ts +575 -0
  111. package/src/actions/public/getBlock.ts +65 -0
  112. package/src/actions/public/getBlockNumber.bench.ts +28 -0
  113. package/src/actions/public/getBlockNumber.test.ts +27 -0
  114. package/src/actions/public/getBlockNumber.ts +32 -0
  115. package/src/actions/public/getBlockTransactionCount.bench.ts +15 -0
  116. package/src/actions/public/getBlockTransactionCount.test.ts +57 -0
  117. package/src/actions/public/getBlockTransactionCount.ts +52 -0
  118. package/src/actions/public/getBytecode.test.ts +27 -0
  119. package/src/actions/public/getBytecode.ts +32 -0
  120. package/src/actions/public/getChainId.bench.ts +15 -0
  121. package/src/actions/public/getChainId.test.ts +8 -0
  122. package/src/actions/public/getChainId.ts +7 -0
  123. package/src/actions/public/getFeeHistory.bench.ts +18 -0
  124. package/src/actions/public/getFeeHistory.test.ts +137 -0
  125. package/src/actions/public/getFeeHistory.ts +44 -0
  126. package/src/actions/public/getFilterChanges.bench.ts +13 -0
  127. package/src/actions/public/getFilterChanges.test.ts +189 -0
  128. package/src/actions/public/getFilterChanges.ts +23 -0
  129. package/src/actions/public/getFilterLogs.test.ts +104 -0
  130. package/src/actions/public/getFilterLogs.ts +20 -0
  131. package/src/actions/public/getGasPrice.bench.ts +28 -0
  132. package/src/actions/public/getGasPrice.test.ts +8 -0
  133. package/src/actions/public/getGasPrice.ts +15 -0
  134. package/src/actions/public/getLogs.test.ts +107 -0
  135. package/src/actions/public/getLogs.ts +84 -0
  136. package/src/actions/public/getStorageAt.test.ts +34 -0
  137. package/src/actions/public/getStorageAt.ts +32 -0
  138. package/src/actions/public/getTransaction.bench.ts +33 -0
  139. package/src/actions/public/getTransaction.test.ts +311 -0
  140. package/src/actions/public/getTransaction.ts +95 -0
  141. package/src/actions/public/getTransactionConfirmations.test.ts +69 -0
  142. package/src/actions/public/getTransactionConfirmations.ts +38 -0
  143. package/src/actions/public/getTransactionCount.test.ts +56 -0
  144. package/src/actions/public/getTransactionCount.ts +34 -0
  145. package/src/actions/public/getTransactionReceipt.bench.ts +33 -0
  146. package/src/actions/public/getTransactionReceipt.test.ts +179 -0
  147. package/src/actions/public/getTransactionReceipt.ts +34 -0
  148. package/src/actions/public/index.test.ts +43 -0
  149. package/src/actions/public/index.ts +149 -0
  150. package/src/actions/public/readContract.test.ts +128 -0
  151. package/src/actions/public/readContract.ts +87 -0
  152. package/src/actions/public/simulateContract.bench.ts +31 -0
  153. package/src/actions/public/simulateContract.test.ts +238 -0
  154. package/src/actions/public/simulateContract.ts +98 -0
  155. package/src/actions/public/uninstallFilter.bench.ts +13 -0
  156. package/src/actions/public/uninstallFilter.test.ts +65 -0
  157. package/src/actions/public/uninstallFilter.ts +17 -0
  158. package/src/actions/public/waitForTransactionReceipt.test.ts +322 -0
  159. package/src/actions/public/waitForTransactionReceipt.ts +170 -0
  160. package/src/actions/public/watchBlockNumber.test.ts +166 -0
  161. package/src/actions/public/watchBlockNumber.ts +79 -0
  162. package/src/actions/public/watchBlocks.test.ts +210 -0
  163. package/src/actions/public/watchBlocks.ts +114 -0
  164. package/src/actions/public/watchContractEvent.test.ts +301 -0
  165. package/src/actions/public/watchContractEvent.ts +108 -0
  166. package/src/actions/public/watchEvent.test.ts +190 -0
  167. package/src/actions/public/watchEvent.ts +95 -0
  168. package/src/actions/public/watchPendingTransactions.test.ts +116 -0
  169. package/src/actions/public/watchPendingTransactions.ts +74 -0
  170. package/src/actions/test/dropTransaction.test.ts +34 -0
  171. package/src/actions/test/dropTransaction.ts +17 -0
  172. package/src/actions/test/getAutomine.test.ts +14 -0
  173. package/src/actions/test/getAutomine.ts +11 -0
  174. package/src/actions/test/getTxpoolContent.test.ts +45 -0
  175. package/src/actions/test/getTxpoolContent.ts +7 -0
  176. package/src/actions/test/getTxpoolStatus.test.ts +41 -0
  177. package/src/actions/test/getTxpoolStatus.ts +12 -0
  178. package/src/actions/test/impersonateAccount.test.ts +28 -0
  179. package/src/actions/test/impersonateAccount.ts +17 -0
  180. package/src/actions/test/increaseTime.test.ts +18 -0
  181. package/src/actions/test/increaseTime.ts +17 -0
  182. package/src/actions/test/index.test.ts +38 -0
  183. package/src/actions/test/index.ts +77 -0
  184. package/src/actions/test/inspectTxpool.test.ts +50 -0
  185. package/src/actions/test/inspectTxpool.ts +7 -0
  186. package/src/actions/test/mine.test.ts +20 -0
  187. package/src/actions/test/mine.ts +16 -0
  188. package/src/actions/test/removeBlockTimestampInterval.test.ts +23 -0
  189. package/src/actions/test/removeBlockTimestampInterval.ts +7 -0
  190. package/src/actions/test/reset.test.ts +19 -0
  191. package/src/actions/test/reset.ts +18 -0
  192. package/src/actions/test/revert.test.ts +39 -0
  193. package/src/actions/test/revert.ts +14 -0
  194. package/src/actions/test/sendUnsignedTransaction.test.ts +52 -0
  195. package/src/actions/test/sendUnsignedTransaction.ts +19 -0
  196. package/src/actions/test/setAutomine.test.ts +14 -0
  197. package/src/actions/test/setAutomine.ts +8 -0
  198. package/src/actions/test/setBalance.test.ts +29 -0
  199. package/src/actions/test/setBalance.ts +20 -0
  200. package/src/actions/test/setBlockGasLimit.test.ts +21 -0
  201. package/src/actions/test/setBlockGasLimit.ts +17 -0
  202. package/src/actions/test/setBlockTimestampInterval.test.ts +23 -0
  203. package/src/actions/test/setBlockTimestampInterval.ts +16 -0
  204. package/src/actions/test/setCode.test.ts +26 -0
  205. package/src/actions/test/setCode.ts +19 -0
  206. package/src/actions/test/setCoinbase.test.ts +11 -0
  207. package/src/actions/test/setCoinbase.ts +17 -0
  208. package/src/actions/test/setIntervalMining.test.ts +30 -0
  209. package/src/actions/test/setIntervalMining.ts +16 -0
  210. package/src/actions/test/setLoggingEnabled.test.ts +10 -0
  211. package/src/actions/test/setLoggingEnabled.ts +8 -0
  212. package/src/actions/test/setMinGasPrice.test.ts +22 -0
  213. package/src/actions/test/setMinGasPrice.ts +17 -0
  214. package/src/actions/test/setNextBlockBaseFeePerGas.test.ts +23 -0
  215. package/src/actions/test/setNextBlockBaseFeePerGas.ts +17 -0
  216. package/src/actions/test/setNextBlockTimestamp.test.ts +19 -0
  217. package/src/actions/test/setNextBlockTimestamp.ts +17 -0
  218. package/src/actions/test/setNonce.test.ts +28 -0
  219. package/src/actions/test/setNonce.ts +20 -0
  220. package/src/actions/test/setRpcUrl.test.ts +9 -0
  221. package/src/actions/test/setRpcUrl.ts +8 -0
  222. package/src/actions/test/setStorageAt.test.ts +36 -0
  223. package/src/actions/test/setStorageAt.ts +26 -0
  224. package/src/actions/test/snapshot.test.ts +18 -0
  225. package/src/actions/test/snapshot.ts +7 -0
  226. package/src/actions/test/stopImpersonatingAccount.test.ts +31 -0
  227. package/src/actions/test/stopImpersonatingAccount.ts +17 -0
  228. package/src/actions/wallet/addChain.test.ts +14 -0
  229. package/src/actions/wallet/addChain.ts +21 -0
  230. package/src/actions/wallet/getAccounts.test.ts +22 -0
  231. package/src/actions/wallet/getAccounts.ts +7 -0
  232. package/src/actions/wallet/getPermissions.test.ts +24 -0
  233. package/src/actions/wallet/getPermissions.ts +9 -0
  234. package/src/actions/wallet/index.test.ts +20 -0
  235. package/src/actions/wallet/index.ts +30 -0
  236. package/src/actions/wallet/requestAccounts.test.ts +13 -0
  237. package/src/actions/wallet/requestAccounts.ts +7 -0
  238. package/src/actions/wallet/requestPermissions.test.ts +26 -0
  239. package/src/actions/wallet/requestPermissions.ts +19 -0
  240. package/src/actions/wallet/sendTransaction.bench.ts +57 -0
  241. package/src/actions/wallet/sendTransaction.test.ts +440 -0
  242. package/src/actions/wallet/sendTransaction.ts +77 -0
  243. package/src/actions/wallet/signMessage.test.ts +62 -0
  244. package/src/actions/wallet/signMessage.ts +35 -0
  245. package/src/actions/wallet/switchChain.test.ts +22 -0
  246. package/src/actions/wallet/switchChain.ts +19 -0
  247. package/src/actions/wallet/watchAsset.test.ts +41 -0
  248. package/src/actions/wallet/watchAsset.ts +16 -0
  249. package/src/actions/wallet/writeContract.test.ts +54 -0
  250. package/src/actions/wallet/writeContract.ts +56 -0
  251. package/src/chains.test.ts +1912 -0
  252. package/src/chains.ts +99 -0
  253. package/src/clients/createClient.test.ts +295 -0
  254. package/src/clients/createClient.ts +81 -0
  255. package/src/clients/createPublicClient.test.ts +165 -0
  256. package/src/clients/createPublicClient.ts +49 -0
  257. package/src/clients/createTestClient.test.ts +145 -0
  258. package/src/clients/createTestClient.ts +72 -0
  259. package/src/clients/createWalletClient.test.ts +121 -0
  260. package/src/clients/createWalletClient.ts +54 -0
  261. package/src/clients/index.test.ts +19 -0
  262. package/src/clients/index.ts +31 -0
  263. package/src/clients/transports/createTransport.test.ts +58 -0
  264. package/src/clients/transports/createTransport.ts +48 -0
  265. package/src/clients/transports/custom.test.ts +98 -0
  266. package/src/clients/transports/custom.ts +34 -0
  267. package/src/clients/transports/fallback.test.ts +223 -0
  268. package/src/clients/transports/fallback.ts +48 -0
  269. package/src/clients/transports/http.test.ts +110 -0
  270. package/src/clients/transports/http.ts +51 -0
  271. package/src/clients/transports/index.test.ts +15 -0
  272. package/src/clients/transports/index.ts +17 -0
  273. package/src/clients/transports/webSocket.test.ts +164 -0
  274. package/src/clients/transports/webSocket.ts +117 -0
  275. package/src/errors/abi.test.ts +83 -0
  276. package/src/errors/abi.ts +238 -0
  277. package/src/errors/address.test.ts +14 -0
  278. package/src/errors/address.ts +9 -0
  279. package/src/errors/base.test.ts +72 -0
  280. package/src/errors/base.ts +57 -0
  281. package/src/errors/block.test.ts +24 -0
  282. package/src/errors/block.ts +18 -0
  283. package/src/errors/contract.ts +125 -0
  284. package/src/errors/data.ts +20 -0
  285. package/src/errors/encoding.ts +60 -0
  286. package/src/errors/index.ts +77 -0
  287. package/src/errors/log.ts +8 -0
  288. package/src/errors/request.test.ts +331 -0
  289. package/src/errors/request.ts +163 -0
  290. package/src/errors/rpc.test.ts +88 -0
  291. package/src/errors/rpc.ts +113 -0
  292. package/src/errors/transaction.test.ts +83 -0
  293. package/src/errors/transaction.ts +54 -0
  294. package/src/errors/transport.test.ts +12 -0
  295. package/src/errors/transport.ts +12 -0
  296. package/src/index.test.ts +214 -0
  297. package/src/index.ts +373 -0
  298. package/src/public.ts +80 -0
  299. package/src/test.ts +51 -0
  300. package/src/types/block.ts +71 -0
  301. package/src/types/chain.ts +6 -0
  302. package/src/types/contract.ts +342 -0
  303. package/src/types/eip1193.ts +1041 -0
  304. package/src/types/fee.ts +47 -0
  305. package/src/types/filter.ts +8 -0
  306. package/src/types/formatter.ts +23 -0
  307. package/src/types/index.ts +78 -0
  308. package/src/types/log.ts +22 -0
  309. package/src/types/misc.ts +5 -0
  310. package/src/types/rpc.ts +35 -0
  311. package/src/types/transaction.ts +145 -0
  312. package/src/types/utils.ts +67 -0
  313. package/src/types/window.ts +9 -0
  314. package/src/utils/abi/decodeAbi.bench.ts +135 -0
  315. package/src/utils/abi/decodeAbi.test.ts +1615 -0
  316. package/src/utils/abi/decodeAbi.ts +296 -0
  317. package/src/utils/abi/decodeDeployData.test.ts +159 -0
  318. package/src/utils/abi/decodeDeployData.ts +41 -0
  319. package/src/utils/abi/decodeErrorResult.test.ts +130 -0
  320. package/src/utils/abi/decodeErrorResult.ts +28 -0
  321. package/src/utils/abi/decodeFunctionData.test.ts +140 -0
  322. package/src/utils/abi/decodeFunctionData.ts +29 -0
  323. package/src/utils/abi/decodeFunctionResult.test.ts +262 -0
  324. package/src/utils/abi/decodeFunctionResult.ts +53 -0
  325. package/src/utils/abi/encodeAbi.bench.ts +163 -0
  326. package/src/utils/abi/encodeAbi.test.ts +1448 -0
  327. package/src/utils/abi/encodeAbi.ts +264 -0
  328. package/src/utils/abi/encodeDeployData.test.ts +131 -0
  329. package/src/utils/abi/encodeDeployData.ts +37 -0
  330. package/src/utils/abi/encodeErrorResult.test.ts +197 -0
  331. package/src/utils/abi/encodeErrorResult.ts +40 -0
  332. package/src/utils/abi/encodeEventTopics.test.ts +348 -0
  333. package/src/utils/abi/encodeEventTopics.ts +69 -0
  334. package/src/utils/abi/encodeFunctionData.test.ts +140 -0
  335. package/src/utils/abi/encodeFunctionData.ts +38 -0
  336. package/src/utils/abi/encodeFunctionResult.test.ts +284 -0
  337. package/src/utils/abi/encodeFunctionResult.ts +39 -0
  338. package/src/utils/abi/formatAbiItem.test.ts +335 -0
  339. package/src/utils/abi/formatAbiItem.ts +41 -0
  340. package/src/utils/abi/formatAbiItemWithArgs.test.ts +291 -0
  341. package/src/utils/abi/formatAbiItemWithArgs.ts +27 -0
  342. package/src/utils/abi/getAbiItem.ts +5 -0
  343. package/src/utils/abi/index.test.ts +23 -0
  344. package/src/utils/abi/index.ts +38 -0
  345. package/src/utils/address/getAddress.bench.ts +22 -0
  346. package/src/utils/address/getAddress.test.ts +46 -0
  347. package/src/utils/address/getAddress.ts +28 -0
  348. package/src/utils/address/getContractAddress.bench.ts +20 -0
  349. package/src/utils/address/getContractAddress.test.ts +78 -0
  350. package/src/utils/address/getContractAddress.ts +59 -0
  351. package/src/utils/address/index.test.ts +17 -0
  352. package/src/utils/address/index.ts +16 -0
  353. package/src/utils/address/isAddress.test.ts +10 -0
  354. package/src/utils/address/isAddress.ts +10 -0
  355. package/src/utils/address/isAddressEqual.test.ts +55 -0
  356. package/src/utils/address/isAddressEqual.ts +6 -0
  357. package/src/utils/buildRequest.test.ts +365 -0
  358. package/src/utils/buildRequest.ts +45 -0
  359. package/src/utils/chain.test.ts +43 -0
  360. package/src/utils/chain.ts +8 -0
  361. package/src/utils/contract/extractFunctionParts.test.ts +109 -0
  362. package/src/utils/contract/extractFunctionParts.ts +27 -0
  363. package/src/utils/contract/getContractError.test.ts +97 -0
  364. package/src/utils/contract/getContractError.ts +66 -0
  365. package/src/utils/contract/index.test.ts +15 -0
  366. package/src/utils/contract/index.ts +8 -0
  367. package/src/utils/data/concat.test.ts +35 -0
  368. package/src/utils/data/concat.ts +34 -0
  369. package/src/utils/data/index.test.ts +23 -0
  370. package/src/utils/data/index.ts +13 -0
  371. package/src/utils/data/isBytes.test.ts +9 -0
  372. package/src/utils/data/isBytes.ts +7 -0
  373. package/src/utils/data/isHex.test.ts +13 -0
  374. package/src/utils/data/isHex.ts +5 -0
  375. package/src/utils/data/pad.bench.ts +39 -0
  376. package/src/utils/data/pad.test.ts +367 -0
  377. package/src/utils/data/pad.ts +53 -0
  378. package/src/utils/data/size.test.ts +18 -0
  379. package/src/utils/data/size.ts +13 -0
  380. package/src/utils/data/slice.test.ts +203 -0
  381. package/src/utils/data/slice.ts +60 -0
  382. package/src/utils/data/trim.bench.ts +50 -0
  383. package/src/utils/data/trim.test.ts +175 -0
  384. package/src/utils/data/trim.ts +33 -0
  385. package/src/utils/encoding/decodeBytes.bench.ts +40 -0
  386. package/src/utils/encoding/decodeBytes.test.ts +144 -0
  387. package/src/utils/encoding/decodeBytes.ts +63 -0
  388. package/src/utils/encoding/decodeHex.bench.ts +24 -0
  389. package/src/utils/encoding/decodeHex.test.ts +167 -0
  390. package/src/utils/encoding/decodeHex.ts +76 -0
  391. package/src/utils/encoding/decodeRlp.bench.ts +34 -0
  392. package/src/utils/encoding/decodeRlp.test.ts +350 -0
  393. package/src/utils/encoding/decodeRlp.ts +121 -0
  394. package/src/utils/encoding/encodeBytes.bench.ts +41 -0
  395. package/src/utils/encoding/encodeBytes.test.ts +676 -0
  396. package/src/utils/encoding/encodeBytes.ts +59 -0
  397. package/src/utils/encoding/encodeHex.bench.ts +60 -0
  398. package/src/utils/encoding/encodeHex.test.ts +232 -0
  399. package/src/utils/encoding/encodeHex.ts +104 -0
  400. package/src/utils/encoding/encodeRlp.bench.ts +54 -0
  401. package/src/utils/encoding/encodeRlp.test.ts +254 -0
  402. package/src/utils/encoding/encodeRlp.ts +48 -0
  403. package/src/utils/encoding/index.test.ts +32 -0
  404. package/src/utils/encoding/index.ts +36 -0
  405. package/src/utils/formatters/block.bench.ts +51 -0
  406. package/src/utils/formatters/block.test.ts +115 -0
  407. package/src/utils/formatters/block.ts +37 -0
  408. package/src/utils/formatters/extract.test.ts +14 -0
  409. package/src/utils/formatters/extract.ts +18 -0
  410. package/src/utils/formatters/feeHistory.test.ts +66 -0
  411. package/src/utils/formatters/feeHistory.ts +12 -0
  412. package/src/utils/formatters/format.test.ts +93 -0
  413. package/src/utils/formatters/format.ts +90 -0
  414. package/src/utils/formatters/index.test.ts +27 -0
  415. package/src/utils/formatters/index.ts +34 -0
  416. package/src/utils/formatters/log.test.ts +79 -0
  417. package/src/utils/formatters/log.ts +12 -0
  418. package/src/utils/formatters/transaction.test.ts +271 -0
  419. package/src/utils/formatters/transaction.ts +63 -0
  420. package/src/utils/formatters/transactionReceipt.bench.ts +73 -0
  421. package/src/utils/formatters/transactionReceipt.test.ts +151 -0
  422. package/src/utils/formatters/transactionReceipt.ts +63 -0
  423. package/src/utils/formatters/transactionRequest.bench.ts +29 -0
  424. package/src/utils/formatters/transactionRequest.test.ts +237 -0
  425. package/src/utils/formatters/transactionRequest.ts +56 -0
  426. package/src/utils/hash/getEventSignature.test.ts +61 -0
  427. package/src/utils/hash/getEventSignature.ts +4 -0
  428. package/src/utils/hash/getFunctionSignature.test.ts +22 -0
  429. package/src/utils/hash/getFunctionSignature.ts +5 -0
  430. package/src/utils/hash/hashFunction.test.ts +65 -0
  431. package/src/utils/hash/hashFunction.ts +12 -0
  432. package/src/utils/hash/index.test.ts +13 -0
  433. package/src/utils/hash/index.ts +5 -0
  434. package/src/utils/hash/keccak256.test.ts +59 -0
  435. package/src/utils/hash/keccak256.ts +23 -0
  436. package/src/utils/index.test.ts +110 -0
  437. package/src/utils/index.ts +137 -0
  438. package/src/utils/observe.test.ts +176 -0
  439. package/src/utils/observe.ts +66 -0
  440. package/src/utils/poll.test.ts +127 -0
  441. package/src/utils/poll.ts +42 -0
  442. package/src/utils/promise/index.test.ts +14 -0
  443. package/src/utils/promise/index.ts +3 -0
  444. package/src/utils/promise/withCache.test.ts +97 -0
  445. package/src/utils/promise/withCache.ts +73 -0
  446. package/src/utils/promise/withRetry.test.ts +231 -0
  447. package/src/utils/promise/withRetry.ts +61 -0
  448. package/src/utils/promise/withTimeout.test.ts +37 -0
  449. package/src/utils/promise/withTimeout.ts +39 -0
  450. package/src/utils/rpc.test.ts +992 -0
  451. package/src/utils/rpc.ts +292 -0
  452. package/src/utils/stringify.test.ts +13 -0
  453. package/src/utils/stringify.ts +5 -0
  454. package/src/utils/uid.ts +14 -0
  455. package/src/utils/unit/constants.test.ts +22 -0
  456. package/src/utils/unit/constants.ts +12 -0
  457. package/src/utils/unit/formatEther.test.ts +75 -0
  458. package/src/utils/unit/formatEther.ts +6 -0
  459. package/src/utils/unit/formatGwei.test.ts +32 -0
  460. package/src/utils/unit/formatGwei.ts +6 -0
  461. package/src/utils/unit/formatUnit.bench.ts +26 -0
  462. package/src/utils/unit/formatUnit.test.ts +40 -0
  463. package/src/utils/unit/formatUnit.ts +16 -0
  464. package/src/utils/unit/index.test.ts +28 -0
  465. package/src/utils/unit/index.ts +7 -0
  466. package/src/utils/unit/parseEther.test.ts +126 -0
  467. package/src/utils/unit/parseEther.ts +6 -0
  468. package/src/utils/unit/parseGwei.test.ts +50 -0
  469. package/src/utils/unit/parseGwei.ts +6 -0
  470. package/src/utils/unit/parseUnit.bench.ts +26 -0
  471. package/src/utils/unit/parseUnit.test.ts +54 -0
  472. package/src/utils/unit/parseUnit.ts +27 -0
  473. package/src/utils/wait.ts +3 -0
  474. package/src/wallet.ts +23 -0
  475. package/src/window.ts +1 -0
  476. package/utils/package.json +1 -1
  477. package/window/package.json +1 -1
  478. package/actions/package.json +0 -4
  479. package/dist/BaseError-7688f84e.d.ts +0 -18
  480. package/dist/actions/index.d.ts +0 -8
  481. package/dist/actions/index.js +0 -123
  482. package/dist/createWalletClient-915223f3.d.ts +0 -130
  483. package/dist/transactionRequest-ade896ac.d.ts +0 -44
@@ -0,0 +1,296 @@
1
+ import {
2
+ AbiParameter,
3
+ AbiParametersToPrimitiveTypes,
4
+ AbiParameterToPrimitiveType,
5
+ } from 'abitype'
6
+
7
+ import {
8
+ AbiDecodingDataSizeInvalidError,
9
+ AbiDecodingZeroDataError,
10
+ InvalidAbiDecodingTypeError,
11
+ } from '../../errors'
12
+ import { Hex } from '../../types'
13
+ import { checksumAddress } from '../address'
14
+ import { size, slice, trim } from '../data'
15
+ import { hexToBigInt, hexToBool, hexToNumber, hexToString } from '../encoding'
16
+ import { getArrayComponents } from './encodeAbi'
17
+
18
+ export type DecodeAbiArgs<TParams extends readonly AbiParameter[]> = {
19
+ data: Hex
20
+ params: TParams
21
+ }
22
+
23
+ export function decodeAbi<TParams extends readonly AbiParameter[]>({
24
+ data,
25
+ params,
26
+ }: DecodeAbiArgs<TParams>) {
27
+ if (data === '0x' && params.length > 0) throw new AbiDecodingZeroDataError()
28
+ if (size(data) % 32 !== 0)
29
+ throw new AbiDecodingDataSizeInvalidError(size(data))
30
+ const values = decodeParams({
31
+ data,
32
+ params,
33
+ })
34
+ if (values.length === 0) return undefined
35
+ return values
36
+ }
37
+
38
+ ////////////////////////////////////////////////////////////////////
39
+
40
+ type TupleAbiParameter = AbiParameter & { components: readonly AbiParameter[] }
41
+
42
+ function decodeParams<TParams extends readonly AbiParameter[]>({
43
+ data,
44
+ params,
45
+ }: {
46
+ data: Hex
47
+ params: TParams
48
+ }) {
49
+ let decodedValues: unknown[] = []
50
+ let position = 0
51
+
52
+ for (let i = 0; i < params.length; i++) {
53
+ const param = params[i]
54
+ const { consumed, value } = decodeParam({ data, param, position })
55
+ decodedValues.push(value)
56
+ // Step across the data by the amount of data consumed by this parameter.
57
+ position += consumed
58
+ }
59
+
60
+ return decodedValues as unknown as AbiParametersToPrimitiveTypes<TParams>
61
+ }
62
+
63
+ function decodeParam({
64
+ data,
65
+ param,
66
+ position,
67
+ }: { data: Hex; param: AbiParameter; position: number }): {
68
+ consumed: number
69
+ value: any
70
+ } {
71
+ const arrayComponents = getArrayComponents(param.type)
72
+ if (arrayComponents) {
73
+ const [length, type] = arrayComponents
74
+ return decodeArray(data, {
75
+ length,
76
+ param: { ...param, type: type } as AbiParameter,
77
+ position,
78
+ })
79
+ }
80
+ if (param.type === 'tuple') {
81
+ return decodeTuple(data, { param: param as TupleAbiParameter, position })
82
+ }
83
+ if (param.type === 'string') {
84
+ return decodeString(data, { position })
85
+ }
86
+ if (param.type.startsWith('bytes')) {
87
+ return decodeBytes(data, { param, position })
88
+ }
89
+
90
+ let value = slice(data, position, position + 32) as Hex
91
+ if (param.type.startsWith('uint') || param.type.startsWith('int')) {
92
+ return decodeNumber(value, { param })
93
+ }
94
+ if (param.type === 'address') {
95
+ return decodeAddress(value)
96
+ }
97
+ if (param.type === 'bool') {
98
+ return decodeBool(value)
99
+ }
100
+ throw new InvalidAbiDecodingTypeError(param.type, {
101
+ docsPath: '/docs/contract/decodeAbi',
102
+ })
103
+ }
104
+
105
+ ////////////////////////////////////////////////////////////////////
106
+
107
+ function decodeAddress(value: Hex) {
108
+ return { consumed: 32, value: checksumAddress(slice(value, -20)) }
109
+ }
110
+
111
+ function decodeArray<TParam extends AbiParameter>(
112
+ data: Hex,
113
+ {
114
+ param,
115
+ length,
116
+ position,
117
+ }: {
118
+ param: TParam
119
+ length: number | null
120
+ position: number
121
+ },
122
+ ) {
123
+ // If the length of the array is not known in advance (dynamic array),
124
+ // we will need to decode the offset of the array data.
125
+ if (!length) {
126
+ // Get the offset of the array data.
127
+ const offset = hexToNumber(slice(data, position, position + 32))
128
+ // Get the length of the array from the offset.
129
+ const length = hexToNumber(slice(data, offset, offset + 32))
130
+
131
+ let consumed = 0
132
+ let value: AbiParameterToPrimitiveType<TParam>[] = []
133
+ for (let i = 0; i < length; ++i) {
134
+ const decodedChild = decodeParam({
135
+ data: slice(data, offset + 32),
136
+ param,
137
+ position: consumed,
138
+ })
139
+ consumed += decodedChild.consumed
140
+ value.push(decodedChild.value)
141
+ }
142
+ return { value, consumed: 32 }
143
+ }
144
+
145
+ // If the length of the array is known in advance,
146
+ // and the length of an element deeply nested in the array is not known,
147
+ // we need to decode the offset of the array data.
148
+ if (hasDynamicChild(param)) {
149
+ // Get the child type of the array.
150
+ const arrayComponents = getArrayComponents(param.type)
151
+ // If the child type is not known, the array is dynamic.
152
+ const dynamicChild = !arrayComponents?.[0]
153
+
154
+ let consumed = 0
155
+ let value: AbiParameterToPrimitiveType<TParam>[] = []
156
+ for (let i = 0; i < length; ++i) {
157
+ const offset = hexToNumber(slice(data, position, position + 32))
158
+ const decodedChild = decodeParam({
159
+ data: slice(data, offset),
160
+ param,
161
+ position: dynamicChild ? consumed : i * 32,
162
+ })
163
+ consumed += decodedChild.consumed
164
+ value.push(decodedChild.value)
165
+ }
166
+ return { value, consumed }
167
+ }
168
+
169
+ // If the length of the array is known in advance,
170
+ // and the length of each element in the array is known,
171
+ // the array data is encoded contiguously after the array.
172
+ let consumed = 0
173
+ let value: AbiParameterToPrimitiveType<TParam>[] = []
174
+ for (let i = 0; i < length; ++i) {
175
+ const decodedChild = decodeParam({
176
+ data,
177
+ param,
178
+ position: position + consumed,
179
+ })
180
+ consumed += decodedChild.consumed
181
+ value.push(decodedChild.value)
182
+ }
183
+ return { value, consumed }
184
+ }
185
+
186
+ function decodeBool(value: Hex) {
187
+ return { consumed: 32, value: hexToBool(value) }
188
+ }
189
+
190
+ function decodeBytes<TParam extends AbiParameter>(
191
+ data: Hex,
192
+ { param, position }: { param: TParam; position: number },
193
+ ) {
194
+ const [_, size] = param.type.split('bytes')
195
+ if (!size) {
196
+ // If we don't have a size, we're dealing with a dynamic-size array
197
+ // so we need to read the offset of the data part first.
198
+ const offset = hexToNumber(slice(data, position, position + 32))
199
+ const length = hexToNumber(slice(data, offset, offset + 32))
200
+ const value = slice(data, offset + 32, offset + 32 + length)
201
+ return { consumed: 32, value }
202
+ }
203
+
204
+ const value = slice(data, position, position + parseInt(size))
205
+ return { consumed: 32, value }
206
+ }
207
+
208
+ function decodeNumber<TParam extends AbiParameter>(
209
+ value: Hex,
210
+ { param }: { param: TParam },
211
+ ) {
212
+ const signed = param.type.startsWith('int')
213
+ const size = parseInt(param.type.split('int')[1] || '256')
214
+ return {
215
+ consumed: 32,
216
+ value:
217
+ size > 48
218
+ ? hexToBigInt(value, { signed })
219
+ : hexToNumber(value, { signed }),
220
+ }
221
+ }
222
+
223
+ function decodeString(data: Hex, { position }: { position: number }) {
224
+ const offset = hexToNumber(slice(data, position, position + 32))
225
+ const length = hexToNumber(slice(data, offset, offset + 32))
226
+ const value = hexToString(
227
+ trim(slice(data, offset + 32, offset + 32 + length)),
228
+ )
229
+ return { consumed: 32, value }
230
+ }
231
+
232
+ function decodeTuple<
233
+ TParam extends AbiParameter & { components: readonly AbiParameter[] },
234
+ >(data: Hex, { param, position }: { param: TParam; position: number }) {
235
+ // Tuples can have unnamed components (i.e. they are arrays), so we must
236
+ // determine whether the tuple is named or unnamed. In the case of a named
237
+ // tuple, the value will be an object where each property is the name of the
238
+ // component. In the case of an unnamed tuple, the value will be an array.
239
+ const hasUnnamedChild =
240
+ param.components.length === 0 || param.components.some(({ name }) => !name)
241
+
242
+ // Initialize the value to an object or an array, depending on whether the
243
+ // tuple is named or unnamed.
244
+ let value: any = hasUnnamedChild ? [] : {}
245
+ let consumed = 0
246
+
247
+ // If the tuple has a dynamic child, we must first decode the offset to the
248
+ // tuple data.
249
+ if (hasDynamicChild(param)) {
250
+ const offset = hexToNumber(slice(data, position, position + 32))
251
+ // Decode each component of the tuple, starting at the offset.
252
+ for (let i = 0; i < param.components.length; ++i) {
253
+ const component = param.components[i]
254
+ const decodedChild = decodeParam({
255
+ data: slice(data, offset),
256
+ param: component,
257
+ position: consumed,
258
+ })
259
+ consumed += decodedChild.consumed
260
+ value[hasUnnamedChild ? i : component?.name!] = decodedChild.value
261
+ }
262
+ return { consumed: 32, value }
263
+ }
264
+
265
+ // If the tuple has static children, we can just decode each component
266
+ // in sequence.
267
+ for (let i = 0; i < param.components.length; ++i) {
268
+ const component = param.components[i]
269
+ const decodedChild = decodeParam({
270
+ data,
271
+ param: component,
272
+ position: position + consumed,
273
+ })
274
+ consumed += decodedChild.consumed
275
+ value[hasUnnamedChild ? i : component?.name!] = decodedChild.value
276
+ }
277
+ return { consumed, value }
278
+ }
279
+
280
+ function hasDynamicChild(param: AbiParameter) {
281
+ const { type } = param
282
+ if (type === 'string') return true
283
+ if (type === 'bytes') return true
284
+ if (type.endsWith('[]')) return true
285
+
286
+ if (type === 'tuple') return (param as any).components?.some(hasDynamicChild)
287
+
288
+ const arrayComponents = getArrayComponents(param.type)
289
+ if (
290
+ arrayComponents &&
291
+ hasDynamicChild({ ...param, type: arrayComponents[1] } as AbiParameter)
292
+ )
293
+ return true
294
+
295
+ return false
296
+ }
@@ -0,0 +1,159 @@
1
+ import { expect, test } from 'vitest'
2
+
3
+ import { decodeDeployData } from './decodeDeployData'
4
+
5
+ test('constructor()', () => {
6
+ expect(
7
+ decodeDeployData({
8
+ abi: [
9
+ {
10
+ inputs: [],
11
+ stateMutability: 'nonpayable',
12
+ type: 'constructor',
13
+ },
14
+ ] as const,
15
+ bytecode:
16
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
17
+ data: '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
18
+ }),
19
+ ).toEqual({
20
+ bytecode:
21
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
22
+ })
23
+ expect(
24
+ decodeDeployData({
25
+ // @ts-expect-error
26
+ abi: [
27
+ {
28
+ stateMutability: 'nonpayable',
29
+ type: 'constructor',
30
+ },
31
+ ] as const,
32
+ bytecode:
33
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
34
+ data: '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
35
+ }),
36
+ ).toEqual({
37
+ bytecode:
38
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
39
+ })
40
+ })
41
+
42
+ test('constructor(uint256)', () => {
43
+ expect(
44
+ decodeDeployData({
45
+ abi: [
46
+ {
47
+ inputs: [
48
+ {
49
+ internalType: 'uint256',
50
+ name: 'a',
51
+ type: 'uint256',
52
+ },
53
+ ],
54
+ stateMutability: 'nonpayable',
55
+ type: 'constructor',
56
+ },
57
+ ] as const,
58
+ bytecode:
59
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
60
+ data: '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c634300080700330000000000000000000000000000000000000000000000000000000000010f2c',
61
+ }),
62
+ ).toEqual({
63
+ args: [69420n],
64
+ bytecode:
65
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
66
+ })
67
+ })
68
+
69
+ test('error: constructor not found', () => {
70
+ expect(() =>
71
+ decodeDeployData({
72
+ // @ts-expect-error
73
+ abi: [{}] as const,
74
+ bytecode:
75
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
76
+ data: '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c634300080700330000000000000000000000000000000000000000000000000000000000010f2c',
77
+ }),
78
+ ).toThrowErrorMatchingInlineSnapshot(`
79
+ "A constructor was not found on the ABI.
80
+ Make sure you are using the correct ABI and that the constructor exists on it.
81
+
82
+ Docs: https://viem.sh/docs/contract/decodeDeployData
83
+
84
+ Version: viem@1.0.2"
85
+ `)
86
+ })
87
+
88
+ test('error: no inputs', () => {
89
+ expect(() =>
90
+ decodeDeployData({
91
+ // @ts-expect-error
92
+ abi: [
93
+ {
94
+ stateMutability: 'nonpayable',
95
+ type: 'constructor',
96
+ },
97
+ ] as const,
98
+ bytecode:
99
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
100
+ data: '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c634300080700330000000000000000000000000000000000000000000000000000000000010f2c',
101
+ }),
102
+ ).toThrowErrorMatchingInlineSnapshot(
103
+ `
104
+ "Constructor arguments were provided (\`args\`), but a constructor parameters (\`inputs\`) were not found on the ABI.
105
+ Make sure you are using the correct ABI, and that the \`inputs\` attribute on the constructor exists.
106
+
107
+ Docs: https://viem.sh/docs/contract/decodeDeployData
108
+
109
+ Version: viem@1.0.2"
110
+ `,
111
+ )
112
+ expect(() =>
113
+ decodeDeployData({
114
+ abi: [
115
+ {
116
+ inputs: [],
117
+ stateMutability: 'nonpayable',
118
+ type: 'constructor',
119
+ },
120
+ ] as const,
121
+ bytecode:
122
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
123
+ data: '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c634300080700330000000000000000000000000000000000000000000000000000000000010f2c',
124
+ }),
125
+ ).toThrowErrorMatchingInlineSnapshot(
126
+ `
127
+ "Constructor arguments were provided (\`args\`), but a constructor parameters (\`inputs\`) were not found on the ABI.
128
+ Make sure you are using the correct ABI, and that the \`inputs\` attribute on the constructor exists.
129
+
130
+ Docs: https://viem.sh/docs/contract/decodeDeployData
131
+
132
+ Version: viem@1.0.2"
133
+ `,
134
+ )
135
+ expect(() =>
136
+ decodeDeployData({
137
+ // @ts-expect-error
138
+ abi: [
139
+ {
140
+ inputs: undefined,
141
+ stateMutability: 'nonpayable',
142
+ type: 'constructor',
143
+ },
144
+ ] as const,
145
+ bytecode:
146
+ '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c63430008070033',
147
+ data: '0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220116554d4ba29ee08da9e97dc54ff9a2a65d67a648140d616fc225a25ff08c86364736f6c634300080700330000000000000000000000000000000000000000000000000000000000010f2c',
148
+ }),
149
+ ).toThrowErrorMatchingInlineSnapshot(
150
+ `
151
+ "Constructor arguments were provided (\`args\`), but a constructor parameters (\`inputs\`) were not found on the ABI.
152
+ Make sure you are using the correct ABI, and that the \`inputs\` attribute on the constructor exists.
153
+
154
+ Docs: https://viem.sh/docs/contract/decodeDeployData
155
+
156
+ Version: viem@1.0.2"
157
+ `,
158
+ )
159
+ })
@@ -0,0 +1,41 @@
1
+ import { Abi } from 'abitype'
2
+
3
+ import {
4
+ AbiConstructorNotFoundError,
5
+ AbiConstructorParamsNotFoundError,
6
+ } from '../../errors'
7
+ import { Hex } from '../../types'
8
+ import { decodeAbi } from './decodeAbi'
9
+
10
+ const docsPath = '/docs/contract/decodeDeployData'
11
+
12
+ export type DecodeDeployDataArgs<TAbi extends Abi = Abi> = {
13
+ abi: TAbi
14
+ bytecode: Hex
15
+ data: Hex
16
+ }
17
+ export type DecodeDeployDataResponse = {
18
+ args?: readonly unknown[] | undefined
19
+ bytecode: Hex
20
+ }
21
+
22
+ export function decodeDeployData<TAbi extends Abi = Abi>({
23
+ abi,
24
+ bytecode,
25
+ data,
26
+ }: DecodeDeployDataArgs<TAbi>): DecodeDeployDataResponse {
27
+ if (data === bytecode) return { bytecode }
28
+
29
+ const description = abi.find((x) => 'type' in x && x.type === 'constructor')
30
+ if (!description) throw new AbiConstructorNotFoundError({ docsPath })
31
+ if (!('inputs' in description))
32
+ throw new AbiConstructorParamsNotFoundError({ docsPath })
33
+ if (!description.inputs || description.inputs.length === 0)
34
+ throw new AbiConstructorParamsNotFoundError({ docsPath })
35
+
36
+ const args = decodeAbi({
37
+ data: `0x${data.replace(bytecode, '')}`,
38
+ params: description.inputs,
39
+ })
40
+ return { args, bytecode }
41
+ }
@@ -0,0 +1,130 @@
1
+ import { expect, test } from 'vitest'
2
+
3
+ import { decodeErrorResult } from './decodeErrorResult'
4
+
5
+ test('revert SoldOutError()', () => {
6
+ expect(
7
+ decodeErrorResult({
8
+ abi: [
9
+ {
10
+ inputs: [],
11
+ name: 'SoldOutError',
12
+ type: 'error',
13
+ },
14
+ ],
15
+ data: '0x7f6df6bb',
16
+ }),
17
+ ).toEqual({ errorName: 'SoldOutError', args: undefined })
18
+ expect(
19
+ decodeErrorResult({
20
+ abi: [
21
+ // @ts-expect-error
22
+ {
23
+ name: 'SoldOutError',
24
+ type: 'error',
25
+ },
26
+ ],
27
+ data: '0x7f6df6bb',
28
+ }),
29
+ ).toEqual({ errorName: 'SoldOutError', args: undefined })
30
+ })
31
+
32
+ test('revert AccessDeniedError(string)', () => {
33
+ expect(
34
+ decodeErrorResult({
35
+ abi: [
36
+ {
37
+ inputs: [
38
+ {
39
+ internalType: 'string',
40
+ name: 'a',
41
+ type: 'string',
42
+ },
43
+ ],
44
+ name: 'AccessDeniedError',
45
+ type: 'error',
46
+ },
47
+ ],
48
+ data: '0x83aa206e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a796f7520646f206e6f7420686176652061636365737320736572000000000000',
49
+ }),
50
+ ).toEqual({
51
+ errorName: 'AccessDeniedError',
52
+ args: ['you do not have access ser'],
53
+ })
54
+ })
55
+
56
+ test('revert AccessDeniedError((uint256,bool,address,uint256))', () => {
57
+ expect(
58
+ decodeErrorResult({
59
+ abi: [
60
+ {
61
+ inputs: [
62
+ {
63
+ components: [
64
+ {
65
+ internalType: 'uint256',
66
+ name: 'weight',
67
+ type: 'uint256',
68
+ },
69
+ {
70
+ internalType: 'bool',
71
+ name: 'voted',
72
+ type: 'bool',
73
+ },
74
+ {
75
+ internalType: 'address',
76
+ name: 'delegate',
77
+ type: 'address',
78
+ },
79
+ {
80
+ internalType: 'uint256',
81
+ name: 'vote',
82
+ type: 'uint256',
83
+ },
84
+ ],
85
+ internalType: 'struct Ballot.Voter',
86
+ name: 'voter',
87
+ type: 'tuple',
88
+ },
89
+ ],
90
+ name: 'AccessDeniedError',
91
+ type: 'error',
92
+ },
93
+ ],
94
+ data: '0x0a1895610000000000000000000000000000000000000000000000000000000000010f2c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac0000000000000000000000000000000000000000000000000000000000000029',
95
+ }),
96
+ ).toEqual({
97
+ errorName: 'AccessDeniedError',
98
+ args: [
99
+ {
100
+ delegate: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
101
+ vote: 41n,
102
+ voted: true,
103
+ weight: 69420n,
104
+ },
105
+ ],
106
+ })
107
+ })
108
+
109
+ test("errors: error doesn't exist", () => {
110
+ expect(() =>
111
+ decodeErrorResult({
112
+ abi: [
113
+ {
114
+ inputs: [],
115
+ name: 'SoldOutError',
116
+ type: 'error',
117
+ },
118
+ ],
119
+ data: '0xa37414670000000000000000000000000000000000000000000000000000000000010f2c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5cc3c03994db5b0d9a5eedd10cabab0813678ac0000000000000000000000000000000000000000000000000000000000000029',
120
+ }),
121
+ ).toThrowErrorMatchingInlineSnapshot(`
122
+ "Encoded error signature \\"0xa3741467\\" not found on ABI.
123
+ Make sure you are using the correct ABI and that the error exists on it.
124
+ You can look up the signature \\"0xa3741467\\" here: https://sig.eth.samczsun.com/.
125
+
126
+ Docs: https://viem.sh/docs/contract/decodeErrorResult
127
+
128
+ Version: viem@1.0.2"
129
+ `)
130
+ })
@@ -0,0 +1,28 @@
1
+ import { Abi } from 'abitype'
2
+ import { AbiErrorSignatureNotFoundError } from '../../errors'
3
+ import { Hex } from '../../types'
4
+ import { slice } from '../data'
5
+ import { getFunctionSignature } from '../hash'
6
+ import { decodeAbi } from './decodeAbi'
7
+ import { formatAbiItem } from './formatAbiItem'
8
+
9
+ export type DecodeErrorResultArgs = { abi: Abi; data: Hex }
10
+
11
+ export function decodeErrorResult({ abi, data }: DecodeErrorResultArgs) {
12
+ const signature = slice(data, 0, 4)
13
+ const description = abi.find(
14
+ (x) => signature === getFunctionSignature(formatAbiItem(x)),
15
+ )
16
+ if (!description)
17
+ throw new AbiErrorSignatureNotFoundError(signature, {
18
+ docsPath: '/docs/contract/decodeErrorResult',
19
+ })
20
+ return {
21
+ errorName: (description as { name: string }).name,
22
+ args: ('inputs' in description &&
23
+ description.inputs &&
24
+ description.inputs.length > 0
25
+ ? decodeAbi({ data: slice(data, 4), params: description.inputs })
26
+ : undefined) as readonly unknown[] | undefined,
27
+ }
28
+ }