crypto-aio 0.0.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (700) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/README.md +163 -13
  3. package/dist/adapters/avalanche/address.d.ts +15 -0
  4. package/dist/adapters/avalanche/address.js +74 -0
  5. package/dist/adapters/avalanche/address.js.map +1 -0
  6. package/dist/adapters/avalanche/api.d.ts +100 -0
  7. package/dist/adapters/avalanche/api.js +381 -0
  8. package/dist/adapters/avalanche/api.js.map +1 -0
  9. package/dist/adapters/avalanche/builder.d.ts +13 -0
  10. package/dist/adapters/avalanche/builder.js +336 -0
  11. package/dist/adapters/avalanche/builder.js.map +1 -0
  12. package/dist/adapters/avalanche/cb58.d.ts +7 -0
  13. package/dist/adapters/avalanche/cb58.js +49 -0
  14. package/dist/adapters/avalanche/cb58.js.map +1 -0
  15. package/dist/adapters/avalanche/chains.d.ts +21 -0
  16. package/dist/adapters/avalanche/chains.js +79 -0
  17. package/dist/adapters/avalanche/chains.js.map +1 -0
  18. package/dist/adapters/avalanche/codec.d.ts +94 -0
  19. package/dist/adapters/avalanche/codec.js +371 -0
  20. package/dist/adapters/avalanche/codec.js.map +1 -0
  21. package/dist/adapters/avalanche/context.d.ts +59 -0
  22. package/dist/adapters/avalanche/context.js +114 -0
  23. package/dist/adapters/avalanche/context.js.map +1 -0
  24. package/dist/adapters/avalanche/decode.d.ts +16 -0
  25. package/dist/adapters/avalanche/decode.js +101 -0
  26. package/dist/adapters/avalanche/decode.js.map +1 -0
  27. package/dist/adapters/avalanche/driver.d.ts +22 -0
  28. package/dist/adapters/avalanche/driver.js +81 -0
  29. package/dist/adapters/avalanche/driver.js.map +1 -0
  30. package/dist/adapters/avalanche/errors.d.ts +18 -0
  31. package/dist/adapters/avalanche/errors.js +61 -0
  32. package/dist/adapters/avalanche/errors.js.map +1 -0
  33. package/dist/adapters/avalanche/fees.d.ts +23 -0
  34. package/dist/adapters/avalanche/fees.js +105 -0
  35. package/dist/adapters/avalanche/fees.js.map +1 -0
  36. package/dist/adapters/avalanche/index.d.ts +19 -0
  37. package/dist/adapters/avalanche/index.js +8 -0
  38. package/dist/adapters/avalanche/index.js.map +1 -0
  39. package/dist/adapters/avalanche/network.d.ts +37 -0
  40. package/dist/adapters/avalanche/network.js +135 -0
  41. package/dist/adapters/avalanche/network.js.map +1 -0
  42. package/dist/adapters/avalanche/plugin.d.ts +21 -0
  43. package/dist/adapters/avalanche/plugin.js +46 -0
  44. package/dist/adapters/avalanche/plugin.js.map +1 -0
  45. package/dist/adapters/avalanche/presets.d.ts +6 -0
  46. package/dist/adapters/avalanche/presets.js +86 -0
  47. package/dist/adapters/avalanche/presets.js.map +1 -0
  48. package/dist/adapters/avalanche/proofs.d.ts +41 -0
  49. package/dist/adapters/avalanche/proofs.js +270 -0
  50. package/dist/adapters/avalanche/proofs.js.map +1 -0
  51. package/dist/adapters/avalanche/reader.d.ts +40 -0
  52. package/dist/adapters/avalanche/reader.js +231 -0
  53. package/dist/adapters/avalanche/reader.js.map +1 -0
  54. package/dist/adapters/avalanche/sdk.d.ts +182 -0
  55. package/dist/adapters/avalanche/sdk.js +21 -0
  56. package/dist/adapters/avalanche/sdk.js.map +1 -0
  57. package/dist/adapters/avalanche/types.d.ts +86 -0
  58. package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
  59. package/dist/adapters/avalanche/types.js.map +1 -0
  60. package/dist/adapters/evm/builder.d.ts +11 -0
  61. package/dist/adapters/evm/builder.js +386 -0
  62. package/dist/adapters/evm/builder.js.map +1 -0
  63. package/dist/adapters/evm/chains.d.ts +6 -0
  64. package/dist/adapters/evm/chains.js +203 -0
  65. package/dist/adapters/evm/chains.js.map +1 -0
  66. package/dist/adapters/evm/client.d.ts +84 -0
  67. package/dist/adapters/evm/client.js +335 -0
  68. package/dist/adapters/evm/client.js.map +1 -0
  69. package/dist/adapters/evm/decode.d.ts +35 -0
  70. package/dist/adapters/evm/decode.js +175 -0
  71. package/dist/adapters/evm/decode.js.map +1 -0
  72. package/dist/adapters/evm/driver.d.ts +8 -0
  73. package/dist/adapters/evm/driver.js +61 -0
  74. package/dist/adapters/evm/driver.js.map +1 -0
  75. package/dist/adapters/evm/errors.d.ts +20 -0
  76. package/dist/adapters/evm/errors.js +110 -0
  77. package/dist/adapters/evm/errors.js.map +1 -0
  78. package/dist/adapters/evm/ethers-client.d.ts +43 -0
  79. package/dist/adapters/evm/ethers-client.js +139 -0
  80. package/dist/adapters/evm/ethers-client.js.map +1 -0
  81. package/dist/adapters/evm/fees.d.ts +103 -0
  82. package/dist/adapters/evm/fees.js +277 -0
  83. package/dist/adapters/evm/fees.js.map +1 -0
  84. package/dist/adapters/evm/index.d.ts +20 -0
  85. package/dist/adapters/evm/index.js +12 -0
  86. package/dist/adapters/evm/index.js.map +1 -0
  87. package/dist/adapters/evm/network.d.ts +65 -0
  88. package/dist/adapters/evm/network.js +150 -0
  89. package/dist/adapters/evm/network.js.map +1 -0
  90. package/dist/adapters/evm/plugin.d.ts +35 -0
  91. package/dist/adapters/evm/plugin.js +150 -0
  92. package/dist/adapters/evm/plugin.js.map +1 -0
  93. package/dist/adapters/evm/presets.d.ts +2 -0
  94. package/dist/adapters/evm/presets.js +105 -0
  95. package/dist/adapters/evm/presets.js.map +1 -0
  96. package/dist/adapters/evm/proofs.d.ts +19 -0
  97. package/dist/adapters/evm/proofs.js +370 -0
  98. package/dist/adapters/evm/proofs.js.map +1 -0
  99. package/dist/adapters/evm/rawtx.d.ts +25 -0
  100. package/dist/adapters/evm/rawtx.js +176 -0
  101. package/dist/adapters/evm/rawtx.js.map +1 -0
  102. package/dist/adapters/evm/reader.d.ts +83 -0
  103. package/dist/adapters/evm/reader.js +326 -0
  104. package/dist/adapters/evm/reader.js.map +1 -0
  105. package/dist/adapters/evm/rpc.d.ts +39 -0
  106. package/dist/adapters/evm/rpc.js +152 -0
  107. package/dist/adapters/evm/rpc.js.map +1 -0
  108. package/dist/adapters/evm/tokens.d.ts +10 -0
  109. package/dist/adapters/evm/tokens.js +23 -0
  110. package/dist/adapters/evm/tokens.js.map +1 -0
  111. package/dist/adapters/evm/types.d.ts +265 -0
  112. package/dist/{type/account.js → adapters/evm/types.js} +1 -1
  113. package/dist/adapters/evm/types.js.map +1 -0
  114. package/dist/adapters/evm/web3-client.d.ts +26 -0
  115. package/dist/adapters/evm/web3-client.js +176 -0
  116. package/dist/adapters/evm/web3-client.js.map +1 -0
  117. package/dist/adapters/solana/builder.d.ts +18 -0
  118. package/dist/adapters/solana/builder.js +556 -0
  119. package/dist/adapters/solana/builder.js.map +1 -0
  120. package/dist/adapters/solana/chains.d.ts +13 -0
  121. package/dist/adapters/solana/chains.js +37 -0
  122. package/dist/adapters/solana/chains.js.map +1 -0
  123. package/dist/adapters/solana/decode.d.ts +111 -0
  124. package/dist/adapters/solana/decode.js +595 -0
  125. package/dist/adapters/solana/decode.js.map +1 -0
  126. package/dist/adapters/solana/driver.d.ts +15 -0
  127. package/dist/adapters/solana/driver.js +72 -0
  128. package/dist/adapters/solana/driver.js.map +1 -0
  129. package/dist/adapters/solana/errors.d.ts +36 -0
  130. package/dist/adapters/solana/errors.js +154 -0
  131. package/dist/adapters/solana/errors.js.map +1 -0
  132. package/dist/adapters/solana/fees.d.ts +77 -0
  133. package/dist/adapters/solana/fees.js +214 -0
  134. package/dist/adapters/solana/fees.js.map +1 -0
  135. package/dist/adapters/solana/heights.d.ts +47 -0
  136. package/dist/adapters/solana/heights.js +185 -0
  137. package/dist/adapters/solana/heights.js.map +1 -0
  138. package/dist/adapters/solana/history.d.ts +10 -0
  139. package/dist/adapters/solana/history.js +71 -0
  140. package/dist/adapters/solana/history.js.map +1 -0
  141. package/dist/adapters/solana/index.d.ts +16 -0
  142. package/dist/adapters/solana/index.js +9 -0
  143. package/dist/adapters/solana/index.js.map +1 -0
  144. package/dist/adapters/solana/keys.d.ts +13 -0
  145. package/dist/adapters/solana/keys.js +69 -0
  146. package/dist/adapters/solana/keys.js.map +1 -0
  147. package/dist/adapters/solana/message.d.ts +15 -0
  148. package/dist/adapters/solana/message.js +120 -0
  149. package/dist/adapters/solana/message.js.map +1 -0
  150. package/dist/adapters/solana/network.d.ts +24 -0
  151. package/dist/adapters/solana/network.js +95 -0
  152. package/dist/adapters/solana/network.js.map +1 -0
  153. package/dist/adapters/solana/plugin.d.ts +18 -0
  154. package/dist/adapters/solana/plugin.js +44 -0
  155. package/dist/adapters/solana/plugin.js.map +1 -0
  156. package/dist/adapters/solana/presets.d.ts +2 -0
  157. package/dist/adapters/solana/presets.js +77 -0
  158. package/dist/adapters/solana/presets.js.map +1 -0
  159. package/dist/adapters/solana/programs.d.ts +44 -0
  160. package/dist/adapters/solana/programs.js +159 -0
  161. package/dist/adapters/solana/programs.js.map +1 -0
  162. package/dist/adapters/solana/proofs.d.ts +56 -0
  163. package/dist/adapters/solana/proofs.js +540 -0
  164. package/dist/adapters/solana/proofs.js.map +1 -0
  165. package/dist/adapters/solana/reader.d.ts +82 -0
  166. package/dist/adapters/solana/reader.js +326 -0
  167. package/dist/adapters/solana/reader.js.map +1 -0
  168. package/dist/adapters/solana/rpc.d.ts +102 -0
  169. package/dist/adapters/solana/rpc.js +301 -0
  170. package/dist/adapters/solana/rpc.js.map +1 -0
  171. package/dist/adapters/solana/tokens.d.ts +7 -0
  172. package/dist/adapters/solana/tokens.js +19 -0
  173. package/dist/adapters/solana/tokens.js.map +1 -0
  174. package/dist/adapters/solana/types.d.ts +124 -0
  175. package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
  176. package/dist/adapters/solana/types.js.map +1 -0
  177. package/dist/adapters/solana/web3.d.ts +5 -0
  178. package/dist/adapters/solana/web3.js +61 -0
  179. package/dist/adapters/solana/web3.js.map +1 -0
  180. package/dist/adapters/solana/wire.d.ts +62 -0
  181. package/dist/adapters/solana/wire.js +168 -0
  182. package/dist/adapters/solana/wire.js.map +1 -0
  183. package/dist/adapters/ton/address.d.ts +43 -0
  184. package/dist/adapters/ton/address.js +168 -0
  185. package/dist/adapters/ton/address.js.map +1 -0
  186. package/dist/adapters/ton/api.d.ts +344 -0
  187. package/dist/adapters/ton/api.js +942 -0
  188. package/dist/adapters/ton/api.js.map +1 -0
  189. package/dist/adapters/ton/builder.d.ts +18 -0
  190. package/dist/adapters/ton/builder.js +701 -0
  191. package/dist/adapters/ton/builder.js.map +1 -0
  192. package/dist/adapters/ton/chains.d.ts +16 -0
  193. package/dist/adapters/ton/chains.js +39 -0
  194. package/dist/adapters/ton/chains.js.map +1 -0
  195. package/dist/adapters/ton/decode.d.ts +43 -0
  196. package/dist/adapters/ton/decode.js +219 -0
  197. package/dist/adapters/ton/decode.js.map +1 -0
  198. package/dist/adapters/ton/driver.d.ts +10 -0
  199. package/dist/adapters/ton/driver.js +117 -0
  200. package/dist/adapters/ton/driver.js.map +1 -0
  201. package/dist/adapters/ton/errors.d.ts +36 -0
  202. package/dist/adapters/ton/errors.js +89 -0
  203. package/dist/adapters/ton/errors.js.map +1 -0
  204. package/dist/adapters/ton/fees.d.ts +28 -0
  205. package/dist/adapters/ton/fees.js +121 -0
  206. package/dist/adapters/ton/fees.js.map +1 -0
  207. package/dist/adapters/ton/index.d.ts +16 -0
  208. package/dist/adapters/ton/index.js +9 -0
  209. package/dist/adapters/ton/index.js.map +1 -0
  210. package/dist/adapters/ton/messages.d.ts +157 -0
  211. package/dist/adapters/ton/messages.js +397 -0
  212. package/dist/adapters/ton/messages.js.map +1 -0
  213. package/dist/adapters/ton/native-client.d.ts +10 -0
  214. package/dist/adapters/ton/native-client.js +47 -0
  215. package/dist/adapters/ton/native-client.js.map +1 -0
  216. package/dist/adapters/ton/network.d.ts +58 -0
  217. package/dist/adapters/ton/network.js +207 -0
  218. package/dist/adapters/ton/network.js.map +1 -0
  219. package/dist/adapters/ton/plugin.d.ts +24 -0
  220. package/dist/adapters/ton/plugin.js +57 -0
  221. package/dist/adapters/ton/plugin.js.map +1 -0
  222. package/dist/adapters/ton/presets.d.ts +6 -0
  223. package/dist/adapters/ton/presets.js +94 -0
  224. package/dist/adapters/ton/presets.js.map +1 -0
  225. package/dist/adapters/ton/proofs.d.ts +66 -0
  226. package/dist/adapters/ton/proofs.js +755 -0
  227. package/dist/adapters/ton/proofs.js.map +1 -0
  228. package/dist/adapters/ton/reader.d.ts +235 -0
  229. package/dist/adapters/ton/reader.js +976 -0
  230. package/dist/adapters/ton/reader.js.map +1 -0
  231. package/dist/adapters/ton/tokens.d.ts +10 -0
  232. package/dist/adapters/ton/tokens.js +27 -0
  233. package/dist/adapters/ton/tokens.js.map +1 -0
  234. package/dist/adapters/ton/trace.d.ts +74 -0
  235. package/dist/adapters/ton/trace.js +303 -0
  236. package/dist/adapters/ton/trace.js.map +1 -0
  237. package/dist/adapters/ton/types.d.ts +105 -0
  238. package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
  239. package/dist/adapters/ton/types.js.map +1 -0
  240. package/dist/adapters/ton/wallets.d.ts +86 -0
  241. package/dist/adapters/ton/wallets.js +373 -0
  242. package/dist/adapters/ton/wallets.js.map +1 -0
  243. package/dist/adapters/tron/abi.d.ts +41 -0
  244. package/dist/adapters/tron/abi.js +112 -0
  245. package/dist/adapters/tron/abi.js.map +1 -0
  246. package/dist/adapters/tron/address.d.ts +20 -0
  247. package/dist/adapters/tron/address.js +110 -0
  248. package/dist/adapters/tron/address.js.map +1 -0
  249. package/dist/adapters/tron/builder.d.ts +12 -0
  250. package/dist/adapters/tron/builder.js +569 -0
  251. package/dist/adapters/tron/builder.js.map +1 -0
  252. package/dist/adapters/tron/chains.d.ts +12 -0
  253. package/dist/adapters/tron/chains.js +35 -0
  254. package/dist/adapters/tron/chains.js.map +1 -0
  255. package/dist/adapters/tron/codec.d.ts +10 -0
  256. package/dist/adapters/tron/codec.js +322 -0
  257. package/dist/adapters/tron/codec.js.map +1 -0
  258. package/dist/adapters/tron/decode.d.ts +52 -0
  259. package/dist/adapters/tron/decode.js +280 -0
  260. package/dist/adapters/tron/decode.js.map +1 -0
  261. package/dist/adapters/tron/driver.d.ts +12 -0
  262. package/dist/adapters/tron/driver.js +106 -0
  263. package/dist/adapters/tron/driver.js.map +1 -0
  264. package/dist/adapters/tron/errors.d.ts +74 -0
  265. package/dist/adapters/tron/errors.js +261 -0
  266. package/dist/adapters/tron/errors.js.map +1 -0
  267. package/dist/adapters/tron/fees.d.ts +49 -0
  268. package/dist/adapters/tron/fees.js +166 -0
  269. package/dist/adapters/tron/fees.js.map +1 -0
  270. package/dist/adapters/tron/http.d.ts +173 -0
  271. package/dist/adapters/tron/http.js +729 -0
  272. package/dist/adapters/tron/http.js.map +1 -0
  273. package/dist/adapters/tron/index.d.ts +16 -0
  274. package/dist/adapters/tron/index.js +15 -0
  275. package/dist/adapters/tron/index.js.map +1 -0
  276. package/dist/adapters/tron/network.d.ts +44 -0
  277. package/dist/adapters/tron/network.js +163 -0
  278. package/dist/adapters/tron/network.js.map +1 -0
  279. package/dist/adapters/tron/plugin.d.ts +17 -0
  280. package/dist/adapters/tron/plugin.js +39 -0
  281. package/dist/adapters/tron/plugin.js.map +1 -0
  282. package/dist/adapters/tron/presets.d.ts +5 -0
  283. package/dist/adapters/tron/presets.js +68 -0
  284. package/dist/adapters/tron/presets.js.map +1 -0
  285. package/dist/adapters/tron/proofs.d.ts +80 -0
  286. package/dist/adapters/tron/proofs.js +371 -0
  287. package/dist/adapters/tron/proofs.js.map +1 -0
  288. package/dist/adapters/tron/protobuf.d.ts +36 -0
  289. package/dist/adapters/tron/protobuf.js +90 -0
  290. package/dist/adapters/tron/protobuf.js.map +1 -0
  291. package/dist/adapters/tron/reader.d.ts +57 -0
  292. package/dist/adapters/tron/reader.js +220 -0
  293. package/dist/adapters/tron/reader.js.map +1 -0
  294. package/dist/adapters/tron/tokens.d.ts +9 -0
  295. package/dist/adapters/tron/tokens.js +14 -0
  296. package/dist/adapters/tron/tokens.js.map +1 -0
  297. package/dist/adapters/tron/types.d.ts +166 -0
  298. package/dist/adapters/tron/types.js +3 -0
  299. package/dist/adapters/tron/types.js.map +1 -0
  300. package/dist/adapters/utxo/address.d.ts +51 -0
  301. package/dist/adapters/utxo/address.js +341 -0
  302. package/dist/adapters/utxo/address.js.map +1 -0
  303. package/dist/adapters/utxo/builder.d.ts +35 -0
  304. package/dist/adapters/utxo/builder.js +380 -0
  305. package/dist/adapters/utxo/builder.js.map +1 -0
  306. package/dist/adapters/utxo/chains.d.ts +17 -0
  307. package/dist/adapters/utxo/chains.js +100 -0
  308. package/dist/adapters/utxo/chains.js.map +1 -0
  309. package/dist/adapters/utxo/codec.d.ts +120 -0
  310. package/dist/adapters/utxo/codec.js +408 -0
  311. package/dist/adapters/utxo/codec.js.map +1 -0
  312. package/dist/adapters/utxo/coinselect.d.ts +48 -0
  313. package/dist/adapters/utxo/coinselect.js +131 -0
  314. package/dist/adapters/utxo/coinselect.js.map +1 -0
  315. package/dist/adapters/utxo/context.d.ts +63 -0
  316. package/dist/adapters/utxo/context.js +125 -0
  317. package/dist/adapters/utxo/context.js.map +1 -0
  318. package/dist/adapters/utxo/decode.d.ts +22 -0
  319. package/dist/adapters/utxo/decode.js +121 -0
  320. package/dist/adapters/utxo/decode.js.map +1 -0
  321. package/dist/adapters/utxo/driver.d.ts +16 -0
  322. package/dist/adapters/utxo/driver.js +79 -0
  323. package/dist/adapters/utxo/driver.js.map +1 -0
  324. package/dist/adapters/utxo/ecc.d.ts +9 -0
  325. package/dist/adapters/utxo/ecc.js +26 -0
  326. package/dist/adapters/utxo/ecc.js.map +1 -0
  327. package/dist/adapters/utxo/errors.d.ts +52 -0
  328. package/dist/adapters/utxo/errors.js +191 -0
  329. package/dist/adapters/utxo/errors.js.map +1 -0
  330. package/dist/adapters/utxo/esplora.d.ts +100 -0
  331. package/dist/adapters/utxo/esplora.js +498 -0
  332. package/dist/adapters/utxo/esplora.js.map +1 -0
  333. package/dist/adapters/utxo/fees.d.ts +41 -0
  334. package/dist/adapters/utxo/fees.js +125 -0
  335. package/dist/adapters/utxo/fees.js.map +1 -0
  336. package/dist/adapters/utxo/index.d.ts +17 -0
  337. package/dist/adapters/utxo/index.js +8 -0
  338. package/dist/adapters/utxo/index.js.map +1 -0
  339. package/dist/adapters/utxo/network.d.ts +50 -0
  340. package/dist/adapters/utxo/network.js +165 -0
  341. package/dist/adapters/utxo/network.js.map +1 -0
  342. package/dist/adapters/utxo/plugin.d.ts +17 -0
  343. package/dist/adapters/utxo/plugin.js +41 -0
  344. package/dist/adapters/utxo/plugin.js.map +1 -0
  345. package/dist/adapters/utxo/presets.d.ts +12 -0
  346. package/dist/adapters/utxo/presets.js +47 -0
  347. package/dist/adapters/utxo/presets.js.map +1 -0
  348. package/dist/adapters/utxo/preview.d.ts +3 -0
  349. package/dist/adapters/utxo/preview.js +65 -0
  350. package/dist/adapters/utxo/preview.js.map +1 -0
  351. package/dist/adapters/utxo/proofs.d.ts +66 -0
  352. package/dist/adapters/utxo/proofs.js +469 -0
  353. package/dist/adapters/utxo/proofs.js.map +1 -0
  354. package/dist/adapters/utxo/rawblock.d.ts +46 -0
  355. package/dist/adapters/utxo/rawblock.js +159 -0
  356. package/dist/adapters/utxo/rawblock.js.map +1 -0
  357. package/dist/adapters/utxo/rawtx.d.ts +73 -0
  358. package/dist/adapters/utxo/rawtx.js +264 -0
  359. package/dist/adapters/utxo/rawtx.js.map +1 -0
  360. package/dist/adapters/utxo/reader.d.ts +36 -0
  361. package/dist/adapters/utxo/reader.js +265 -0
  362. package/dist/adapters/utxo/reader.js.map +1 -0
  363. package/dist/adapters/utxo/sdk.d.ts +18 -0
  364. package/dist/adapters/utxo/sdk.js +17 -0
  365. package/dist/adapters/utxo/sdk.js.map +1 -0
  366. package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
  367. package/dist/adapters/utxo/signed-psbt.js +428 -0
  368. package/dist/adapters/utxo/signed-psbt.js.map +1 -0
  369. package/dist/adapters/utxo/spend.d.ts +59 -0
  370. package/dist/adapters/utxo/spend.js +230 -0
  371. package/dist/adapters/utxo/spend.js.map +1 -0
  372. package/dist/adapters/utxo/types.d.ts +167 -0
  373. package/dist/adapters/utxo/types.js +3 -0
  374. package/dist/adapters/utxo/types.js.map +1 -0
  375. package/dist/core/assets/service.d.ts +18 -0
  376. package/dist/core/assets/service.js +69 -0
  377. package/dist/core/assets/service.js.map +1 -0
  378. package/dist/core/blockchain/default-ref.d.ts +4 -0
  379. package/dist/core/blockchain/default-ref.js +16 -0
  380. package/dist/core/blockchain/default-ref.js.map +1 -0
  381. package/dist/core/blockchain/handle.d.ts +179 -0
  382. package/dist/core/blockchain/handle.js +579 -0
  383. package/dist/core/blockchain/handle.js.map +1 -0
  384. package/dist/core/blockchain/internal.d.ts +19 -0
  385. package/dist/core/blockchain/internal.js +16 -0
  386. package/dist/core/blockchain/internal.js.map +1 -0
  387. package/dist/core/blockchain/mapping.d.ts +22 -0
  388. package/dist/core/blockchain/mapping.js +136 -0
  389. package/dist/core/blockchain/mapping.js.map +1 -0
  390. package/dist/core/config/env.d.ts +8 -0
  391. package/dist/core/config/env.js +60 -0
  392. package/dist/core/config/env.js.map +1 -0
  393. package/dist/core/config/merge.d.ts +26 -0
  394. package/dist/core/config/merge.js +144 -0
  395. package/dist/core/config/merge.js.map +1 -0
  396. package/dist/core/config/resolve.d.ts +12 -0
  397. package/dist/core/config/resolve.js +251 -0
  398. package/dist/core/config/resolve.js.map +1 -0
  399. package/dist/core/config/types.d.ts +180 -0
  400. package/dist/core/config/types.js +3 -0
  401. package/dist/core/config/types.js.map +1 -0
  402. package/dist/core/container/builtins.d.ts +4 -0
  403. package/dist/core/container/builtins.js +13 -0
  404. package/dist/core/container/builtins.js.map +1 -0
  405. package/dist/core/container/container.d.ts +62 -0
  406. package/dist/core/container/container.js +500 -0
  407. package/dist/core/container/container.js.map +1 -0
  408. package/dist/core/container/default.d.ts +15 -0
  409. package/dist/core/container/default.js +70 -0
  410. package/dist/core/container/default.js.map +1 -0
  411. package/dist/core/container/internals.d.ts +54 -0
  412. package/dist/core/container/internals.js +21 -0
  413. package/dist/core/container/internals.js.map +1 -0
  414. package/dist/core/container/pool.d.ts +27 -0
  415. package/dist/core/container/pool.js +77 -0
  416. package/dist/core/container/pool.js.map +1 -0
  417. package/dist/core/driver/types.d.ts +379 -0
  418. package/dist/core/driver/types.js +3 -0
  419. package/dist/core/driver/types.js.map +1 -0
  420. package/dist/core/errors/codes.d.ts +163 -0
  421. package/dist/core/errors/codes.js +53 -0
  422. package/dist/core/errors/codes.js.map +1 -0
  423. package/dist/core/errors/error.d.ts +66 -0
  424. package/dist/core/errors/error.js +129 -0
  425. package/dist/core/errors/error.js.map +1 -0
  426. package/dist/core/events/bus.d.ts +12 -0
  427. package/dist/core/events/bus.js +46 -0
  428. package/dist/core/events/bus.js.map +1 -0
  429. package/dist/core/events/logger.d.ts +13 -0
  430. package/dist/core/events/logger.js +42 -0
  431. package/dist/core/events/logger.js.map +1 -0
  432. package/dist/core/events/types.d.ts +131 -0
  433. package/dist/core/events/types.js +3 -0
  434. package/dist/core/events/types.js.map +1 -0
  435. package/dist/core/lifecycle/engine-rules.d.ts +106 -0
  436. package/dist/core/lifecycle/engine-rules.js +267 -0
  437. package/dist/core/lifecycle/engine-rules.js.map +1 -0
  438. package/dist/core/lifecycle/engine.d.ts +502 -0
  439. package/dist/core/lifecycle/engine.js +1750 -0
  440. package/dist/core/lifecycle/engine.js.map +1 -0
  441. package/dist/core/lifecycle/evaluate.d.ts +19 -0
  442. package/dist/core/lifecycle/evaluate.js +77 -0
  443. package/dist/core/lifecycle/evaluate.js.map +1 -0
  444. package/dist/core/lifecycle/intent.d.ts +11 -0
  445. package/dist/core/lifecycle/intent.js +88 -0
  446. package/dist/core/lifecycle/intent.js.map +1 -0
  447. package/dist/core/lifecycle/monitor.d.ts +138 -0
  448. package/dist/core/lifecycle/monitor.js +616 -0
  449. package/dist/core/lifecycle/monitor.js.map +1 -0
  450. package/dist/core/lifecycle/observations.d.ts +17 -0
  451. package/dist/core/lifecycle/observations.js +59 -0
  452. package/dist/core/lifecycle/observations.js.map +1 -0
  453. package/dist/core/lifecycle/reconcile.d.ts +58 -0
  454. package/dist/core/lifecycle/reconcile.js +112 -0
  455. package/dist/core/lifecycle/reconcile.js.map +1 -0
  456. package/dist/core/lifecycle/views.d.ts +49 -0
  457. package/dist/core/lifecycle/views.js +57 -0
  458. package/dist/core/lifecycle/views.js.map +1 -0
  459. package/dist/core/lifecycle/workers.d.ts +88 -0
  460. package/dist/core/lifecycle/workers.js +347 -0
  461. package/dist/core/lifecycle/workers.js.map +1 -0
  462. package/dist/core/model/address.d.ts +32 -0
  463. package/dist/core/model/address.js +43 -0
  464. package/dist/core/model/address.js.map +1 -0
  465. package/dist/core/model/amount.d.ts +25 -0
  466. package/dist/core/model/amount.js +102 -0
  467. package/dist/core/model/amount.js.map +1 -0
  468. package/dist/core/model/asset.d.ts +28 -0
  469. package/dist/core/model/asset.js +47 -0
  470. package/dist/core/model/asset.js.map +1 -0
  471. package/dist/core/model/capability.d.ts +3 -0
  472. package/dist/core/model/capability.js +18 -0
  473. package/dist/core/model/capability.js.map +1 -0
  474. package/dist/core/model/chain.d.ts +63 -0
  475. package/dist/core/model/chain.js +8 -0
  476. package/dist/core/model/chain.js.map +1 -0
  477. package/dist/core/model/fee.d.ts +36 -0
  478. package/dist/core/model/fee.js +17 -0
  479. package/dist/core/model/fee.js.map +1 -0
  480. package/dist/core/model/ids.d.ts +38 -0
  481. package/dist/core/model/ids.js +14 -0
  482. package/dist/core/model/ids.js.map +1 -0
  483. package/dist/core/model/intent.d.ts +63 -0
  484. package/dist/core/model/intent.js +81 -0
  485. package/dist/core/model/intent.js.map +1 -0
  486. package/dist/core/model/ordering.d.ts +28 -0
  487. package/dist/core/model/ordering.js +29 -0
  488. package/dist/core/model/ordering.js.map +1 -0
  489. package/dist/core/model/transaction.d.ts +123 -0
  490. package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
  491. package/dist/core/model/transaction.js.map +1 -0
  492. package/dist/core/observe/scanner.d.ts +135 -0
  493. package/dist/core/observe/scanner.js +358 -0
  494. package/dist/core/observe/scanner.js.map +1 -0
  495. package/dist/core/ordering/reservations.d.ts +16 -0
  496. package/dist/core/ordering/reservations.js +53 -0
  497. package/dist/core/ordering/reservations.js.map +1 -0
  498. package/dist/core/ordering/sequence.d.ts +61 -0
  499. package/dist/core/ordering/sequence.js +155 -0
  500. package/dist/core/ordering/sequence.js.map +1 -0
  501. package/dist/core/registry/adapters.d.ts +10 -0
  502. package/dist/core/registry/adapters.js +56 -0
  503. package/dist/core/registry/adapters.js.map +1 -0
  504. package/dist/core/registry/assets.d.ts +18 -0
  505. package/dist/core/registry/assets.js +90 -0
  506. package/dist/core/registry/assets.js.map +1 -0
  507. package/dist/core/registry/chains.d.ts +10 -0
  508. package/dist/core/registry/chains.js +80 -0
  509. package/dist/core/registry/chains.js.map +1 -0
  510. package/dist/core/registry/plugin.d.ts +41 -0
  511. package/dist/core/registry/plugin.js +109 -0
  512. package/dist/core/registry/plugin.js.map +1 -0
  513. package/dist/core/registry/providers.d.ts +31 -0
  514. package/dist/core/registry/providers.js +43 -0
  515. package/dist/core/registry/providers.js.map +1 -0
  516. package/dist/core/registry/schemes.d.ts +30 -0
  517. package/dist/core/registry/schemes.js +84 -0
  518. package/dist/core/registry/schemes.js.map +1 -0
  519. package/dist/core/secret/fragments.d.ts +33 -0
  520. package/dist/core/secret/fragments.js +110 -0
  521. package/dist/core/secret/fragments.js.map +1 -0
  522. package/dist/core/secret/redact.d.ts +10 -0
  523. package/dist/core/secret/redact.js +110 -0
  524. package/dist/core/secret/redact.js.map +1 -0
  525. package/dist/core/secret/secret.d.ts +14 -0
  526. package/dist/core/secret/secret.js +42 -0
  527. package/dist/core/secret/secret.js.map +1 -0
  528. package/dist/core/signing/callback.d.ts +10 -0
  529. package/dist/core/signing/callback.js +22 -0
  530. package/dist/core/signing/callback.js.map +1 -0
  531. package/dist/core/signing/guard.d.ts +18 -0
  532. package/dist/core/signing/guard.js +72 -0
  533. package/dist/core/signing/guard.js.map +1 -0
  534. package/dist/core/signing/hd.d.ts +36 -0
  535. package/dist/core/signing/hd.js +167 -0
  536. package/dist/core/signing/hd.js.map +1 -0
  537. package/dist/core/signing/local.d.ts +48 -0
  538. package/dist/core/signing/local.js +190 -0
  539. package/dist/core/signing/local.js.map +1 -0
  540. package/dist/core/signing/orchestrator.d.ts +40 -0
  541. package/dist/core/signing/orchestrator.js +300 -0
  542. package/dist/core/signing/orchestrator.js.map +1 -0
  543. package/dist/core/signing/types.d.ts +64 -0
  544. package/dist/core/signing/types.js +3 -0
  545. package/dist/core/signing/types.js.map +1 -0
  546. package/dist/core/signing/wallet.d.ts +48 -0
  547. package/dist/core/signing/wallet.js +161 -0
  548. package/dist/core/signing/wallet.js.map +1 -0
  549. package/dist/core/store/clone.d.ts +25 -0
  550. package/dist/core/store/clone.js +71 -0
  551. package/dist/core/store/clone.js.map +1 -0
  552. package/dist/core/store/format.d.ts +20 -0
  553. package/dist/core/store/format.js +86 -0
  554. package/dist/core/store/format.js.map +1 -0
  555. package/dist/core/store/memory.d.ts +38 -0
  556. package/dist/core/store/memory.js +325 -0
  557. package/dist/core/store/memory.js.map +1 -0
  558. package/dist/core/store/types.d.ts +258 -0
  559. package/dist/core/store/types.js +119 -0
  560. package/dist/core/store/types.js.map +1 -0
  561. package/dist/core/transport/backoff.d.ts +8 -0
  562. package/dist/core/transport/backoff.js +27 -0
  563. package/dist/core/transport/backoff.js.map +1 -0
  564. package/dist/core/transport/circuit.d.ts +25 -0
  565. package/dist/core/transport/circuit.js +61 -0
  566. package/dist/core/transport/circuit.js.map +1 -0
  567. package/dist/core/transport/http-transport.d.ts +30 -0
  568. package/dist/core/transport/http-transport.js +1703 -0
  569. package/dist/core/transport/http-transport.js.map +1 -0
  570. package/dist/core/transport/rate-limit.d.ts +27 -0
  571. package/dist/core/transport/rate-limit.js +78 -0
  572. package/dist/core/transport/rate-limit.js.map +1 -0
  573. package/dist/core/transport/stale-view.d.ts +11 -0
  574. package/dist/core/transport/stale-view.js +17 -0
  575. package/dist/core/transport/stale-view.js.map +1 -0
  576. package/dist/core/transport/types.d.ts +159 -0
  577. package/dist/core/transport/types.js +6 -0
  578. package/dist/core/transport/types.js.map +1 -0
  579. package/dist/core/util/bytes.d.ts +9 -0
  580. package/dist/core/util/bytes.js +40 -0
  581. package/dist/core/util/bytes.js.map +1 -0
  582. package/dist/core/util/clock.d.ts +6 -0
  583. package/dist/core/util/clock.js +26 -0
  584. package/dist/core/util/clock.js.map +1 -0
  585. package/dist/core/util/freeze.d.ts +8 -0
  586. package/dist/core/util/freeze.js +31 -0
  587. package/dist/core/util/freeze.js.map +1 -0
  588. package/dist/core/util/json.d.ts +35 -0
  589. package/dist/core/util/json.js +174 -0
  590. package/dist/core/util/json.js.map +1 -0
  591. package/dist/core/util/names.d.ts +27 -0
  592. package/dist/core/util/names.js +56 -0
  593. package/dist/core/util/names.js.map +1 -0
  594. package/dist/index.d.ts +65 -14
  595. package/dist/index.js +107 -49
  596. package/dist/index.js.map +1 -1
  597. package/dist/native.d.ts +21 -0
  598. package/dist/native.js +44 -0
  599. package/dist/native.js.map +1 -0
  600. package/dist/testing/contracts/api.d.ts +12 -0
  601. package/dist/testing/contracts/api.js +58 -0
  602. package/dist/testing/contracts/api.js.map +1 -0
  603. package/dist/testing/contracts/cursors.d.ts +6 -0
  604. package/dist/testing/contracts/cursors.js +43 -0
  605. package/dist/testing/contracts/cursors.js.map +1 -0
  606. package/dist/testing/contracts/locks.d.ts +10 -0
  607. package/dist/testing/contracts/locks.js +63 -0
  608. package/dist/testing/contracts/locks.js.map +1 -0
  609. package/dist/testing/contracts/operations.d.ts +21 -0
  610. package/dist/testing/contracts/operations.js +737 -0
  611. package/dist/testing/contracts/operations.js.map +1 -0
  612. package/dist/testing/contracts/sequences.d.ts +6 -0
  613. package/dist/testing/contracts/sequences.js +68 -0
  614. package/dist/testing/contracts/sequences.js.map +1 -0
  615. package/dist/testing/env.d.ts +68 -0
  616. package/dist/testing/env.js +105 -0
  617. package/dist/testing/env.js.map +1 -0
  618. package/dist/testing/fake-chain.d.ts +118 -0
  619. package/dist/testing/fake-chain.js +536 -0
  620. package/dist/testing/fake-chain.js.map +1 -0
  621. package/dist/testing/fake-clock.d.ts +15 -0
  622. package/dist/testing/fake-clock.js +86 -0
  623. package/dist/testing/fake-clock.js.map +1 -0
  624. package/dist/testing/fake-driver.d.ts +15 -0
  625. package/dist/testing/fake-driver.js +458 -0
  626. package/dist/testing/fake-driver.js.map +1 -0
  627. package/dist/testing/fake-fetch.d.ts +32 -0
  628. package/dist/testing/fake-fetch.js +81 -0
  629. package/dist/testing/fake-fetch.js.map +1 -0
  630. package/dist/testing/fake-plugin.d.ts +30 -0
  631. package/dist/testing/fake-plugin.js +66 -0
  632. package/dist/testing/fake-plugin.js.map +1 -0
  633. package/dist/testing/faulty-store.d.ts +38 -0
  634. package/dist/testing/faulty-store.js +71 -0
  635. package/dist/testing/faulty-store.js.map +1 -0
  636. package/dist/testing/generation.d.ts +60 -0
  637. package/dist/testing/generation.js +252 -0
  638. package/dist/testing/generation.js.map +1 -0
  639. package/dist/testing/index.d.ts +28 -0
  640. package/dist/testing/index.js +51 -0
  641. package/dist/testing/index.js.map +1 -0
  642. package/package.json +198 -45
  643. package/dist/libs/eth/account.d.ts +0 -9
  644. package/dist/libs/eth/account.js +0 -58
  645. package/dist/libs/eth/account.js.map +0 -1
  646. package/dist/libs/eth/contract.d.ts +0 -7
  647. package/dist/libs/eth/contract.js +0 -42
  648. package/dist/libs/eth/contract.js.map +0 -1
  649. package/dist/libs/eth/index.d.ts +0 -24
  650. package/dist/libs/eth/index.js +0 -72
  651. package/dist/libs/eth/index.js.map +0 -1
  652. package/dist/libs/eth/transact.d.ts +0 -7
  653. package/dist/libs/eth/transact.js +0 -26
  654. package/dist/libs/eth/transact.js.map +0 -1
  655. package/dist/libs/index.d.ts +0 -2
  656. package/dist/libs/index.js +0 -19
  657. package/dist/libs/index.js.map +0 -1
  658. package/dist/libs/trx/account.d.ts +0 -9
  659. package/dist/libs/trx/account.js +0 -55
  660. package/dist/libs/trx/account.js.map +0 -1
  661. package/dist/libs/trx/contract.d.ts +0 -7
  662. package/dist/libs/trx/contract.js +0 -27
  663. package/dist/libs/trx/contract.js.map +0 -1
  664. package/dist/libs/trx/index.d.ts +0 -22
  665. package/dist/libs/trx/index.js +0 -64
  666. package/dist/libs/trx/index.js.map +0 -1
  667. package/dist/libs/trx/transact.d.ts +0 -7
  668. package/dist/libs/trx/transact.js +0 -26
  669. package/dist/libs/trx/transact.js.map +0 -1
  670. package/dist/tool/common.d.ts +0 -28
  671. package/dist/tool/common.js +0 -33
  672. package/dist/tool/common.js.map +0 -1
  673. package/dist/tool/eth-tools.d.ts +0 -3
  674. package/dist/tool/eth-tools.js +0 -33
  675. package/dist/tool/eth-tools.js.map +0 -1
  676. package/dist/tool/index.d.ts +0 -5
  677. package/dist/tool/index.js +0 -22
  678. package/dist/tool/index.js.map +0 -1
  679. package/dist/tool/logging.d.ts +0 -3
  680. package/dist/tool/logging.js +0 -11
  681. package/dist/tool/logging.js.map +0 -1
  682. package/dist/tool/options.d.ts +0 -6
  683. package/dist/tool/options.js +0 -41
  684. package/dist/tool/options.js.map +0 -1
  685. package/dist/tool/trx-tools.d.ts +0 -3
  686. package/dist/tool/trx-tools.js +0 -20
  687. package/dist/tool/trx-tools.js.map +0 -1
  688. package/dist/type/account.d.ts +0 -9
  689. package/dist/type/account.js.map +0 -1
  690. package/dist/type/common.d.ts +0 -18
  691. package/dist/type/common.js.map +0 -1
  692. package/dist/type/contract.d.ts +0 -10
  693. package/dist/type/contract.js.map +0 -1
  694. package/dist/type/index.d.ts +0 -5
  695. package/dist/type/index.js +0 -22
  696. package/dist/type/index.js.map +0 -1
  697. package/dist/type/lib-types.d.ts +0 -9
  698. package/dist/type/lib-types.js.map +0 -1
  699. package/dist/type/transact.d.ts +0 -7
  700. package/dist/type/transact.js.map +0 -1
