crypto-aio 0.0.3 → 0.1.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 (691) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +144 -14
  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 +326 -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 +170 -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 +135 -0
  80. package/dist/adapters/evm/ethers-client.js.map +1 -0
  81. package/dist/adapters/evm/fees.d.ts +79 -0
  82. package/dist/adapters/evm/fees.js +234 -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 +11 -0
  86. package/dist/adapters/evm/index.js.map +1 -0
  87. package/dist/adapters/evm/network.d.ts +60 -0
  88. package/dist/adapters/evm/network.js +131 -0
  89. package/dist/adapters/evm/network.js.map +1 -0
  90. package/dist/adapters/evm/plugin.d.ts +36 -0
  91. package/dist/adapters/evm/plugin.js +102 -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 +358 -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 +65 -0
  103. package/dist/adapters/evm/reader.js +292 -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 +7 -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 +255 -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 +23 -0
  115. package/dist/adapters/evm/web3-client.js +159 -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 +545 -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 +68 -0
  133. package/dist/adapters/solana/fees.js +205 -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/network.d.ts +24 -0
  148. package/dist/adapters/solana/network.js +95 -0
  149. package/dist/adapters/solana/network.js.map +1 -0
  150. package/dist/adapters/solana/plugin.d.ts +18 -0
  151. package/dist/adapters/solana/plugin.js +41 -0
  152. package/dist/adapters/solana/plugin.js.map +1 -0
  153. package/dist/adapters/solana/presets.d.ts +2 -0
  154. package/dist/adapters/solana/presets.js +77 -0
  155. package/dist/adapters/solana/presets.js.map +1 -0
  156. package/dist/adapters/solana/programs.d.ts +44 -0
  157. package/dist/adapters/solana/programs.js +159 -0
  158. package/dist/adapters/solana/programs.js.map +1 -0
  159. package/dist/adapters/solana/proofs.d.ts +56 -0
  160. package/dist/adapters/solana/proofs.js +540 -0
  161. package/dist/adapters/solana/proofs.js.map +1 -0
  162. package/dist/adapters/solana/reader.d.ts +82 -0
  163. package/dist/adapters/solana/reader.js +326 -0
  164. package/dist/adapters/solana/reader.js.map +1 -0
  165. package/dist/adapters/solana/rpc.d.ts +102 -0
  166. package/dist/adapters/solana/rpc.js +301 -0
  167. package/dist/adapters/solana/rpc.js.map +1 -0
  168. package/dist/adapters/solana/tokens.d.ts +7 -0
  169. package/dist/adapters/solana/tokens.js +19 -0
  170. package/dist/adapters/solana/tokens.js.map +1 -0
  171. package/dist/adapters/solana/types.d.ts +121 -0
  172. package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
  173. package/dist/adapters/solana/types.js.map +1 -0
  174. package/dist/adapters/solana/web3.d.ts +5 -0
  175. package/dist/adapters/solana/web3.js +83 -0
  176. package/dist/adapters/solana/web3.js.map +1 -0
  177. package/dist/adapters/solana/wire.d.ts +62 -0
  178. package/dist/adapters/solana/wire.js +168 -0
  179. package/dist/adapters/solana/wire.js.map +1 -0
  180. package/dist/adapters/ton/address.d.ts +43 -0
  181. package/dist/adapters/ton/address.js +168 -0
  182. package/dist/adapters/ton/address.js.map +1 -0
  183. package/dist/adapters/ton/api.d.ts +344 -0
  184. package/dist/adapters/ton/api.js +942 -0
  185. package/dist/adapters/ton/api.js.map +1 -0
  186. package/dist/adapters/ton/builder.d.ts +18 -0
  187. package/dist/adapters/ton/builder.js +701 -0
  188. package/dist/adapters/ton/builder.js.map +1 -0
  189. package/dist/adapters/ton/chains.d.ts +16 -0
  190. package/dist/adapters/ton/chains.js +39 -0
  191. package/dist/adapters/ton/chains.js.map +1 -0
  192. package/dist/adapters/ton/decode.d.ts +43 -0
  193. package/dist/adapters/ton/decode.js +219 -0
  194. package/dist/adapters/ton/decode.js.map +1 -0
  195. package/dist/adapters/ton/driver.d.ts +10 -0
  196. package/dist/adapters/ton/driver.js +117 -0
  197. package/dist/adapters/ton/driver.js.map +1 -0
  198. package/dist/adapters/ton/errors.d.ts +36 -0
  199. package/dist/adapters/ton/errors.js +89 -0
  200. package/dist/adapters/ton/errors.js.map +1 -0
  201. package/dist/adapters/ton/fees.d.ts +28 -0
  202. package/dist/adapters/ton/fees.js +121 -0
  203. package/dist/adapters/ton/fees.js.map +1 -0
  204. package/dist/adapters/ton/index.d.ts +16 -0
  205. package/dist/adapters/ton/index.js +9 -0
  206. package/dist/adapters/ton/index.js.map +1 -0
  207. package/dist/adapters/ton/messages.d.ts +157 -0
  208. package/dist/adapters/ton/messages.js +397 -0
  209. package/dist/adapters/ton/messages.js.map +1 -0
  210. package/dist/adapters/ton/native-client.d.ts +10 -0
  211. package/dist/adapters/ton/native-client.js +47 -0
  212. package/dist/adapters/ton/native-client.js.map +1 -0
  213. package/dist/adapters/ton/network.d.ts +58 -0
  214. package/dist/adapters/ton/network.js +207 -0
  215. package/dist/adapters/ton/network.js.map +1 -0
  216. package/dist/adapters/ton/plugin.d.ts +24 -0
  217. package/dist/adapters/ton/plugin.js +57 -0
  218. package/dist/adapters/ton/plugin.js.map +1 -0
  219. package/dist/adapters/ton/presets.d.ts +6 -0
  220. package/dist/adapters/ton/presets.js +94 -0
  221. package/dist/adapters/ton/presets.js.map +1 -0
  222. package/dist/adapters/ton/proofs.d.ts +66 -0
  223. package/dist/adapters/ton/proofs.js +813 -0
  224. package/dist/adapters/ton/proofs.js.map +1 -0
  225. package/dist/adapters/ton/reader.d.ts +194 -0
  226. package/dist/adapters/ton/reader.js +781 -0
  227. package/dist/adapters/ton/reader.js.map +1 -0
  228. package/dist/adapters/ton/tokens.d.ts +10 -0
  229. package/dist/adapters/ton/tokens.js +27 -0
  230. package/dist/adapters/ton/tokens.js.map +1 -0
  231. package/dist/adapters/ton/trace.d.ts +48 -0
  232. package/dist/adapters/ton/trace.js +277 -0
  233. package/dist/adapters/ton/trace.js.map +1 -0
  234. package/dist/adapters/ton/types.d.ts +105 -0
  235. package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
  236. package/dist/adapters/ton/types.js.map +1 -0
  237. package/dist/adapters/ton/wallets.d.ts +86 -0
  238. package/dist/adapters/ton/wallets.js +373 -0
  239. package/dist/adapters/ton/wallets.js.map +1 -0
  240. package/dist/adapters/tron/abi.d.ts +39 -0
  241. package/dist/adapters/tron/abi.js +110 -0
  242. package/dist/adapters/tron/abi.js.map +1 -0
  243. package/dist/adapters/tron/address.d.ts +20 -0
  244. package/dist/adapters/tron/address.js +110 -0
  245. package/dist/adapters/tron/address.js.map +1 -0
  246. package/dist/adapters/tron/builder.d.ts +12 -0
  247. package/dist/adapters/tron/builder.js +553 -0
  248. package/dist/adapters/tron/builder.js.map +1 -0
  249. package/dist/adapters/tron/chains.d.ts +12 -0
  250. package/dist/adapters/tron/chains.js +35 -0
  251. package/dist/adapters/tron/chains.js.map +1 -0
  252. package/dist/adapters/tron/codec.d.ts +10 -0
  253. package/dist/adapters/tron/codec.js +322 -0
  254. package/dist/adapters/tron/codec.js.map +1 -0
  255. package/dist/adapters/tron/decode.d.ts +50 -0
  256. package/dist/adapters/tron/decode.js +280 -0
  257. package/dist/adapters/tron/decode.js.map +1 -0
  258. package/dist/adapters/tron/driver.d.ts +12 -0
  259. package/dist/adapters/tron/driver.js +106 -0
  260. package/dist/adapters/tron/driver.js.map +1 -0
  261. package/dist/adapters/tron/errors.d.ts +74 -0
  262. package/dist/adapters/tron/errors.js +261 -0
  263. package/dist/adapters/tron/errors.js.map +1 -0
  264. package/dist/adapters/tron/fees.d.ts +49 -0
  265. package/dist/adapters/tron/fees.js +166 -0
  266. package/dist/adapters/tron/fees.js.map +1 -0
  267. package/dist/adapters/tron/http.d.ts +173 -0
  268. package/dist/adapters/tron/http.js +729 -0
  269. package/dist/adapters/tron/http.js.map +1 -0
  270. package/dist/adapters/tron/index.d.ts +16 -0
  271. package/dist/adapters/tron/index.js +15 -0
  272. package/dist/adapters/tron/index.js.map +1 -0
  273. package/dist/adapters/tron/network.d.ts +44 -0
  274. package/dist/adapters/tron/network.js +163 -0
  275. package/dist/adapters/tron/network.js.map +1 -0
  276. package/dist/adapters/tron/plugin.d.ts +17 -0
  277. package/dist/adapters/tron/plugin.js +39 -0
  278. package/dist/adapters/tron/plugin.js.map +1 -0
  279. package/dist/adapters/tron/presets.d.ts +5 -0
  280. package/dist/adapters/tron/presets.js +68 -0
  281. package/dist/adapters/tron/presets.js.map +1 -0
  282. package/dist/adapters/tron/proofs.d.ts +80 -0
  283. package/dist/adapters/tron/proofs.js +370 -0
  284. package/dist/adapters/tron/proofs.js.map +1 -0
  285. package/dist/adapters/tron/protobuf.d.ts +36 -0
  286. package/dist/adapters/tron/protobuf.js +90 -0
  287. package/dist/adapters/tron/protobuf.js.map +1 -0
  288. package/dist/adapters/tron/reader.d.ts +47 -0
  289. package/dist/adapters/tron/reader.js +203 -0
  290. package/dist/adapters/tron/reader.js.map +1 -0
  291. package/dist/adapters/tron/tokens.d.ts +7 -0
  292. package/dist/adapters/tron/tokens.js +14 -0
  293. package/dist/adapters/tron/tokens.js.map +1 -0
  294. package/dist/adapters/tron/types.d.ts +166 -0
  295. package/dist/adapters/tron/types.js +3 -0
  296. package/dist/adapters/tron/types.js.map +1 -0
  297. package/dist/adapters/utxo/address.d.ts +51 -0
  298. package/dist/adapters/utxo/address.js +341 -0
  299. package/dist/adapters/utxo/address.js.map +1 -0
  300. package/dist/adapters/utxo/builder.d.ts +35 -0
  301. package/dist/adapters/utxo/builder.js +380 -0
  302. package/dist/adapters/utxo/builder.js.map +1 -0
  303. package/dist/adapters/utxo/chains.d.ts +17 -0
  304. package/dist/adapters/utxo/chains.js +99 -0
  305. package/dist/adapters/utxo/chains.js.map +1 -0
  306. package/dist/adapters/utxo/codec.d.ts +120 -0
  307. package/dist/adapters/utxo/codec.js +408 -0
  308. package/dist/adapters/utxo/codec.js.map +1 -0
  309. package/dist/adapters/utxo/coinselect.d.ts +48 -0
  310. package/dist/adapters/utxo/coinselect.js +131 -0
  311. package/dist/adapters/utxo/coinselect.js.map +1 -0
  312. package/dist/adapters/utxo/context.d.ts +57 -0
  313. package/dist/adapters/utxo/context.js +118 -0
  314. package/dist/adapters/utxo/context.js.map +1 -0
  315. package/dist/adapters/utxo/decode.d.ts +14 -0
  316. package/dist/adapters/utxo/decode.js +85 -0
  317. package/dist/adapters/utxo/decode.js.map +1 -0
  318. package/dist/adapters/utxo/driver.d.ts +16 -0
  319. package/dist/adapters/utxo/driver.js +74 -0
  320. package/dist/adapters/utxo/driver.js.map +1 -0
  321. package/dist/adapters/utxo/ecc.d.ts +9 -0
  322. package/dist/adapters/utxo/ecc.js +26 -0
  323. package/dist/adapters/utxo/ecc.js.map +1 -0
  324. package/dist/adapters/utxo/errors.d.ts +52 -0
  325. package/dist/adapters/utxo/errors.js +191 -0
  326. package/dist/adapters/utxo/errors.js.map +1 -0
  327. package/dist/adapters/utxo/esplora.d.ts +79 -0
  328. package/dist/adapters/utxo/esplora.js +451 -0
  329. package/dist/adapters/utxo/esplora.js.map +1 -0
  330. package/dist/adapters/utxo/fees.d.ts +41 -0
  331. package/dist/adapters/utxo/fees.js +125 -0
  332. package/dist/adapters/utxo/fees.js.map +1 -0
  333. package/dist/adapters/utxo/index.d.ts +17 -0
  334. package/dist/adapters/utxo/index.js +8 -0
  335. package/dist/adapters/utxo/index.js.map +1 -0
  336. package/dist/adapters/utxo/network.d.ts +50 -0
  337. package/dist/adapters/utxo/network.js +165 -0
  338. package/dist/adapters/utxo/network.js.map +1 -0
  339. package/dist/adapters/utxo/plugin.d.ts +17 -0
  340. package/dist/adapters/utxo/plugin.js +41 -0
  341. package/dist/adapters/utxo/plugin.js.map +1 -0
  342. package/dist/adapters/utxo/presets.d.ts +12 -0
  343. package/dist/adapters/utxo/presets.js +47 -0
  344. package/dist/adapters/utxo/presets.js.map +1 -0
  345. package/dist/adapters/utxo/preview.d.ts +3 -0
  346. package/dist/adapters/utxo/preview.js +65 -0
  347. package/dist/adapters/utxo/preview.js.map +1 -0
  348. package/dist/adapters/utxo/proofs.d.ts +57 -0
  349. package/dist/adapters/utxo/proofs.js +331 -0
  350. package/dist/adapters/utxo/proofs.js.map +1 -0
  351. package/dist/adapters/utxo/rawtx.d.ts +59 -0
  352. package/dist/adapters/utxo/rawtx.js +234 -0
  353. package/dist/adapters/utxo/rawtx.js.map +1 -0
  354. package/dist/adapters/utxo/reader.d.ts +36 -0
  355. package/dist/adapters/utxo/reader.js +265 -0
  356. package/dist/adapters/utxo/reader.js.map +1 -0
  357. package/dist/adapters/utxo/sdk.d.ts +18 -0
  358. package/dist/adapters/utxo/sdk.js +17 -0
  359. package/dist/adapters/utxo/sdk.js.map +1 -0
  360. package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
  361. package/dist/adapters/utxo/signed-psbt.js +428 -0
  362. package/dist/adapters/utxo/signed-psbt.js.map +1 -0
  363. package/dist/adapters/utxo/spend.d.ts +59 -0
  364. package/dist/adapters/utxo/spend.js +230 -0
  365. package/dist/adapters/utxo/spend.js.map +1 -0
  366. package/dist/adapters/utxo/types.d.ts +167 -0
  367. package/dist/adapters/utxo/types.js +3 -0
  368. package/dist/adapters/utxo/types.js.map +1 -0
  369. package/dist/core/assets/service.d.ts +18 -0
  370. package/dist/core/assets/service.js +69 -0
  371. package/dist/core/assets/service.js.map +1 -0
  372. package/dist/core/blockchain/default-ref.d.ts +4 -0
  373. package/dist/core/blockchain/default-ref.js +16 -0
  374. package/dist/core/blockchain/default-ref.js.map +1 -0
  375. package/dist/core/blockchain/handle.d.ts +200 -0
  376. package/dist/core/blockchain/handle.js +579 -0
  377. package/dist/core/blockchain/handle.js.map +1 -0
  378. package/dist/core/blockchain/internal.d.ts +19 -0
  379. package/dist/core/blockchain/internal.js +16 -0
  380. package/dist/core/blockchain/internal.js.map +1 -0
  381. package/dist/core/blockchain/mapping.d.ts +22 -0
  382. package/dist/core/blockchain/mapping.js +136 -0
  383. package/dist/core/blockchain/mapping.js.map +1 -0
  384. package/dist/core/config/env.d.ts +8 -0
  385. package/dist/core/config/env.js +60 -0
  386. package/dist/core/config/env.js.map +1 -0
  387. package/dist/core/config/merge.d.ts +26 -0
  388. package/dist/core/config/merge.js +144 -0
  389. package/dist/core/config/merge.js.map +1 -0
  390. package/dist/core/config/resolve.d.ts +12 -0
  391. package/dist/core/config/resolve.js +251 -0
  392. package/dist/core/config/resolve.js.map +1 -0
  393. package/dist/core/config/types.d.ts +165 -0
  394. package/dist/core/config/types.js +3 -0
  395. package/dist/core/config/types.js.map +1 -0
  396. package/dist/core/container/builtins.d.ts +4 -0
  397. package/dist/core/container/builtins.js +13 -0
  398. package/dist/core/container/builtins.js.map +1 -0
  399. package/dist/core/container/container.d.ts +69 -0
  400. package/dist/core/container/container.js +466 -0
  401. package/dist/core/container/container.js.map +1 -0
  402. package/dist/core/container/default.d.ts +15 -0
  403. package/dist/core/container/default.js +70 -0
  404. package/dist/core/container/default.js.map +1 -0
  405. package/dist/core/container/internals.d.ts +54 -0
  406. package/dist/core/container/internals.js +21 -0
  407. package/dist/core/container/internals.js.map +1 -0
  408. package/dist/core/container/pool.d.ts +27 -0
  409. package/dist/core/container/pool.js +77 -0
  410. package/dist/core/container/pool.js.map +1 -0
  411. package/dist/core/driver/types.d.ts +346 -0
  412. package/dist/core/driver/types.js +3 -0
  413. package/dist/core/driver/types.js.map +1 -0
  414. package/dist/core/errors/codes.d.ts +153 -0
  415. package/dist/core/errors/codes.js +49 -0
  416. package/dist/core/errors/codes.js.map +1 -0
  417. package/dist/core/errors/error.d.ts +66 -0
  418. package/dist/core/errors/error.js +129 -0
  419. package/dist/core/errors/error.js.map +1 -0
  420. package/dist/core/events/bus.d.ts +12 -0
  421. package/dist/core/events/bus.js +46 -0
  422. package/dist/core/events/bus.js.map +1 -0
  423. package/dist/core/events/logger.d.ts +13 -0
  424. package/dist/core/events/logger.js +42 -0
  425. package/dist/core/events/logger.js.map +1 -0
  426. package/dist/core/events/types.d.ts +131 -0
  427. package/dist/core/events/types.js +3 -0
  428. package/dist/core/events/types.js.map +1 -0
  429. package/dist/core/lifecycle/engine-rules.d.ts +107 -0
  430. package/dist/core/lifecycle/engine-rules.js +257 -0
  431. package/dist/core/lifecycle/engine-rules.js.map +1 -0
  432. package/dist/core/lifecycle/engine.d.ts +500 -0
  433. package/dist/core/lifecycle/engine.js +1732 -0
  434. package/dist/core/lifecycle/engine.js.map +1 -0
  435. package/dist/core/lifecycle/evaluate.d.ts +19 -0
  436. package/dist/core/lifecycle/evaluate.js +72 -0
  437. package/dist/core/lifecycle/evaluate.js.map +1 -0
  438. package/dist/core/lifecycle/intent.d.ts +11 -0
  439. package/dist/core/lifecycle/intent.js +88 -0
  440. package/dist/core/lifecycle/intent.js.map +1 -0
  441. package/dist/core/lifecycle/monitor.d.ts +138 -0
  442. package/dist/core/lifecycle/monitor.js +606 -0
  443. package/dist/core/lifecycle/monitor.js.map +1 -0
  444. package/dist/core/lifecycle/observations.d.ts +17 -0
  445. package/dist/core/lifecycle/observations.js +59 -0
  446. package/dist/core/lifecycle/observations.js.map +1 -0
  447. package/dist/core/lifecycle/reconcile.d.ts +58 -0
  448. package/dist/core/lifecycle/reconcile.js +112 -0
  449. package/dist/core/lifecycle/reconcile.js.map +1 -0
  450. package/dist/core/lifecycle/views.d.ts +49 -0
  451. package/dist/core/lifecycle/views.js +57 -0
  452. package/dist/core/lifecycle/views.js.map +1 -0
  453. package/dist/core/lifecycle/workers.d.ts +82 -0
  454. package/dist/core/lifecycle/workers.js +329 -0
  455. package/dist/core/lifecycle/workers.js.map +1 -0
  456. package/dist/core/model/address.d.ts +32 -0
  457. package/dist/core/model/address.js +43 -0
  458. package/dist/core/model/address.js.map +1 -0
  459. package/dist/core/model/amount.d.ts +25 -0
  460. package/dist/core/model/amount.js +102 -0
  461. package/dist/core/model/amount.js.map +1 -0
  462. package/dist/core/model/asset.d.ts +28 -0
  463. package/dist/core/model/asset.js +47 -0
  464. package/dist/core/model/asset.js.map +1 -0
  465. package/dist/core/model/capability.d.ts +3 -0
  466. package/dist/core/model/capability.js +18 -0
  467. package/dist/core/model/capability.js.map +1 -0
  468. package/dist/core/model/chain.d.ts +63 -0
  469. package/dist/core/model/chain.js +8 -0
  470. package/dist/core/model/chain.js.map +1 -0
  471. package/dist/core/model/fee.d.ts +36 -0
  472. package/dist/core/model/fee.js +17 -0
  473. package/dist/core/model/fee.js.map +1 -0
  474. package/dist/core/model/ids.d.ts +37 -0
  475. package/dist/core/model/ids.js +13 -0
  476. package/dist/core/model/ids.js.map +1 -0
  477. package/dist/core/model/intent.d.ts +63 -0
  478. package/dist/core/model/intent.js +81 -0
  479. package/dist/core/model/intent.js.map +1 -0
  480. package/dist/core/model/ordering.d.ts +20 -0
  481. package/dist/core/model/ordering.js +29 -0
  482. package/dist/core/model/ordering.js.map +1 -0
  483. package/dist/core/model/transaction.d.ts +116 -0
  484. package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
  485. package/dist/core/model/transaction.js.map +1 -0
  486. package/dist/core/observe/scanner.d.ts +135 -0
  487. package/dist/core/observe/scanner.js +355 -0
  488. package/dist/core/observe/scanner.js.map +1 -0
  489. package/dist/core/ordering/reservations.d.ts +16 -0
  490. package/dist/core/ordering/reservations.js +53 -0
  491. package/dist/core/ordering/reservations.js.map +1 -0
  492. package/dist/core/ordering/sequence.d.ts +61 -0
  493. package/dist/core/ordering/sequence.js +155 -0
  494. package/dist/core/ordering/sequence.js.map +1 -0
  495. package/dist/core/registry/adapters.d.ts +10 -0
  496. package/dist/core/registry/adapters.js +56 -0
  497. package/dist/core/registry/adapters.js.map +1 -0
  498. package/dist/core/registry/assets.d.ts +18 -0
  499. package/dist/core/registry/assets.js +90 -0
  500. package/dist/core/registry/assets.js.map +1 -0
  501. package/dist/core/registry/chains.d.ts +10 -0
  502. package/dist/core/registry/chains.js +80 -0
  503. package/dist/core/registry/chains.js.map +1 -0
  504. package/dist/core/registry/plugin.d.ts +41 -0
  505. package/dist/core/registry/plugin.js +109 -0
  506. package/dist/core/registry/plugin.js.map +1 -0
  507. package/dist/core/registry/providers.d.ts +31 -0
  508. package/dist/core/registry/providers.js +43 -0
  509. package/dist/core/registry/providers.js.map +1 -0
  510. package/dist/core/registry/schemes.d.ts +30 -0
  511. package/dist/core/registry/schemes.js +84 -0
  512. package/dist/core/registry/schemes.js.map +1 -0
  513. package/dist/core/secret/fragments.d.ts +33 -0
  514. package/dist/core/secret/fragments.js +110 -0
  515. package/dist/core/secret/fragments.js.map +1 -0
  516. package/dist/core/secret/redact.d.ts +10 -0
  517. package/dist/core/secret/redact.js +110 -0
  518. package/dist/core/secret/redact.js.map +1 -0
  519. package/dist/core/secret/secret.d.ts +14 -0
  520. package/dist/core/secret/secret.js +42 -0
  521. package/dist/core/secret/secret.js.map +1 -0
  522. package/dist/core/signing/callback.d.ts +10 -0
  523. package/dist/core/signing/callback.js +22 -0
  524. package/dist/core/signing/callback.js.map +1 -0
  525. package/dist/core/signing/guard.d.ts +18 -0
  526. package/dist/core/signing/guard.js +72 -0
  527. package/dist/core/signing/guard.js.map +1 -0
  528. package/dist/core/signing/hd.d.ts +36 -0
  529. package/dist/core/signing/hd.js +167 -0
  530. package/dist/core/signing/hd.js.map +1 -0
  531. package/dist/core/signing/local.d.ts +48 -0
  532. package/dist/core/signing/local.js +190 -0
  533. package/dist/core/signing/local.js.map +1 -0
  534. package/dist/core/signing/orchestrator.d.ts +40 -0
  535. package/dist/core/signing/orchestrator.js +300 -0
  536. package/dist/core/signing/orchestrator.js.map +1 -0
  537. package/dist/core/signing/types.d.ts +64 -0
  538. package/dist/core/signing/types.js +3 -0
  539. package/dist/core/signing/types.js.map +1 -0
  540. package/dist/core/signing/wallet.d.ts +48 -0
  541. package/dist/core/signing/wallet.js +153 -0
  542. package/dist/core/signing/wallet.js.map +1 -0
  543. package/dist/core/store/clone.d.ts +25 -0
  544. package/dist/core/store/clone.js +71 -0
  545. package/dist/core/store/clone.js.map +1 -0
  546. package/dist/core/store/memory.d.ts +38 -0
  547. package/dist/core/store/memory.js +325 -0
  548. package/dist/core/store/memory.js.map +1 -0
  549. package/dist/core/store/types.d.ts +246 -0
  550. package/dist/core/store/types.js +117 -0
  551. package/dist/core/store/types.js.map +1 -0
  552. package/dist/core/transport/backoff.d.ts +8 -0
  553. package/dist/core/transport/backoff.js +27 -0
  554. package/dist/core/transport/backoff.js.map +1 -0
  555. package/dist/core/transport/circuit.d.ts +25 -0
  556. package/dist/core/transport/circuit.js +61 -0
  557. package/dist/core/transport/circuit.js.map +1 -0
  558. package/dist/core/transport/http-transport.d.ts +30 -0
  559. package/dist/core/transport/http-transport.js +1695 -0
  560. package/dist/core/transport/http-transport.js.map +1 -0
  561. package/dist/core/transport/rate-limit.d.ts +27 -0
  562. package/dist/core/transport/rate-limit.js +78 -0
  563. package/dist/core/transport/rate-limit.js.map +1 -0
  564. package/dist/core/transport/stale-view.d.ts +11 -0
  565. package/dist/core/transport/stale-view.js +17 -0
  566. package/dist/core/transport/stale-view.js.map +1 -0
  567. package/dist/core/transport/types.d.ts +144 -0
  568. package/dist/core/transport/types.js +6 -0
  569. package/dist/core/transport/types.js.map +1 -0
  570. package/dist/core/util/bytes.d.ts +9 -0
  571. package/dist/core/util/bytes.js +40 -0
  572. package/dist/core/util/bytes.js.map +1 -0
  573. package/dist/core/util/clock.d.ts +6 -0
  574. package/dist/core/util/clock.js +26 -0
  575. package/dist/core/util/clock.js.map +1 -0
  576. package/dist/core/util/freeze.d.ts +8 -0
  577. package/dist/core/util/freeze.js +31 -0
  578. package/dist/core/util/freeze.js.map +1 -0
  579. package/dist/core/util/json.d.ts +29 -0
  580. package/dist/core/util/json.js +165 -0
  581. package/dist/core/util/json.js.map +1 -0
  582. package/dist/core/util/names.d.ts +21 -0
  583. package/dist/core/util/names.js +46 -0
  584. package/dist/core/util/names.js.map +1 -0
  585. package/dist/index.d.ts +64 -14
  586. package/dist/index.js +105 -49
  587. package/dist/index.js.map +1 -1
  588. package/dist/native.d.ts +21 -0
  589. package/dist/native.js +44 -0
  590. package/dist/native.js.map +1 -0
  591. package/dist/testing/contracts/api.d.ts +12 -0
  592. package/dist/testing/contracts/api.js +58 -0
  593. package/dist/testing/contracts/api.js.map +1 -0
  594. package/dist/testing/contracts/cursors.d.ts +6 -0
  595. package/dist/testing/contracts/cursors.js +43 -0
  596. package/dist/testing/contracts/cursors.js.map +1 -0
  597. package/dist/testing/contracts/locks.d.ts +10 -0
  598. package/dist/testing/contracts/locks.js +63 -0
  599. package/dist/testing/contracts/locks.js.map +1 -0
  600. package/dist/testing/contracts/operations.d.ts +21 -0
  601. package/dist/testing/contracts/operations.js +718 -0
  602. package/dist/testing/contracts/operations.js.map +1 -0
  603. package/dist/testing/contracts/sequences.d.ts +6 -0
  604. package/dist/testing/contracts/sequences.js +68 -0
  605. package/dist/testing/contracts/sequences.js.map +1 -0
  606. package/dist/testing/env.d.ts +63 -0
  607. package/dist/testing/env.js +105 -0
  608. package/dist/testing/env.js.map +1 -0
  609. package/dist/testing/fake-chain.d.ts +118 -0
  610. package/dist/testing/fake-chain.js +536 -0
  611. package/dist/testing/fake-chain.js.map +1 -0
  612. package/dist/testing/fake-clock.d.ts +15 -0
  613. package/dist/testing/fake-clock.js +86 -0
  614. package/dist/testing/fake-clock.js.map +1 -0
  615. package/dist/testing/fake-driver.d.ts +15 -0
  616. package/dist/testing/fake-driver.js +458 -0
  617. package/dist/testing/fake-driver.js.map +1 -0
  618. package/dist/testing/fake-fetch.d.ts +32 -0
  619. package/dist/testing/fake-fetch.js +81 -0
  620. package/dist/testing/fake-fetch.js.map +1 -0
  621. package/dist/testing/fake-plugin.d.ts +30 -0
  622. package/dist/testing/fake-plugin.js +66 -0
  623. package/dist/testing/fake-plugin.js.map +1 -0
  624. package/dist/testing/faulty-store.d.ts +36 -0
  625. package/dist/testing/faulty-store.js +66 -0
  626. package/dist/testing/faulty-store.js.map +1 -0
  627. package/dist/testing/generation.d.ts +60 -0
  628. package/dist/testing/generation.js +252 -0
  629. package/dist/testing/generation.js.map +1 -0
  630. package/dist/testing/index.d.ts +28 -0
  631. package/dist/testing/index.js +51 -0
  632. package/dist/testing/index.js.map +1 -0
  633. package/package.json +188 -45
  634. package/dist/libs/eth/account.d.ts +0 -9
  635. package/dist/libs/eth/account.js +0 -58
  636. package/dist/libs/eth/account.js.map +0 -1
  637. package/dist/libs/eth/contract.d.ts +0 -7
  638. package/dist/libs/eth/contract.js +0 -42
  639. package/dist/libs/eth/contract.js.map +0 -1
  640. package/dist/libs/eth/index.d.ts +0 -24
  641. package/dist/libs/eth/index.js +0 -72
  642. package/dist/libs/eth/index.js.map +0 -1
  643. package/dist/libs/eth/transact.d.ts +0 -7
  644. package/dist/libs/eth/transact.js +0 -26
  645. package/dist/libs/eth/transact.js.map +0 -1
  646. package/dist/libs/index.d.ts +0 -2
  647. package/dist/libs/index.js +0 -19
  648. package/dist/libs/index.js.map +0 -1
  649. package/dist/libs/trx/account.d.ts +0 -9
  650. package/dist/libs/trx/account.js +0 -55
  651. package/dist/libs/trx/account.js.map +0 -1
  652. package/dist/libs/trx/contract.d.ts +0 -7
  653. package/dist/libs/trx/contract.js +0 -27
  654. package/dist/libs/trx/contract.js.map +0 -1
  655. package/dist/libs/trx/index.d.ts +0 -22
  656. package/dist/libs/trx/index.js +0 -64
  657. package/dist/libs/trx/index.js.map +0 -1
  658. package/dist/libs/trx/transact.d.ts +0 -7
  659. package/dist/libs/trx/transact.js +0 -26
  660. package/dist/libs/trx/transact.js.map +0 -1
  661. package/dist/tool/common.d.ts +0 -28
  662. package/dist/tool/common.js +0 -33
  663. package/dist/tool/common.js.map +0 -1
  664. package/dist/tool/eth-tools.d.ts +0 -3
  665. package/dist/tool/eth-tools.js +0 -33
  666. package/dist/tool/eth-tools.js.map +0 -1
  667. package/dist/tool/index.d.ts +0 -5
  668. package/dist/tool/index.js +0 -22
  669. package/dist/tool/index.js.map +0 -1
  670. package/dist/tool/logging.d.ts +0 -3
  671. package/dist/tool/logging.js +0 -11
  672. package/dist/tool/logging.js.map +0 -1
  673. package/dist/tool/options.d.ts +0 -6
  674. package/dist/tool/options.js +0 -41
  675. package/dist/tool/options.js.map +0 -1
  676. package/dist/tool/trx-tools.d.ts +0 -3
  677. package/dist/tool/trx-tools.js +0 -20
  678. package/dist/tool/trx-tools.js.map +0 -1
  679. package/dist/type/account.d.ts +0 -9
  680. package/dist/type/account.js.map +0 -1
  681. package/dist/type/common.d.ts +0 -18
  682. package/dist/type/common.js.map +0 -1
  683. package/dist/type/contract.d.ts +0 -10
  684. package/dist/type/contract.js.map +0 -1
  685. package/dist/type/index.d.ts +0 -5
  686. package/dist/type/index.js +0 -22
  687. package/dist/type/index.js.map +0 -1
  688. package/dist/type/lib-types.d.ts +0 -9
  689. package/dist/type/lib-types.js.map +0 -1
  690. package/dist/type/transact.d.ts +0 -7
  691. package/dist/type/transact.js.map +0 -1
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Broadcast classification (pure). Esplora forwards bitcoind's `sendrawtransaction` error as
3
+ * an HTTP 400 body, in one of two formats:
4
+ * - Blockstream electrs: `sendrawtransaction RPC error -26: min relay fee not met, 100 < 141`
5
+ * - mempool/electrs: `sendrawtransaction RPC error: {"code":-26,"message":"min relay fee …"}`
6
+ *
7
+ * `rejected` only for exact, anchored reject reasons that make these
8
+ * bytes invalid by consensus on every node (bitcoind's `CheckTransaction` and consensus
9
+ * script checks, and an undecodable transaction); everything that depends on state, policy
10
+ * or node configuration is `refused`, which is also the default for unknown texts. A
11
+ * `rejected` reason counts only under the code bitcoind answers it with, so a text outside
12
+ * bitcoind's structured answer never ends an Attempt. Reasons are fixed literals: bitcoind's
13
+ * texts carry txids, amounts and fee rates, which a stored reason must never hold.
14
+ *
15
+ * A node's rejection is a claim. `nodeClaim` only parses what the node
16
+ * claims, and a claimed consensus failure is `invalid`, a kind no `Broadcaster` may return.
17
+ * `classifyOwnBroadcast`, the only classifier, keeps a `rejected` only when the claimed reason
18
+ * holds for the bytes that were sent, checked here, and makes every other one `refused`
19
+ * (non-terminal). No export takes the node at its word.
20
+ */
21
+ import type { BroadcastResult } from '../../core/driver/types';
22
+ export interface NodeError {
23
+ readonly code?: number;
24
+ readonly message: string;
25
+ }
26
+ /**
27
+ * The bitcoind error inside an Esplora 400 body, or the body's head when it is neither
28
+ * format.
29
+ */
30
+ export declare function parseNodeError(body: string): NodeError;
31
+ /**
32
+ * What bitcoind's answer claims, parsed: it decides nothing. A claimed consensus failure is
33
+ * `invalid`, which is no `BroadcastResult`: only `classifyOwnBroadcast` turns it into a
34
+ * `rejected` verdict, and only for bytes its reason holds for.
35
+ */
36
+ export type NodeClaim = Extract<BroadcastResult, {
37
+ readonly kind: 'already-known' | 'refused';
38
+ }> | {
39
+ readonly kind: 'invalid';
40
+ readonly reason: string;
41
+ };
42
+ export declare function nodeClaim(error: NodeError): NodeClaim;
43
+ /**
44
+ * The node's answer to the hex this driver sent. A terminal `rejected` frees the
45
+ * Attempt's inputs for a caller's retry, and if a lying or buggy endpoint relayed the bytes
46
+ * before it claimed them invalid, the retry and the original can both confirm: a double
47
+ * payment. So a rejection stands only when its claimed reason holds for those bytes, decoded
48
+ * here (whether they decode is always this module's own finding): an undecodable
49
+ * hex for `TX decode failed`, a byte rule for a `CheckTransaction` reason. Anything else is
50
+ * `refused`.
51
+ */
52
+ export declare function classifyOwnBroadcast(error: NodeError, sentHex: string): BroadcastResult;
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseNodeError = parseNodeError;
4
+ exports.nodeClaim = nodeClaim;
5
+ exports.classifyOwnBroadcast = classifyOwnBroadcast;
6
+ const rawtx_1 = require("./rawtx");
7
+ /**
8
+ * Only a body's head is read. bitcoind's code and reject reason come first and its
9
+ * texts are far shorter; unbounded, the mempool/electrs pattern is quadratic in the length.
10
+ */
11
+ const MAX_BODY = 1_024;
12
+ /**
13
+ * The bitcoind error inside an Esplora 400 body, or the body's head when it is neither
14
+ * format.
15
+ */
16
+ function parseNodeError(body) {
17
+ const text = body.slice(0, MAX_BODY).trim();
18
+ const json = /RPC error: (\{.*\})$/s.exec(text);
19
+ if (json) {
20
+ try {
21
+ const parsed = JSON.parse(json[1]);
22
+ if (typeof parsed.message === 'string') {
23
+ return {
24
+ ...(typeof parsed.code === 'number' ? { code: parsed.code } : {}),
25
+ message: parsed.message,
26
+ };
27
+ }
28
+ }
29
+ catch {
30
+ // Fall through: not the mempool/electrs format after all.
31
+ }
32
+ }
33
+ // The transport keeps only the first 300 characters of a 400 body (`details.body`), which
34
+ // leaves the JSON of a long message unterminated: its code and the head of its message
35
+ // classify it as the Blockstream format of the same answer does.
36
+ const cut = /RPC error: \{"code":(-?\d+),"message":"(.*)$/s.exec(text);
37
+ if (cut)
38
+ return { code: Number(cut[1]), message: cut[2] };
39
+ const plain = /RPC error (-?\d+): (.*)$/s.exec(text);
40
+ if (plain)
41
+ return { code: Number(plain[1]), message: plain[2] };
42
+ return { message: text };
43
+ }
44
+ /** A reject reason at the start of the message, followed by nothing, `,`, `.` or a space. */
45
+ const reason = (...names) => new RegExp(`^(?:${names.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|')})(?:$|,| \\(|\\.| )`);
46
+ const ALREADY_KNOWN = reason('txn-already-in-mempool', 'txn-already-known', 'txn-same-nonwitness-data-in-mempool', 'Transaction outputs already in utxo set', 'Transaction already in block chain');
47
+ /** bitcoind's -22 (`RPC_DESERIALIZATION_ERROR`) reason: the hex does not decode. */
48
+ const DECODE_FAILED = 'TX decode failed';
49
+ /**
50
+ * Consensus failures of these exact bytes (bitcoind `CheckTransaction`, consensus scripts),
51
+ * each under the code bitcoind answers it with: -26 (`RPC_VERIFY_REJECTED`, a mempool
52
+ * rejection) or -22 (`RPC_DESERIALIZATION_ERROR`, undecodable hex).
53
+ */
54
+ const REJECTED = [
55
+ [
56
+ -26,
57
+ [
58
+ 'bad-txns-vin-empty',
59
+ 'bad-txns-vout-empty',
60
+ 'bad-txns-oversize',
61
+ 'bad-txns-vout-negative',
62
+ 'bad-txns-vout-toolarge',
63
+ 'bad-txns-txouttotal-toolarge',
64
+ 'bad-txns-inputs-duplicate',
65
+ 'bad-txns-prevout-null',
66
+ 'bad-txns-in-belowout',
67
+ 'bad-txns-inputvalues-outofrange',
68
+ 'bad-txns-fee-outofrange',
69
+ 'coinbase',
70
+ ],
71
+ 'invalid by consensus rules',
72
+ ],
73
+ [
74
+ -26,
75
+ ['mandatory-script-verify-flag-failed', 'block-script-verify-flag-failed'],
76
+ 'script verification failed',
77
+ ],
78
+ [-22, [DECODE_FAILED], 'the transaction does not decode'],
79
+ ];
80
+ /** Each rejected reason's own anchored pattern, with the code and the verdict text. */
81
+ const CLAIMS = REJECTED.flatMap(([code, names, text]) => names.map((name) => [code, name, reason(name), text]));
82
+ /** The rejected reason bitcoind's answer claims, or `undefined` when it claims none. */
83
+ function claimedReason(error, message) {
84
+ return CLAIMS.find(([code, , pattern]) => error.code === code && pattern.test(message));
85
+ }
86
+ const FEE_TOO_LOW = reason('min relay fee not met', 'mempool min fee not met', 'insufficient fee');
87
+ const SPENT = reason('bad-txns-inputs-missingorspent', 'Missing inputs', 'Inputs missing or spent', 'txn-mempool-conflict', 'bad-txns-spends-conflicting-tx');
88
+ function nodeClaim(error) {
89
+ const message = error.message.trim();
90
+ if (ALREADY_KNOWN.test(message) || error.code === -27)
91
+ return { kind: 'already-known' };
92
+ const claim = claimedReason(error, message);
93
+ if (claim)
94
+ return { kind: 'invalid', reason: claim[3] };
95
+ if (FEE_TOO_LOW.test(message)) {
96
+ return { kind: 'refused', code: 'FEE_TOO_LOW', reason: 'fee too low for the node' };
97
+ }
98
+ if (SPENT.test(message)) {
99
+ return {
100
+ kind: 'refused',
101
+ code: 'TX_REFUSED',
102
+ reason: 'inputs missing or already spent',
103
+ };
104
+ }
105
+ return {
106
+ kind: 'refused',
107
+ code: 'TX_REFUSED',
108
+ reason: 'the node refused the transaction',
109
+ };
110
+ }
111
+ /** Bitcoin Core's `MAX_MONEY` and `MAX_BLOCK_WEIGHT`. */
112
+ const MAX_MONEY = 2100000000000000n;
113
+ const MAX_BLOCK_WEIGHT = 4_000_000;
114
+ const NULL_TXID = '0'.repeat(64);
115
+ const isNull = (input) => input.txid === NULL_TXID && input.vout === 0xffffffff;
116
+ const isCoinbase = (tx) => tx.inputs.length === 1 && isNull(tx.inputs[0]);
117
+ /**
118
+ * bitcoind's reasons the bytes alone decide (`CheckTransaction`, and ATMP's `coinbase`), each
119
+ * as bitcoind tests it. The others (`bad-txns-in-belowout`, `-inputvalues-outofrange`,
120
+ * `-fee-outofrange` and every script check) depend on the spent outputs, and have no rule: the
121
+ * builder spends only outputs whose value and script their previous transaction authenticates
122
+ * (every input, every wallet type, whatever `nonWitnessUtxo` says), and the core
123
+ * verifies every signature, so they cannot hold for our own bytes, and a node that claims one
124
+ * is not believed.
125
+ */
126
+ const BYTE_RULES = {
127
+ 'bad-txns-vin-empty': (tx) => tx.inputs.length === 0,
128
+ 'bad-txns-vout-empty': (tx) => tx.values.length === 0,
129
+ 'bad-txns-oversize': (tx) => tx.strippedSize * 4 > MAX_BLOCK_WEIGHT,
130
+ 'bad-txns-vout-negative': (tx) => tx.values.some((value) => value < 0n),
131
+ 'bad-txns-vout-toolarge': (tx) => tx.values.some((value) => value > MAX_MONEY),
132
+ // bitcoind's loop: each output in order, stopping at the first that fails.
133
+ 'bad-txns-txouttotal-toolarge': (tx) => {
134
+ let total = 0n;
135
+ for (const value of tx.values) {
136
+ if (value < 0n || value > MAX_MONEY)
137
+ return false; // `vout-negative`, `-toolarge`
138
+ total += value;
139
+ if (total > MAX_MONEY)
140
+ return true;
141
+ }
142
+ return false;
143
+ },
144
+ 'bad-txns-inputs-duplicate': (tx) => new Set(tx.inputs.map((input) => `${input.txid}:${input.vout}`)).size <
145
+ tx.inputs.length,
146
+ 'bad-txns-prevout-null': (tx) => !isCoinbase(tx) && tx.inputs.some(isNull),
147
+ coinbase: isCoinbase,
148
+ };
149
+ /** A rejection this driver cannot confirm for the bytes it sent: observed, never terminal. */
150
+ const UNCONFIRMED = {
151
+ kind: 'refused',
152
+ code: 'TX_REFUSED',
153
+ reason: 'the node claimed the transaction is invalid',
154
+ };
155
+ /**
156
+ * The hex that was sent, decoded as `sendrawtransaction` decodes it (`rawtx.ts` follows
157
+ * bitcoind's format, with no cap below the broadcaster's own), or `undefined` when bitcoind
158
+ * cannot decode it either.
159
+ */
160
+ function bytesOf(sentHex) {
161
+ const tx = (0, rawtx_1.readTxHex)(sentHex, { maxStripped: rawtx_1.MAX_TX_BYTES });
162
+ if (!tx)
163
+ return undefined;
164
+ return {
165
+ inputs: tx.inputs.map((input) => ({ txid: input.txid, vout: input.vout })),
166
+ values: tx.outputs.map((output) => output.value),
167
+ strippedSize: tx.strippedSize,
168
+ };
169
+ }
170
+ /**
171
+ * The node's answer to the hex this driver sent. A terminal `rejected` frees the
172
+ * Attempt's inputs for a caller's retry, and if a lying or buggy endpoint relayed the bytes
173
+ * before it claimed them invalid, the retry and the original can both confirm: a double
174
+ * payment. So a rejection stands only when its claimed reason holds for those bytes, decoded
175
+ * here (whether they decode is always this module's own finding): an undecodable
176
+ * hex for `TX decode failed`, a byte rule for a `CheckTransaction` reason. Anything else is
177
+ * `refused`.
178
+ */
179
+ function classifyOwnBroadcast(error, sentHex) {
180
+ const claim = nodeClaim(error);
181
+ if (claim.kind !== 'invalid')
182
+ return claim;
183
+ const bytes = bytesOf(sentHex);
184
+ const rejected = { kind: 'rejected', reason: claim.reason };
185
+ const name = claimedReason(error, error.message.trim())?.[1];
186
+ if (name === DECODE_FAILED)
187
+ return bytes === undefined ? rejected : UNCONFIRMED;
188
+ const rule = name !== undefined && Object.hasOwn(BYTE_RULES, name) ? BYTE_RULES[name] : undefined;
189
+ return bytes !== undefined && rule?.(bytes) ? rejected : UNCONFIRMED;
190
+ }
191
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/adapters/utxo/errors.ts"],"names":[],"mappings":";;AAsCA,wCA2BC;AAmFD,8BAoBC;AAsFD,oDAUC;AAnPD,mCAAkD;AAOlD;;;GAGG;AACH,MAAM,QAAQ,GAAG,KAAK,CAAC;AAEvB;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAW,CAG1C,CAAC;YACF,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACvC,OAAO;oBACL,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,OAAO,EAAE,MAAM,CAAC,OAAO;iBACxB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IACD,0FAA0F;IAC1F,uFAAuF;IACvF,iEAAiE;IACjE,MAAM,GAAG,GAAG,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAW,EAAE,CAAC;IACpE,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,CAAC;IAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,6FAA6F;AAC7F,MAAM,MAAM,GAAG,CAAC,GAAG,KAAwB,EAAU,EAAE,CACrD,IAAI,MAAM,CACR,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CACjG,CAAC;AAEJ,MAAM,aAAa,GAAG,MAAM,CAC1B,wBAAwB,EACxB,mBAAmB,EACnB,qCAAqC,EACrC,yCAAyC,EACzC,oCAAoC,CACrC,CAAC;AAEF,oFAAoF;AACpF,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;GAIG;AACH,MAAM,QAAQ,GAA8D;IAC1E;QACE,CAAC,EAAE;QACH;YACE,oBAAoB;YACpB,qBAAqB;YACrB,mBAAmB;YACnB,wBAAwB;YACxB,wBAAwB;YACxB,8BAA8B;YAC9B,2BAA2B;YAC3B,uBAAuB;YACvB,sBAAsB;YACtB,iCAAiC;YACjC,yBAAyB;YACzB,UAAU;SACX;QACD,4BAA4B;KAC7B;IACD;QACE,CAAC,EAAE;QACH,CAAC,qCAAqC,EAAE,iCAAiC,CAAC;QAC1E,4BAA4B;KAC7B;IACD,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,iCAAiC,CAAC;CAC1D,CAAC;AAEF,uFAAuF;AACvF,MAAM,MAAM,GAA2D,QAAQ,CAAC,OAAO,CACrF,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAU,CAAC,CACxF,CAAC;AAEF,wFAAwF;AACxF,SAAS,aAAa,CAAC,KAAgB,EAAE,OAAe;IACtD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,AAAD,EAAG,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,WAAW,GAAG,MAAM,CACxB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,CACnB,CAAC;AACF,MAAM,KAAK,GAAG,MAAM,CAClB,gCAAgC,EAChC,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,gCAAgC,CACjC,CAAC;AAWF,SAAgB,SAAS,CAAC,KAAgB;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IACxF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,iCAAiC;SAC1C,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,kCAAkC;KAC3C,CAAC;AACJ,CAAC;AAaD,yDAAyD;AACzD,MAAM,SAAS,GAAG,iBAAsB,CAAC;AACzC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEjC,MAAM,MAAM,GAAG,CAAC,KAAgC,EAAW,EAAE,CAC3D,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;AACxD,MAAM,UAAU,GAAG,CAAC,EAAW,EAAW,EAAE,CAC1C,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAA8B,CAAC,CAAC;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAuD;IACrE,oBAAoB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;IACpD,qBAAqB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;IACrD,mBAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,GAAG,CAAC,GAAG,gBAAgB;IACnE,wBAAwB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;IACvE,wBAAwB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC;IAC9E,2EAA2E;IAC3E,8BAA8B,EAAE,CAAC,EAAE,EAAE,EAAE;QACrC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,SAAS;gBAAE,OAAO,KAAK,CAAC,CAAC,+BAA+B;YAClF,KAAK,IAAI,KAAK,CAAC;YACf,IAAI,KAAK,GAAG,SAAS;gBAAE,OAAO,IAAI,CAAC;QACrC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,2BAA2B,EAAE,CAAC,EAAE,EAAE,EAAE,CAClC,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACrE,EAAE,CAAC,MAAM,CAAC,MAAM;IAClB,uBAAuB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1E,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,8FAA8F;AAC9F,MAAM,WAAW,GAAoB;IACnC,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,6CAA6C;CACtD,CAAC;AAEF;;;;GAIG;AACH,SAAS,OAAO,CAAC,OAAe;IAC9B,MAAM,EAAE,GAAG,IAAA,iBAAS,EAAC,OAAO,EAAE,EAAE,WAAW,EAAE,oBAAY,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO;QACL,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QAChD,YAAY,EAAE,EAAE,CAAC,YAAY;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,KAAgB,EAAE,OAAe;IACpE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7E,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IAChF,MAAM,IAAI,GACR,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;AACvE,CAAC","sourcesContent":["/**\n * Broadcast classification (pure). Esplora forwards bitcoind's `sendrawtransaction` error as\n * an HTTP 400 body, in one of two formats:\n * - Blockstream electrs: `sendrawtransaction RPC error -26: min relay fee not met, 100 < 141`\n * - mempool/electrs: `sendrawtransaction RPC error: {\"code\":-26,\"message\":\"min relay fee …\"}`\n *\n * `rejected` only for exact, anchored reject reasons that make these\n * bytes invalid by consensus on every node (bitcoind's `CheckTransaction` and consensus\n * script checks, and an undecodable transaction); everything that depends on state, policy\n * or node configuration is `refused`, which is also the default for unknown texts. A\n * `rejected` reason counts only under the code bitcoind answers it with, so a text outside\n * bitcoind's structured answer never ends an Attempt. Reasons are fixed literals: bitcoind's\n * texts carry txids, amounts and fee rates, which a stored reason must never hold.\n *\n * A node's rejection is a claim. `nodeClaim` only parses what the node\n * claims, and a claimed consensus failure is `invalid`, a kind no `Broadcaster` may return.\n * `classifyOwnBroadcast`, the only classifier, keeps a `rejected` only when the claimed reason\n * holds for the bytes that were sent, checked here, and makes every other one `refused`\n * (non-terminal). No export takes the node at its word.\n */\nimport type { BroadcastResult } from '../../core/driver/types';\nimport { MAX_TX_BYTES, readTxHex } from './rawtx';\n\nexport interface NodeError {\n readonly code?: number;\n readonly message: string;\n}\n\n/**\n * Only a body's head is read. bitcoind's code and reject reason come first and its\n * texts are far shorter; unbounded, the mempool/electrs pattern is quadratic in the length.\n */\nconst MAX_BODY = 1_024;\n\n/**\n * The bitcoind error inside an Esplora 400 body, or the body's head when it is neither\n * format.\n */\nexport function parseNodeError(body: string): NodeError {\n const text = body.slice(0, MAX_BODY).trim();\n const json = /RPC error: (\\{.*\\})$/s.exec(text);\n if (json) {\n try {\n const parsed = JSON.parse(json[1] as string) as {\n code?: unknown;\n message?: unknown;\n };\n if (typeof parsed.message === 'string') {\n return {\n ...(typeof parsed.code === 'number' ? { code: parsed.code } : {}),\n message: parsed.message,\n };\n }\n } catch {\n // Fall through: not the mempool/electrs format after all.\n }\n }\n // The transport keeps only the first 300 characters of a 400 body (`details.body`), which\n // leaves the JSON of a long message unterminated: its code and the head of its message\n // classify it as the Blockstream format of the same answer does.\n const cut = /RPC error: \\{\"code\":(-?\\d+),\"message\":\"(.*)$/s.exec(text);\n if (cut) return { code: Number(cut[1]), message: cut[2] as string };\n const plain = /RPC error (-?\\d+): (.*)$/s.exec(text);\n if (plain) return { code: Number(plain[1]), message: plain[2] as string };\n return { message: text };\n}\n\n/** A reject reason at the start of the message, followed by nothing, `,`, `.` or a space. */\nconst reason = (...names: readonly string[]): RegExp =>\n new RegExp(\n `^(?:${names.map((n) => n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')})(?:$|,| \\\\(|\\\\.| )`,\n );\n\nconst ALREADY_KNOWN = reason(\n 'txn-already-in-mempool',\n 'txn-already-known',\n 'txn-same-nonwitness-data-in-mempool',\n 'Transaction outputs already in utxo set',\n 'Transaction already in block chain',\n);\n\n/** bitcoind's -22 (`RPC_DESERIALIZATION_ERROR`) reason: the hex does not decode. */\nconst DECODE_FAILED = 'TX decode failed';\n\n/**\n * Consensus failures of these exact bytes (bitcoind `CheckTransaction`, consensus scripts),\n * each under the code bitcoind answers it with: -26 (`RPC_VERIFY_REJECTED`, a mempool\n * rejection) or -22 (`RPC_DESERIALIZATION_ERROR`, undecodable hex).\n */\nconst REJECTED: readonly (readonly [number, readonly string[], string])[] = [\n [\n -26,\n [\n 'bad-txns-vin-empty',\n 'bad-txns-vout-empty',\n 'bad-txns-oversize',\n 'bad-txns-vout-negative',\n 'bad-txns-vout-toolarge',\n 'bad-txns-txouttotal-toolarge',\n 'bad-txns-inputs-duplicate',\n 'bad-txns-prevout-null',\n 'bad-txns-in-belowout',\n 'bad-txns-inputvalues-outofrange',\n 'bad-txns-fee-outofrange',\n 'coinbase',\n ],\n 'invalid by consensus rules',\n ],\n [\n -26,\n ['mandatory-script-verify-flag-failed', 'block-script-verify-flag-failed'],\n 'script verification failed',\n ],\n [-22, [DECODE_FAILED], 'the transaction does not decode'],\n];\n\n/** Each rejected reason's own anchored pattern, with the code and the verdict text. */\nconst CLAIMS: readonly (readonly [number, string, RegExp, string])[] = REJECTED.flatMap(\n ([code, names, text]) => names.map((name) => [code, name, reason(name), text] as const),\n);\n\n/** The rejected reason bitcoind's answer claims, or `undefined` when it claims none. */\nfunction claimedReason(error: NodeError, message: string) {\n return CLAIMS.find(([code, , pattern]) => error.code === code && pattern.test(message));\n}\n\nconst FEE_TOO_LOW = reason(\n 'min relay fee not met',\n 'mempool min fee not met',\n 'insufficient fee',\n);\nconst SPENT = reason(\n 'bad-txns-inputs-missingorspent',\n 'Missing inputs',\n 'Inputs missing or spent',\n 'txn-mempool-conflict',\n 'bad-txns-spends-conflicting-tx',\n);\n\n/**\n * What bitcoind's answer claims, parsed: it decides nothing. A claimed consensus failure is\n * `invalid`, which is no `BroadcastResult`: only `classifyOwnBroadcast` turns it into a\n * `rejected` verdict, and only for bytes its reason holds for.\n */\nexport type NodeClaim =\n | Extract<BroadcastResult, { readonly kind: 'already-known' | 'refused' }>\n | { readonly kind: 'invalid'; readonly reason: string };\n\nexport function nodeClaim(error: NodeError): NodeClaim {\n const message = error.message.trim();\n if (ALREADY_KNOWN.test(message) || error.code === -27) return { kind: 'already-known' };\n const claim = claimedReason(error, message);\n if (claim) return { kind: 'invalid', reason: claim[3] };\n if (FEE_TOO_LOW.test(message)) {\n return { kind: 'refused', code: 'FEE_TOO_LOW', reason: 'fee too low for the node' };\n }\n if (SPENT.test(message)) {\n return {\n kind: 'refused',\n code: 'TX_REFUSED',\n reason: 'inputs missing or already spent',\n };\n }\n return {\n kind: 'refused',\n code: 'TX_REFUSED',\n reason: 'the node refused the transaction',\n };\n}\n\n/**\n * A transaction's bytes as bitcoind's byte-only checks read them, decoded here\n * from the hex that was sent: its outpoints, its output values as signed 64-bit integers, and\n * its size without witness data.\n */\ninterface TxBytes {\n readonly inputs: readonly { readonly txid: string; readonly vout: number }[];\n readonly values: readonly bigint[];\n readonly strippedSize: number;\n}\n\n/** Bitcoin Core's `MAX_MONEY` and `MAX_BLOCK_WEIGHT`. */\nconst MAX_MONEY = 2_100_000_000_000_000n;\nconst MAX_BLOCK_WEIGHT = 4_000_000;\nconst NULL_TXID = '0'.repeat(64);\n\nconst isNull = (input: TxBytes['inputs'][number]): boolean =>\n input.txid === NULL_TXID && input.vout === 0xffffffff;\nconst isCoinbase = (tx: TxBytes): boolean =>\n tx.inputs.length === 1 && isNull(tx.inputs[0] as TxBytes['inputs'][number]);\n\n/**\n * bitcoind's reasons the bytes alone decide (`CheckTransaction`, and ATMP's `coinbase`), each\n * as bitcoind tests it. The others (`bad-txns-in-belowout`, `-inputvalues-outofrange`,\n * `-fee-outofrange` and every script check) depend on the spent outputs, and have no rule: the\n * builder spends only outputs whose value and script their previous transaction authenticates\n * (every input, every wallet type, whatever `nonWitnessUtxo` says), and the core\n * verifies every signature, so they cannot hold for our own bytes, and a node that claims one\n * is not believed.\n */\nconst BYTE_RULES: Readonly<Record<string, (tx: TxBytes) => boolean>> = {\n 'bad-txns-vin-empty': (tx) => tx.inputs.length === 0,\n 'bad-txns-vout-empty': (tx) => tx.values.length === 0,\n 'bad-txns-oversize': (tx) => tx.strippedSize * 4 > MAX_BLOCK_WEIGHT,\n 'bad-txns-vout-negative': (tx) => tx.values.some((value) => value < 0n),\n 'bad-txns-vout-toolarge': (tx) => tx.values.some((value) => value > MAX_MONEY),\n // bitcoind's loop: each output in order, stopping at the first that fails.\n 'bad-txns-txouttotal-toolarge': (tx) => {\n let total = 0n;\n for (const value of tx.values) {\n if (value < 0n || value > MAX_MONEY) return false; // `vout-negative`, `-toolarge`\n total += value;\n if (total > MAX_MONEY) return true;\n }\n return false;\n },\n 'bad-txns-inputs-duplicate': (tx) =>\n new Set(tx.inputs.map((input) => `${input.txid}:${input.vout}`)).size <\n tx.inputs.length,\n 'bad-txns-prevout-null': (tx) => !isCoinbase(tx) && tx.inputs.some(isNull),\n coinbase: isCoinbase,\n};\n\n/** A rejection this driver cannot confirm for the bytes it sent: observed, never terminal. */\nconst UNCONFIRMED: BroadcastResult = {\n kind: 'refused',\n code: 'TX_REFUSED',\n reason: 'the node claimed the transaction is invalid',\n};\n\n/**\n * The hex that was sent, decoded as `sendrawtransaction` decodes it (`rawtx.ts` follows\n * bitcoind's format, with no cap below the broadcaster's own), or `undefined` when bitcoind\n * cannot decode it either.\n */\nfunction bytesOf(sentHex: string): TxBytes | undefined {\n const tx = readTxHex(sentHex, { maxStripped: MAX_TX_BYTES });\n if (!tx) return undefined;\n return {\n inputs: tx.inputs.map((input) => ({ txid: input.txid, vout: input.vout })),\n values: tx.outputs.map((output) => output.value),\n strippedSize: tx.strippedSize,\n };\n}\n\n/**\n * The node's answer to the hex this driver sent. A terminal `rejected` frees the\n * Attempt's inputs for a caller's retry, and if a lying or buggy endpoint relayed the bytes\n * before it claimed them invalid, the retry and the original can both confirm: a double\n * payment. So a rejection stands only when its claimed reason holds for those bytes, decoded\n * here (whether they decode is always this module's own finding): an undecodable\n * hex for `TX decode failed`, a byte rule for a `CheckTransaction` reason. Anything else is\n * `refused`.\n */\nexport function classifyOwnBroadcast(error: NodeError, sentHex: string): BroadcastResult {\n const claim = nodeClaim(error);\n if (claim.kind !== 'invalid') return claim;\n const bytes = bytesOf(sentHex);\n const rejected: BroadcastResult = { kind: 'rejected', reason: claim.reason };\n const name = claimedReason(error, error.message.trim())?.[1];\n if (name === DECODE_FAILED) return bytes === undefined ? rejected : UNCONFIRMED;\n const rule =\n name !== undefined && Object.hasOwn(BYTE_RULES, name) ? BYTE_RULES[name] : undefined;\n return bytes !== undefined && rule?.(bytes) ? rejected : UNCONFIRMED;\n}\n"]}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The Esplora REST API, sent directly over the core transport. Every call carries the
3
+ * calling driver method's tags and a `route` template with no identifiers in it, which
4
+ * events and logs show instead of the path. Answers are validated strictly: a malformed
5
+ * one is a retryable `ProviderError('PROVIDER_UNAVAILABLE')`, a missing or ill-typed
6
+ * field is malformed and never a default, an answer for another id than the one asked for is
7
+ * refused, and a 404 is `null`. Chain data is read as the chain allows it, never bounded by
8
+ * what this library builds (lenient readers). Chain reads use the `rpc` transport; address
9
+ * reads use the `indexer`. Only raw transaction hex is decoded, by the strict linear
10
+ * reader (`rawtx.ts`), to bind it to its txid.
11
+ */
12
+ import { ProviderError } from '../../core/errors/error';
13
+ import type { Transport } from '../../core/transport/types';
14
+ import { type PreviousTx } from './codec';
15
+ import type { EsploraAddressStats, EsploraBlock, EsploraOutspend, EsploraStatus, EsploraTx, EsploraUtxo, UtxoCallTags } from './types';
16
+ /**
17
+ * The previous transactions one client keeps, by count and by bytes without the
18
+ * witness (a larger one is not kept). A typical one is a few hundred bytes.
19
+ */
20
+ export declare const PREVIOUS_TX_CACHE: Readonly<{
21
+ entries: 1000;
22
+ bytes: 8000000;
23
+ }>;
24
+ /** Bitcoin Core's `MAX_MONEY`: no output, and no balance, is larger. */
25
+ export declare const MAX_MONEY = 2100000000000000n;
26
+ export declare function malformed(what: string): ProviderError;
27
+ /** A definitive 404 (not an ambiguous or retried failure): the resource is not there. */
28
+ export declare function isNotFound(error: unknown): boolean;
29
+ export declare function parseHeight(text: unknown): bigint;
30
+ export declare function parseHash(text: unknown): string;
31
+ export declare function parseStatus(value: unknown): EsploraStatus;
32
+ export declare function parseTx(value: unknown): EsploraTx;
33
+ export declare function parseOutspend(value: unknown): EsploraOutspend;
34
+ /** Esplora's `/fee-estimates`: confirmation target (blocks) → sat/vB (a float). */
35
+ export declare function parseFeeEstimates(value: unknown): ReadonlyMap<number, number>;
36
+ /** Whether a caller's id is a txid or block hash (64 lowercase hex characters). */
37
+ export declare const isHash: (value: unknown) => value is string;
38
+ /** One Esplora endpoint family (the `rpc` transport) and its address index (`indexer`). */
39
+ export declare class EsploraClient {
40
+ #private;
41
+ private readonly chain;
42
+ private readonly indexer;
43
+ private readonly cache;
44
+ constructor(chain: Transport, indexer: Transport, cache?: {
45
+ readonly entries: number;
46
+ readonly bytes: number;
47
+ });
48
+ tipHeight(tags: UtxoCallTags): Promise<bigint>;
49
+ /** The hash of the block at `height` on this endpoint's best chain, or `null` above its tip. */
50
+ blockHashAt(height: bigint, tags: UtxoCallTags): Promise<string | null>;
51
+ block(blockHash: string, tags: UtxoCallTags): Promise<EsploraBlock | null>;
52
+ blockTxids(blockHash: string, tags: UtxoCallTags): Promise<string[]>;
53
+ /** Up to 25 transactions of a block from `start` (a multiple of 25). */
54
+ blockTxs(blockHash: string, start: number, tags: UtxoCallTags): Promise<EsploraTx[]>;
55
+ tx(txid: string, tags: UtxoCallTags): Promise<EsploraTx | null>;
56
+ /** The raw transaction, as hex, bound to `txid` (see `#rawTx`). */
57
+ txHex(txid: string, tags: UtxoCallTags): Promise<string | null>;
58
+ /**
59
+ * An input's previous transaction, decoded once and bound to `txid` (see
60
+ * `#rawTx`). Its bytes authenticate themselves, so it is kept per txid, whatever endpoint
61
+ * served it, in a bounded cache: a replacement's inputs are read once per client.
62
+ */
63
+ previousTx(txid: string, tags: UtxoCallTags): Promise<PreviousTx | null>;
64
+ /**
65
+ * A transaction this client sent for an Attempt and a node took. Its bytes are
66
+ * known here, so its outputs are not an indexer's word even before a block holds it, and
67
+ * under `minInputConfirmations: 0` they may be spent unconfirmed. Kept like the cache.
68
+ */
69
+ rememberOwn(tx: PreviousTx): void;
70
+ isOwn(txid: string): boolean;
71
+ outspend(txid: string, vout: number, tags: UtxoCallTags): Promise<EsploraOutspend>;
72
+ feeEstimates(tags: UtxoCallTags): Promise<ReadonlyMap<number, number>>;
73
+ /** `POST /tx`: the node's txid on success; a node refusal is the transport's `RPC_ERROR`. */
74
+ broadcast(hex: string, tags: UtxoCallTags): Promise<string>;
75
+ addressUtxos(address: string, tags: UtxoCallTags): Promise<EsploraUtxo[]>;
76
+ addressStats(address: string, tags: UtxoCallTags): Promise<EsploraAddressStats>;
77
+ /** Confirmed history, newest first, 25 per page, after `lastSeen` when given. */
78
+ addressTxs(address: string, lastSeen: string | undefined, tags: UtxoCallTags): Promise<EsploraTx[]>;
79
+ }