voltaire-effect 0.2.23 → 0.2.25

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 (397) hide show
  1. package/dist/KZGService-B7PJerOb.d.ts +146 -0
  2. package/dist/ProviderService-BZ5pqDrD.d.ts +319 -0
  3. package/dist/{X25519Test-DGsk1V9o.d.ts → X25519Test-D5Q-5fL9.d.ts} +4 -143
  4. package/dist/crypto/index.d.ts +5 -6
  5. package/dist/crypto/index.js +227 -201
  6. package/dist/{index-IgkEHjBe.d.ts → index-BCOuszKZ.d.ts} +17634 -11962
  7. package/dist/index.d.ts +3195 -976
  8. package/dist/index.js +6994 -4679
  9. package/dist/native/index.d.ts +25 -16
  10. package/dist/native/index.js +7020 -4705
  11. package/dist/primitives/index.d.ts +14 -8
  12. package/dist/primitives/index.js +4060 -2539
  13. package/dist/services/index.d.ts +9054 -30
  14. package/dist/services/index.js +1592 -1331
  15. package/package.json +2 -2
  16. package/src/crypto/ERC6492/ERC6492.test.ts +32 -14
  17. package/src/crypto/ERC6492/verifySignature.ts +4 -5
  18. package/src/crypto/Keccak256/Keccak256.test.ts +42 -1
  19. package/src/crypto/Keccak256/hashSync.ts +53 -0
  20. package/src/crypto/Keccak256/index.ts +2 -0
  21. package/src/index.ts +7 -2
  22. package/src/primitives/Abi/decode.test.ts +38 -0
  23. package/src/primitives/Abi/decode.ts +67 -0
  24. package/src/primitives/Abi/decodeData.test.ts +37 -0
  25. package/src/primitives/Abi/decodeData.ts +77 -0
  26. package/src/primitives/Abi/decodeLog.test.ts +32 -0
  27. package/src/primitives/Abi/decodeLog.ts +81 -0
  28. package/src/primitives/Abi/decodeWrappedError.test.ts +41 -0
  29. package/src/primitives/Abi/decodeWrappedError.ts +68 -0
  30. package/src/primitives/Abi/encode.test.ts +43 -0
  31. package/src/primitives/Abi/encode.ts +67 -0
  32. package/src/primitives/Abi/encodePacked.test.ts +35 -0
  33. package/src/primitives/Abi/encodePacked.ts +62 -0
  34. package/src/primitives/Abi/encodeWrappedError.test.ts +21 -0
  35. package/src/primitives/Abi/encodeWrappedError.ts +64 -0
  36. package/src/primitives/Abi/findSelectorCollisions.test.ts +50 -0
  37. package/src/primitives/Abi/findSelectorCollisions.ts +83 -0
  38. package/src/primitives/Abi/index.ts +33 -7
  39. package/src/primitives/Abi/parseLogs.test.ts +37 -0
  40. package/src/primitives/Abi/parseLogs.ts +62 -0
  41. package/src/primitives/AccessList/AccessList.test.ts +229 -0
  42. package/src/primitives/AccessList/AccessListTypeSchema.ts +16 -0
  43. package/src/primitives/AccessList/addressCount.ts +21 -0
  44. package/src/primitives/AccessList/assertValid.ts +37 -0
  45. package/src/primitives/AccessList/create.ts +19 -0
  46. package/src/primitives/AccessList/deduplicate.ts +23 -0
  47. package/src/primitives/AccessList/from.ts +39 -0
  48. package/src/primitives/AccessList/fromBytes.ts +36 -0
  49. package/src/primitives/AccessList/gasCost.ts +22 -0
  50. package/src/primitives/AccessList/gasSavings.ts +26 -0
  51. package/src/primitives/AccessList/hasSavings.ts +23 -0
  52. package/src/primitives/AccessList/includesAddress.ts +25 -0
  53. package/src/primitives/AccessList/includesStorageKey.ts +28 -0
  54. package/src/primitives/AccessList/index.ts +99 -19
  55. package/src/primitives/AccessList/is.ts +23 -0
  56. package/src/primitives/AccessList/isEmpty.ts +23 -0
  57. package/src/primitives/AccessList/isItem.ts +22 -0
  58. package/src/primitives/AccessList/keysFor.ts +29 -0
  59. package/src/primitives/AccessList/merge.ts +24 -0
  60. package/src/primitives/AccessList/storageKeyCount.ts +21 -0
  61. package/src/primitives/AccessList/toBytes.ts +23 -0
  62. package/src/primitives/AccessList/withAddress.ts +27 -0
  63. package/src/primitives/AccessList/withStorageKey.ts +30 -0
  64. package/src/primitives/Address/Address.test.ts +146 -0
  65. package/src/primitives/Address/assert.ts +51 -0
  66. package/src/primitives/Address/calculateCreate2Address.ts +33 -0
  67. package/src/primitives/Address/calculateCreateAddress.ts +30 -0
  68. package/src/primitives/Address/deduplicateAddresses.ts +20 -0
  69. package/src/primitives/Address/from.ts +41 -0
  70. package/src/primitives/Address/fromAbiEncoded.ts +35 -0
  71. package/src/primitives/Address/fromBase64.ts +25 -0
  72. package/src/primitives/Address/fromBytes.ts +25 -0
  73. package/src/primitives/Address/fromHex.ts +31 -0
  74. package/src/primitives/Address/fromNumber.ts +25 -0
  75. package/src/primitives/Address/fromPrivateKey.ts +25 -0
  76. package/src/primitives/Address/fromPublicKey.ts +56 -0
  77. package/src/primitives/Address/index.ts +99 -35
  78. package/src/primitives/Address/is.ts +20 -0
  79. package/src/primitives/Address/isAddress.ts +22 -0
  80. package/src/primitives/Address/sortAddresses.ts +19 -0
  81. package/src/primitives/Address/toChecksummed.ts +32 -0
  82. package/src/primitives/Address/toHex.ts +18 -0
  83. package/src/primitives/Address/zero.ts +18 -0
  84. package/src/primitives/Base64/Base64.test.ts +75 -0
  85. package/src/primitives/Base64/convert.ts +37 -0
  86. package/src/primitives/Base64/decode.ts +59 -0
  87. package/src/primitives/Base64/encode.ts +42 -0
  88. package/src/primitives/Base64/from.ts +39 -0
  89. package/src/primitives/Base64/index.ts +81 -1
  90. package/src/primitives/Base64/size.ts +16 -0
  91. package/src/primitives/Base64/validation.ts +16 -0
  92. package/src/primitives/Blob/Blob.test.ts +292 -0
  93. package/src/primitives/Blob/calculateGas.ts +30 -0
  94. package/src/primitives/Blob/estimateBlobCount.ts +30 -0
  95. package/src/primitives/Blob/from.ts +38 -0
  96. package/src/primitives/Blob/fromData.ts +36 -0
  97. package/src/primitives/Blob/index.ts +99 -12
  98. package/src/primitives/Blob/isValidVersion.ts +27 -0
  99. package/src/primitives/Blob/joinData.ts +43 -0
  100. package/src/primitives/Blob/splitData.ts +36 -0
  101. package/src/primitives/Blob/toCommitment.ts +43 -0
  102. package/src/primitives/Blob/toProof.ts +50 -0
  103. package/src/primitives/Blob/toVersionedHash.ts +35 -0
  104. package/src/primitives/Blob/verify.ts +49 -0
  105. package/src/primitives/Blob/verifyBatch.ts +119 -0
  106. package/src/primitives/BloomFilter/BloomFilter.test.ts +138 -0
  107. package/src/primitives/BloomFilter/add.ts +23 -0
  108. package/src/primitives/BloomFilter/combine.ts +21 -0
  109. package/src/primitives/BloomFilter/contains.ts +26 -0
  110. package/src/primitives/BloomFilter/create.ts +35 -0
  111. package/src/primitives/BloomFilter/density.ts +22 -0
  112. package/src/primitives/BloomFilter/expectedFalsePositiveRate.ts +25 -0
  113. package/src/primitives/BloomFilter/fromHex.ts +37 -0
  114. package/src/primitives/BloomFilter/hash.ts +43 -0
  115. package/src/primitives/BloomFilter/index.ts +59 -37
  116. package/src/primitives/BloomFilter/isEmpty.ts +22 -0
  117. package/src/primitives/BloomFilter/merge.ts +24 -0
  118. package/src/primitives/BloomFilter/toHex.ts +22 -0
  119. package/src/primitives/Bytecode/analyze.ts +58 -0
  120. package/src/primitives/Bytecode/detectFusions.ts +10 -0
  121. package/src/primitives/Bytecode/equals.ts +10 -0
  122. package/src/primitives/Bytecode/extractRuntime.ts +12 -0
  123. package/src/primitives/Bytecode/format.ts +16 -0
  124. package/src/primitives/Bytecode/from.ts +16 -0
  125. package/src/primitives/Bytecode/fromHex.ts +14 -0
  126. package/src/primitives/Bytecode/getBlock.ts +12 -0
  127. package/src/primitives/Bytecode/getNextPc.ts +12 -0
  128. package/src/primitives/Bytecode/getPushSize.ts +8 -0
  129. package/src/primitives/Bytecode/hasMetadata.ts +10 -0
  130. package/src/primitives/Bytecode/hash.ts +9 -0
  131. package/src/primitives/Bytecode/index.ts +103 -13
  132. package/src/primitives/Bytecode/isPush.ts +8 -0
  133. package/src/primitives/Bytecode/isTerminator.ts +8 -0
  134. package/src/primitives/Bytecode/isValidJumpDest.ts +12 -0
  135. package/src/primitives/Bytecode/parseInstructions.ts +10 -0
  136. package/src/primitives/Bytecode/prettyPrint.ts +12 -0
  137. package/src/primitives/Bytecode/scan.ts +20 -0
  138. package/src/primitives/Bytecode/size.ts +9 -0
  139. package/src/primitives/Bytecode/stripMetadata.ts +10 -0
  140. package/src/primitives/Bytecode/toAbi.ts +10 -0
  141. package/src/primitives/Bytecode/toHex.ts +10 -0
  142. package/src/primitives/Bytecode/types.ts +23 -0
  143. package/src/primitives/Bytecode/validate.ts +9 -0
  144. package/src/primitives/ContractSignature/ContractSignature.test.ts +1 -13
  145. package/src/primitives/ContractSignature/verifySignature.ts +88 -62
  146. package/src/primitives/Ens/Ens.test.ts +71 -0
  147. package/src/primitives/Ens/convert.ts +13 -0
  148. package/src/primitives/Ens/from.ts +32 -0
  149. package/src/primitives/Ens/hash.ts +46 -0
  150. package/src/primitives/Ens/index.ts +86 -4
  151. package/src/primitives/Ens/normalize.ts +45 -0
  152. package/src/primitives/Ens/validation.ts +38 -0
  153. package/src/primitives/EventLog/accessors.ts +32 -0
  154. package/src/primitives/EventLog/clone.ts +17 -0
  155. package/src/primitives/EventLog/create.ts +46 -0
  156. package/src/primitives/EventLog/filtering.ts +48 -0
  157. package/src/primitives/EventLog/index.ts +96 -6
  158. package/src/primitives/EventLog/status.ts +17 -0
  159. package/src/primitives/EventLog/toRpc.ts +49 -0
  160. package/src/primitives/Hardfork/HardforkSchema.ts +3 -3
  161. package/src/primitives/Hardfork/allIds.ts +13 -0
  162. package/src/primitives/Hardfork/allNames.ts +13 -0
  163. package/src/primitives/Hardfork/compare.ts +17 -0
  164. package/src/primitives/Hardfork/comparisons.ts +45 -0
  165. package/src/primitives/Hardfork/equals.ts +17 -0
  166. package/src/primitives/Hardfork/features.ts +61 -0
  167. package/src/primitives/Hardfork/fromString.ts +16 -0
  168. package/src/primitives/Hardfork/index.ts +128 -18
  169. package/src/primitives/Hardfork/isValidName.ts +14 -0
  170. package/src/primitives/Hardfork/minMax.ts +23 -0
  171. package/src/primitives/Hardfork/range.ts +19 -0
  172. package/src/primitives/Hardfork/toString.ts +16 -0
  173. package/src/primitives/Hash/Hash.test.ts +104 -0
  174. package/src/primitives/Hash/from.ts +47 -0
  175. package/src/primitives/Hash/fromBytes.ts +46 -0
  176. package/src/primitives/Hash/fromHex.ts +44 -0
  177. package/src/primitives/Hash/index.ts +45 -8
  178. package/src/primitives/Hash/isHash.ts +31 -0
  179. package/src/primitives/Hash/toHex.ts +29 -0
  180. package/src/primitives/Hex/Hex.test.ts +327 -153
  181. package/src/primitives/Hex/assertSize.ts +41 -0
  182. package/src/primitives/Hex/concat.ts +37 -0
  183. package/src/primitives/Hex/from.ts +38 -0
  184. package/src/primitives/Hex/fromBigInt.ts +40 -0
  185. package/src/primitives/Hex/fromBoolean.ts +29 -0
  186. package/src/primitives/Hex/fromNumber.ts +41 -0
  187. package/src/primitives/Hex/fromString.ts +28 -0
  188. package/src/primitives/Hex/index.ts +68 -37
  189. package/src/primitives/Hex/pad.ts +40 -0
  190. package/src/primitives/Hex/padRight.ts +39 -0
  191. package/src/primitives/Hex/size.ts +29 -0
  192. package/src/primitives/Hex/slice.ts +42 -0
  193. package/src/primitives/Hex/toBigInt.ts +27 -0
  194. package/src/primitives/Hex/toBoolean.ts +38 -0
  195. package/src/primitives/Hex/toNumber.ts +37 -0
  196. package/src/primitives/Hex/toStringHex.ts +39 -0
  197. package/src/primitives/Hex/trim.ts +27 -0
  198. package/src/primitives/Hex/validate.ts +37 -0
  199. package/src/primitives/Hex/xor.ts +39 -0
  200. package/src/primitives/Opcode/OpcodeSchema.ts +1 -1
  201. package/src/primitives/Opcode/disassemble.ts +15 -0
  202. package/src/primitives/Opcode/dupPosition.ts +15 -0
  203. package/src/primitives/Opcode/format.ts +15 -0
  204. package/src/primitives/Opcode/getters.ts +54 -0
  205. package/src/primitives/Opcode/index.ts +301 -11
  206. package/src/primitives/Opcode/info.ts +18 -0
  207. package/src/primitives/Opcode/jumpDests.ts +15 -0
  208. package/src/primitives/Opcode/logTopics.ts +15 -0
  209. package/src/primitives/Opcode/name.ts +15 -0
  210. package/src/primitives/Opcode/parse.ts +15 -0
  211. package/src/primitives/Opcode/predicates.ts +72 -0
  212. package/src/primitives/Opcode/pushBytes.ts +15 -0
  213. package/src/primitives/Opcode/pushOpcode.ts +15 -0
  214. package/src/primitives/Opcode/swapPosition.ts +15 -0
  215. package/src/primitives/Rlp/decodeBatch.ts +46 -0
  216. package/src/primitives/Rlp/decodeObject.ts +46 -0
  217. package/src/primitives/Rlp/decodeValue.ts +51 -0
  218. package/src/primitives/Rlp/encodeBatch.ts +50 -0
  219. package/src/primitives/Rlp/encodeObject.ts +48 -0
  220. package/src/primitives/Rlp/encodeVariadic.ts +49 -0
  221. package/src/primitives/Rlp/equals.ts +22 -0
  222. package/src/primitives/Rlp/from.ts +44 -0
  223. package/src/primitives/Rlp/fromJSON.ts +45 -0
  224. package/src/primitives/Rlp/getEncodedLength.ts +47 -0
  225. package/src/primitives/Rlp/getLength.ts +44 -0
  226. package/src/primitives/Rlp/index.ts +67 -14
  227. package/src/primitives/Rlp/isBytesData.ts +21 -0
  228. package/src/primitives/Rlp/isCanonical.ts +32 -0
  229. package/src/primitives/Rlp/isData.ts +21 -0
  230. package/src/primitives/Rlp/isList.ts +46 -0
  231. package/src/primitives/Rlp/isListData.ts +21 -0
  232. package/src/primitives/Rlp/isString.ts +46 -0
  233. package/src/primitives/Rlp/toJSON.ts +20 -0
  234. package/src/primitives/Rlp/toRaw.ts +31 -0
  235. package/src/primitives/Signature/Signature.test.ts +217 -0
  236. package/src/primitives/Signature/from.ts +38 -0
  237. package/src/primitives/Signature/fromBytes.ts +31 -0
  238. package/src/primitives/Signature/fromCompact.ts +33 -0
  239. package/src/primitives/Signature/fromDER.ts +35 -0
  240. package/src/primitives/Signature/fromEd25519.ts +24 -0
  241. package/src/primitives/Signature/fromHex.ts +29 -0
  242. package/src/primitives/Signature/fromP256.ts +25 -0
  243. package/src/primitives/Signature/fromRpc.ts +38 -0
  244. package/src/primitives/Signature/fromSecp256k1.ts +29 -0
  245. package/src/primitives/Signature/fromTuple.ts +33 -0
  246. package/src/primitives/Signature/getR.ts +24 -0
  247. package/src/primitives/Signature/getS.ts +24 -0
  248. package/src/primitives/Signature/getV.ts +24 -0
  249. package/src/primitives/Signature/index.ts +61 -11
  250. package/src/primitives/Signature/toDER.ts +24 -0
  251. package/src/primitives/Signature/toHex.ts +24 -0
  252. package/src/primitives/Signature/toRpc.ts +35 -0
  253. package/src/primitives/Signature/toTuple.ts +29 -0
  254. package/src/primitives/Signature/verify.ts +31 -0
  255. package/src/primitives/Siwe/create.ts +56 -0
  256. package/src/primitives/Siwe/hash.ts +27 -0
  257. package/src/primitives/Siwe/index.ts +57 -21
  258. package/src/primitives/Siwe/parse.ts +24 -0
  259. package/src/primitives/Siwe/verify.ts +47 -0
  260. package/src/primitives/Transaction/Transaction.test.ts +309 -0
  261. package/src/primitives/Transaction/index.ts +467 -2
  262. package/src/primitives/Uint/Uint.test.ts +200 -0
  263. package/src/primitives/Uint/dividedBy.ts +34 -0
  264. package/src/primitives/Uint/from.ts +35 -0
  265. package/src/primitives/Uint/fromAbiEncoded.ts +29 -0
  266. package/src/primitives/Uint/fromBigInt.ts +30 -0
  267. package/src/primitives/Uint/fromBytes.ts +32 -0
  268. package/src/primitives/Uint/fromHex.ts +32 -0
  269. package/src/primitives/Uint/fromNumber.ts +30 -0
  270. package/src/primitives/Uint/index.ts +90 -45
  271. package/src/primitives/Uint/isUint256.ts +25 -0
  272. package/src/primitives/Uint/isValid.ts +25 -0
  273. package/src/primitives/Uint/modulo.ts +34 -0
  274. package/src/primitives/Uint/toHex.ts +31 -0
  275. package/src/primitives/Uint/tryFrom.ts +30 -0
  276. package/src/services/Contract/Contract.test.ts +46 -41
  277. package/src/services/Contract/Contract.ts +25 -29
  278. package/src/services/Contract/ContractTypes.ts +6 -3
  279. package/src/services/Contract/estimateGas.test.ts +21 -9
  280. package/src/services/Contract/estimateGas.ts +21 -23
  281. package/src/services/Debug/Debug.ts +1 -1
  282. package/src/services/Debug/DebugService.ts +1 -1
  283. package/src/services/FeeEstimator/DefaultFeeEstimator.ts +10 -6
  284. package/src/services/FeeEstimator/FeeEstimator.test.ts +68 -62
  285. package/src/services/Multicall/BalanceResolver.ts +1 -1
  286. package/src/services/Multicall/GetBalance.ts +1 -1
  287. package/src/services/Multicall/Multicall.ts +1 -1
  288. package/src/services/NonceManager/DefaultNonceManager.ts +4 -7
  289. package/src/services/NonceManager/NonceManager.test.ts +20 -33
  290. package/src/services/Provider/Provider.test.ts +155 -349
  291. package/src/services/Provider/Provider.ts +14 -1180
  292. package/src/services/Provider/ProviderService.ts +14 -1199
  293. package/src/services/Provider/actions/multicall.test.ts +29 -39
  294. package/src/services/Provider/actions/multicall.ts +2 -2
  295. package/src/services/Provider/actions/readContract.test.ts +45 -50
  296. package/src/services/Provider/actions/readContract.ts +2 -6
  297. package/src/services/Provider/actions/simulateContract.test.ts +55 -232
  298. package/src/services/Provider/actions/simulateContract.ts +2 -3
  299. package/src/services/Provider/ens/getEnsAddress.ts +11 -14
  300. package/src/services/Provider/ens/getEnsName.ts +15 -18
  301. package/src/services/Provider/ens/getEnsResolver.ts +11 -14
  302. package/src/services/Provider/ens/getEnsText.ts +15 -18
  303. package/src/services/Provider/functions/backfillBlocks.ts +97 -0
  304. package/src/services/Provider/functions/call.ts +45 -0
  305. package/src/services/Provider/functions/createAccessList.ts +61 -0
  306. package/src/services/Provider/functions/createBlockFilter.ts +41 -0
  307. package/src/services/Provider/functions/createEventFilter.ts +43 -0
  308. package/src/services/Provider/functions/createPendingTransactionFilter.ts +41 -0
  309. package/src/services/Provider/functions/estimateGas.ts +52 -0
  310. package/src/services/Provider/functions/getAccounts.ts +40 -0
  311. package/src/services/Provider/functions/getBalance.ts +50 -0
  312. package/src/services/Provider/functions/getBlobBaseFee.ts +46 -0
  313. package/src/services/Provider/functions/getBlock.ts +95 -0
  314. package/src/services/Provider/functions/getBlockNumber.ts +51 -0
  315. package/src/services/Provider/functions/getBlockReceipts.ts +78 -0
  316. package/src/services/Provider/functions/getBlockTransactionCount.ts +86 -0
  317. package/src/services/Provider/functions/getChainId.ts +46 -0
  318. package/src/services/Provider/functions/getCode.ts +43 -0
  319. package/src/services/Provider/functions/getCoinbase.ts +40 -0
  320. package/src/services/Provider/functions/getFeeHistory.ts +85 -0
  321. package/src/services/Provider/functions/getFilterChanges.ts +42 -0
  322. package/src/services/Provider/functions/getFilterLogs.ts +44 -0
  323. package/src/services/Provider/functions/getGasPrice.ts +46 -0
  324. package/src/services/Provider/functions/getHashrate.ts +46 -0
  325. package/src/services/Provider/functions/getLogs.ts +45 -0
  326. package/src/services/Provider/functions/getMaxPriorityFeePerGas.ts +46 -0
  327. package/src/services/Provider/functions/getMining.ts +40 -0
  328. package/src/services/Provider/functions/getProof.ts +52 -0
  329. package/src/services/Provider/functions/getProtocolVersion.ts +40 -0
  330. package/src/services/Provider/functions/getStorageAt.ts +52 -0
  331. package/src/services/Provider/functions/getSyncing.ts +56 -0
  332. package/src/services/Provider/functions/getTransaction.ts +57 -0
  333. package/src/services/Provider/functions/getTransactionByBlockHashAndIndex.ts +73 -0
  334. package/src/services/Provider/functions/getTransactionByBlockNumberAndIndex.ts +86 -0
  335. package/src/services/Provider/functions/getTransactionConfirmations.ts +70 -0
  336. package/src/services/Provider/functions/getTransactionCount.ts +50 -0
  337. package/src/services/Provider/functions/getTransactionReceipt.ts +57 -0
  338. package/src/services/Provider/functions/getUncle.ts +97 -0
  339. package/src/services/Provider/functions/getUncleCount.ts +86 -0
  340. package/src/services/Provider/functions/index.ts +73 -0
  341. package/src/services/Provider/functions/netVersion.ts +40 -0
  342. package/src/services/Provider/functions/sendRawTransaction.ts +40 -0
  343. package/src/services/Provider/functions/sendTransaction.ts +48 -0
  344. package/src/services/Provider/functions/sign.ts +50 -0
  345. package/src/services/Provider/functions/signTransaction.ts +52 -0
  346. package/src/services/Provider/functions/simulateV1.ts +95 -0
  347. package/src/services/Provider/functions/simulateV2.ts +51 -0
  348. package/src/services/Provider/functions/subscribe.ts +49 -0
  349. package/src/services/Provider/functions/uninstallFilter.ts +40 -0
  350. package/src/services/Provider/functions/unsubscribe.ts +41 -0
  351. package/src/services/Provider/functions/waitForTransactionReceipt.ts +168 -0
  352. package/src/services/Provider/functions/watchBlocks.ts +98 -0
  353. package/src/services/Provider/index.ts +29 -178
  354. package/src/services/Provider/types.ts +780 -0
  355. package/src/services/Provider/utils.ts +204 -0
  356. package/src/services/RawProvider/ForkProviderTransport.ts +2 -3
  357. package/src/services/RawProvider/HttpProviderTransport.ts +3 -3
  358. package/src/services/RawProvider/InMemoryProviderTransport.ts +3 -3
  359. package/src/services/RawProvider/WebSocketProviderTransport.ts +3 -3
  360. package/src/services/Signer/Signer.test.ts +211 -187
  361. package/src/services/Signer/Signer.ts +26 -16
  362. package/src/services/Signer/actions/deployContract.test.ts +125 -105
  363. package/src/services/Signer/actions/deployContract.ts +3 -2
  364. package/src/services/Signer/actions/prepareAuthorization.test.ts +47 -48
  365. package/src/services/Signer/actions/prepareAuthorization.ts +3 -3
  366. package/src/services/Signer/actions/signAuthorization.test.ts +39 -45
  367. package/src/services/Signer/actions/signAuthorization.ts +3 -3
  368. package/src/services/Signer/actions/writeContract.test.ts +41 -57
  369. package/src/services/Transport/FallbackTransport.ts +3 -3
  370. package/src/services/Transport/HttpTransport.ts +3 -3
  371. package/src/services/Transport/config.ts +7 -7
  372. package/src/services/Transport/index.ts +3 -4
  373. package/src/services/errors.test.ts +3 -8
  374. package/src/services/index.ts +8 -90
  375. package/src/services/presets/index.ts +9 -10
  376. package/src/services/presets/presets.test.ts +14 -29
  377. package/src/standards/ERC165.test.ts +19 -20
  378. package/src/standards/ERC165.ts +9 -11
  379. package/src/type-exports.test.ts +37 -0
  380. package/dist/AccountService-BetXokad.d.ts +0 -1717
  381. package/dist/RpcResolver-BpvqybjD.d.ts +0 -6439
  382. package/src/services/Provider/Account.ts +0 -33
  383. package/src/services/Provider/AccountService.ts +0 -84
  384. package/src/services/Provider/Blocks.ts +0 -32
  385. package/src/services/Provider/BlocksService.ts +0 -73
  386. package/src/services/Provider/Events.ts +0 -33
  387. package/src/services/Provider/EventsService.ts +0 -71
  388. package/src/services/Provider/Network.ts +0 -41
  389. package/src/services/Provider/NetworkService.ts +0 -114
  390. package/src/services/Provider/Simulation.ts +0 -34
  391. package/src/services/Provider/SimulationService.ts +0 -161
  392. package/src/services/Provider/Streaming.ts +0 -30
  393. package/src/services/Provider/StreamingService.ts +0 -58
  394. package/src/services/Provider/Transaction.ts +0 -39
  395. package/src/services/Provider/TransactionService.ts +0 -83
  396. package/src/services/Provider/filters.ts +0 -91
  397. package/src/services/Provider/getBlobBaseFee.ts +0 -170
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @fileoverview Free function to get the protocol version.
3
+ *
4
+ * @module Provider/functions/getProtocolVersion
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import { ProviderService } from "../ProviderService.js";
10
+ import type { TransportError } from "../../Transport/TransportError.js";
11
+
12
+ /**
13
+ * Gets the Ethereum protocol version.
14
+ *
15
+ * @returns Effect yielding the protocol version as string
16
+ *
17
+ * @since 0.4.0
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { Effect } from 'effect'
22
+ * import { getProtocolVersion, Provider, HttpTransport } from 'voltaire-effect'
23
+ *
24
+ * const program = Effect.gen(function* () {
25
+ * const version = yield* getProtocolVersion()
26
+ * console.log('Protocol version:', version)
27
+ * }).pipe(
28
+ * Effect.provide(Provider),
29
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
30
+ * )
31
+ * ```
32
+ */
33
+ export const getProtocolVersion = (): Effect.Effect<
34
+ string,
35
+ TransportError,
36
+ ProviderService
37
+ > =>
38
+ Effect.flatMap(ProviderService, (svc) =>
39
+ svc.request<string>("eth_protocolVersion"),
40
+ );
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @fileoverview Free function to get storage at a slot.
3
+ *
4
+ * @module Provider/functions/getStorageAt
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import { ProviderService } from "../ProviderService.js";
10
+ import type { AddressInput, BlockTag, HashInput } from "../types.js";
11
+ import { toAddressHex, toHashHex } from "../utils.js";
12
+ import type { TransportError } from "../../Transport/TransportError.js";
13
+
14
+ /**
15
+ * Gets storage at a specific slot for an address.
16
+ *
17
+ * @param address - The contract address
18
+ * @param slot - The storage slot to read
19
+ * @param blockTag - Block to query at (default: "latest")
20
+ * @returns Effect yielding the storage value as hex string
21
+ *
22
+ * @since 0.4.0
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { Effect } from 'effect'
27
+ * import { getStorageAt, Provider, HttpTransport } from 'voltaire-effect'
28
+ *
29
+ * const program = Effect.gen(function* () {
30
+ * const value = yield* getStorageAt(
31
+ * '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
32
+ * '0x0000000000000000000000000000000000000000000000000000000000000000'
33
+ * )
34
+ * console.log(`Storage slot 0: ${value}`)
35
+ * }).pipe(
36
+ * Effect.provide(Provider),
37
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
38
+ * )
39
+ * ```
40
+ */
41
+ export const getStorageAt = (
42
+ address: AddressInput,
43
+ slot: HashInput,
44
+ blockTag: BlockTag = "latest",
45
+ ): Effect.Effect<`0x${string}`, TransportError, ProviderService> =>
46
+ Effect.flatMap(ProviderService, (svc) =>
47
+ svc.request<`0x${string}`>("eth_getStorageAt", [
48
+ toAddressHex(address),
49
+ toHashHex(slot),
50
+ blockTag,
51
+ ]),
52
+ );
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @fileoverview Free function to get syncing status.
3
+ *
4
+ * @module Provider/functions/getSyncing
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import { ProviderService } from "../ProviderService.js";
10
+ import type { SyncingStatus } from "../types.js";
11
+ import type { TransportError } from "../../Transport/TransportError.js";
12
+
13
+ /**
14
+ * Gets the syncing status of the node.
15
+ *
16
+ * @returns Effect yielding false if not syncing, or an object with sync progress
17
+ *
18
+ * @since 0.4.0
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { Effect } from 'effect'
23
+ * import { getSyncing, Provider, HttpTransport } from 'voltaire-effect'
24
+ *
25
+ * const program = Effect.gen(function* () {
26
+ * const status = yield* getSyncing()
27
+ * if (status === false) {
28
+ * console.log('Node is fully synced')
29
+ * } else {
30
+ * console.log('Syncing:', status.currentBlock, '/', status.highestBlock)
31
+ * }
32
+ * }).pipe(
33
+ * Effect.provide(Provider),
34
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
35
+ * )
36
+ * ```
37
+ */
38
+ export const getSyncing = (): Effect.Effect<
39
+ SyncingStatus,
40
+ TransportError,
41
+ ProviderService
42
+ > =>
43
+ Effect.flatMap(ProviderService, (svc) =>
44
+ svc.request<false | { startingBlock: string; currentBlock: string; highestBlock: string }>(
45
+ "eth_syncing",
46
+ ).pipe(
47
+ Effect.map((result) => {
48
+ if (result === false) return false;
49
+ return {
50
+ startingBlock: result.startingBlock,
51
+ currentBlock: result.currentBlock,
52
+ highestBlock: result.highestBlock,
53
+ };
54
+ }),
55
+ ),
56
+ );
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @fileoverview Free function to get a transaction by hash.
3
+ *
4
+ * @module Provider/functions/getTransaction
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import type { TransportError } from "../../Transport/TransportError.js";
10
+ import { ProviderService } from "../ProviderService.js";
11
+ import {
12
+ type HashInput,
13
+ ProviderNotFoundError,
14
+ type TransactionType,
15
+ } from "../types.js";
16
+ import { toHashHex } from "../utils.js";
17
+
18
+ /**
19
+ * Gets a transaction by its hash.
20
+ *
21
+ * @param hash - The transaction hash
22
+ * @returns Effect yielding the transaction
23
+ *
24
+ * @since 0.4.0
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * import { Effect } from 'effect'
29
+ * import { getTransaction, Provider, HttpTransport } from 'voltaire-effect'
30
+ *
31
+ * const program = Effect.gen(function* () {
32
+ * const tx = yield* getTransaction('0x...')
33
+ * console.log(`From: ${tx.from}`)
34
+ * }).pipe(
35
+ * Effect.provide(Provider),
36
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
37
+ * )
38
+ * ```
39
+ */
40
+ export const getTransaction = (
41
+ hash: HashInput,
42
+ ): Effect.Effect<TransactionType, TransportError | ProviderNotFoundError, ProviderService> =>
43
+ Effect.flatMap(ProviderService, (svc) =>
44
+ svc
45
+ .request<TransactionType | null>("eth_getTransactionByHash", [toHashHex(hash)])
46
+ .pipe(
47
+ Effect.flatMap((result) =>
48
+ result === null
49
+ ? Effect.fail(
50
+ new ProviderNotFoundError(hash, "Transaction not found", {
51
+ resource: "transaction",
52
+ }),
53
+ )
54
+ : Effect.succeed(result),
55
+ ),
56
+ ),
57
+ );
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview Free function to get a transaction by block hash and index.
3
+ *
4
+ * @module Provider/functions/getTransactionByBlockHashAndIndex
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import type { TransportError } from "../../Transport/TransportError.js";
10
+ import { ProviderService } from "../ProviderService.js";
11
+ import {
12
+ type HashInput,
13
+ ProviderNotFoundError,
14
+ type TransactionIndexInput,
15
+ type TransactionType,
16
+ } from "../types.js";
17
+ import { toHashHex } from "../utils.js";
18
+
19
+ /**
20
+ * Converts transaction index to hex string.
21
+ */
22
+ const toIndexHex = (index: TransactionIndexInput): `0x${string}` => {
23
+ if (typeof index === "string") return index;
24
+ return `0x${BigInt(index).toString(16)}`;
25
+ };
26
+
27
+ /**
28
+ * Gets a transaction by block hash and transaction index.
29
+ *
30
+ * @param blockHash - The block hash
31
+ * @param index - The transaction index in the block
32
+ * @returns Effect yielding the transaction
33
+ *
34
+ * @since 0.4.0
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * import { Effect } from 'effect'
39
+ * import { getTransactionByBlockHashAndIndex, Provider, HttpTransport } from 'voltaire-effect'
40
+ *
41
+ * const program = Effect.gen(function* () {
42
+ * const tx = yield* getTransactionByBlockHashAndIndex('0x...blockHash', 0)
43
+ * console.log(`Transaction hash: ${tx.hash}`)
44
+ * }).pipe(
45
+ * Effect.provide(Provider),
46
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
47
+ * )
48
+ * ```
49
+ */
50
+ export const getTransactionByBlockHashAndIndex = (
51
+ blockHash: HashInput,
52
+ index: TransactionIndexInput,
53
+ ): Effect.Effect<TransactionType, TransportError | ProviderNotFoundError, ProviderService> =>
54
+ Effect.flatMap(ProviderService, (svc) =>
55
+ svc
56
+ .request<TransactionType | null>("eth_getTransactionByBlockHashAndIndex", [
57
+ toHashHex(blockHash),
58
+ toIndexHex(index),
59
+ ])
60
+ .pipe(
61
+ Effect.flatMap((result) =>
62
+ result === null
63
+ ? Effect.fail(
64
+ new ProviderNotFoundError(
65
+ { blockHash, index },
66
+ "Transaction not found",
67
+ { resource: "transaction" },
68
+ ),
69
+ )
70
+ : Effect.succeed(result),
71
+ ),
72
+ ),
73
+ );
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @fileoverview Free function to get a transaction by block number and index.
3
+ *
4
+ * @module Provider/functions/getTransactionByBlockNumberAndIndex
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import type { TransportError } from "../../Transport/TransportError.js";
10
+ import { ProviderService } from "../ProviderService.js";
11
+ import {
12
+ type BlockTag,
13
+ ProviderNotFoundError,
14
+ type TransactionIndexInput,
15
+ type TransactionType,
16
+ } from "../types.js";
17
+
18
+ /**
19
+ * Converts transaction index to hex string.
20
+ */
21
+ const toIndexHex = (index: TransactionIndexInput): `0x${string}` => {
22
+ if (typeof index === "string") return index;
23
+ return `0x${BigInt(index).toString(16)}`;
24
+ };
25
+
26
+ /**
27
+ * Converts block tag or bigint to RPC block identifier.
28
+ */
29
+ const toBlockId = (blockTag: BlockTag | bigint): BlockTag => {
30
+ if (typeof blockTag === "bigint") {
31
+ return `0x${blockTag.toString(16)}` as BlockTag;
32
+ }
33
+ return blockTag;
34
+ };
35
+
36
+ /**
37
+ * Gets a transaction by block number/tag and transaction index.
38
+ *
39
+ * @param blockTag - The block number or tag
40
+ * @param index - The transaction index in the block
41
+ * @returns Effect yielding the transaction
42
+ *
43
+ * @since 0.4.0
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * import { Effect } from 'effect'
48
+ * import { getTransactionByBlockNumberAndIndex, Provider, HttpTransport } from 'voltaire-effect'
49
+ *
50
+ * const program = Effect.gen(function* () {
51
+ * // Get first transaction in block 18000000
52
+ * const tx = yield* getTransactionByBlockNumberAndIndex(18000000n, 0)
53
+ * console.log(`Transaction hash: ${tx.hash}`)
54
+ *
55
+ * // Get from latest block
56
+ * const latestTx = yield* getTransactionByBlockNumberAndIndex('latest', 0)
57
+ * }).pipe(
58
+ * Effect.provide(Provider),
59
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
60
+ * )
61
+ * ```
62
+ */
63
+ export const getTransactionByBlockNumberAndIndex = (
64
+ blockTag: BlockTag | bigint,
65
+ index: TransactionIndexInput,
66
+ ): Effect.Effect<TransactionType, TransportError | ProviderNotFoundError, ProviderService> =>
67
+ Effect.flatMap(ProviderService, (svc) =>
68
+ svc
69
+ .request<TransactionType | null>("eth_getTransactionByBlockNumberAndIndex", [
70
+ toBlockId(blockTag),
71
+ toIndexHex(index),
72
+ ])
73
+ .pipe(
74
+ Effect.flatMap((result) =>
75
+ result === null
76
+ ? Effect.fail(
77
+ new ProviderNotFoundError(
78
+ { blockTag, index },
79
+ "Transaction not found",
80
+ { resource: "transaction" },
81
+ ),
82
+ )
83
+ : Effect.succeed(result),
84
+ ),
85
+ ),
86
+ );
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @fileoverview Free function to get transaction confirmations.
3
+ *
4
+ * @module Provider/functions/getTransactionConfirmations
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import type { TransportError } from "../../Transport/TransportError.js";
10
+ import { ProviderService } from "../ProviderService.js";
11
+ import {
12
+ type HashInput,
13
+ type ProviderResponseError,
14
+ type ReceiptType,
15
+ } from "../types.js";
16
+ import { parseHexToBigInt, toHashHex } from "../utils.js";
17
+
18
+ /**
19
+ * Gets the number of confirmations for a transaction.
20
+ *
21
+ * @param hash - The transaction hash
22
+ * @returns Effect yielding the number of confirmations (0n if not yet mined)
23
+ *
24
+ * @since 0.4.0
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * import { Effect } from 'effect'
29
+ * import { getTransactionConfirmations, Provider, HttpTransport } from 'voltaire-effect'
30
+ *
31
+ * const program = Effect.gen(function* () {
32
+ * const confirmations = yield* getTransactionConfirmations('0x...')
33
+ * if (confirmations >= 12n) {
34
+ * console.log('Transaction is confirmed')
35
+ * }
36
+ * }).pipe(
37
+ * Effect.provide(Provider),
38
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
39
+ * )
40
+ * ```
41
+ */
42
+ export const getTransactionConfirmations = (
43
+ hash: HashInput,
44
+ ): Effect.Effect<bigint, TransportError | ProviderResponseError, ProviderService> =>
45
+ Effect.flatMap(ProviderService, (svc) =>
46
+ Effect.gen(function* () {
47
+ const hashHex = toHashHex(hash);
48
+ const receipt = yield* svc.request<ReceiptType | null>(
49
+ "eth_getTransactionReceipt",
50
+ [hashHex],
51
+ );
52
+ if (!receipt) {
53
+ return 0n;
54
+ }
55
+ const currentBlockHex = yield* svc.request<string>("eth_blockNumber");
56
+ const receiptBlock = yield* parseHexToBigInt({
57
+ method: "eth_getTransactionReceipt",
58
+ params: [hashHex],
59
+ response: receipt.blockNumber,
60
+ });
61
+ const currentBlock = yield* parseHexToBigInt({
62
+ method: "eth_blockNumber",
63
+ response: currentBlockHex,
64
+ });
65
+ if (currentBlock < receiptBlock) {
66
+ return 0n;
67
+ }
68
+ return currentBlock - receiptBlock + 1n;
69
+ }),
70
+ );
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview Free function to get account transaction count (nonce).
3
+ *
4
+ * @module Provider/functions/getTransactionCount
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import { ProviderService } from "../ProviderService.js";
10
+ import type { AddressInput, BlockTag } from "../types.js";
11
+ import { toAddressHex, parseHexToBigInt } from "../utils.js";
12
+ import type { TransportError } from "../../Transport/TransportError.js";
13
+ import type { ProviderResponseError } from "../types.js";
14
+
15
+ /**
16
+ * Gets the transaction count (nonce) for an address.
17
+ *
18
+ * @param address - The address to check nonce for
19
+ * @param blockTag - Block to query at (default: "latest")
20
+ * @returns Effect yielding the nonce as bigint
21
+ *
22
+ * @since 0.4.0
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { Effect } from 'effect'
27
+ * import { getTransactionCount, Provider, HttpTransport } from 'voltaire-effect'
28
+ *
29
+ * const program = Effect.gen(function* () {
30
+ * const nonce = yield* getTransactionCount('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045')
31
+ * console.log(`Nonce: ${nonce}`)
32
+ * }).pipe(
33
+ * Effect.provide(Provider),
34
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
35
+ * )
36
+ * ```
37
+ */
38
+ export const getTransactionCount = (
39
+ address: AddressInput,
40
+ blockTag: BlockTag = "latest",
41
+ ): Effect.Effect<bigint, TransportError | ProviderResponseError, ProviderService> =>
42
+ Effect.flatMap(ProviderService, (svc) =>
43
+ svc
44
+ .request<string>("eth_getTransactionCount", [toAddressHex(address), blockTag])
45
+ .pipe(
46
+ Effect.flatMap((response) =>
47
+ parseHexToBigInt({ method: "eth_getTransactionCount", response, params: [address, blockTag] }),
48
+ ),
49
+ ),
50
+ );
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @fileoverview Free function to get a transaction receipt by hash.
3
+ *
4
+ * @module Provider/functions/getTransactionReceipt
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import type { TransportError } from "../../Transport/TransportError.js";
10
+ import { ProviderService } from "../ProviderService.js";
11
+ import {
12
+ type HashInput,
13
+ ProviderNotFoundError,
14
+ type ReceiptType,
15
+ } from "../types.js";
16
+ import { toHashHex } from "../utils.js";
17
+
18
+ /**
19
+ * Gets a transaction receipt by its hash.
20
+ *
21
+ * @param hash - The transaction hash
22
+ * @returns Effect yielding the receipt
23
+ *
24
+ * @since 0.4.0
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * import { Effect } from 'effect'
29
+ * import { getTransactionReceipt, Provider, HttpTransport } from 'voltaire-effect'
30
+ *
31
+ * const program = Effect.gen(function* () {
32
+ * const receipt = yield* getTransactionReceipt('0x...')
33
+ * console.log(`Status: ${receipt.status}`)
34
+ * }).pipe(
35
+ * Effect.provide(Provider),
36
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
37
+ * )
38
+ * ```
39
+ */
40
+ export const getTransactionReceipt = (
41
+ hash: HashInput,
42
+ ): Effect.Effect<ReceiptType, TransportError | ProviderNotFoundError, ProviderService> =>
43
+ Effect.flatMap(ProviderService, (svc) =>
44
+ svc
45
+ .request<ReceiptType | null>("eth_getTransactionReceipt", [toHashHex(hash)])
46
+ .pipe(
47
+ Effect.flatMap((result) =>
48
+ result === null
49
+ ? Effect.fail(
50
+ new ProviderNotFoundError(hash, "Transaction receipt not found", {
51
+ resource: "receipt",
52
+ }),
53
+ )
54
+ : Effect.succeed(result),
55
+ ),
56
+ ),
57
+ );
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @fileoverview Free function to get an uncle block by index.
3
+ *
4
+ * @module Provider/functions/getUncle
5
+ * @since 0.4.0
6
+ */
7
+
8
+ import * as Effect from "effect/Effect";
9
+ import { ProviderService } from "../ProviderService.js";
10
+ import {
11
+ type BlockTag,
12
+ type GetUncleArgs,
13
+ type UncleBlockType,
14
+ ProviderNotFoundError,
15
+ } from "../types.js";
16
+ import type { TransportError } from "../../Transport/TransportError.js";
17
+
18
+ /**
19
+ * Gets an uncle block by block identifier and uncle index.
20
+ *
21
+ * @param args - Block identifier (blockTag or blockHash)
22
+ * @param uncleIndex - The index of the uncle in the block
23
+ * @returns Effect yielding the uncle block
24
+ *
25
+ * @since 0.4.0
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { Effect } from 'effect'
30
+ * import { getUncle, Provider, HttpTransport } from 'voltaire-effect'
31
+ *
32
+ * const program = Effect.gen(function* () {
33
+ * // Get first uncle of a block by number
34
+ * const uncle = yield* getUncle({ blockTag: '0x1234' }, 0)
35
+ *
36
+ * // Get by block hash
37
+ * const uncleByHash = yield* getUncle({
38
+ * blockHash: '0x...'
39
+ * }, 0)
40
+ * }).pipe(
41
+ * Effect.provide(Provider),
42
+ * Effect.provide(HttpTransport('https://mainnet.infura.io/v3/YOUR_KEY'))
43
+ * )
44
+ * ```
45
+ */
46
+ export const getUncle = (
47
+ args: GetUncleArgs = {},
48
+ uncleIndex: number | bigint,
49
+ ): Effect.Effect<UncleBlockType, TransportError | ProviderNotFoundError, ProviderService> =>
50
+ Effect.flatMap(ProviderService, (svc) => {
51
+ const indexHex = `0x${BigInt(uncleIndex).toString(16)}`;
52
+
53
+ if ("blockHash" in args && args.blockHash !== undefined) {
54
+ const hash =
55
+ typeof args.blockHash === "string"
56
+ ? args.blockHash
57
+ : `0x${Buffer.from(args.blockHash).toString("hex")}`;
58
+ return svc
59
+ .request<UncleBlockType | null>("eth_getUncleByBlockHashAndIndex", [
60
+ hash,
61
+ indexHex,
62
+ ])
63
+ .pipe(
64
+ Effect.flatMap((result) =>
65
+ result === null
66
+ ? Effect.fail(
67
+ new ProviderNotFoundError(
68
+ { ...args, uncleIndex },
69
+ "Uncle not found",
70
+ { resource: "uncle" },
71
+ ),
72
+ )
73
+ : Effect.succeed(result),
74
+ ),
75
+ );
76
+ }
77
+
78
+ const blockTag: BlockTag = args.blockTag ?? "latest";
79
+ return svc
80
+ .request<UncleBlockType | null>("eth_getUncleByBlockNumberAndIndex", [
81
+ blockTag,
82
+ indexHex,
83
+ ])
84
+ .pipe(
85
+ Effect.flatMap((result) =>
86
+ result === null
87
+ ? Effect.fail(
88
+ new ProviderNotFoundError(
89
+ { ...args, uncleIndex },
90
+ "Uncle not found",
91
+ { resource: "uncle" },
92
+ ),
93
+ )
94
+ : Effect.succeed(result),
95
+ ),
96
+ );
97
+ });