viem 0.0.1-alpha.14 → 0.0.1-alpha.16

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 (456) hide show
  1. package/dist/chains.js +6 -5
  2. package/dist/chains.js.map +1 -0
  3. package/dist/chains.mjs +2 -1
  4. package/dist/chains.mjs.map +1 -0
  5. package/dist/chunk-4XREGFHD.js +153 -0
  6. package/dist/chunk-4XREGFHD.js.map +1 -0
  7. package/dist/{chunk-DUNJAMH5.mjs → chunk-B7A2CAHU.mjs} +95 -480
  8. package/dist/chunk-B7A2CAHU.mjs.map +1 -0
  9. package/dist/{chunk-6Z62LPKB.js → chunk-EWTLCB3N.js} +18 -6
  10. package/dist/chunk-EWTLCB3N.js.map +1 -0
  11. package/dist/chunk-KCMYVU3Z.mjs +153 -0
  12. package/dist/chunk-KCMYVU3Z.mjs.map +1 -0
  13. package/dist/{chunk-KB6CBNKW.mjs → chunk-KM6AFT2K.mjs} +18 -6
  14. package/dist/chunk-KM6AFT2K.mjs.map +1 -0
  15. package/dist/chunk-LQXQPPTU.js +256 -0
  16. package/dist/chunk-LQXQPPTU.js.map +1 -0
  17. package/dist/{chunk-5TCPFLFT.mjs → chunk-TSJ3OOJW.mjs} +2 -1
  18. package/dist/chunk-TSJ3OOJW.mjs.map +1 -0
  19. package/dist/chunk-U7QDLGQL.mjs +256 -0
  20. package/dist/chunk-U7QDLGQL.mjs.map +1 -0
  21. package/dist/{chunk-VUNR7KGG.js → chunk-WTXKCAG7.js} +146 -531
  22. package/dist/chunk-WTXKCAG7.js.map +1 -0
  23. package/dist/{chunk-E7IQYTLV.js → chunk-XJKOJIX3.js} +12 -11
  24. package/dist/chunk-XJKOJIX3.js.map +1 -0
  25. package/dist/clients/index.d.ts +6 -3
  26. package/dist/clients/index.js +4 -3
  27. package/dist/clients/index.js.map +1 -0
  28. package/dist/clients/index.mjs +3 -2
  29. package/dist/clients/index.mjs.map +1 -0
  30. package/dist/createClient-cd948138.d.ts +62 -0
  31. package/dist/createPublicClient-989a0556.d.ts +19 -0
  32. package/dist/createTestClient-81507f58.d.ts +34 -0
  33. package/dist/createWalletClient-43f801b9.d.ts +30 -0
  34. package/dist/{eip1193-c001fcd5.d.ts → eip1193-4330b722.d.ts} +1 -1
  35. package/dist/index.d.ts +13 -6
  36. package/dist/index.js +9 -4
  37. package/dist/index.js.map +1 -0
  38. package/dist/index.mjs +34 -29
  39. package/dist/index.mjs.map +1 -0
  40. package/dist/{parseGwei-21f98a29.d.ts → parseGwei-f2d23de6.d.ts} +1 -1
  41. package/dist/public.d.ts +12 -0
  42. package/dist/public.js +59 -0
  43. package/dist/public.js.map +1 -0
  44. package/dist/public.mjs +59 -0
  45. package/dist/public.mjs.map +1 -0
  46. package/dist/sendTransaction-7a9d241a.d.ts +13 -0
  47. package/dist/stopImpersonatingAccount-8113150e.d.ts +156 -0
  48. package/dist/test.d.ts +7 -0
  49. package/dist/test.js +60 -0
  50. package/dist/test.js.map +1 -0
  51. package/dist/test.mjs +60 -0
  52. package/dist/test.mjs.map +1 -0
  53. package/dist/{transactionRequest-1d4e4385.d.ts → transactionReceipt-5d332aab.d.ts} +4 -32
  54. package/dist/transactionRequest-327eb7c2.d.ts +33 -0
  55. package/dist/utils/index.d.ts +4 -3
  56. package/dist/utils/index.js +3 -2
  57. package/dist/utils/index.js.map +1 -0
  58. package/dist/utils/index.mjs +2 -1
  59. package/dist/utils/index.mjs.map +1 -0
  60. package/dist/wallet.d.ts +9 -0
  61. package/dist/wallet.js +24 -0
  62. package/dist/wallet.js.map +1 -0
  63. package/dist/wallet.mjs +24 -0
  64. package/dist/wallet.mjs.map +1 -0
  65. package/dist/watchAsset-0088384c.d.ts +39 -0
  66. package/dist/{stopImpersonatingAccount-fcc5a678.d.ts → watchPendingTransactions-670a7ca3.d.ts} +7 -197
  67. package/dist/{webSocket-3385e295.d.ts → webSocket-9a3b0b26.d.ts} +1 -1
  68. package/dist/window.d.ts +1 -1
  69. package/dist/window.js +1 -1
  70. package/dist/window.js.map +1 -0
  71. package/dist/window.mjs +1 -0
  72. package/dist/window.mjs.map +1 -0
  73. package/package.json +18 -6
  74. package/src/_test/abis.ts +1225 -0
  75. package/src/_test/bench.ts +15 -0
  76. package/src/_test/constants.ts +63 -0
  77. package/src/_test/globalSetup.ts +11 -0
  78. package/src/_test/index.ts +20 -0
  79. package/src/_test/setup.ts +8 -0
  80. package/src/_test/utils.ts +112 -0
  81. package/src/actions/index.test.ts +72 -0
  82. package/src/actions/index.ts +156 -0
  83. package/src/actions/public/call.bench.ts +48 -0
  84. package/src/actions/public/call.test.ts +99 -0
  85. package/src/actions/public/call.ts +96 -0
  86. package/src/actions/public/callContract.bench.ts +24 -0
  87. package/src/actions/public/callContract.test.ts +285 -0
  88. package/src/actions/public/callContract.ts +80 -0
  89. package/src/actions/public/createBlockFilter.bench.ts +11 -0
  90. package/src/actions/public/createBlockFilter.test.ts +9 -0
  91. package/src/actions/public/createBlockFilter.ts +14 -0
  92. package/src/actions/public/createEventFilter.test.ts +245 -0
  93. package/src/actions/public/createEventFilter.ts +81 -0
  94. package/src/actions/public/createPendingTransactionFilter.bench.ts +11 -0
  95. package/src/actions/public/createPendingTransactionFilter.test.ts +9 -0
  96. package/src/actions/public/createPendingTransactionFilter.ts +14 -0
  97. package/src/actions/public/deployContract.test.ts +56 -0
  98. package/src/actions/public/deployContract.ts +39 -0
  99. package/src/actions/public/estimateGas.bench.ts +46 -0
  100. package/src/actions/public/estimateGas.test.ts +92 -0
  101. package/src/actions/public/estimateGas.ts +61 -0
  102. package/src/actions/public/getBalance.test.ts +83 -0
  103. package/src/actions/public/getBalance.ts +37 -0
  104. package/src/actions/public/getBlock.bench.ts +28 -0
  105. package/src/actions/public/getBlock.test.ts +575 -0
  106. package/src/actions/public/getBlock.ts +66 -0
  107. package/src/actions/public/getBlockNumber.bench.ts +28 -0
  108. package/src/actions/public/getBlockNumber.test.ts +27 -0
  109. package/src/actions/public/getBlockNumber.ts +32 -0
  110. package/src/actions/public/getBlockTransactionCount.bench.ts +15 -0
  111. package/src/actions/public/getBlockTransactionCount.test.ts +57 -0
  112. package/src/actions/public/getBlockTransactionCount.ts +53 -0
  113. package/src/actions/public/getBytecode.test.ts +27 -0
  114. package/src/actions/public/getBytecode.ts +32 -0
  115. package/src/actions/public/getChainId.bench.ts +15 -0
  116. package/src/actions/public/getChainId.test.ts +8 -0
  117. package/src/actions/public/getChainId.ts +7 -0
  118. package/src/actions/public/getFeeHistory.bench.ts +18 -0
  119. package/src/actions/public/getFeeHistory.test.ts +137 -0
  120. package/src/actions/public/getFeeHistory.ts +44 -0
  121. package/src/actions/public/getFilterChanges.bench.ts +13 -0
  122. package/src/actions/public/getFilterChanges.test.ts +187 -0
  123. package/src/actions/public/getFilterChanges.ts +23 -0
  124. package/src/actions/public/getFilterLogs.test.ts +102 -0
  125. package/src/actions/public/getFilterLogs.ts +20 -0
  126. package/src/actions/public/getGasPrice.bench.ts +28 -0
  127. package/src/actions/public/getGasPrice.test.ts +8 -0
  128. package/src/actions/public/getGasPrice.ts +15 -0
  129. package/src/actions/public/getTransaction.bench.ts +33 -0
  130. package/src/actions/public/getTransaction.test.ts +311 -0
  131. package/src/actions/public/getTransaction.ts +96 -0
  132. package/src/actions/public/getTransactionConfirmations.test.ts +69 -0
  133. package/src/actions/public/getTransactionConfirmations.ts +39 -0
  134. package/src/actions/public/getTransactionCount.test.ts +56 -0
  135. package/src/actions/public/getTransactionCount.ts +34 -0
  136. package/src/actions/public/getTransactionReceipt.bench.ts +33 -0
  137. package/src/actions/public/getTransactionReceipt.test.ts +217 -0
  138. package/src/actions/public/getTransactionReceipt.ts +35 -0
  139. package/src/actions/public/index.test.ts +36 -0
  140. package/src/actions/public/index.ts +120 -0
  141. package/src/actions/public/uninstallFilter.bench.ts +13 -0
  142. package/src/actions/public/uninstallFilter.test.ts +65 -0
  143. package/src/actions/public/uninstallFilter.ts +17 -0
  144. package/src/actions/public/waitForTransactionReceipt.test.ts +322 -0
  145. package/src/actions/public/waitForTransactionReceipt.ts +171 -0
  146. package/src/actions/public/watchBlockNumber.test.ts +166 -0
  147. package/src/actions/public/watchBlockNumber.ts +79 -0
  148. package/src/actions/public/watchBlocks.test.ts +185 -0
  149. package/src/actions/public/watchBlocks.ts +95 -0
  150. package/src/actions/public/watchPendingTransactions.test.ts +116 -0
  151. package/src/actions/public/watchPendingTransactions.ts +73 -0
  152. package/src/actions/test/dropTransaction.test.ts +34 -0
  153. package/src/actions/test/dropTransaction.ts +17 -0
  154. package/src/actions/test/getAutomine.test.ts +14 -0
  155. package/src/actions/test/getAutomine.ts +11 -0
  156. package/src/actions/test/getTxpoolContent.test.ts +45 -0
  157. package/src/actions/test/getTxpoolContent.ts +7 -0
  158. package/src/actions/test/getTxpoolStatus.test.ts +41 -0
  159. package/src/actions/test/getTxpoolStatus.ts +12 -0
  160. package/src/actions/test/impersonateAccount.test.ts +28 -0
  161. package/src/actions/test/impersonateAccount.ts +17 -0
  162. package/src/actions/test/increaseTime.test.ts +18 -0
  163. package/src/actions/test/increaseTime.ts +17 -0
  164. package/src/actions/test/index.test.ts +38 -0
  165. package/src/actions/test/index.ts +77 -0
  166. package/src/actions/test/inspectTxpool.test.ts +50 -0
  167. package/src/actions/test/inspectTxpool.ts +7 -0
  168. package/src/actions/test/mine.test.ts +20 -0
  169. package/src/actions/test/mine.ts +16 -0
  170. package/src/actions/test/removeBlockTimestampInterval.test.ts +23 -0
  171. package/src/actions/test/removeBlockTimestampInterval.ts +7 -0
  172. package/src/actions/test/reset.test.ts +19 -0
  173. package/src/actions/test/reset.ts +18 -0
  174. package/src/actions/test/revert.test.ts +39 -0
  175. package/src/actions/test/revert.ts +14 -0
  176. package/src/actions/test/sendUnsignedTransaction.test.ts +52 -0
  177. package/src/actions/test/sendUnsignedTransaction.ts +19 -0
  178. package/src/actions/test/setAutomine.test.ts +14 -0
  179. package/src/actions/test/setAutomine.ts +8 -0
  180. package/src/actions/test/setBalance.test.ts +29 -0
  181. package/src/actions/test/setBalance.ts +20 -0
  182. package/src/actions/test/setBlockGasLimit.test.ts +21 -0
  183. package/src/actions/test/setBlockGasLimit.ts +17 -0
  184. package/src/actions/test/setBlockTimestampInterval.test.ts +23 -0
  185. package/src/actions/test/setBlockTimestampInterval.ts +16 -0
  186. package/src/actions/test/setCode.test.ts +26 -0
  187. package/src/actions/test/setCode.ts +19 -0
  188. package/src/actions/test/setCoinbase.test.ts +11 -0
  189. package/src/actions/test/setCoinbase.ts +17 -0
  190. package/src/actions/test/setIntervalMining.test.ts +30 -0
  191. package/src/actions/test/setIntervalMining.ts +16 -0
  192. package/src/actions/test/setLoggingEnabled.test.ts +10 -0
  193. package/src/actions/test/setLoggingEnabled.ts +8 -0
  194. package/src/actions/test/setMinGasPrice.test.ts +22 -0
  195. package/src/actions/test/setMinGasPrice.ts +17 -0
  196. package/src/actions/test/setNextBlockBaseFeePerGas.test.ts +23 -0
  197. package/src/actions/test/setNextBlockBaseFeePerGas.ts +17 -0
  198. package/src/actions/test/setNextBlockTimestamp.test.ts +19 -0
  199. package/src/actions/test/setNextBlockTimestamp.ts +17 -0
  200. package/src/actions/test/setNonce.test.ts +28 -0
  201. package/src/actions/test/setNonce.ts +20 -0
  202. package/src/actions/test/setRpcUrl.test.ts +9 -0
  203. package/src/actions/test/setRpcUrl.ts +8 -0
  204. package/src/actions/test/setStorageAt.test.ts +36 -0
  205. package/src/actions/test/setStorageAt.ts +26 -0
  206. package/src/actions/test/snapshot.test.ts +18 -0
  207. package/src/actions/test/snapshot.ts +7 -0
  208. package/src/actions/test/stopImpersonatingAccount.test.ts +31 -0
  209. package/src/actions/test/stopImpersonatingAccount.ts +17 -0
  210. package/src/actions/wallet/addChain.test.ts +14 -0
  211. package/src/actions/wallet/addChain.ts +21 -0
  212. package/src/actions/wallet/getAccounts.test.ts +22 -0
  213. package/src/actions/wallet/getAccounts.ts +7 -0
  214. package/src/actions/wallet/getPermissions.test.ts +24 -0
  215. package/src/actions/wallet/getPermissions.ts +9 -0
  216. package/src/actions/wallet/index.test.ts +19 -0
  217. package/src/actions/wallet/index.ts +27 -0
  218. package/src/actions/wallet/requestAccounts.test.ts +13 -0
  219. package/src/actions/wallet/requestAccounts.ts +7 -0
  220. package/src/actions/wallet/requestPermissions.test.ts +26 -0
  221. package/src/actions/wallet/requestPermissions.ts +19 -0
  222. package/src/actions/wallet/sendTransaction.bench.ts +57 -0
  223. package/src/actions/wallet/sendTransaction.test.ts +440 -0
  224. package/src/actions/wallet/sendTransaction.ts +76 -0
  225. package/src/actions/wallet/signMessage.test.ts +62 -0
  226. package/src/actions/wallet/signMessage.ts +35 -0
  227. package/src/actions/wallet/switchChain.test.ts +22 -0
  228. package/src/actions/wallet/switchChain.ts +19 -0
  229. package/src/actions/wallet/watchAsset.test.ts +41 -0
  230. package/src/actions/wallet/watchAsset.ts +16 -0
  231. package/src/chains.test.ts +1134 -0
  232. package/src/chains.ts +167 -0
  233. package/src/clients/createClient.test.ts +295 -0
  234. package/src/clients/createClient.ts +81 -0
  235. package/src/clients/createPublicClient.test.ts +165 -0
  236. package/src/clients/createPublicClient.ts +49 -0
  237. package/src/clients/createTestClient.test.ts +145 -0
  238. package/src/clients/createTestClient.ts +72 -0
  239. package/src/clients/createWalletClient.test.ts +121 -0
  240. package/src/clients/createWalletClient.ts +54 -0
  241. package/src/clients/index.test.ts +19 -0
  242. package/src/clients/index.ts +31 -0
  243. package/src/clients/transports/createTransport.test.ts +58 -0
  244. package/src/clients/transports/createTransport.ts +48 -0
  245. package/src/clients/transports/custom.test.ts +98 -0
  246. package/src/clients/transports/custom.ts +34 -0
  247. package/src/clients/transports/fallback.test.ts +223 -0
  248. package/src/clients/transports/fallback.ts +48 -0
  249. package/src/clients/transports/http.test.ts +110 -0
  250. package/src/clients/transports/http.ts +51 -0
  251. package/src/clients/transports/index.test.ts +15 -0
  252. package/src/clients/transports/index.ts +17 -0
  253. package/src/clients/transports/webSocket.test.ts +164 -0
  254. package/src/clients/transports/webSocket.ts +117 -0
  255. package/src/constants.test.ts +27 -0
  256. package/src/constants.ts +18 -0
  257. package/src/errors/abi.test.ts +83 -0
  258. package/src/errors/abi.ts +238 -0
  259. package/src/errors/address.test.ts +14 -0
  260. package/src/errors/address.ts +9 -0
  261. package/src/errors/base.test.ts +72 -0
  262. package/src/errors/base.ts +57 -0
  263. package/src/errors/block.test.ts +24 -0
  264. package/src/errors/block.ts +18 -0
  265. package/src/errors/contract.ts +125 -0
  266. package/src/errors/data.ts +20 -0
  267. package/src/errors/encoding.ts +60 -0
  268. package/src/errors/index.ts +77 -0
  269. package/src/errors/log.ts +8 -0
  270. package/src/errors/request.test.ts +331 -0
  271. package/src/errors/request.ts +163 -0
  272. package/src/errors/rpc.test.ts +88 -0
  273. package/src/errors/rpc.ts +113 -0
  274. package/src/errors/transaction.test.ts +83 -0
  275. package/src/errors/transaction.ts +54 -0
  276. package/src/errors/transport.test.ts +12 -0
  277. package/src/errors/transport.ts +12 -0
  278. package/src/index.test.ts +208 -0
  279. package/src/index.ts +353 -0
  280. package/src/public.ts +80 -0
  281. package/src/test.ts +51 -0
  282. package/src/types/block.ts +71 -0
  283. package/src/types/contract.ts +327 -0
  284. package/src/types/eip1193.ts +1038 -0
  285. package/src/types/fee.ts +47 -0
  286. package/src/types/filter.ts +8 -0
  287. package/src/types/index.ts +72 -0
  288. package/src/types/log.ts +22 -0
  289. package/src/types/misc.ts +4 -0
  290. package/src/types/rpc.ts +35 -0
  291. package/src/types/transaction.ts +145 -0
  292. package/src/types/utils.ts +67 -0
  293. package/src/types/window.ts +9 -0
  294. package/src/utils/abi/decodeAbi.bench.ts +135 -0
  295. package/src/utils/abi/decodeAbi.test.ts +1615 -0
  296. package/src/utils/abi/decodeAbi.ts +296 -0
  297. package/src/utils/abi/decodeDeployData.test.ts +159 -0
  298. package/src/utils/abi/decodeDeployData.ts +41 -0
  299. package/src/utils/abi/decodeErrorResult.test.ts +130 -0
  300. package/src/utils/abi/decodeErrorResult.ts +28 -0
  301. package/src/utils/abi/decodeFunctionData.test.ts +140 -0
  302. package/src/utils/abi/decodeFunctionData.ts +29 -0
  303. package/src/utils/abi/decodeFunctionResult.test.ts +262 -0
  304. package/src/utils/abi/decodeFunctionResult.ts +53 -0
  305. package/src/utils/abi/encodeAbi.bench.ts +163 -0
  306. package/src/utils/abi/encodeAbi.test.ts +1414 -0
  307. package/src/utils/abi/encodeAbi.ts +258 -0
  308. package/src/utils/abi/encodeDeployData.test.ts +131 -0
  309. package/src/utils/abi/encodeDeployData.ts +37 -0
  310. package/src/utils/abi/encodeErrorResult.test.ts +197 -0
  311. package/src/utils/abi/encodeErrorResult.ts +40 -0
  312. package/src/utils/abi/encodeEventTopics.test.ts +348 -0
  313. package/src/utils/abi/encodeEventTopics.ts +69 -0
  314. package/src/utils/abi/encodeFunctionData.test.ts +140 -0
  315. package/src/utils/abi/encodeFunctionData.ts +38 -0
  316. package/src/utils/abi/encodeFunctionResult.test.ts +284 -0
  317. package/src/utils/abi/encodeFunctionResult.ts +39 -0
  318. package/src/utils/abi/formatAbiItemWithArgs.test.ts +291 -0
  319. package/src/utils/abi/formatAbiItemWithArgs.ts +27 -0
  320. package/src/utils/abi/formatAbiItemWithParams.test.ts +335 -0
  321. package/src/utils/abi/formatAbiItemWithParams.ts +41 -0
  322. package/src/utils/abi/getAbiItem.ts +5 -0
  323. package/src/utils/abi/index.test.ts +23 -0
  324. package/src/utils/abi/index.ts +38 -0
  325. package/src/utils/address/getAddress.bench.ts +22 -0
  326. package/src/utils/address/getAddress.test.ts +46 -0
  327. package/src/utils/address/getAddress.ts +28 -0
  328. package/src/utils/address/getContractAddress.bench.ts +20 -0
  329. package/src/utils/address/getContractAddress.test.ts +78 -0
  330. package/src/utils/address/getContractAddress.ts +59 -0
  331. package/src/utils/address/index.test.ts +17 -0
  332. package/src/utils/address/index.ts +16 -0
  333. package/src/utils/address/isAddress.test.ts +10 -0
  334. package/src/utils/address/isAddress.ts +10 -0
  335. package/src/utils/address/isAddressEqual.test.ts +55 -0
  336. package/src/utils/address/isAddressEqual.ts +6 -0
  337. package/src/utils/buildRequest.test.ts +365 -0
  338. package/src/utils/buildRequest.ts +45 -0
  339. package/src/utils/contract/extractFunctionParts.test.ts +109 -0
  340. package/src/utils/contract/extractFunctionParts.ts +27 -0
  341. package/src/utils/contract/getContractError.test.ts +97 -0
  342. package/src/utils/contract/getContractError.ts +70 -0
  343. package/src/utils/contract/index.test.ts +15 -0
  344. package/src/utils/contract/index.ts +8 -0
  345. package/src/utils/data/concat.test.ts +35 -0
  346. package/src/utils/data/concat.ts +34 -0
  347. package/src/utils/data/index.test.ts +23 -0
  348. package/src/utils/data/index.ts +13 -0
  349. package/src/utils/data/isBytes.test.ts +9 -0
  350. package/src/utils/data/isBytes.ts +7 -0
  351. package/src/utils/data/isHex.test.ts +13 -0
  352. package/src/utils/data/isHex.ts +5 -0
  353. package/src/utils/data/pad.bench.ts +39 -0
  354. package/src/utils/data/pad.test.ts +367 -0
  355. package/src/utils/data/pad.ts +53 -0
  356. package/src/utils/data/size.test.ts +18 -0
  357. package/src/utils/data/size.ts +13 -0
  358. package/src/utils/data/slice.test.ts +203 -0
  359. package/src/utils/data/slice.ts +60 -0
  360. package/src/utils/data/trim.bench.ts +50 -0
  361. package/src/utils/data/trim.test.ts +175 -0
  362. package/src/utils/data/trim.ts +33 -0
  363. package/src/utils/encoding/decodeBytes.bench.ts +40 -0
  364. package/src/utils/encoding/decodeBytes.test.ts +144 -0
  365. package/src/utils/encoding/decodeBytes.ts +63 -0
  366. package/src/utils/encoding/decodeHex.bench.ts +24 -0
  367. package/src/utils/encoding/decodeHex.test.ts +167 -0
  368. package/src/utils/encoding/decodeHex.ts +76 -0
  369. package/src/utils/encoding/decodeRlp.bench.ts +34 -0
  370. package/src/utils/encoding/decodeRlp.test.ts +350 -0
  371. package/src/utils/encoding/decodeRlp.ts +121 -0
  372. package/src/utils/encoding/encodeBytes.bench.ts +41 -0
  373. package/src/utils/encoding/encodeBytes.test.ts +676 -0
  374. package/src/utils/encoding/encodeBytes.ts +59 -0
  375. package/src/utils/encoding/encodeHex.bench.ts +60 -0
  376. package/src/utils/encoding/encodeHex.test.ts +232 -0
  377. package/src/utils/encoding/encodeHex.ts +104 -0
  378. package/src/utils/encoding/encodeRlp.bench.ts +54 -0
  379. package/src/utils/encoding/encodeRlp.test.ts +254 -0
  380. package/src/utils/encoding/encodeRlp.ts +48 -0
  381. package/src/utils/encoding/index.test.ts +32 -0
  382. package/src/utils/encoding/index.ts +36 -0
  383. package/src/utils/formatters/block.bench.ts +51 -0
  384. package/src/utils/formatters/block.test.ts +115 -0
  385. package/src/utils/formatters/block.ts +36 -0
  386. package/src/utils/formatters/extract.test.ts +14 -0
  387. package/src/utils/formatters/extract.ts +18 -0
  388. package/src/utils/formatters/feeHistory.test.ts +66 -0
  389. package/src/utils/formatters/feeHistory.ts +12 -0
  390. package/src/utils/formatters/format.test.ts +93 -0
  391. package/src/utils/formatters/format.ts +53 -0
  392. package/src/utils/formatters/index.test.ts +17 -0
  393. package/src/utils/formatters/index.ts +24 -0
  394. package/src/utils/formatters/log.test.ts +79 -0
  395. package/src/utils/formatters/log.ts +12 -0
  396. package/src/utils/formatters/transaction.test.ts +271 -0
  397. package/src/utils/formatters/transaction.ts +51 -0
  398. package/src/utils/formatters/transactionReceipt.bench.ts +73 -0
  399. package/src/utils/formatters/transactionReceipt.test.ts +151 -0
  400. package/src/utils/formatters/transactionReceipt.ts +54 -0
  401. package/src/utils/formatters/transactionRequest.bench.ts +29 -0
  402. package/src/utils/formatters/transactionRequest.test.ts +237 -0
  403. package/src/utils/formatters/transactionRequest.ts +47 -0
  404. package/src/utils/hash/getEventSignature.test.ts +61 -0
  405. package/src/utils/hash/getEventSignature.ts +4 -0
  406. package/src/utils/hash/getFunctionSignature.test.ts +22 -0
  407. package/src/utils/hash/getFunctionSignature.ts +5 -0
  408. package/src/utils/hash/hashFunction.test.ts +65 -0
  409. package/src/utils/hash/hashFunction.ts +12 -0
  410. package/src/utils/hash/index.test.ts +13 -0
  411. package/src/utils/hash/index.ts +5 -0
  412. package/src/utils/hash/keccak256.test.ts +59 -0
  413. package/src/utils/hash/keccak256.ts +23 -0
  414. package/src/utils/index.test.ts +87 -0
  415. package/src/utils/index.ts +126 -0
  416. package/src/utils/observe.test.ts +176 -0
  417. package/src/utils/observe.ts +66 -0
  418. package/src/utils/poll.test.ts +127 -0
  419. package/src/utils/poll.ts +42 -0
  420. package/src/utils/promise/index.test.ts +14 -0
  421. package/src/utils/promise/index.ts +3 -0
  422. package/src/utils/promise/withCache.test.ts +97 -0
  423. package/src/utils/promise/withCache.ts +73 -0
  424. package/src/utils/promise/withRetry.test.ts +231 -0
  425. package/src/utils/promise/withRetry.ts +61 -0
  426. package/src/utils/promise/withTimeout.test.ts +37 -0
  427. package/src/utils/promise/withTimeout.ts +39 -0
  428. package/src/utils/rpc.test.ts +992 -0
  429. package/src/utils/rpc.ts +292 -0
  430. package/src/utils/stringify.test.ts +13 -0
  431. package/src/utils/stringify.ts +5 -0
  432. package/src/utils/uid.ts +14 -0
  433. package/src/utils/unit/formatEther.test.ts +75 -0
  434. package/src/utils/unit/formatEther.ts +6 -0
  435. package/src/utils/unit/formatGwei.test.ts +32 -0
  436. package/src/utils/unit/formatGwei.ts +6 -0
  437. package/src/utils/unit/formatUnit.bench.ts +26 -0
  438. package/src/utils/unit/formatUnit.test.ts +40 -0
  439. package/src/utils/unit/formatUnit.ts +16 -0
  440. package/src/utils/unit/index.test.ts +16 -0
  441. package/src/utils/unit/index.ts +6 -0
  442. package/src/utils/unit/parseEther.test.ts +126 -0
  443. package/src/utils/unit/parseEther.ts +6 -0
  444. package/src/utils/unit/parseGwei.test.ts +50 -0
  445. package/src/utils/unit/parseGwei.ts +6 -0
  446. package/src/utils/unit/parseUnit.bench.ts +26 -0
  447. package/src/utils/unit/parseUnit.test.ts +54 -0
  448. package/src/utils/unit/parseUnit.ts +27 -0
  449. package/src/utils/wait.ts +3 -0
  450. package/src/wallet.ts +23 -0
  451. package/src/window.ts +1 -0
  452. package/actions/package.json +0 -4
  453. package/dist/actions/index.d.ts +0 -8
  454. package/dist/actions/index.js +0 -129
  455. package/dist/actions/index.mjs +0 -129
  456. package/dist/createWalletClient-3f9fa8b6.d.ts +0 -130