@@ -0,0 +1,370 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.consumptionHeight = consumptionHeight;
4
+ exports.createEvmProofs = createEvmProofs;
5
+ exports.mayHold = mayHold;
6
+ exports.createEvmBlocks = createEvmBlocks;
7
+ /**
8
+ * Proofs and block scanning. Every proof read is a quorum read under `PROOF`, comparing
9
+ * only consensus facts (`rpc.ts`). No proof lets one endpoint choose the final height: a
10
+ * proof attests the fact it needs at that fact's own
11
+ * height, so honest endpoints disagree only while it is final on one and not yet on another,
12
+ * which decides nothing. The block source serves dense heights with native transfers and
13
+ * ERC-20 `Transfer` logs, as the chain reports them. Every error thrown here is a
14
+ * `PROVIDER_*` code, retryable by the code table: look again later.
15
+ */
16
+ const sha3_1 = require("@noble/hashes/sha3");
17
+ const utils_1 = require("@noble/hashes/utils");
18
+ const error_1 = require("../../core/errors/error");
19
+ const client_1 = require("./client");
20
+ const decode_1 = require("./decode");
21
+ const reader_1 = require("./reader");
22
+ const rpc_1 = require("./rpc");
23
+ /**
24
+ * A quorum key under which every endpoint whose nonce is past `nonce` agrees. A
25
+ * malformed answer throws, which the transport counts as a disagreement.
26
+ */
27
+ const nonceAbove = (nonce) => (result) => (0, client_1.quantity)(result, 'nonce') > nonce;
28
+ /**
29
+ * Node texts for state it does not hold: pruned, beyond its recent-state window, or
30
+ * not served at a tag (geth, op-geth, Nitro, BSC, Erigon, Reth, Besu wordings).
31
+ */
32
+ const STATE_UNAVAILABLE = /missing trie node|historical state .* not available|header not found|state (is )?not available|pruned/i;
33
+ /**
34
+ * The boundary of every proof. Only a definitive negative answer may
35
+ * say "no", and a JSON-RPC error answer is none: state the node does not hold, an index it
36
+ * is still building (geth's "transaction indexing is in progress"), or any other error,
37
+ * ambiguous or not. Every `RPC_ERROR` becomes a retryable `PROVIDER_UNAVAILABLE` (look again
38
+ * later, or elsewhere) that carries it as its cause, so no caller takes it for an answer and
39
+ * the monitor keeps watching. Every other error passes unchanged: `PROVIDER_MISCONFIGURED`
40
+ * stays final, and aborts and foreign errors stay what they are.
41
+ */
42
+ async function undecided(proof) {
43
+ try {
44
+ return await proof();
45
+ }
46
+ catch (error) {
47
+ if (!(0, error_1.isCryptoAioError)(error, 'RPC_ERROR'))
48
+ throw error;
49
+ const message = String(error.details?.rpcMessage ?? error.message);
50
+ throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', STATE_UNAVAILABLE.test(message)
51
+ ? 'finalized state not available'
52
+ : 'the endpoints gave no answer', { cause: error });
53
+ }
54
+ }
55
+ /** A retryable "decide nothing": look again later, or elsewhere. */
56
+ const undecidable = (reason) => new error_1.ProviderError('PROVIDER_UNAVAILABLE', reason);
57
+ /**
58
+ * At most this many nonce reads look for the height that consumed a nonce. The gallop
59
+ * and the bisection take about two reads per doubling of the distance back: at worst 60
60
+ * reads below a final height of 2^30, and 64 below 2^32, so this reaches every consumption
61
+ * on any chain served today.
62
+ */
63
+ const MAX_SEARCH_READS = 64;
64
+ /**
65
+ * The lowest height at or below `final` where `consumed` holds, given that it holds at
66
+ * `final`. A gallop back (`final` less 1, 2, 4, …) finds a height where it does not, then a
67
+ * bisection the first where it does. `consumed` never turns false again as the height
68
+ * grows, since an account's nonce never falls. Beyond `MAX_SEARCH_READS` reads, it decides
69
+ * nothing.
70
+ */
71
+ async function consumptionHeight(consumed, final) {
72
+ let reads = 0;
73
+ const read = (height) => {
74
+ if (reads === MAX_SEARCH_READS) {
75
+ throw undecidable('the nonce was consumed too far back to look up');
76
+ }
77
+ reads += 1;
78
+ return consumed(height);
79
+ };
80
+ // Consumed at `high`; not at `low` (below genesis, until a read says otherwise).
81
+ let high = final;
82
+ let low = -1n;
83
+ for (let step = 1n; high > 0n && low < 0n; step *= 2n) {
84
+ const height = final > step ? final - step : 0n;
85
+ if (await read(height))
86
+ high = height;
87
+ else
88
+ low = height;
89
+ }
90
+ while (high - low > 1n) {
91
+ const middle = (low + high) / 2n;
92
+ if (await read(middle))
93
+ high = middle;
94
+ else
95
+ low = middle;
96
+ }
97
+ return high;
98
+ }
99
+ /**
100
+ * Whether `txHash` is final, when no endpoint serves its
101
+ * receipt. `null` is no proof of absence: a node answers it for every transaction outside its
102
+ * index (geth indexes the last 2,350,000 blocks by default, and pruning nodes of other
103
+ * clients drop theirs), so "not included" would prove a final, executed transfer `replaced`.
104
+ * The nonce's consumer decides instead. The quorum attests the nonce consumed at a final
105
+ * height, a search finds the block that consumed it, and the sender's transaction at that
106
+ * nonce there answers: another one proves ours is not included; ours is included, with the
107
+ * verdict its receipt in that block gives. Anything else decides nothing, and so does
108
+ * an endpoint without the historical state the search reads.
109
+ *
110
+ * Known gap: nothing caches the consumer per sender and nonce, so an undecided Attempt
111
+ * repeats the search on every monitor pass. A nonce that an EIP-7702 authorization
112
+ * consumed (no transaction from the sender) is never decided, the safe direction.
113
+ */
114
+ async function nonceConsumer(ctx, txHash, ordering, from) {
115
+ if (ordering.kind !== 'nonce')
116
+ throw undecidable('no nonce to look the transaction up by');
117
+ const { client } = ctx;
118
+ const { nonce } = ordering;
119
+ const tags = { ...reader_1.PROOF, quorumKey: nonceAbove(nonce) };
120
+ const consumed = async (height) => (await client.getTransactionCount(from, height, tags)) > nonce;
121
+ const { height: final } = await (0, reader_1.provenFinal)(ctx, reader_1.PROOF);
122
+ if (!(await consumed(final)))
123
+ throw undecidable('the nonce is not consumed at finality');
124
+ const height = await consumptionHeight(consumed, final);
125
+ const block = await client.getBlockWithTransactions(height, {
126
+ ...reader_1.PROOF,
127
+ quorumKey: rpc_1.blockTransactionsKey,
128
+ });
129
+ if (block?.number !== height)
130
+ throw undecidable('the endpoints serve no final block');
131
+ const sender = from.toLowerCase();
132
+ const consumer = block.transactions.find((tx) => tx.from.toLowerCase() === sender && tx.nonce === nonce);
133
+ // No transaction from the sender used the nonce: an EIP-7702 authorization can.
134
+ if (!consumer)
135
+ throw undecidable('no transaction in its block used the nonce');
136
+ // Another transaction is final at our nonce: ours can never be included.
137
+ if (consumer.hash !== txHash.toLowerCase())
138
+ return { included: false };
139
+ const receipts = await client.getBlockReceipts(block.hash, reader_1.PROOF);
140
+ const receipt = receipts?.find((r) => r.transactionHash === consumer.hash);
141
+ if (receipt?.blockHash !== block.hash) {
142
+ throw undecidable('the final block has no receipts on the endpoints');
143
+ }
144
+ return {
145
+ included: true,
146
+ ...verdict(receipt.status === 1, (0, decode_1.tokenTransferLanded)(client.abi, consumer, receipt)),
147
+ blockHeight: height,
148
+ blockHash: block.hash,
149
+ txHash: consumer.hash,
150
+ };
151
+ }
152
+ /**
153
+ * The verdict of an included transaction of ours: a reverted one, or one that executed but
154
+ * logged no token transfer to its recipient (`unevidenced`: value may have moved).
155
+ */
156
+ function verdict(executed, landed) {
157
+ if (!executed)
158
+ return { success: false };
159
+ return landed
160
+ ? { success: true }
161
+ : { success: false, reason: 'token transfer failed', failure: 'unevidenced' };
162
+ }
163
+ function createEvmProofs(ctx) {
164
+ const { client } = ctx;
165
+ return {
166
+ finalizedHead: () => undecided(async () => {
167
+ const { height, block } = await (0, reader_1.provenFinal)(ctx, reader_1.PROOF);
168
+ const final = block ?? (await client.getBlock(height, reader_1.PROOF));
169
+ if (!final) {
170
+ throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'the endpoints serve no finalized block');
171
+ }
172
+ return { height: final.number, hash: final.hash, timestamp: final.timestamp };
173
+ }),
174
+ includedFinal: (ref, ordering, from) => undecided(async () => {
175
+ const receipt = await client.getReceipt(ref.id, reader_1.PROOF);
176
+ // No receipt is no proof of absence; the transaction at our nonce decides.
177
+ if (!receipt)
178
+ return nonceConsumer(ctx, ref.id, ordering, from);
179
+ const final = await (0, reader_1.finalBlockAt)(ctx, receipt.blockNumber, reader_1.PROOF);
180
+ // The transaction is in a block, just not a final one on these endpoints yet.
181
+ // "Not included" would let the core prove a final transfer `replaced` (whenAbsent,
182
+ // after the slot was proven consumed on endpoints whose finality is further along),
183
+ // so this decides nothing.
184
+ if (!final) {
185
+ throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'receipt not yet final');
186
+ }
187
+ // The endpoints agree on a receipt from a block that is not the final one at its
188
+ // height: the chain reorganized between the reads, or their receipt index lags. The
189
+ // transaction may be final elsewhere, so this decides nothing.
190
+ if (final.hash !== receipt.blockHash) {
191
+ throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'the receipt is not in the final block at its height');
192
+ }
193
+ const executed = receipt.status === 1;
194
+ let landed = true;
195
+ if (executed) {
196
+ // A token transfer that logged no transfer to its recipient paid it nothing
197
+ // (read from the ref alone, the call's arguments from its keyed calldata). The
198
+ // core proves only its own Attempts, so this is always a verdict.
199
+ const tx = await client.getTransaction(ref.id, reader_1.PROOF);
200
+ if (!tx) {
201
+ throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'a receipt without its transaction');
202
+ }
203
+ landed = (0, decode_1.tokenTransferLanded)(client.abi, tx, receipt);
204
+ }
205
+ return {
206
+ included: true,
207
+ ...verdict(executed, landed),
208
+ blockHeight: receipt.blockNumber,
209
+ blockHash: receipt.blockHash,
210
+ txHash: receipt.transactionHash,
211
+ };
212
+ }),
213
+ slotConsumed: (ordering, from, level) => undecided(async () => {
214
+ if (ordering.kind !== 'nonce')
215
+ return false;
216
+ if (level === 'latest') {
217
+ return ((await client.getTransactionCount(from, 'latest', reader_1.MONITOR)) > ordering.nonce);
218
+ }
219
+ // The nonce at a height the quorum attests final (one endpoint's view proposes
220
+ // it, trailed by PEER_SKEW), on tag and confirmation networks alike. State at a final
221
+ // height never changes, so honest endpoints agree however their heads move, and one
222
+ // that over-reports its finalized block cannot advance the height. A number,
223
+ // not the `finalized` tag: some nodes (BSC's) serve no state at the tag.
224
+ const { height } = await (0, reader_1.provenFinal)(ctx, reader_1.PROOF);
225
+ const count = await client.getTransactionCount(from, height, {
226
+ ...reader_1.PROOF,
227
+ quorumKey: nonceAbove(ordering.nonce),
228
+ });
229
+ return count > ordering.nonce;
230
+ }),
231
+ // Nonce ordering: an EVM transaction never expires.
232
+ expired: async () => false,
233
+ blockHash: (height, level) => undecided(async () => {
234
+ if (level === 'finalized') {
235
+ return (await (0, reader_1.finalBlockAt)(ctx, height, reader_1.PROOF))?.hash ?? null;
236
+ }
237
+ return (await client.getBlock(height, reader_1.PROOF))?.hash ?? null;
238
+ }),
239
+ };
240
+ }
241
+ const changed = (height) => new error_1.ProviderError('PROVIDER_INCONSISTENT', `block ${height} changed while scanning`);
242
+ /**
243
+ * Whether a block's `logsBloom` may hold `value` (a log's address or topic), by the
244
+ * yellow paper's M3:2048: three bits, each the low 11 bits of a byte pair of the value's
245
+ * keccak-256. `false` is definitive; `true` may be a false positive. No bloom may hold
246
+ * anything.
247
+ */
248
+ function mayHold(bloom, value) {
249
+ if (bloom === undefined)
250
+ return true;
251
+ const hash = (0, sha3_1.keccak_256)((0, utils_1.hexToBytes)(value.slice(2)));
252
+ for (let i = 0; i < 6; i += 2) {
253
+ const bit = ((hash[i] << 8) | hash[i + 1]) & 2047;
254
+ // Bit 0 is the last byte's lowest bit.
255
+ const byte = 255 - (bit >> 3);
256
+ const bits = Number.parseInt(bloom.slice(2 + 2 * byte, 4 + 2 * byte), 16);
257
+ if ((bits & (1 << (bit & 7))) === 0)
258
+ return false;
259
+ }
260
+ return true;
261
+ }
262
+ /** Provider texts for a method they do not serve, whatever their error code. */
263
+ const METHOD_MISSING = /method .*(not found|not supported|does not exist|is not available)/i;
264
+ /**
265
+ * A definitive answer that the node does not serve `eth_getBlockReceipts`: JSON-RPC's
266
+ * "method not found" (-32601), EIP-1474's "method not supported" (-32004), or a provider's
267
+ * own code with a text that says so.
268
+ */
269
+ function methodMissing(error) {
270
+ if (!(0, error_1.isCryptoAioError)(error, 'RPC_ERROR') || error.ambiguous)
271
+ return false;
272
+ const { rpcCode, rpcMessage } = error.details ?? {};
273
+ return (rpcCode === -32601 ||
274
+ rpcCode === -32004 ||
275
+ METHOD_MISSING.test(String(rpcMessage ?? '')));
276
+ }
277
+ /**
278
+ * Every receipt of `block` in one call, by transaction hash. The node reads them by
279
+ * block, never through a log or transaction index that may lag. `undefined` when the node
280
+ * does not serve `eth_getBlockReceipts`.
281
+ */
282
+ async function blockReceipts(client, block) {
283
+ let receipts;
284
+ try {
285
+ receipts = await client.getBlockReceipts(block.hash, reader_1.MONITOR);
286
+ }
287
+ catch (error) {
288
+ if (methodMissing(error))
289
+ return undefined;
290
+ throw error;
291
+ }
292
+ if (receipts === null)
293
+ throw changed(block.number);
294
+ return new Map(receipts.map((receipt) => [receipt.transactionHash, receipt]));
295
+ }
296
+ /** The fallback: one `eth_getTransactionReceipt` per transaction. */
297
+ async function receiptsOf(client, txs) {
298
+ const receipts = await Promise.all(txs.map((tx) => client.getReceipt(tx.hash, reader_1.MONITOR)));
299
+ return new Map(receipts.flatMap((receipt, i) => receipt ? [[txs[i]?.hash, receipt]] : []));
300
+ }
301
+ /**
302
+ * The logs of every transaction of `block`. A receipt missing, or from another block, could
303
+ * hide a deposit, so it fails the scan retryably instead.
304
+ */
305
+ function blockLogs(block, receipts) {
306
+ return block.transactions.flatMap((tx) => {
307
+ const receipt = receipts.get(tx.hash);
308
+ if (receipt?.blockHash !== block.hash)
309
+ throw changed(block.number);
310
+ return receipt.logs;
311
+ });
312
+ }
313
+ function createEvmBlocks(ctx) {
314
+ const { client, config } = ctx;
315
+ /**
316
+ * The block's `Transfer` logs without block receipts: `eth_getLogs`, which a lagging
317
+ * log index answers empty without an error. So when it answers nothing while the header's
318
+ * bloom may hold the topic, every transaction's receipt is read before the empty answer
319
+ * is trusted: any call may have logged one.
320
+ */
321
+ const transferLogs = async (block) => {
322
+ const topic = client.abi.transferTopic;
323
+ const logs = await client.getLogs({ blockHash: block.hash, topics: [topic] }, reader_1.MONITOR);
324
+ if (logs.length > 0 || !mayHold(block.logsBloom, topic))
325
+ return { logs };
326
+ const receipts = await receiptsOf(client, block.transactions);
327
+ return { logs: blockLogs(block, receipts), receipts };
328
+ };
329
+ return {
330
+ async header(height) {
331
+ const block = await client.getBlock(height, reader_1.MONITOR);
332
+ return block ? (0, reader_1.toDriverBlock)(block) : null;
333
+ },
334
+ async transactions(block, filter) {
335
+ const full = await client.getBlockWithTransactions(block.height, reader_1.MONITOR);
336
+ if (!full || full.hash !== block.hash)
337
+ throw changed(block.height);
338
+ // One call for every receipt of the block, filtered scans included.
339
+ let receipts = await blockReceipts(client, full);
340
+ let selected = full.transactions;
341
+ if (filter?.addresses?.length) {
342
+ const wanted = new Set(filter.addresses.map((a) => a.toLowerCase()));
343
+ const watched = (address) => address !== null && wanted.has(address.toLowerCase());
344
+ let logs;
345
+ if (receipts)
346
+ logs = blockLogs(full, receipts);
347
+ else
348
+ ({ logs, receipts } = await transferLogs(full));
349
+ const tokenTxs = new Set(logs
350
+ .filter((log) => {
351
+ const transfer = client.abi.decodeTransfer(log);
352
+ return (transfer !== null && (watched(transfer.from) || watched(transfer.to)));
353
+ })
354
+ .map((log) => log.transactionHash));
355
+ // A contract creation's recipient is only in its receipt, so every creation stays.
356
+ selected = full.transactions.filter((tx) => tx.to === null || watched(tx.from) || watched(tx.to) || tokenTxs.has(tx.hash));
357
+ }
358
+ receipts ??= await receiptsOf(client, selected);
359
+ return selected.map((tx) => {
360
+ const receipt = receipts.get(tx.hash);
361
+ if (!receipt || receipt.blockHash !== block.hash)
362
+ throw changed(block.height);
363
+ // The chain's view, with the network's config so bor's system logs do not make a
364
+ // plain Polygon transfer `partial`.
365
+ return (0, decode_1.decodeTransaction)(client.abi, tx, receipt, full.timestamp, config);
366
+ });
367
+ },
368
+ };
369
+ }
370
+ //# sourceMappingURL=proofs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proofs.js","sourceRoot":"","sources":["../../../src/adapters/evm/proofs.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Proofs and block scanning. Every proof read is a quorum read under `PROOF`, comparing\n * only consensus facts (`rpc.ts`). No proof lets one endpoint choose the final height: a\n * proof attests the fact it needs at that fact's own\n * height, so honest endpoints disagree only while it is final on one and not yet on another,\n * which decides nothing. The block source serves dense heights with native transfers and\n * ERC-20 `Transfer` logs, as the chain reports them. Every error thrown here is a\n * `PROVIDER_*` code, retryable by the code table: look again later.\n */\nimport { keccak_256 } from '@noble/hashes/sha3';\nimport { hexToBytes } from '@noble/hashes/utils';\nimport type { BlockSource, ProofSource } from '../../core/driver/types';\nimport { ProviderError, isCryptoAioError } from '../../core/errors/error';\nimport type { OrderingData } from '../../core/model/ordering';\nimport type { TxFailure } from '../../core/model/transaction';\nimport { quantity } from './client';\nimport { decodeTransaction, tokenTransferLanded } from './decode';\nimport {\n MONITOR,\n PROOF,\n finalBlockAt,\n provenFinal,\n toDriverBlock,\n type EvmContext,\n} from './reader';\nimport { blockTransactionsKey } from './rpc';\nimport type { EvmClient, EvmFullBlock, EvmLog, EvmReceipt, EvmTx } from './types';\n\n/**\n * A quorum key under which every endpoint whose nonce is past `nonce` agrees. A\n * malformed answer throws, which the transport counts as a disagreement.\n */\nconst nonceAbove =\n (nonce: bigint) =>\n (result: unknown): boolean =>\n quantity(result, 'nonce') > nonce;\n\n/**\n * Node texts for state it does not hold: pruned, beyond its recent-state window, or\n * not served at a tag (geth, op-geth, Nitro, BSC, Erigon, Reth, Besu wordings).\n */\nconst STATE_UNAVAILABLE =\n /missing trie node|historical state .* not available|header not found|state (is )?not available|pruned/i;\n\n/**\n * The boundary of every proof. Only a definitive negative answer may\n * say \"no\", and a JSON-RPC error answer is none: state the node does not hold, an index it\n * is still building (geth's \"transaction indexing is in progress\"), or any other error,\n * ambiguous or not. Every `RPC_ERROR` becomes a retryable `PROVIDER_UNAVAILABLE` (look again\n * later, or elsewhere) that carries it as its cause, so no caller takes it for an answer and\n * the monitor keeps watching. Every other error passes unchanged: `PROVIDER_MISCONFIGURED`\n * stays final, and aborts and foreign errors stay what they are.\n */\nasync function undecided<T>(proof: () => Promise<T>): Promise<T> {\n try {\n return await proof();\n } catch (error) {\n if (!isCryptoAioError(error, 'RPC_ERROR')) throw error;\n const message = String(error.details?.rpcMessage ?? error.message);\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n STATE_UNAVAILABLE.test(message)\n ? 'finalized state not available'\n : 'the endpoints gave no answer',\n { cause: error },\n );\n }\n}\n\n/** A retryable \"decide nothing\": look again later, or elsewhere. */\nconst undecidable = (reason: string) => new ProviderError('PROVIDER_UNAVAILABLE', reason);\n\n/**\n * At most this many nonce reads look for the height that consumed a nonce. The gallop\n * and the bisection take about two reads per doubling of the distance back: at worst 60\n * reads below a final height of 2^30, and 64 below 2^32, so this reaches every consumption\n * on any chain served today.\n */\nconst MAX_SEARCH_READS = 64;\n\n/**\n * The lowest height at or below `final` where `consumed` holds, given that it holds at\n * `final`. A gallop back (`final` less 1, 2, 4, …) finds a height where it does not, then a\n * bisection the first where it does. `consumed` never turns false again as the height\n * grows, since an account's nonce never falls. Beyond `MAX_SEARCH_READS` reads, it decides\n * nothing.\n */\nexport async function consumptionHeight(\n consumed: (height: bigint) => Promise<boolean>,\n final: bigint,\n): Promise<bigint> {\n let reads = 0;\n const read = (height: bigint): Promise<boolean> => {\n if (reads === MAX_SEARCH_READS) {\n throw undecidable('the nonce was consumed too far back to look up');\n }\n reads += 1;\n return consumed(height);\n };\n // Consumed at `high`; not at `low` (below genesis, until a read says otherwise).\n let high = final;\n let low = -1n;\n for (let step = 1n; high > 0n && low < 0n; step *= 2n) {\n const height = final > step ? final - step : 0n;\n if (await read(height)) high = height;\n else low = height;\n }\n while (high - low > 1n) {\n const middle = (low + high) / 2n;\n if (await read(middle)) high = middle;\n else low = middle;\n }\n return high;\n}\n\ntype Inclusion = Awaited<ReturnType<ProofSource['includedFinal']>>;\n\n/**\n * Whether `txHash` is final, when no endpoint serves its\n * receipt. `null` is no proof of absence: a node answers it for every transaction outside its\n * index (geth indexes the last 2,350,000 blocks by default, and pruning nodes of other\n * clients drop theirs), so \"not included\" would prove a final, executed transfer `replaced`.\n * The nonce's consumer decides instead. The quorum attests the nonce consumed at a final\n * height, a search finds the block that consumed it, and the sender's transaction at that\n * nonce there answers: another one proves ours is not included; ours is included, with the\n * verdict its receipt in that block gives. Anything else decides nothing, and so does\n * an endpoint without the historical state the search reads.\n *\n * Known gap: nothing caches the consumer per sender and nonce, so an undecided Attempt\n * repeats the search on every monitor pass. A nonce that an EIP-7702 authorization\n * consumed (no transaction from the sender) is never decided, the safe direction.\n */\nasync function nonceConsumer(\n ctx: EvmContext,\n txHash: string,\n ordering: OrderingData,\n from: string,\n): Promise<Inclusion> {\n if (ordering.kind !== 'nonce')\n throw undecidable('no nonce to look the transaction up by');\n const { client } = ctx;\n const { nonce } = ordering;\n const tags = { ...PROOF, quorumKey: nonceAbove(nonce) };\n const consumed = async (height: bigint) =>\n (await client.getTransactionCount(from, height, tags)) > nonce;\n const { height: final } = await provenFinal(ctx, PROOF);\n if (!(await consumed(final)))\n throw undecidable('the nonce is not consumed at finality');\n const height = await consumptionHeight(consumed, final);\n const block = await client.getBlockWithTransactions(height, {\n ...PROOF,\n quorumKey: blockTransactionsKey,\n });\n if (block?.number !== height) throw undecidable('the endpoints serve no final block');\n const sender = from.toLowerCase();\n const consumer = block.transactions.find(\n (tx) => tx.from.toLowerCase() === sender && tx.nonce === nonce,\n );\n // No transaction from the sender used the nonce: an EIP-7702 authorization can.\n if (!consumer) throw undecidable('no transaction in its block used the nonce');\n // Another transaction is final at our nonce: ours can never be included.\n if (consumer.hash !== txHash.toLowerCase()) return { included: false };\n const receipts = await client.getBlockReceipts(block.hash, PROOF);\n const receipt = receipts?.find((r) => r.transactionHash === consumer.hash);\n if (receipt?.blockHash !== block.hash) {\n throw undecidable('the final block has no receipts on the endpoints');\n }\n return {\n included: true,\n ...verdict(receipt.status === 1, tokenTransferLanded(client.abi, consumer, receipt)),\n blockHeight: height,\n blockHash: block.hash,\n txHash: consumer.hash,\n };\n}\n\n/**\n * The verdict of an included transaction of ours: a reverted one, or one that executed but\n * logged no token transfer to its recipient (`unevidenced`: value may have moved).\n */\nfunction verdict(\n executed: boolean,\n landed: boolean,\n): { readonly success: boolean; readonly reason?: string; readonly failure?: TxFailure } {\n if (!executed) return { success: false };\n return landed\n ? { success: true }\n : { success: false, reason: 'token transfer failed', failure: 'unevidenced' };\n}\n\nexport function createEvmProofs(ctx: EvmContext): ProofSource {\n const { client } = ctx;\n return {\n finalizedHead: () =>\n undecided(async () => {\n const { height, block } = await provenFinal(ctx, PROOF);\n const final = block ?? (await client.getBlock(height, PROOF));\n if (!final) {\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n 'the endpoints serve no finalized block',\n );\n }\n return { height: final.number, hash: final.hash, timestamp: final.timestamp };\n }),\n\n includedFinal: (ref, ordering, from) =>\n undecided(async () => {\n const receipt = await client.getReceipt(ref.id, PROOF);\n // No receipt is no proof of absence; the transaction at our nonce decides.\n if (!receipt) return nonceConsumer(ctx, ref.id, ordering, from);\n const final = await finalBlockAt(ctx, receipt.blockNumber, PROOF);\n // The transaction is in a block, just not a final one on these endpoints yet.\n // \"Not included\" would let the core prove a final transfer `replaced` (whenAbsent,\n // after the slot was proven consumed on endpoints whose finality is further along),\n // so this decides nothing.\n if (!final) {\n throw new ProviderError('PROVIDER_UNAVAILABLE', 'receipt not yet final');\n }\n // The endpoints agree on a receipt from a block that is not the final one at its\n // height: the chain reorganized between the reads, or their receipt index lags. The\n // transaction may be final elsewhere, so this decides nothing.\n if (final.hash !== receipt.blockHash) {\n throw new ProviderError(\n 'PROVIDER_INCONSISTENT',\n 'the receipt is not in the final block at its height',\n );\n }\n const executed = receipt.status === 1;\n let landed = true;\n if (executed) {\n // A token transfer that logged no transfer to its recipient paid it nothing\n // (read from the ref alone, the call's arguments from its keyed calldata). The\n // core proves only its own Attempts, so this is always a verdict.\n const tx = await client.getTransaction(ref.id, PROOF);\n if (!tx) {\n throw new ProviderError(\n 'PROVIDER_INCONSISTENT',\n 'a receipt without its transaction',\n );\n }\n landed = tokenTransferLanded(client.abi, tx, receipt);\n }\n return {\n included: true,\n ...verdict(executed, landed),\n blockHeight: receipt.blockNumber,\n blockHash: receipt.blockHash,\n txHash: receipt.transactionHash,\n };\n }),\n\n slotConsumed: (ordering, from, level) =>\n undecided(async () => {\n if (ordering.kind !== 'nonce') return false;\n if (level === 'latest') {\n return (\n (await client.getTransactionCount(from, 'latest', MONITOR)) > ordering.nonce\n );\n }\n // The nonce at a height the quorum attests final (one endpoint's view proposes\n // it, trailed by PEER_SKEW), on tag and confirmation networks alike. State at a final\n // height never changes, so honest endpoints agree however their heads move, and one\n // that over-reports its finalized block cannot advance the height. A number,\n // not the `finalized` tag: some nodes (BSC's) serve no state at the tag.\n const { height } = await provenFinal(ctx, PROOF);\n const count = await client.getTransactionCount(from, height, {\n ...PROOF,\n quorumKey: nonceAbove(ordering.nonce),\n });\n return count > ordering.nonce;\n }),\n\n // Nonce ordering: an EVM transaction never expires.\n expired: async () => false,\n\n blockHash: (height, level) =>\n undecided(async () => {\n if (level === 'finalized') {\n return (await finalBlockAt(ctx, height, PROOF))?.hash ?? null;\n }\n return (await client.getBlock(height, PROOF))?.hash ?? null;\n }),\n };\n}\n\nconst changed = (height: bigint) =>\n new ProviderError('PROVIDER_INCONSISTENT', `block ${height} changed while scanning`);\n\n/**\n * Whether a block's `logsBloom` may hold `value` (a log's address or topic), by the\n * yellow paper's M3:2048: three bits, each the low 11 bits of a byte pair of the value's\n * keccak-256. `false` is definitive; `true` may be a false positive. No bloom may hold\n * anything.\n */\nexport function mayHold(bloom: string | undefined, value: string): boolean {\n if (bloom === undefined) return true;\n const hash = keccak_256(hexToBytes(value.slice(2)));\n for (let i = 0; i < 6; i += 2) {\n const bit = (((hash[i] as number) << 8) | (hash[i + 1] as number)) & 2047;\n // Bit 0 is the last byte's lowest bit.\n const byte = 255 - (bit >> 3);\n const bits = Number.parseInt(bloom.slice(2 + 2 * byte, 4 + 2 * byte), 16);\n if ((bits & (1 << (bit & 7))) === 0) return false;\n }\n return true;\n}\n\n/** Provider texts for a method they do not serve, whatever their error code. */\nconst METHOD_MISSING =\n /method .*(not found|not supported|does not exist|is not available)/i;\n\n/**\n * A definitive answer that the node does not serve `eth_getBlockReceipts`: JSON-RPC's\n * \"method not found\" (-32601), EIP-1474's \"method not supported\" (-32004), or a provider's\n * own code with a text that says so.\n */\nfunction methodMissing(error: unknown): boolean {\n if (!isCryptoAioError(error, 'RPC_ERROR') || error.ambiguous) return false;\n const { rpcCode, rpcMessage } = error.details ?? {};\n return (\n rpcCode === -32601 ||\n rpcCode === -32004 ||\n METHOD_MISSING.test(String(rpcMessage ?? ''))\n );\n}\n\ntype Receipts = ReadonlyMap<string, EvmReceipt>;\n\n/**\n * Every receipt of `block` in one call, by transaction hash. The node reads them by\n * block, never through a log or transaction index that may lag. `undefined` when the node\n * does not serve `eth_getBlockReceipts`.\n */\nasync function blockReceipts(\n client: EvmClient,\n block: EvmFullBlock,\n): Promise<Receipts | undefined> {\n let receipts: readonly EvmReceipt[] | null;\n try {\n receipts = await client.getBlockReceipts(block.hash, MONITOR);\n } catch (error) {\n if (methodMissing(error)) return undefined;\n throw error;\n }\n if (receipts === null) throw changed(block.number);\n return new Map(receipts.map((receipt) => [receipt.transactionHash, receipt]));\n}\n\n/** The fallback: one `eth_getTransactionReceipt` per transaction. */\nasync function receiptsOf(client: EvmClient, txs: readonly EvmTx[]): Promise<Receipts> {\n const receipts = await Promise.all(\n txs.map((tx) => client.getReceipt(tx.hash, MONITOR)),\n );\n return new Map(\n receipts.flatMap((receipt, i) =>\n receipt ? [[txs[i]?.hash as string, receipt]] : [],\n ),\n );\n}\n\n/**\n * The logs of every transaction of `block`. A receipt missing, or from another block, could\n * hide a deposit, so it fails the scan retryably instead.\n */\nfunction blockLogs(block: EvmFullBlock, receipts: Receipts): readonly EvmLog[] {\n return block.transactions.flatMap((tx) => {\n const receipt = receipts.get(tx.hash);\n if (receipt?.blockHash !== block.hash) throw changed(block.number);\n return receipt.logs;\n });\n}\n\nexport function createEvmBlocks(ctx: EvmContext): BlockSource {\n const { client, config } = ctx;\n /**\n * The block's `Transfer` logs without block receipts: `eth_getLogs`, which a lagging\n * log index answers empty without an error. So when it answers nothing while the header's\n * bloom may hold the topic, every transaction's receipt is read before the empty answer\n * is trusted: any call may have logged one.\n */\n const transferLogs = async (\n block: EvmFullBlock,\n ): Promise<{ readonly logs: readonly EvmLog[]; readonly receipts?: Receipts }> => {\n const topic = client.abi.transferTopic;\n const logs = await client.getLogs(\n { blockHash: block.hash, topics: [topic] },\n MONITOR,\n );\n if (logs.length > 0 || !mayHold(block.logsBloom, topic)) return { logs };\n const receipts = await receiptsOf(client, block.transactions);\n return { logs: blockLogs(block, receipts), receipts };\n };\n\n return {\n async header(height) {\n const block = await client.getBlock(height, MONITOR);\n return block ? toDriverBlock(block) : null;\n },\n\n async transactions(block, filter) {\n const full = await client.getBlockWithTransactions(block.height, MONITOR);\n if (!full || full.hash !== block.hash) throw changed(block.height);\n // One call for every receipt of the block, filtered scans included.\n let receipts = await blockReceipts(client, full);\n let selected: readonly EvmTx[] = full.transactions;\n if (filter?.addresses?.length) {\n const wanted = new Set(filter.addresses.map((a) => a.toLowerCase()));\n const watched = (address: string | null) =>\n address !== null && wanted.has(address.toLowerCase());\n let logs: readonly EvmLog[];\n if (receipts) logs = blockLogs(full, receipts);\n else ({ logs, receipts } = await transferLogs(full));\n const tokenTxs = new Set(\n logs\n .filter((log) => {\n const transfer = client.abi.decodeTransfer(log);\n return (\n transfer !== null && (watched(transfer.from) || watched(transfer.to))\n );\n })\n .map((log) => log.transactionHash),\n );\n // A contract creation's recipient is only in its receipt, so every creation stays.\n selected = full.transactions.filter(\n (tx) =>\n tx.to === null || watched(tx.from) || watched(tx.to) || tokenTxs.has(tx.hash),\n );\n }\n receipts ??= await receiptsOf(client, selected);\n return selected.map((tx) => {\n const receipt = receipts.get(tx.hash);\n if (!receipt || receipt.blockHash !== block.hash) throw changed(block.height);\n // The chain's view, with the network's config so bor's system logs do not make a\n // plain Polygon transfer `partial`.\n return decodeTransaction(client.abi, tx, receipt, full.timestamp, config);\n });\n },\n };\n}\n"]}
@@ -0,0 +1,25 @@
1
+ /** The fields a rejection check reads, of one signed legacy, EIP-2930 or EIP-1559 tx. */
2
+ export interface EvmSentTx {
3
+ readonly type: 0 | 1 | 2;
4
+ /** Absent for a legacy transaction signed without EIP-155 (v of 27 or 28). */
5
+ readonly chainId?: bigint;
6
+ readonly maxFeePerGas?: bigint;
7
+ readonly maxPriorityFeePerGas?: bigint;
8
+ /** The recovery id: `yParity`, or the legacy `v` reduced to 0 or 1; -1 when neither. */
9
+ readonly recovery: number;
10
+ readonly r: bigint;
11
+ readonly s: bigint;
12
+ }
13
+ /**
14
+ * Twice geth's 128 KiB pool limit, checked before any decoding: a bare broadcast may
15
+ * carry any bytes, and untrusted input is capped before it is decoded.
16
+ */
17
+ export declare const MAX_SENT_BYTES: number;
18
+ /**
19
+ * The sent bytes as the checks read them: the fields, `'malformed'` when geth could not
20
+ * decode them either, or `undefined` when they are unreadable here but may be valid (an
21
+ * EIP-4844 or EIP-7702 transaction, or more than `MAX_SENT_BYTES`): no claim holds for those.
22
+ */
23
+ export declare function readSentTx(hex: string): EvmSentTx | 'malformed' | undefined;
24
+ /** geth's `ValidateSignatureValues` with Homestead's low-s rule, over the recovery id. */
25
+ export declare function signatureValuesValid(tx: EvmSentTx): boolean;
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_SENT_BYTES = void 0;
4
+ exports.readSentTx = readSentTx;
5
+ exports.signatureValuesValid = signatureValuesValid;
6
+ /**
7
+ * What a node's rejection claims is checked against the bytes we sent,
8
+ * read here SDK-free. The reader is never stricter than geth: it calls bytes `malformed`
9
+ * only for what geth's RLP decoder also refuses (a broken or non-canonical encoding, an
10
+ * integer with a leading zero or over 256 bits, the wrong number of fields, a `to` that is
11
+ * not 20 bytes), and it reads no access list, so a claim it cannot confirm stays a refusal.
12
+ */
13
+ const bytes_1 = require("../../core/util/bytes");
14
+ /**
15
+ * Twice geth's 128 KiB pool limit, checked before any decoding: a bare broadcast may
16
+ * carry any bytes, and untrusted input is capped before it is decoded.
17
+ */
18
+ exports.MAX_SENT_BYTES = 2 * 128 * 1024;
19
+ class Malformed extends Error {
20
+ }
21
+ /** One canonical RLP item at `at`, and the offset after it; throws `Malformed`. */
22
+ function item(bytes, at) {
23
+ const lead = bytes[at];
24
+ if (lead === undefined)
25
+ throw new Malformed();
26
+ const span = (offset, length) => {
27
+ const end = offset + length;
28
+ if (end > bytes.length)
29
+ throw new Malformed();
30
+ return [offset, end];
31
+ };
32
+ const longLength = (width) => {
33
+ const [start, end] = span(at + 1, width);
34
+ if (bytes[start] === 0)
35
+ throw new Malformed();
36
+ let length = 0;
37
+ for (let i = start; i < end; i++)
38
+ length = length * 256 + bytes[i];
39
+ if (length < 56)
40
+ throw new Malformed();
41
+ return length;
42
+ };
43
+ if (lead < 0x80)
44
+ return [bytes.subarray(at, at + 1), at + 1];
45
+ if (lead <= 0xbf) {
46
+ const long = lead > 0xb7;
47
+ const width = long ? lead - 0xb7 : 0;
48
+ const length = long ? longLength(width) : lead - 0x80;
49
+ const [start, end] = span(at + 1 + width, length);
50
+ if (!long && length === 1 && bytes[start] < 0x80)
51
+ throw new Malformed();
52
+ return [bytes.subarray(start, end), end];
53
+ }
54
+ const long = lead > 0xf7;
55
+ const width = long ? lead - 0xf7 : 0;
56
+ const length = long ? longLength(width) : lead - 0xc0;
57
+ const [start, end] = span(at + 1 + width, length);
58
+ const items = [];
59
+ for (let offset = start; offset < end;) {
60
+ const [next, after] = item(bytes, offset);
61
+ if (after > end)
62
+ throw new Malformed();
63
+ items.push(next);
64
+ offset = after;
65
+ }
66
+ return [items, end];
67
+ }
68
+ /** A whole buffer as one list of exactly `fields` items. */
69
+ function list(bytes, fields) {
70
+ const [value, end] = item(bytes, 0);
71
+ if (end !== bytes.length || !Array.isArray(value) || value.length !== fields)
72
+ throw new Malformed();
73
+ return value;
74
+ }
75
+ /** A canonical unsigned integer of at most `bits` bits. */
76
+ function uint(value, bits) {
77
+ if (!(value instanceof Uint8Array) || value.length * 8 > bits || value[0] === 0)
78
+ throw new Malformed();
79
+ let out = 0n;
80
+ for (const byte of value)
81
+ out = (out << 8n) | BigInt(byte);
82
+ return out;
83
+ }
84
+ function address(value) {
85
+ if (!(value instanceof Uint8Array) || (value.length !== 0 && value.length !== 20))
86
+ throw new Malformed();
87
+ }
88
+ /**
89
+ * The sent bytes as the checks read them: the fields, `'malformed'` when geth could not
90
+ * decode them either, or `undefined` when they are unreadable here but may be valid (an
91
+ * EIP-4844 or EIP-7702 transaction, or more than `MAX_SENT_BYTES`): no claim holds for those.
92
+ */
93
+ function readSentTx(hex) {
94
+ if (typeof hex !== 'string' || hex.length > 2 + 2 * exports.MAX_SENT_BYTES)
95
+ return undefined;
96
+ let bytes;
97
+ try {
98
+ bytes = (0, bytes_1.fromHex)(hex);
99
+ }
100
+ catch {
101
+ return 'malformed';
102
+ }
103
+ const type = bytes[0];
104
+ if (type === undefined)
105
+ return 'malformed';
106
+ try {
107
+ if (type >= 0xc0) {
108
+ const [nonce, gasPrice, gas, to, value, , v, r, s] = list(bytes, 9);
109
+ uint(nonce, 64);
110
+ uint(gasPrice, 256);
111
+ uint(gas, 64);
112
+ address(to);
113
+ uint(value, 256);
114
+ const vv = uint(v, 256);
115
+ const eip155 = vv >= 35n;
116
+ return {
117
+ type: 0,
118
+ ...(eip155 ? { chainId: (vv - 35n) / 2n } : {}),
119
+ recovery: eip155
120
+ ? Number((vv - 35n) % 2n)
121
+ : vv === 27n || vv === 28n
122
+ ? Number(vv - 27n)
123
+ : -1,
124
+ r: uint(r, 256),
125
+ s: uint(s, 256),
126
+ };
127
+ }
128
+ if (type === 1 || type === 2) {
129
+ const fields = list(bytes.subarray(1), type === 1 ? 11 : 12);
130
+ const chainId = uint(fields[0], 256);
131
+ uint(fields[1], 64);
132
+ const prices = type === 2 ? [uint(fields[2], 256), uint(fields[3], 256)] : [];
133
+ if (type === 1)
134
+ uint(fields[2], 256);
135
+ const rest = type === 1 ? 3 : 4;
136
+ uint(fields[rest], 64);
137
+ address(fields[rest + 1]);
138
+ uint(fields[rest + 2], 256);
139
+ const [yParity, r, s] = fields.slice(-3);
140
+ const parity = uint(yParity, 256);
141
+ return {
142
+ type,
143
+ chainId,
144
+ ...(type === 2
145
+ ? {
146
+ maxPriorityFeePerGas: prices[0],
147
+ maxFeePerGas: prices[1],
148
+ }
149
+ : {}),
150
+ recovery: parity <= 1n ? Number(parity) : -1,
151
+ r: uint(r, 256),
152
+ s: uint(s, 256),
153
+ };
154
+ }
155
+ // geth reads any other first byte above 0x7f as a legacy list, and fails.
156
+ if (type >= 0x80)
157
+ return 'malformed';
158
+ return undefined;
159
+ }
160
+ catch (error) {
161
+ if (error instanceof Malformed)
162
+ return 'malformed';
163
+ throw error;
164
+ }
165
+ }
166
+ /** secp256k1's group order. */
167
+ const N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n;
168
+ /** geth's `ValidateSignatureValues` with Homestead's low-s rule, over the recovery id. */
169
+ function signatureValuesValid(tx) {
170
+ return ((tx.recovery === 0 || tx.recovery === 1) &&
171
+ tx.r >= 1n &&
172
+ tx.r < N &&
173
+ tx.s >= 1n &&
174
+ tx.s <= N / 2n);
175
+ }
176
+ //# sourceMappingURL=rawtx.js.map