@@ -0,0 +1,992 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import { createHttpServer, initialBlockNumber, localWsUrl } from '../_test'
4
+
5
+ import { localhost, mainnet } from '../chains'
6
+ import { numberToHex } from './encoding'
7
+
8
+ import type { RpcResponse } from './rpc'
9
+ import { getSocket, rpc } from './rpc'
10
+ import { wait } from './wait'
11
+
12
+ test('rpc', () => {
13
+ expect(rpc).toMatchInlineSnapshot(`
14
+ {
15
+ "http": [Function],
16
+ "webSocket": [Function],
17
+ "webSocketAsync": [Function],
18
+ }
19
+ `)
20
+ })
21
+
22
+ describe('http', () => {
23
+ test('valid request', async () => {
24
+ expect(
25
+ await rpc.http(localhost.rpcUrls.default.http[0], {
26
+ body: { method: 'web3_clientVersion' },
27
+ }),
28
+ ).toMatchInlineSnapshot(`
29
+ {
30
+ "id": 0,
31
+ "jsonrpc": "2.0",
32
+ "result": "anvil/v0.1.0",
33
+ }
34
+ `)
35
+ })
36
+
37
+ test('valid request w/ incremented id', async () => {
38
+ expect(
39
+ await rpc.http(localhost.rpcUrls.default.http[0], {
40
+ body: { method: 'web3_clientVersion' },
41
+ }),
42
+ ).toMatchInlineSnapshot(`
43
+ {
44
+ "id": 1,
45
+ "jsonrpc": "2.0",
46
+ "result": "anvil/v0.1.0",
47
+ }
48
+ `)
49
+ })
50
+
51
+ test('invalid rpc params', async () => {
52
+ await expect(() =>
53
+ rpc.http(localhost.rpcUrls.default.http[0], {
54
+ body: { method: 'eth_getBlockByHash', params: ['0x0', false] },
55
+ }),
56
+ ).rejects.toThrowError(
57
+ 'invalid length 1, expected a (both 0x-prefixed or not) hex string',
58
+ )
59
+ })
60
+
61
+ test('invalid request', async () => {
62
+ expect(
63
+ rpc.http(localhost.rpcUrls.default.http[0], {
64
+ body: { method: 'eth_wagmi' },
65
+ }),
66
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
67
+ "RPC Request failed.
68
+
69
+ URL: http://127.0.0.1:8545
70
+ Request body: {\\"method\\":\\"eth_wagmi\\"}
71
+
72
+ Details: Method not found
73
+ Version: viem@1.0.2
74
+ Internal Error: {\\"code\\":-32601,\\"message\\":\\"Method not found\\"}"
75
+ `)
76
+ })
77
+
78
+ test('serial requests', async () => {
79
+ let response: any = []
80
+ for (const i in Array.from({ length: 10 })) {
81
+ response.push(
82
+ await rpc.http(localhost.rpcUrls.default.http[0], {
83
+ body: {
84
+ method: 'eth_getBlockByNumber',
85
+ params: [numberToHex(initialBlockNumber - BigInt(i)), false],
86
+ },
87
+ }),
88
+ )
89
+ }
90
+ expect(response.map((r: any) => r.result.number)).toEqual(
91
+ Array.from({ length: 10 }).map((_, i) =>
92
+ numberToHex(initialBlockNumber - BigInt(i)),
93
+ ),
94
+ )
95
+ })
96
+
97
+ test('parallel requests', async () => {
98
+ await wait(500)
99
+ const response = await Promise.all(
100
+ Array.from({ length: 50 }).map(async (_, i) => {
101
+ return await rpc.http(localhost.rpcUrls.default.http[0], {
102
+ body: {
103
+ method: 'eth_getBlockByNumber',
104
+ params: [numberToHex(initialBlockNumber - BigInt(i)), false],
105
+ },
106
+ })
107
+ }),
108
+ )
109
+ expect(response.map((r) => r.result.number)).toEqual(
110
+ Array.from({ length: 50 }).map((_, i) =>
111
+ numberToHex(initialBlockNumber - BigInt(i)),
112
+ ),
113
+ )
114
+ await wait(500)
115
+ })
116
+
117
+ test('http error', async () => {
118
+ let retryCount = -1
119
+ const server = await createHttpServer((req, res) => {
120
+ retryCount++
121
+ res.writeHead(500, {
122
+ 'Content-Type': 'application/json',
123
+ })
124
+ res.end(JSON.stringify({ error: 'ngmi' }))
125
+ })
126
+
127
+ await expect(() =>
128
+ rpc.http(server.url, {
129
+ body: {
130
+ method: 'eth_getBlockByNumber',
131
+ params: [numberToHex(initialBlockNumber), false],
132
+ },
133
+ retryCount: 0,
134
+ }),
135
+ ).rejects.toThrowError(`Details: "ngmi"`)
136
+ expect(retryCount).toBe(0)
137
+ })
138
+
139
+ test('http error', async () => {
140
+ let retryCount = -1
141
+ const server = await createHttpServer((req, res) => {
142
+ retryCount++
143
+ res.writeHead(500, {
144
+ 'Content-Type': 'application/json',
145
+ })
146
+ res.end(JSON.stringify({}))
147
+ })
148
+
149
+ await expect(() =>
150
+ rpc.http(server.url, {
151
+ body: {
152
+ method: 'eth_getBlockByNumber',
153
+ params: [numberToHex(initialBlockNumber), false],
154
+ },
155
+ retryCount: 0,
156
+ }),
157
+ ).rejects.toThrowError('Details: Internal Server Error')
158
+ expect(retryCount).toBe(0)
159
+ })
160
+
161
+ test('timeout', async () => {
162
+ try {
163
+ await rpc.http(mainnet.rpcUrls.default.http[0], {
164
+ body: {
165
+ method: 'eth_getBlockByNumber',
166
+ params: [numberToHex(initialBlockNumber), false],
167
+ },
168
+ timeout: 10,
169
+ })
170
+ } catch (err) {
171
+ expect(err).toMatchInlineSnapshot(
172
+ `
173
+ [TimeoutError: The request took too long to respond.
174
+
175
+ URL: https://cloudflare-eth.com
176
+ Request body: {"method":"eth_getBlockByNumber","params":["0xf86cc2",false]}
177
+
178
+ Details: The request timed out.
179
+ Version: viem@1.0.2]
180
+ `,
181
+ )
182
+ }
183
+ })
184
+
185
+ test('retries (500 status code)', async () => {
186
+ let retryCount = -1
187
+
188
+ const server = await createHttpServer((req, res) => {
189
+ retryCount++
190
+ res.writeHead(500)
191
+ res.end('ngmi')
192
+ })
193
+
194
+ await expect(() =>
195
+ rpc.http(server.url, {
196
+ body: {
197
+ method: 'eth_getBlockByNumber',
198
+ params: [numberToHex(initialBlockNumber), false],
199
+ },
200
+ retryCount: 2,
201
+ }),
202
+ ).rejects.toThrowError('HTTP request failed.')
203
+ expect(retryCount).toBe(2)
204
+ })
205
+
206
+ test('retries (408 status code)', async () => {
207
+ let retryCount = -1
208
+ const server = await createHttpServer((req, res) => {
209
+ retryCount++
210
+ res.writeHead(408, {
211
+ 'Content-Type': 'application/json',
212
+ })
213
+ res.end(JSON.stringify({ error: 'ngmi' }))
214
+ })
215
+
216
+ await expect(() =>
217
+ rpc.http(server.url, {
218
+ body: {
219
+ method: 'eth_getBlockByNumber',
220
+ params: [numberToHex(initialBlockNumber), false],
221
+ },
222
+ retryCount: 2,
223
+ }),
224
+ ).rejects.toThrowError('HTTP request failed.')
225
+ expect(retryCount).toBe(2)
226
+ })
227
+
228
+ test('retries (408 status code)', async () => {
229
+ let retryCount = -1
230
+ const server = await createHttpServer((req, res) => {
231
+ retryCount++
232
+ res.writeHead(408, {
233
+ 'Content-Type': 'application/json',
234
+ })
235
+ res.end(JSON.stringify({ error: 'ngmi' }))
236
+ })
237
+
238
+ await expect(() =>
239
+ rpc.http(server.url, {
240
+ body: {
241
+ method: 'eth_getBlockByNumber',
242
+ params: [numberToHex(initialBlockNumber), false],
243
+ },
244
+ retryCount: 2,
245
+ }),
246
+ ).rejects.toThrowError('HTTP request failed.')
247
+ expect(retryCount).toBe(2)
248
+ })
249
+
250
+ test('does not retry for 401', async () => {
251
+ let retryCount = -1
252
+ const server = await createHttpServer((req, res) => {
253
+ retryCount++
254
+ res.writeHead(401, {
255
+ 'Content-Type': 'application/json',
256
+ })
257
+ res.end(JSON.stringify({ error: 'ngmi' }))
258
+ })
259
+
260
+ await expect(() =>
261
+ rpc.http(server.url, {
262
+ body: {
263
+ method: 'eth_getBlockByNumber',
264
+ params: [numberToHex(initialBlockNumber), false],
265
+ },
266
+ retryCount: 2,
267
+ }),
268
+ ).rejects.toThrowError('HTTP request failed.')
269
+ expect(retryCount).toBe(0)
270
+ })
271
+
272
+ test('retries (500 status code w/ Retry-After)', async () => {
273
+ let retryCount = -1
274
+
275
+ const server = await createHttpServer((req, res) => {
276
+ retryCount++
277
+ res.writeHead(500, {
278
+ 'Retry-After': 1,
279
+ })
280
+ res.end('ngmi')
281
+ })
282
+
283
+ await expect(() =>
284
+ rpc.http(server.url, {
285
+ body: {
286
+ method: 'eth_getBlockByNumber',
287
+ params: [numberToHex(initialBlockNumber), false],
288
+ },
289
+ retryCount: 2,
290
+ }),
291
+ ).rejects.toThrowError('HTTP request failed.')
292
+ expect(retryCount).toBe(2)
293
+ })
294
+ })
295
+
296
+ describe('getSocket', () => {
297
+ test('creates WebSocket instance', async () => {
298
+ const socket = await getSocket(localWsUrl)
299
+ expect(socket).toBeDefined()
300
+ expect(socket.readyState).toEqual(WebSocket.OPEN)
301
+ })
302
+
303
+ test('multiple invocations on a url only opens one socket', async () => {
304
+ const [socket, socket2, socket3, socket4] = await Promise.all([
305
+ getSocket(localWsUrl),
306
+ getSocket(localWsUrl),
307
+ getSocket(localWsUrl),
308
+ getSocket(localWsUrl),
309
+ ])
310
+ expect(socket).toBe(socket2)
311
+ expect(socket).toBe(socket3)
312
+ expect(socket).toBe(socket4)
313
+ })
314
+ })
315
+
316
+ describe('webSocket', () => {
317
+ test('valid request', async () => {
318
+ const socket = await getSocket(localWsUrl)
319
+ const { id, ...version } = await new Promise<any>((resolve, reject) =>
320
+ rpc.webSocket(socket, {
321
+ body: { method: 'web3_clientVersion' },
322
+ onData: resolve,
323
+ onError: reject,
324
+ }),
325
+ )
326
+ expect(id).toBeDefined()
327
+ expect(version).toMatchInlineSnapshot(`
328
+ {
329
+ "jsonrpc": "2.0",
330
+ "result": "anvil/v0.1.0",
331
+ }
332
+ `)
333
+ expect(socket.requests.size).toBe(0)
334
+ })
335
+
336
+ test('valid request', async () => {
337
+ const socket = await getSocket(localWsUrl)
338
+ const { id, ...block } = await new Promise<any>((resolve, reject) =>
339
+ rpc.webSocket(socket, {
340
+ body: {
341
+ method: 'eth_getBlockByNumber',
342
+ params: [numberToHex(initialBlockNumber), false],
343
+ },
344
+ onData: resolve,
345
+ onError: reject,
346
+ }),
347
+ )
348
+ expect(id).toBeDefined()
349
+ expect(block).toMatchInlineSnapshot(`
350
+ {
351
+ "jsonrpc": "2.0",
352
+ "result": {
353
+ "baseFeePerGas": "0x2f9b711b9",
354
+ "difficulty": "0x0",
355
+ "extraData": "0x6265617665726275696c642e6f7267",
356
+ "gasLimit": "0x1c9c380",
357
+ "gasUsed": "0x120bbd0",
358
+ "hash": "0x3f900200152e9e7731b6adfb4a9a5cf43c71f3ff600962efe544f3b1d9466fac",
359
+ "logsBloom": "0xeeec4ae861e4d9e400eb97e3c26253a37852273ababa634d97d300674e269f1a567884ba980b255ac72c1d787a129b8786e9b4201f21316cb6e8274545adbe4fb9264bf2f936df28efcdf72ff393486d4adae488455c34ed5c7d3e158d070938db650d71021a42da46105b004f05ad1fd614768209bc8ef44e0ada968a384a791639509379623bcbc1fc8cb876e3282969c5b9abc354b159678dd87153b6aecbbec06d7f3eb37a9a98596ce72c638ac7c2788ea00a36f0cfb96f0ec314bc8b4a473b955fc5c4dbdba1aaddb5a9c412165169cae009ae09561a79ab8f822cfd533d73bd988dd42dc4185618f62b310b40173f62b628fe2fe5958e3b14acc60860",
360
+ "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5",
361
+ "mixHash": "0xd7de5432d0e9545465317f2f0f82f6f60dfc35055103378c2b4c19a9218e7c75",
362
+ "nonce": "0x0000000000000000",
363
+ "number": "0xf86cc2",
364
+ "parentHash": "0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4",
365
+ "receiptsRoot": "0x7c577c7a2c1649735565691411b9236e1946dc74f3f474d15c014bece0104de8",
366
+ "sealFields": [],
367
+ "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
368
+ "size": "0x18011",
369
+ "stateRoot": "0x651162a87a2905c6f37ab5f0a2676f9cd8fc5ff618cb5c1a89bf25ddea7f391c",
370
+ "timestamp": "0x63abc18b",
371
+ "totalDifficulty": "0xc70d815d562d3cfa955",
372
+ "transactions": [
373
+ "0x1351de11f81a077cd300914e278c870c3df5b26d3f3b2a4a3f8db76bc138e7d3",
374
+ "0x7d5c80f38b2e706aa3bd19b234e6026c8a4c0543bf299dfe609193693ac27dfb",
375
+ "0xc986d00394b3aea84f19906037be219456f13894c0fcfecbd242b36d52a0fa01",
376
+ "0x73271cf06de97fdbbf0be2bb13b9376a98b1715b6d463c81f5ce73a9988b6f5c",
377
+ "0x48c27153e0fd95de6bb7858dc42ff2d16aa0123ff6f4839dda23da82c170df13",
378
+ "0xb901cc43954131517926708106398c5c0c3c77c2550b18fb7bd6eb45a6b39284",
379
+ "0xc6d0d2bf4e46725ed595acdc8bc841994d1e63500c0c06671bc19379c5f111dd",
380
+ "0xb05036fbb0125a493090289331e0b9d44c8ebb3f7852c0a1657ff9e0fce0f51f",
381
+ "0x14bbc701396fffe3b212eb96af063cb97e05ee36c98b133da22a5968a4b38707",
382
+ "0x6b96c5431807ef6792333f1e448dc52d72d24b1460879da6b88a94858bc27a12",
383
+ "0xda1f70f856e3ffc9ed5d5c3c91d8e13b0256931ca759be650407de7053842f4c",
384
+ "0xe52666b85980c7f2cdf1c36ef32a69164c65250109bc9f639ebbc990390c8176",
385
+ "0x5010f98f3ed2110fd40c8b463ad9fa56fe9f026d3bbbfa27a86238ea69084056",
386
+ "0xa554462712447f7edee4cef01317d1d2438200c70f0eafd696d21ae6483472ae",
387
+ "0x4d85ba6c319c5f05768bd42bc3a8509ffb20873c763bacf72b13d6febde479a7",
388
+ "0xaf32af489ae7d94b22cd47c6b1ad44872a5b5781ed329e2e5dc622c1ad9b0be2",
389
+ "0x5be511e63eabbaaeb0436e972e34747edd255e30155d6e943e0c4cc81980efea",
390
+ "0xdad9805520d2eb35019f9f7692750959943a9c1dc9ecf31d234273eb0af93be5",
391
+ "0x33e0a938bdb373ab8a57a03d20faa1fad0b793c86b61cc8cfbd9187f7a7a8f6c",
392
+ "0x552e8b37157fa2fc8576b56e73b314d6001531e00c8c406c25b46c2275d99cb4",
393
+ "0x8a47abc6188d6500b71744d03c68e20b017a33c4291b30eb6c8a1d332b03a654",
394
+ "0xf6a51940f09b38b619958b2955841d6a5c80230a4bfda8266a2c59ebb2722528",
395
+ "0x6d0adc2c20661faa7fab9ab72d09c7688fc61ab1d5d6d2f453b969c820377a2b",
396
+ "0x91963d8420403980eeee8434d1d158dc0e7fb035d0b6bbc0cfa795965a9189c6",
397
+ "0x4bb35a76df1f1b12cdb722f86548061bdcad763a96a0ee1a0bf8f8a3acc4894b",
398
+ "0xbb1be5996b36846b4455ee515e701a8619741e035b89e7abf0b8dccba3d882fc",
399
+ "0x995df00e7dd97dd7d591ebab4a8af2a5689ce67d98378857311715fc0c04e3c4",
400
+ "0x6d0ef7c18c8a79e8c5357ede322c0f3c9bb79b423dcd38d68ece250d6dd90e82",
401
+ "0x5e23f022fe06150e4269e76a0607732d960cec687398d7bb9551e2f396629a54",
402
+ "0xc284f18afa7be933a7c2dd81666553ecb454280d68c5ab368e980e75d18cf341",
403
+ "0x89710dd344aee964826271ee471c290cc07c75f5fa1567d3fb7a5bd7d9c98fd1",
404
+ "0x0c98cd5eeeb28e14eeef72fc71432467b87f5b726adc97372d8a0533023d306b",
405
+ "0xf9a3c04b2f40ca3b42a61988ada325db3ab11bda42ab9cb9c01c685e4d66bc04",
406
+ "0x55531cea77c328a669b76543c20352346172f40d206afe38f25a8e79b1cd89eb",
407
+ "0xb7d3f39769d5e1da93f979809d59fc0950136cfe4e58a59ae322993ad444d787",
408
+ "0x4b3cb165f91b96ba7a90fe7cc1cb5dcf0d8ea379446970c650273f8e11cb5957",
409
+ "0x4778b34dae4eb5de168b9c8aadec570cd8e73ff31f8633d84ebad667b736c5ef",
410
+ "0xa298bfbb6cfd9f9663205aa81032df3f09c4ebdf5ff3411cd4db787429b6d014",
411
+ "0x2b76948313eb52ab9e06b171d9ab6e746d19ef031e5d94bbb7f9d8ec532a9fe8",
412
+ "0xa5835cf94ea79ec5518e4d0400f206e57bcab07696fcea7cf6308cd4c3647cfb",
413
+ "0xfb00b96840d28381ea9d09d185d6bc0882acfba09a5b64997dab030178fee0a1",
414
+ "0x30b4a72ee9e077c57c78cf86d8d2d6efef9f28f84f85eddeca5e35476fe011f8",
415
+ "0x48d8e59134e8e89987b6059bda69d988b19a78e072c6c40dcf25b748d7916aac",
416
+ "0x35af74b2deb8ea65742be1e8b75ad1c49bbbf01d1bfd26037fcaf3cd89926e39",
417
+ "0x6763cf676ad90dfb40a6bd22d54d36a65571874c66b6e1bea3690cad8d051321",
418
+ "0x760054fc96b0f8612dad81cea54de6d55622259a4a022398537d2814ed8ccb17",
419
+ "0x2d58f61719af0756262b390ab0587babadb77da1403695dbb9b58dd5f4148d30",
420
+ "0x6d1277534c5314ac1a7b9c05f92040c53144c45b55676c604304a4e3c4e9e0ac",
421
+ "0xfa5bfaaed054884e849ce6988ab948ad7e98158741013c8da40f280879103125",
422
+ "0xec2c8a649815c8a76a1c9d5ae0a4d2ca5530207dd59c84beb79e643c2b4699de",
423
+ "0x5fc207821af511e130bac12d541562db4f9f956e2d2150cbdcce2ff2b2271dfe",
424
+ "0xb3ca73f157d9837633dd44b86bb7b91fcdfabfeba6339f3cd5e5d2ca0a99054c",
425
+ "0xdcb443a670462f3dc014e721b9b57a68d9288bebc74a29172192099746392cdb",
426
+ "0x815de12d2b3d66a7cb0a29f0a21a597d1d6c5eadd077a2e42543c8266c1c552f",
427
+ "0x5b8ed4cb34ed17d8e82f9037d828b73f3ec09caec6691a4919df7759d02cb989",
428
+ "0xa4d7bcba3b2a421fe3af2ba43f8a30ea662015d8292916dd231bc6b125be8378",
429
+ "0x69def64bae7292bc0a5c72d4b9f14426cc8d7aa12f89ba2fa685f63c466e398e",
430
+ "0xad6f4e025468372f4b6e925584beb95675da74217d6344637443b0f1267af09b",
431
+ "0x7c207ef61607ba16622cf9796156a22a29dab59ed77666ef5b81808fb8feca81",
432
+ "0xc5ac8b92f5216cdd316cc4c28f3cdd6ee6978cb848379c51b8ce6ea5a8c0a231",
433
+ "0x856d42db3f08e9c493d4e0239a5e6e610c58951a87d55eb4c6c7103d1e9818af",
434
+ "0x557775076b85cead00fc6c33417b56743baf7cb301f965dd8e35263d18b860c2",
435
+ "0x930031f6567e75ddbc7061ef851b0c1cb95eecf57c4db559b63e9f78b132011b",
436
+ "0x3d016940fac9cbcb035310141727206a5a7cd936b8ac7ef8ad492f2c35f10b06",
437
+ "0x5cc81c393a2c1523b9a8342eb2a291321ee8c5cd99a0f647570e3cc4fade8a7f",
438
+ "0x75b03ab8d646c483878914bd0c91c1d1a2018f0fa039e72ad35cc9fb657f324e",
439
+ "0xfd38eecb7f9689315484627791d3393d2f7286b40be85c0f44b879cb46710645",
440
+ "0xf2f08c1b2723ac801ec471099071a6d8d60ab0b3847dd14400a88ca6fe2b0804",
441
+ "0xafc9d2533c985139de1e3cda1c3ebdb022456d644dc0b32e05c8ce602cb0308f",
442
+ "0x0f06d0716036c226992ae14def944de3bf651459f7d1a631b88d63bb35db2287",
443
+ "0xc332aa7d2c9459a8149bdd04a0da2552f7fd3871d6dc00c932bb8ca115e3b124",
444
+ "0xcdac2adc326d645b9ecdaf1954da28026957c87873f7e97d6236756395385901",
445
+ "0x890e71419171b6c94acfa3859d9cad0acfae4095a4d4989b2f613e429e4e8f60",
446
+ "0x681ede0467b184ae2fbc17b4d3a78d1eaa4674555494aaf872abe72c1ac10c57",
447
+ "0xdcc80cfc23ad4582fca9b31590dc7badd5104b90e564e6e73718f437118c7f73",
448
+ "0x53421fb3b6ce41428288863ab2983601400662ecee01f25f8005e13edae57be9",
449
+ "0xabc0c5603cce5690d0c66a50e938a13e3ec5a5252345e70348b11276f2d3f3dd",
450
+ "0x9b3f6a66edaf57e527d167569bc28ed14fd74a3b57dda552a98249372c559693",
451
+ "0x1944f7eef251c45eb7a41c3dcbb2e38d05a68c935678d9de83352b2c553583c6",
452
+ "0x37bc6090d2417fba1b1b06c5d1416be4012ca79df2e88d65c0b70fdbea28e85f",
453
+ "0x9e35edc9fd33b00138cb4740aa9fcc67fb4a55639e30e3f55100f6fde63219fa",
454
+ "0x93f72376c013a41bbac041280e426808162ae3c7fff4c86336283a338f98c629",
455
+ "0x74277cfdf9d119e4acc2ac5b91883ade1888dce2d6f27a854ee12301379f7b72",
456
+ "0x98889715672a70ca2e2d7b5c30269523a11ec510cf906d26f842692644265983",
457
+ "0x11265cfc4888c5c00ec3848cbbf6b97c923127a8d71a576d9f40f29aaac3fab1",
458
+ "0x227eafafdbbf1b38cb9b44720780c8730f5fcc963417d214c1b5b3ae15aea8ac",
459
+ "0x789a22790ccc6db1aad0d4fdacef1e99f985083dac5c71684a05984173eb722e",
460
+ "0x7ed24aed7c45de70482f19ce398574cd753d47fa26a5a72f7a85fbaebe1f3247",
461
+ "0x95880d0c34bb3ed909f73dde91f24262724d231256739c79cfb76e5456d2da5e",
462
+ "0x31299e470fc68ea56bd9f04b0cf1a63f56b48ff8475474e784f783db1fecad0c",
463
+ "0x846a23db36d000b6c3dc4c4404daab5e749488273b022819f97250224ce86602",
464
+ "0x011a92b6ae845fca18c3877e71602755983960c424233e3995868afadbb08915",
465
+ "0xba48629772708a411d27be75f1f1b4ce94b5c61f1d5c3f742bf46dd911169ab4",
466
+ "0xfca880cf632eb59cf79326690962288aa469a3f8ea5ed5431a6b3da2bd9524ea",
467
+ "0xb82ecba811355e826346a633ba3f7a924f84ca0f7bab43b39423280539ac3e2e",
468
+ "0x0f05979f9d7725b0dcc01c928d16e83842cc7fb7471827482ea7a912c0d49d13",
469
+ "0x421cfd9ee8c958c87a24dbe2b315d101ed04579287199ca49fec93af3f5c6b44",
470
+ "0x009797083528b2b097b5ed4e86b7a8ce09d4d230bc47ad5fc55056eba992af9c",
471
+ "0xda306790bea2079c8332d113b9c0b2b94d947c11534a8d43844e1742ef3f0b87",
472
+ "0xa7ca2796de5c4cd6ddc53debcde5ce1f97ff04a42679a7dc69cdd3ccef801818",
473
+ "0xf930a383591fb426df5dc75d394368c5708d3fc45f280ed4d4f9893d1b5e0f64",
474
+ "0xb3acc2d780a5fcd79afc84974fb0051ebba73b454053e9a0c3844625aebb7438",
475
+ "0x50b247b9da00fa48d62b10e78e5f139da0169313b7051f328f56d987b7f72635",
476
+ "0xac5c12ce32adffa8c6a39adaa54e4f9921086b1549858ddb8352611a9bc6dfaf",
477
+ "0x211cc2097a9503e2d20a83d2e04bf04e2eae54fcf212de1d7c5c44f1dc2d4f26",
478
+ "0xe81b13eaf7b676a84b028f0d9b015c517ca2d5c1040889fbf76e9213c81f5a13",
479
+ "0x759fdf6ed79a4880c19dc2aeae6f402d3c2548c69a4ff2c414185d50d681a9b3",
480
+ "0x4228cbaa3829b28afc56074a75761bc700547bce00bf62624e33d2561c0b55db",
481
+ "0xcb0f89c3dc21d62b81ff4d1954b7b746d5667c6eb05182c08b9538a1d9e315c8",
482
+ "0x5d0d1c7f0fb49a562150cd818dc7407d944f9d7724c688815dbb745cbd413f0e",
483
+ "0x315b36e3411c3bb8a1c092c80eab9c19fd37db319dfc41befbbce9e78704988f",
484
+ "0x8359dfc29f6fa9e06ba34cfa07b799a9203f17e42d3b5b3d7c48616ae1bd9aeb",
485
+ "0xdc28479bc50ff36814c3272723405be178a67d0ec380719bc5d791031ec0e565",
486
+ "0x3439e8ceba82c5b4a07f7c22be78c9650c88c384fdfb78572a5baa0289f723c7",
487
+ "0xce6487ec2ea20a752cb27b5252faf15c7e75c07c95164a6be6a680e5411417bd",
488
+ "0xda73b97749449576b0b3b406be397babab8ac683d2c63efaadfab98c0b01f6df",
489
+ "0x8335757eabcb45e9de63bd17466223e59885ac9455331acff3035ee841545ffc",
490
+ "0x1d19308d55db9fefe56833ddaa46ebdaefc8374acb944a0cdf0e54612ee823c6",
491
+ "0xbf39356cc9332569595ba559e7a93455d6821f06607b5f81fa9ef497cef8ded4",
492
+ "0x21c53c6633f95c9d09873f882357b9d3c9d578e36ac9ff4522c4f162d8f063c6",
493
+ "0x080e51f918966a1a991fb35bf43f03f3d4b1d059b930f9425d03243909e6627e",
494
+ "0x850bbd853553d4e63e7deae2b46c717f4898eb4cd2ab70b92074ba75e0669b28",
495
+ "0x560bd9e5208ffab137318cb78dd22d022418ef05851559df6373184b6008d921",
496
+ "0x68b994d4812451cd5dd0a6f79ec4af6c55bd81af96e80f398378827bfd2bfc79",
497
+ "0xc8d2c46cfc54c6ee29c4ca9f11ff6775051d59b1c774fd2fa732f92236f535ba",
498
+ "0xb706132112362fe076cca1c33cf4fef2e910f70fe2a453e45b710034059f1757",
499
+ "0xb19912b950a53e2a6b16bfe2e8847f43ba7a3d15993701ebebe0e9c0971ca3dc",
500
+ "0xcc8c01edc1360397cca04b87c4d94819da70fab718dc1c75cad7c43f82502d9e",
501
+ "0x1a10b69ecdfb19ec88477595d14627de4335de63ee04d3273822cb571327f8a8",
502
+ "0xcfab191eed98547c47065c6d3e5759306423f9c2610629adb5df336c7224bddb",
503
+ "0xcf8fdcb00038d10d5fa3c847e4611ffee02ac20ee75ad45841451c9f1410e045",
504
+ "0xe6d72fe86fbfa94a7e03e72d292f8d4bab188b18a4d732b500fc867d84bd86d6",
505
+ ],
506
+ "transactionsRoot": "0xe1aed9562570b4a0f31aebcc7558960f7aeafa3bd2a062977e2c927ff795af27",
507
+ "uncles": [],
508
+ },
509
+ }
510
+ `)
511
+ expect(socket.requests.size).toBe(0)
512
+ })
513
+
514
+ test('invalid request', async () => {
515
+ const socket = await getSocket(localWsUrl)
516
+ await expect(
517
+ () =>
518
+ new Promise<any>((resolve, reject) =>
519
+ rpc.webSocket(socket, {
520
+ body: {
521
+ method: 'wagmi_lol',
522
+ },
523
+ onData: resolve,
524
+ onError: reject,
525
+ }),
526
+ ),
527
+ ).rejects.toThrowError(
528
+ 'data did not match any variant of untagged enum EthRpcCall',
529
+ )
530
+ expect(socket.requests.size).toBe(0)
531
+ })
532
+
533
+ test('invalid request (closing socket)', async () => {
534
+ const socket = await getSocket(localWsUrl)
535
+ await wait(1000)
536
+ socket.close()
537
+ await expect(
538
+ () =>
539
+ new Promise<any>((resolve, reject) =>
540
+ rpc.webSocket(socket, {
541
+ body: {
542
+ method: 'wagmi_lol',
543
+ },
544
+ onData: resolve,
545
+ onError: reject,
546
+ }),
547
+ ),
548
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
549
+ `
550
+ "WebSocket request failed.
551
+
552
+ URL: ws://127.0.0.1:8545/
553
+ Request body: {\\"method\\":\\"wagmi_lol\\"}
554
+
555
+ Details: Socket is closed.
556
+ Version: viem@1.0.2"
557
+ `,
558
+ )
559
+ await wait(100)
560
+ })
561
+
562
+ test('invalid request (closed socket)', async () => {
563
+ const socket = await getSocket(localWsUrl)
564
+ socket.close()
565
+ await wait(1000)
566
+ await expect(
567
+ () =>
568
+ new Promise<any>((resolve, reject) =>
569
+ rpc.webSocket(socket, {
570
+ body: {
571
+ method: 'wagmi_lol',
572
+ },
573
+ onData: resolve,
574
+ onError: reject,
575
+ }),
576
+ ),
577
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
578
+ `
579
+ "WebSocket request failed.
580
+
581
+ URL: ws://127.0.0.1:8545/
582
+ Request body: {\\"method\\":\\"wagmi_lol\\"}
583
+
584
+ Details: Socket is closed.
585
+ Version: viem@1.0.2"
586
+ `,
587
+ )
588
+ })
589
+ })
590
+
591
+ describe('webSocket (subscription)', () => {
592
+ test('basic', async () => {
593
+ const socket = await getSocket(localWsUrl)
594
+ let data_: RpcResponse[] = []
595
+ rpc.webSocket(socket, {
596
+ body: {
597
+ method: 'eth_subscribe',
598
+ params: ['newHeads'],
599
+ },
600
+ onData: (data) => data_.push(data),
601
+ })
602
+ await wait(2000)
603
+ expect(socket.subscriptions.size).toBe(1)
604
+ expect(data_.length).toBe(3)
605
+
606
+ await rpc.webSocketAsync(socket, {
607
+ body: {
608
+ method: 'eth_unsubscribe',
609
+ params: [(data_[0] as any).result],
610
+ },
611
+ })
612
+
613
+ await wait(2000)
614
+ expect(socket.subscriptions.size).toBe(0)
615
+ expect(data_.length).toBe(3)
616
+ })
617
+
618
+ test('multiple', async () => {
619
+ const socket = await getSocket(localWsUrl)
620
+ let s1: RpcResponse[] = []
621
+ rpc.webSocket(socket, {
622
+ body: {
623
+ method: 'eth_subscribe',
624
+ params: ['newHeads'],
625
+ },
626
+ onData: (data) => s1.push(data),
627
+ })
628
+
629
+ let s2: RpcResponse[] = []
630
+ rpc.webSocket(socket, {
631
+ body: {
632
+ method: 'eth_subscribe',
633
+ params: ['newHeads'],
634
+ },
635
+ onData: (data) => s2.push(data),
636
+ })
637
+
638
+ let s3: RpcResponse[] = []
639
+ rpc.webSocket(socket, {
640
+ body: {
641
+ method: 'eth_subscribe',
642
+ params: ['newPendingTransactions'],
643
+ },
644
+ onData: (data) => s3.push(data),
645
+ })
646
+
647
+ await wait(2000)
648
+ expect(socket.requests.size).toBe(0)
649
+ expect(socket.subscriptions.size).toBe(3)
650
+ expect(s1.length).toBe(3)
651
+ expect(s2.length).toBe(3)
652
+ expect(s3.length).toBe(1)
653
+
654
+ await rpc.webSocketAsync(socket, {
655
+ body: {
656
+ method: 'eth_unsubscribe',
657
+ params: [(s1[0] as any).result],
658
+ },
659
+ })
660
+
661
+ await wait(2000)
662
+ expect(socket.requests.size).toBe(0)
663
+ expect(socket.subscriptions.size).toBe(2)
664
+ expect(s1.length).toBe(3)
665
+ expect(s2.length).toBe(5)
666
+ expect(s3.length).toBe(1)
667
+
668
+ await rpc.webSocketAsync(socket, {
669
+ body: {
670
+ method: 'eth_unsubscribe',
671
+ params: [(s2[0] as any).result],
672
+ },
673
+ })
674
+ await rpc.webSocketAsync(socket, {
675
+ body: {
676
+ method: 'eth_unsubscribe',
677
+ params: [(s3[0] as any).result],
678
+ },
679
+ })
680
+
681
+ await wait(2000)
682
+ expect(socket.requests.size).toBe(0)
683
+ expect(socket.subscriptions.size).toBe(0)
684
+ expect(s1.length).toBe(3)
685
+ expect(s2.length).toBe(5)
686
+ expect(s3.length).toBe(1)
687
+ })
688
+
689
+ test('invalid subscription', async () => {
690
+ const socket = await getSocket(localWsUrl)
691
+ let err_: Error | undefined
692
+ rpc.webSocket(socket, {
693
+ body: {
694
+ method: 'eth_subscribe',
695
+ params: ['fakeHeadz'],
696
+ },
697
+ onError: (err) => (err_ = err),
698
+ })
699
+ await wait(500)
700
+ expect(socket.requests.size).toBe(0)
701
+ expect(socket.subscriptions.size).toBe(0)
702
+ expect(err_).toMatchInlineSnapshot(`
703
+ [RpcError: RPC Request failed.
704
+
705
+ URL: ws://127.0.0.1:8545/
706
+ Request body: {"method":"eth_subscribe","params":["fakeHeadz"]}
707
+
708
+ Details: data did not match any variant of untagged enum EthRpcCall
709
+ Version: viem@1.0.2
710
+ Internal Error: {"code":-32602,"message":"data did not match any variant of untagged enum EthRpcCall"}]
711
+ `)
712
+ })
713
+ })
714
+
715
+ describe('webSocketAsync', () => {
716
+ test('valid request', async () => {
717
+ const socket = await getSocket(localWsUrl)
718
+ const { id, ...version } = await rpc.webSocketAsync(socket, {
719
+ body: { method: 'web3_clientVersion' },
720
+ })
721
+ expect(id).toBeDefined()
722
+ expect(version).toMatchInlineSnapshot(`
723
+ {
724
+ "jsonrpc": "2.0",
725
+ "result": "anvil/v0.1.0",
726
+ }
727
+ `)
728
+ expect(socket.requests.size).toBe(0)
729
+ })
730
+
731
+ test('valid request', async () => {
732
+ const socket = await getSocket(localWsUrl)
733
+ const { id, ...block } = await rpc.webSocketAsync(socket, {
734
+ body: {
735
+ method: 'eth_getBlockByNumber',
736
+ params: [numberToHex(initialBlockNumber), false],
737
+ },
738
+ })
739
+ expect(id).toBeDefined()
740
+ expect(block).toMatchInlineSnapshot(`
741
+ {
742
+ "jsonrpc": "2.0",
743
+ "result": {
744
+ "baseFeePerGas": "0x2f9b711b9",
745
+ "difficulty": "0x0",
746
+ "extraData": "0x6265617665726275696c642e6f7267",
747
+ "gasLimit": "0x1c9c380",
748
+ "gasUsed": "0x120bbd0",
749
+ "hash": "0x3f900200152e9e7731b6adfb4a9a5cf43c71f3ff600962efe544f3b1d9466fac",
750
+ "logsBloom": "0xeeec4ae861e4d9e400eb97e3c26253a37852273ababa634d97d300674e269f1a567884ba980b255ac72c1d787a129b8786e9b4201f21316cb6e8274545adbe4fb9264bf2f936df28efcdf72ff393486d4adae488455c34ed5c7d3e158d070938db650d71021a42da46105b004f05ad1fd614768209bc8ef44e0ada968a384a791639509379623bcbc1fc8cb876e3282969c5b9abc354b159678dd87153b6aecbbec06d7f3eb37a9a98596ce72c638ac7c2788ea00a36f0cfb96f0ec314bc8b4a473b955fc5c4dbdba1aaddb5a9c412165169cae009ae09561a79ab8f822cfd533d73bd988dd42dc4185618f62b310b40173f62b628fe2fe5958e3b14acc60860",
751
+ "miner": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5",
752
+ "mixHash": "0xd7de5432d0e9545465317f2f0f82f6f60dfc35055103378c2b4c19a9218e7c75",
753
+ "nonce": "0x0000000000000000",
754
+ "number": "0xf86cc2",
755
+ "parentHash": "0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4",
756
+ "receiptsRoot": "0x7c577c7a2c1649735565691411b9236e1946dc74f3f474d15c014bece0104de8",
757
+ "sealFields": [],
758
+ "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
759
+ "size": "0x18011",
760
+ "stateRoot": "0x651162a87a2905c6f37ab5f0a2676f9cd8fc5ff618cb5c1a89bf25ddea7f391c",
761
+ "timestamp": "0x63abc18b",
762
+ "totalDifficulty": "0xc70d815d562d3cfa955",
763
+ "transactions": [
764
+ "0x1351de11f81a077cd300914e278c870c3df5b26d3f3b2a4a3f8db76bc138e7d3",
765
+ "0x7d5c80f38b2e706aa3bd19b234e6026c8a4c0543bf299dfe609193693ac27dfb",
766
+ "0xc986d00394b3aea84f19906037be219456f13894c0fcfecbd242b36d52a0fa01",
767
+ "0x73271cf06de97fdbbf0be2bb13b9376a98b1715b6d463c81f5ce73a9988b6f5c",
768
+ "0x48c27153e0fd95de6bb7858dc42ff2d16aa0123ff6f4839dda23da82c170df13",
769
+ "0xb901cc43954131517926708106398c5c0c3c77c2550b18fb7bd6eb45a6b39284",
770
+ "0xc6d0d2bf4e46725ed595acdc8bc841994d1e63500c0c06671bc19379c5f111dd",
771
+ "0xb05036fbb0125a493090289331e0b9d44c8ebb3f7852c0a1657ff9e0fce0f51f",
772
+ "0x14bbc701396fffe3b212eb96af063cb97e05ee36c98b133da22a5968a4b38707",
773
+ "0x6b96c5431807ef6792333f1e448dc52d72d24b1460879da6b88a94858bc27a12",
774
+ "0xda1f70f856e3ffc9ed5d5c3c91d8e13b0256931ca759be650407de7053842f4c",
775
+ "0xe52666b85980c7f2cdf1c36ef32a69164c65250109bc9f639ebbc990390c8176",
776
+ "0x5010f98f3ed2110fd40c8b463ad9fa56fe9f026d3bbbfa27a86238ea69084056",
777
+ "0xa554462712447f7edee4cef01317d1d2438200c70f0eafd696d21ae6483472ae",
778
+ "0x4d85ba6c319c5f05768bd42bc3a8509ffb20873c763bacf72b13d6febde479a7",
779
+ "0xaf32af489ae7d94b22cd47c6b1ad44872a5b5781ed329e2e5dc622c1ad9b0be2",
780
+ "0x5be511e63eabbaaeb0436e972e34747edd255e30155d6e943e0c4cc81980efea",
781
+ "0xdad9805520d2eb35019f9f7692750959943a9c1dc9ecf31d234273eb0af93be5",
782
+ "0x33e0a938bdb373ab8a57a03d20faa1fad0b793c86b61cc8cfbd9187f7a7a8f6c",
783
+ "0x552e8b37157fa2fc8576b56e73b314d6001531e00c8c406c25b46c2275d99cb4",
784
+ "0x8a47abc6188d6500b71744d03c68e20b017a33c4291b30eb6c8a1d332b03a654",
785
+ "0xf6a51940f09b38b619958b2955841d6a5c80230a4bfda8266a2c59ebb2722528",
786
+ "0x6d0adc2c20661faa7fab9ab72d09c7688fc61ab1d5d6d2f453b969c820377a2b",
787
+ "0x91963d8420403980eeee8434d1d158dc0e7fb035d0b6bbc0cfa795965a9189c6",
788
+ "0x4bb35a76df1f1b12cdb722f86548061bdcad763a96a0ee1a0bf8f8a3acc4894b",
789
+ "0xbb1be5996b36846b4455ee515e701a8619741e035b89e7abf0b8dccba3d882fc",
790
+ "0x995df00e7dd97dd7d591ebab4a8af2a5689ce67d98378857311715fc0c04e3c4",
791
+ "0x6d0ef7c18c8a79e8c5357ede322c0f3c9bb79b423dcd38d68ece250d6dd90e82",
792
+ "0x5e23f022fe06150e4269e76a0607732d960cec687398d7bb9551e2f396629a54",
793
+ "0xc284f18afa7be933a7c2dd81666553ecb454280d68c5ab368e980e75d18cf341",
794
+ "0x89710dd344aee964826271ee471c290cc07c75f5fa1567d3fb7a5bd7d9c98fd1",
795
+ "0x0c98cd5eeeb28e14eeef72fc71432467b87f5b726adc97372d8a0533023d306b",
796
+ "0xf9a3c04b2f40ca3b42a61988ada325db3ab11bda42ab9cb9c01c685e4d66bc04",
797
+ "0x55531cea77c328a669b76543c20352346172f40d206afe38f25a8e79b1cd89eb",
798
+ "0xb7d3f39769d5e1da93f979809d59fc0950136cfe4e58a59ae322993ad444d787",
799
+ "0x4b3cb165f91b96ba7a90fe7cc1cb5dcf0d8ea379446970c650273f8e11cb5957",
800
+ "0x4778b34dae4eb5de168b9c8aadec570cd8e73ff31f8633d84ebad667b736c5ef",
801
+ "0xa298bfbb6cfd9f9663205aa81032df3f09c4ebdf5ff3411cd4db787429b6d014",
802
+ "0x2b76948313eb52ab9e06b171d9ab6e746d19ef031e5d94bbb7f9d8ec532a9fe8",
803
+ "0xa5835cf94ea79ec5518e4d0400f206e57bcab07696fcea7cf6308cd4c3647cfb",
804
+ "0xfb00b96840d28381ea9d09d185d6bc0882acfba09a5b64997dab030178fee0a1",
805
+ "0x30b4a72ee9e077c57c78cf86d8d2d6efef9f28f84f85eddeca5e35476fe011f8",
806
+ "0x48d8e59134e8e89987b6059bda69d988b19a78e072c6c40dcf25b748d7916aac",
807
+ "0x35af74b2deb8ea65742be1e8b75ad1c49bbbf01d1bfd26037fcaf3cd89926e39",
808
+ "0x6763cf676ad90dfb40a6bd22d54d36a65571874c66b6e1bea3690cad8d051321",
809
+ "0x760054fc96b0f8612dad81cea54de6d55622259a4a022398537d2814ed8ccb17",
810
+ "0x2d58f61719af0756262b390ab0587babadb77da1403695dbb9b58dd5f4148d30",
811
+ "0x6d1277534c5314ac1a7b9c05f92040c53144c45b55676c604304a4e3c4e9e0ac",
812
+ "0xfa5bfaaed054884e849ce6988ab948ad7e98158741013c8da40f280879103125",
813
+ "0xec2c8a649815c8a76a1c9d5ae0a4d2ca5530207dd59c84beb79e643c2b4699de",
814
+ "0x5fc207821af511e130bac12d541562db4f9f956e2d2150cbdcce2ff2b2271dfe",
815
+ "0xb3ca73f157d9837633dd44b86bb7b91fcdfabfeba6339f3cd5e5d2ca0a99054c",
816
+ "0xdcb443a670462f3dc014e721b9b57a68d9288bebc74a29172192099746392cdb",
817
+ "0x815de12d2b3d66a7cb0a29f0a21a597d1d6c5eadd077a2e42543c8266c1c552f",
818
+ "0x5b8ed4cb34ed17d8e82f9037d828b73f3ec09caec6691a4919df7759d02cb989",
819
+ "0xa4d7bcba3b2a421fe3af2ba43f8a30ea662015d8292916dd231bc6b125be8378",
820
+ "0x69def64bae7292bc0a5c72d4b9f14426cc8d7aa12f89ba2fa685f63c466e398e",
821
+ "0xad6f4e025468372f4b6e925584beb95675da74217d6344637443b0f1267af09b",
822
+ "0x7c207ef61607ba16622cf9796156a22a29dab59ed77666ef5b81808fb8feca81",
823
+ "0xc5ac8b92f5216cdd316cc4c28f3cdd6ee6978cb848379c51b8ce6ea5a8c0a231",
824
+ "0x856d42db3f08e9c493d4e0239a5e6e610c58951a87d55eb4c6c7103d1e9818af",
825
+ "0x557775076b85cead00fc6c33417b56743baf7cb301f965dd8e35263d18b860c2",
826
+ "0x930031f6567e75ddbc7061ef851b0c1cb95eecf57c4db559b63e9f78b132011b",
827
+ "0x3d016940fac9cbcb035310141727206a5a7cd936b8ac7ef8ad492f2c35f10b06",
828
+ "0x5cc81c393a2c1523b9a8342eb2a291321ee8c5cd99a0f647570e3cc4fade8a7f",
829
+ "0x75b03ab8d646c483878914bd0c91c1d1a2018f0fa039e72ad35cc9fb657f324e",
830
+ "0xfd38eecb7f9689315484627791d3393d2f7286b40be85c0f44b879cb46710645",
831
+ "0xf2f08c1b2723ac801ec471099071a6d8d60ab0b3847dd14400a88ca6fe2b0804",
832
+ "0xafc9d2533c985139de1e3cda1c3ebdb022456d644dc0b32e05c8ce602cb0308f",
833
+ "0x0f06d0716036c226992ae14def944de3bf651459f7d1a631b88d63bb35db2287",
834
+ "0xc332aa7d2c9459a8149bdd04a0da2552f7fd3871d6dc00c932bb8ca115e3b124",
835
+ "0xcdac2adc326d645b9ecdaf1954da28026957c87873f7e97d6236756395385901",
836
+ "0x890e71419171b6c94acfa3859d9cad0acfae4095a4d4989b2f613e429e4e8f60",
837
+ "0x681ede0467b184ae2fbc17b4d3a78d1eaa4674555494aaf872abe72c1ac10c57",
838
+ "0xdcc80cfc23ad4582fca9b31590dc7badd5104b90e564e6e73718f437118c7f73",
839
+ "0x53421fb3b6ce41428288863ab2983601400662ecee01f25f8005e13edae57be9",
840
+ "0xabc0c5603cce5690d0c66a50e938a13e3ec5a5252345e70348b11276f2d3f3dd",
841
+ "0x9b3f6a66edaf57e527d167569bc28ed14fd74a3b57dda552a98249372c559693",
842
+ "0x1944f7eef251c45eb7a41c3dcbb2e38d05a68c935678d9de83352b2c553583c6",
843
+ "0x37bc6090d2417fba1b1b06c5d1416be4012ca79df2e88d65c0b70fdbea28e85f",
844
+ "0x9e35edc9fd33b00138cb4740aa9fcc67fb4a55639e30e3f55100f6fde63219fa",
845
+ "0x93f72376c013a41bbac041280e426808162ae3c7fff4c86336283a338f98c629",
846
+ "0x74277cfdf9d119e4acc2ac5b91883ade1888dce2d6f27a854ee12301379f7b72",
847
+ "0x98889715672a70ca2e2d7b5c30269523a11ec510cf906d26f842692644265983",
848
+ "0x11265cfc4888c5c00ec3848cbbf6b97c923127a8d71a576d9f40f29aaac3fab1",
849
+ "0x227eafafdbbf1b38cb9b44720780c8730f5fcc963417d214c1b5b3ae15aea8ac",
850
+ "0x789a22790ccc6db1aad0d4fdacef1e99f985083dac5c71684a05984173eb722e",
851
+ "0x7ed24aed7c45de70482f19ce398574cd753d47fa26a5a72f7a85fbaebe1f3247",
852
+ "0x95880d0c34bb3ed909f73dde91f24262724d231256739c79cfb76e5456d2da5e",
853
+ "0x31299e470fc68ea56bd9f04b0cf1a63f56b48ff8475474e784f783db1fecad0c",
854
+ "0x846a23db36d000b6c3dc4c4404daab5e749488273b022819f97250224ce86602",
855
+ "0x011a92b6ae845fca18c3877e71602755983960c424233e3995868afadbb08915",
856
+ "0xba48629772708a411d27be75f1f1b4ce94b5c61f1d5c3f742bf46dd911169ab4",
857
+ "0xfca880cf632eb59cf79326690962288aa469a3f8ea5ed5431a6b3da2bd9524ea",
858
+ "0xb82ecba811355e826346a633ba3f7a924f84ca0f7bab43b39423280539ac3e2e",
859
+ "0x0f05979f9d7725b0dcc01c928d16e83842cc7fb7471827482ea7a912c0d49d13",
860
+ "0x421cfd9ee8c958c87a24dbe2b315d101ed04579287199ca49fec93af3f5c6b44",
861
+ "0x009797083528b2b097b5ed4e86b7a8ce09d4d230bc47ad5fc55056eba992af9c",
862
+ "0xda306790bea2079c8332d113b9c0b2b94d947c11534a8d43844e1742ef3f0b87",
863
+ "0xa7ca2796de5c4cd6ddc53debcde5ce1f97ff04a42679a7dc69cdd3ccef801818",
864
+ "0xf930a383591fb426df5dc75d394368c5708d3fc45f280ed4d4f9893d1b5e0f64",
865
+ "0xb3acc2d780a5fcd79afc84974fb0051ebba73b454053e9a0c3844625aebb7438",
866
+ "0x50b247b9da00fa48d62b10e78e5f139da0169313b7051f328f56d987b7f72635",
867
+ "0xac5c12ce32adffa8c6a39adaa54e4f9921086b1549858ddb8352611a9bc6dfaf",
868
+ "0x211cc2097a9503e2d20a83d2e04bf04e2eae54fcf212de1d7c5c44f1dc2d4f26",
869
+ "0xe81b13eaf7b676a84b028f0d9b015c517ca2d5c1040889fbf76e9213c81f5a13",
870
+ "0x759fdf6ed79a4880c19dc2aeae6f402d3c2548c69a4ff2c414185d50d681a9b3",
871
+ "0x4228cbaa3829b28afc56074a75761bc700547bce00bf62624e33d2561c0b55db",
872
+ "0xcb0f89c3dc21d62b81ff4d1954b7b746d5667c6eb05182c08b9538a1d9e315c8",
873
+ "0x5d0d1c7f0fb49a562150cd818dc7407d944f9d7724c688815dbb745cbd413f0e",
874
+ "0x315b36e3411c3bb8a1c092c80eab9c19fd37db319dfc41befbbce9e78704988f",
875
+ "0x8359dfc29f6fa9e06ba34cfa07b799a9203f17e42d3b5b3d7c48616ae1bd9aeb",
876
+ "0xdc28479bc50ff36814c3272723405be178a67d0ec380719bc5d791031ec0e565",
877
+ "0x3439e8ceba82c5b4a07f7c22be78c9650c88c384fdfb78572a5baa0289f723c7",
878
+ "0xce6487ec2ea20a752cb27b5252faf15c7e75c07c95164a6be6a680e5411417bd",
879
+ "0xda73b97749449576b0b3b406be397babab8ac683d2c63efaadfab98c0b01f6df",
880
+ "0x8335757eabcb45e9de63bd17466223e59885ac9455331acff3035ee841545ffc",
881
+ "0x1d19308d55db9fefe56833ddaa46ebdaefc8374acb944a0cdf0e54612ee823c6",
882
+ "0xbf39356cc9332569595ba559e7a93455d6821f06607b5f81fa9ef497cef8ded4",
883
+ "0x21c53c6633f95c9d09873f882357b9d3c9d578e36ac9ff4522c4f162d8f063c6",
884
+ "0x080e51f918966a1a991fb35bf43f03f3d4b1d059b930f9425d03243909e6627e",
885
+ "0x850bbd853553d4e63e7deae2b46c717f4898eb4cd2ab70b92074ba75e0669b28",
886
+ "0x560bd9e5208ffab137318cb78dd22d022418ef05851559df6373184b6008d921",
887
+ "0x68b994d4812451cd5dd0a6f79ec4af6c55bd81af96e80f398378827bfd2bfc79",
888
+ "0xc8d2c46cfc54c6ee29c4ca9f11ff6775051d59b1c774fd2fa732f92236f535ba",
889
+ "0xb706132112362fe076cca1c33cf4fef2e910f70fe2a453e45b710034059f1757",
890
+ "0xb19912b950a53e2a6b16bfe2e8847f43ba7a3d15993701ebebe0e9c0971ca3dc",
891
+ "0xcc8c01edc1360397cca04b87c4d94819da70fab718dc1c75cad7c43f82502d9e",
892
+ "0x1a10b69ecdfb19ec88477595d14627de4335de63ee04d3273822cb571327f8a8",
893
+ "0xcfab191eed98547c47065c6d3e5759306423f9c2610629adb5df336c7224bddb",
894
+ "0xcf8fdcb00038d10d5fa3c847e4611ffee02ac20ee75ad45841451c9f1410e045",
895
+ "0xe6d72fe86fbfa94a7e03e72d292f8d4bab188b18a4d732b500fc867d84bd86d6",
896
+ ],
897
+ "transactionsRoot": "0xe1aed9562570b4a0f31aebcc7558960f7aeafa3bd2a062977e2c927ff795af27",
898
+ "uncles": [],
899
+ },
900
+ }
901
+ `)
902
+ expect(socket.requests.size).toBe(0)
903
+ })
904
+
905
+ test('serial requests', async () => {
906
+ const socket = await getSocket(localWsUrl)
907
+ let response: any = []
908
+ for (const i in Array.from({ length: 10 })) {
909
+ response.push(
910
+ await rpc.webSocketAsync(socket, {
911
+ body: {
912
+ method: 'eth_getBlockByNumber',
913
+ params: [numberToHex(initialBlockNumber - BigInt(i)), false],
914
+ },
915
+ }),
916
+ )
917
+ }
918
+ expect(response.map((r: any) => r.result.number)).toEqual(
919
+ Array.from({ length: 10 }).map((_, i) =>
920
+ numberToHex(initialBlockNumber - BigInt(i)),
921
+ ),
922
+ )
923
+ expect(socket.requests.size).toBe(0)
924
+ })
925
+
926
+ test('parallel requests', async () => {
927
+ await wait(500)
928
+ const socket = await getSocket(localWsUrl)
929
+ const response = await Promise.all(
930
+ Array.from({ length: 100 }).map(async (_, i) => {
931
+ return await rpc.webSocketAsync(socket, {
932
+ body: {
933
+ method: 'eth_getBlockByNumber',
934
+ params: [numberToHex(initialBlockNumber - BigInt(i)), false],
935
+ },
936
+ })
937
+ }),
938
+ )
939
+ expect(response.map((r) => r.result.number)).toEqual(
940
+ Array.from({ length: 100 }).map((_, i) =>
941
+ numberToHex(initialBlockNumber - BigInt(i)),
942
+ ),
943
+ )
944
+ expect(socket.requests.size).toBe(0)
945
+ await wait(500)
946
+ })
947
+
948
+ test('invalid request', async () => {
949
+ const socket = await getSocket(localWsUrl)
950
+ await expect(() =>
951
+ rpc.webSocketAsync(socket, {
952
+ body: {
953
+ method: 'wagmi_lol',
954
+ },
955
+ }),
956
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
957
+ `
958
+ "RPC Request failed.
959
+
960
+ URL: ws://127.0.0.1:8545/
961
+ Request body: {\\"method\\":\\"wagmi_lol\\"}
962
+
963
+ Details: data did not match any variant of untagged enum EthRpcCall
964
+ Version: viem@1.0.2
965
+ Internal Error: {\\"code\\":-32602,\\"message\\":\\"data did not match any variant of untagged enum EthRpcCall\\"}"
966
+ `,
967
+ )
968
+ })
969
+
970
+ test.skip('timeout', async () => {
971
+ const socket = await getSocket(localWsUrl)
972
+ try {
973
+ await rpc.webSocketAsync(socket, {
974
+ body: {
975
+ method: 'eth_getBlockByNumber',
976
+ params: [numberToHex(initialBlockNumber), false],
977
+ },
978
+ timeout: 10,
979
+ })
980
+ } catch (err) {
981
+ expect(err).toMatchInlineSnapshot(`
982
+ [TimeoutError: The request took too long to respond.
983
+
984
+ URL: wss://eth-mainnet.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC
985
+ Request body: {"method":"eth_getBlockByNumber","params":["0xe6e560",false]}
986
+
987
+ Details: The request timed out.
988
+ Version: viem@1.0.2]
989
+ `)
990
+ }
991
+ })
992
+ })