crypto-aio 0.0.2 → 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 (672) 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/lib-types.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/adapters/ton/types.js +3 -0
  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/core/model/transaction.js +3 -0
  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 -44
  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 -2
  638. package/dist/libs/eth/contract.js +0 -7
  639. package/dist/libs/eth/contract.js.map +0 -1
  640. package/dist/libs/eth/index.d.ts +0 -20
  641. package/dist/libs/eth/index.js +0 -62
  642. package/dist/libs/eth/index.js.map +0 -1
  643. package/dist/libs/eth/transact.d.ts +0 -2
  644. package/dist/libs/eth/transact.js +0 -7
  645. package/dist/libs/eth/transact.js.map +0 -1
  646. package/dist/libs/index.d.ts +0 -1
  647. package/dist/libs/index.js +0 -18
  648. package/dist/libs/index.js.map +0 -1
  649. package/dist/tool/common.d.ts +0 -28
  650. package/dist/tool/common.js +0 -33
  651. package/dist/tool/common.js.map +0 -1
  652. package/dist/tool/eth-tools.d.ts +0 -3
  653. package/dist/tool/eth-tools.js +0 -33
  654. package/dist/tool/eth-tools.js.map +0 -1
  655. package/dist/tool/index.d.ts +0 -4
  656. package/dist/tool/index.js +0 -21
  657. package/dist/tool/index.js.map +0 -1
  658. package/dist/tool/logging.d.ts +0 -3
  659. package/dist/tool/logging.js +0 -11
  660. package/dist/tool/logging.js.map +0 -1
  661. package/dist/tool/options.d.ts +0 -4
  662. package/dist/tool/options.js +0 -28
  663. package/dist/tool/options.js.map +0 -1
  664. package/dist/type/account.d.ts +0 -9
  665. package/dist/type/account.js.map +0 -1
  666. package/dist/type/common.d.ts +0 -18
  667. package/dist/type/common.js.map +0 -1
  668. package/dist/type/index.d.ts +0 -3
  669. package/dist/type/index.js +0 -20
  670. package/dist/type/index.js.map +0 -1
  671. package/dist/type/lib-types.d.ts +0 -7
  672. package/dist/type/lib-types.js.map +0 -1
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XPUB_CHANGE_SEARCH = exports.MAX_OUTPUTS = exports.assertNative = void 0;
4
+ exports.plannedOutputs = plannedOutputs;
5
+ exports.senderOf = senderOf;
6
+ exports.walletOf = walletOf;
7
+ exports.changeAddressOf = changeAddressOf;
8
+ exports.spendable = spendable;
9
+ exports.rateOf = rateOf;
10
+ const error_1 = require("../../core/errors/error");
11
+ const fee_1 = require("../../core/model/fee");
12
+ const address_1 = require("./address");
13
+ const context_1 = require("./context");
14
+ var context_2 = require("./context");
15
+ Object.defineProperty(exports, "assertNative", { enumerable: true, get: function () { return context_2.assertNative; } });
16
+ const bip32_1 = require("@scure/bip32");
17
+ const hd_1 = require("../../core/signing/hd");
18
+ const fees_1 = require("./fees");
19
+ const reader_1 = require("./reader");
20
+ /**
21
+ * The most outputs one transfer may pay (`limits().maxOutputs`), enforced here because
22
+ * the core only reports it. Library policy: 1,000 taproot outputs are about 43 kvB, far
23
+ * below the 100 kvB standard size.
24
+ */
25
+ exports.MAX_OUTPUTS = 1_000;
26
+ /** The intent's outputs as scripts; each must be a standard address and above dust. */
27
+ function plannedOutputs(ctx, outputs) {
28
+ if (outputs.length === 0) {
29
+ throw new error_1.ValidationError('INVALID_INTENT', 'at least one output is required');
30
+ }
31
+ if (outputs.length > exports.MAX_OUTPUTS) {
32
+ throw new error_1.ValidationError('INVALID_INTENT', `a transfer pays at most ${exports.MAX_OUTPUTS} outputs`);
33
+ }
34
+ return outputs.map((output) => {
35
+ const { script } = (0, address_1.decodeAddress)(output.to, ctx.config.address);
36
+ if (output.amount < (0, address_1.dustThreshold)(script, ctx.config.dustRelayFee)) {
37
+ throw new error_1.ValidationError('INVALID_AMOUNT', 'an output is below the dust threshold and would not be relayed');
38
+ }
39
+ return { script, value: output.amount };
40
+ });
41
+ }
42
+ function senderOf(ctx, from) {
43
+ const decoded = (0, address_1.decodeAddress)(from, ctx.config.address);
44
+ return { from: decoded, type: (0, address_1.walletTypeOf)(decoded) };
45
+ }
46
+ /**
47
+ * The wallet's scripts from its key, which must own the sending address: nothing is ever
48
+ * built for inputs the wallet's key cannot sign (`INVALID_INTENT`).
49
+ */
50
+ function walletOf(ctx, sender, keys) {
51
+ const key = keys[0];
52
+ if (!key) {
53
+ throw new error_1.ValidationError('INVALID_INTENT', 'building a Bitcoin transaction needs the wallet public key');
54
+ }
55
+ const wallet = (0, address_1.walletAddress)(key.publicKey, sender.type, ctx.config.address);
56
+ if (wallet.address !== sender.from.canonical) {
57
+ throw new error_1.ValidationError('INVALID_INTENT', "the wallet's key does not own the sending address");
58
+ }
59
+ return { wallet, key };
60
+ }
61
+ /** How many indexes `changeAddressOf` searches on each chain of the wallet's xpub. */
62
+ exports.XPUB_CHANGE_SEARCH = 20;
63
+ /** The chains `xpubDerives` keeps, each as the addresses it derives. */
64
+ const XPUB_CACHE_ENTRIES = 64;
65
+ const xpubChains = new Map();
66
+ /** The key at `path` below `root`, deriving each parent node once (`parents`). */
67
+ function childKey(root, parents, path) {
68
+ const full = path.startsWith('m') ? path : `m/${path}`;
69
+ const cut = full.lastIndexOf('/');
70
+ const last = full.slice(cut + 1);
71
+ if (cut < 0 || !/^[0-9]{1,10}$/.test(last) || Number(last) >= bip32_1.HARDENED_OFFSET) {
72
+ throw new RangeError('not a plain child path');
73
+ }
74
+ const parentPath = full.slice(0, cut);
75
+ let parent = parents.get(parentPath);
76
+ if (!parent) {
77
+ parent = root.derive(parentPath);
78
+ parents.set(parentPath, parent);
79
+ }
80
+ const key = parent.deriveChild(Number(last)).publicKey;
81
+ if (!key)
82
+ throw new RangeError('no public key');
83
+ return key;
84
+ }
85
+ /**
86
+ * Whether the wallet's xpub derives `target` for the sender's address type, at indexes
87
+ * 0–19 of its configured path (default `0/{index}`) or of the change chain `1/{index}`. A
88
+ * bounded search: at most 40 child keys, and only after the key check failed. `wallet.hd`
89
+ * is the core's own `WalletHdOptions` (a caller's `hd` never reaches a driver), and its
90
+ * `xpub` is always a public key. An xpub of the other network class (a mainnet `xpub` on
91
+ * a test network, or the reverse) is `CONFIG_INVALID`.
92
+ *
93
+ * The search runs on every estimate, build, replacement and cancel, so it parses the xpub
94
+ * once, derives each chain node once, and keeps each chain's addresses (per xpub,
95
+ * versions, network, wallet type and template) in a bounded cache. The core's
96
+ * `deriveXpubChild` checks the key first (a public key of the network's class, no
97
+ * hardened segments), with its fixed texts, and derives any path this shortcut does not
98
+ * model.
99
+ */
100
+ function xpubDerives(ctx, wallet, type, target) {
101
+ const hd = wallet.hd;
102
+ if (typeof hd?.xpub !== 'string' || hd.xpub.length === 0)
103
+ return false;
104
+ const xpub = hd.xpub;
105
+ const network = { testnet: ctx.network.testnet };
106
+ const templates = [
107
+ ...new Set([
108
+ typeof hd.xpubPath === 'string' ? hd.xpubPath : '0/{index}',
109
+ '1/{index}',
110
+ ]),
111
+ ];
112
+ const keyOf = (template) => JSON.stringify([
113
+ xpub,
114
+ hd.xpubVersions ?? null,
115
+ network.testnet,
116
+ ctx.config.address,
117
+ type,
118
+ template,
119
+ ]);
120
+ let root;
121
+ const parents = new Map();
122
+ for (const template of templates) {
123
+ const key = keyOf(template);
124
+ let chain = xpubChains.get(key);
125
+ if (chain) {
126
+ xpubChains.delete(key); // most recently used last
127
+ }
128
+ else {
129
+ const paths = [
130
+ ...new Set(Array.from({ length: exports.XPUB_CHANGE_SEARCH }, (_, index) => template.replace('{index}', String(index)))),
131
+ ];
132
+ if (!root) {
133
+ (0, hd_1.deriveXpubChild)(xpub, paths[0], hd.xpubVersions, network);
134
+ root = (0, hd_1.parseExtendedPublicKey)(xpub, hd.xpubVersions).node;
135
+ }
136
+ const addresses = new Set();
137
+ for (const path of paths) {
138
+ let child;
139
+ try {
140
+ child = childKey(root, parents, path);
141
+ }
142
+ catch {
143
+ child = (0, hd_1.deriveXpubChild)(xpub, path, hd.xpubVersions, network);
144
+ }
145
+ addresses.add((0, address_1.walletAddress)(child, type, ctx.config.address).address);
146
+ }
147
+ chain = addresses;
148
+ }
149
+ xpubChains.set(key, chain);
150
+ while (xpubChains.size > XPUB_CACHE_ENTRIES) {
151
+ xpubChains.delete(xpubChains.keys().next().value);
152
+ }
153
+ if (chain.has(target))
154
+ return true;
155
+ }
156
+ return false;
157
+ }
158
+ /**
159
+ * Where change goes. A configured `changeAddress` must be derivable from the wallet: the
160
+ * sending address, or any of the four wallet types of one of the wallet's keys (a bounded
161
+ * search, at most 4 per key). Otherwise it is refused with `CONFIG_INVALID`, naming no
162
+ * address, because a valid but mistyped address would lose every change output. The
163
+ * wallet opts out with `allowExternalChangeAddress: true`.
164
+ */
165
+ function changeAddressOf(ctx, wallet, sender, keys) {
166
+ const { changeAddress, allowExternalChangeAddress } = (0, context_1.parseWalletOptions)(wallet, ctx.config);
167
+ if (!changeAddress)
168
+ return sender.from;
169
+ if (allowExternalChangeAddress)
170
+ return changeAddress;
171
+ const target = changeAddress.canonical;
172
+ if (target === sender.from.canonical)
173
+ return changeAddress;
174
+ for (const key of keys) {
175
+ for (const type of context_1.ADDRESS_TYPES) {
176
+ let derived;
177
+ try {
178
+ derived = (0, address_1.walletAddress)(key.publicKey, type, ctx.config.address).address;
179
+ }
180
+ catch {
181
+ continue; // e.g. an x-only key derives only p2tr
182
+ }
183
+ if (derived === target)
184
+ return changeAddress;
185
+ }
186
+ }
187
+ if (xpubDerives(ctx, wallet, sender.type, target))
188
+ return changeAddress;
189
+ throw new error_1.ConfigError('CONFIG_INVALID', "wallet.utxo.changeAddress is not derivable from the wallet's key; set wallet.utxo.allowExternalChangeAddress to send change elsewhere");
190
+ }
191
+ /**
192
+ * The wallet's outputs coin selection may spend. They are read as `listUnspent` reads them:
193
+ * an output the indexer lists twice alike counts once (the funds check sums them), and two
194
+ * listings that disagree decide nothing (retryable).
195
+ */
196
+ async function spendable(ctx, from, exclude, minConfirmations, signal) {
197
+ const [utxos, tip] = await Promise.all([
198
+ (0, reader_1.listUnspent)(ctx, from, signal),
199
+ ctx.esplora.tipHeight((0, context_1.withSignal)(context_1.READ, signal)),
200
+ ]);
201
+ const held = new Set(exclude ?? []);
202
+ return utxos
203
+ .filter((utxo) => {
204
+ if (held.has(utxo.outpoint))
205
+ return false;
206
+ if (minConfirmations === 0)
207
+ return true;
208
+ if (!utxo.confirmed)
209
+ return false;
210
+ return tip - utxo.blockHeight + 1n >= BigInt(minConfirmations);
211
+ })
212
+ .map((utxo) => ({
213
+ outpoint: utxo.outpoint,
214
+ txid: utxo.txid,
215
+ vout: utxo.vout,
216
+ value: utxo.value,
217
+ }));
218
+ }
219
+ /** The fee rate (sat/kvB) of a speed or a `{ satPerVByte }` override. */
220
+ async function rateOf(ctx, fee, signal) {
221
+ if ((0, fee_1.isFeeSpeed)(fee)) {
222
+ const estimates = await ctx.esplora.feeEstimates((0, context_1.withSignal)(context_1.READ, signal));
223
+ return (0, fees_1.rateForSpeed)(estimates, fee, ctx.config);
224
+ }
225
+ if (fee === null || typeof fee !== 'object') {
226
+ throw new error_1.ValidationError('INVALID_INTENT', 'fee must be a speed or { satPerVByte }');
227
+ }
228
+ return (0, fees_1.rateFromOverride)(fee, ctx.config);
229
+ }
230
+ //# sourceMappingURL=spend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend.js","sourceRoot":"","sources":["../../../src/adapters/utxo/spend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What coin selection spends and pays: the planned outputs of an intent (strict addresses,\n * no dust), the wallet's eligible outputs (not reserved by another live Operation, and\n * confirmed as deeply as `minInputConfirmations` asks), and the fee rate of a fee spec.\n *\n * This module loads bitcoinjs-lib (`spendable` reads through `reader.ts`, which imports the\n * codec and `sdk.ts`), so only modules behind the manifest's `load()` may import it; an\n * SDK-free module (the plugin, an entry's types) must not.\n */\nimport type { WalletKey, WalletOptions } from '../../core/driver/types';\nimport { ConfigError, ValidationError } from '../../core/errors/error';\nimport { isFeeSpeed, type FeeOverride, type FeeSpeed } from '../../core/model/fee';\nimport {\n decodeAddress,\n dustThreshold,\n walletAddress,\n walletTypeOf,\n type DecodedAddress,\n type WalletAddress,\n} from './address';\nimport type { PlannedOutput, Spendable } from './coinselect';\nimport {\n ADDRESS_TYPES,\n READ,\n parseWalletOptions,\n withSignal,\n type UtxoContext,\n} from './context';\n\nexport { assertNative } from './context';\nimport { HARDENED_OFFSET, type HDKey } from '@scure/bip32';\nimport { deriveXpubChild, parseExtendedPublicKey } from '../../core/signing/hd';\nimport type { WalletHdOptions } from '../../core/signing/wallet';\nimport { rateForSpeed, rateFromOverride } from './fees';\nimport { listUnspent } from './reader';\nimport type { UtxoAddressType } from './types';\n\n/**\n * The most outputs one transfer may pay (`limits().maxOutputs`), enforced here because\n * the core only reports it. Library policy: 1,000 taproot outputs are about 43 kvB, far\n * below the 100 kvB standard size.\n */\nexport const MAX_OUTPUTS = 1_000;\n\n/** The intent's outputs as scripts; each must be a standard address and above dust. */\nexport function plannedOutputs(\n ctx: UtxoContext,\n outputs: readonly { readonly to: string; readonly amount: bigint }[],\n): PlannedOutput[] {\n if (outputs.length === 0) {\n throw new ValidationError('INVALID_INTENT', 'at least one output is required');\n }\n if (outputs.length > MAX_OUTPUTS) {\n throw new ValidationError(\n 'INVALID_INTENT',\n `a transfer pays at most ${MAX_OUTPUTS} outputs`,\n );\n }\n return outputs.map((output) => {\n const { script } = decodeAddress(output.to, ctx.config.address);\n if (output.amount < dustThreshold(script, ctx.config.dustRelayFee)) {\n throw new ValidationError(\n 'INVALID_AMOUNT',\n 'an output is below the dust threshold and would not be relayed',\n );\n }\n return { script, value: output.amount };\n });\n}\n\n/** The sending wallet: its type (from the address; p2sh is p2sh-p2wpkh) and, with a key, its scripts. */\nexport interface Sender {\n readonly from: DecodedAddress;\n readonly type: UtxoAddressType;\n}\n\nexport function senderOf(ctx: UtxoContext, from: string): Sender {\n const decoded = decodeAddress(from, ctx.config.address);\n return { from: decoded, type: walletTypeOf(decoded) };\n}\n\n/**\n * The wallet's scripts from its key, which must own the sending address: nothing is ever\n * built for inputs the wallet's key cannot sign (`INVALID_INTENT`).\n */\nexport function walletOf(\n ctx: UtxoContext,\n sender: Sender,\n keys: readonly WalletKey[],\n): { readonly wallet: WalletAddress; readonly key: WalletKey } {\n const key = keys[0];\n if (!key) {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'building a Bitcoin transaction needs the wallet public key',\n );\n }\n const wallet = walletAddress(key.publicKey, sender.type, ctx.config.address);\n if (wallet.address !== sender.from.canonical) {\n throw new ValidationError(\n 'INVALID_INTENT',\n \"the wallet's key does not own the sending address\",\n );\n }\n return { wallet, key };\n}\n\n/** How many indexes `changeAddressOf` searches on each chain of the wallet's xpub. */\nexport const XPUB_CHANGE_SEARCH = 20;\n\n/** The chains `xpubDerives` keeps, each as the addresses it derives. */\nconst XPUB_CACHE_ENTRIES = 64;\nconst xpubChains = new Map<string, ReadonlySet<string>>();\n\n/** The key at `path` below `root`, deriving each parent node once (`parents`). */\nfunction childKey(root: HDKey, parents: Map<string, HDKey>, path: string): Uint8Array {\n const full = path.startsWith('m') ? path : `m/${path}`;\n const cut = full.lastIndexOf('/');\n const last = full.slice(cut + 1);\n if (cut < 0 || !/^[0-9]{1,10}$/.test(last) || Number(last) >= HARDENED_OFFSET) {\n throw new RangeError('not a plain child path');\n }\n const parentPath = full.slice(0, cut);\n let parent = parents.get(parentPath);\n if (!parent) {\n parent = root.derive(parentPath);\n parents.set(parentPath, parent);\n }\n const key = parent.deriveChild(Number(last)).publicKey;\n if (!key) throw new RangeError('no public key');\n return key;\n}\n\n/**\n * Whether the wallet's xpub derives `target` for the sender's address type, at indexes\n * 0–19 of its configured path (default `0/{index}`) or of the change chain `1/{index}`. A\n * bounded search: at most 40 child keys, and only after the key check failed. `wallet.hd`\n * is the core's own `WalletHdOptions` (a caller's `hd` never reaches a driver), and its\n * `xpub` is always a public key. An xpub of the other network class (a mainnet `xpub` on\n * a test network, or the reverse) is `CONFIG_INVALID`.\n *\n * The search runs on every estimate, build, replacement and cancel, so it parses the xpub\n * once, derives each chain node once, and keeps each chain's addresses (per xpub,\n * versions, network, wallet type and template) in a bounded cache. The core's\n * `deriveXpubChild` checks the key first (a public key of the network's class, no\n * hardened segments), with its fixed texts, and derives any path this shortcut does not\n * model.\n */\nfunction xpubDerives(\n ctx: UtxoContext,\n wallet: WalletOptions,\n type: UtxoAddressType,\n target: string,\n): boolean {\n const hd = wallet.hd as WalletHdOptions | undefined;\n if (typeof hd?.xpub !== 'string' || hd.xpub.length === 0) return false;\n const xpub = hd.xpub;\n const network = { testnet: ctx.network.testnet };\n const templates = [\n ...new Set([\n typeof hd.xpubPath === 'string' ? hd.xpubPath : '0/{index}',\n '1/{index}',\n ]),\n ];\n const keyOf = (template: string) =>\n JSON.stringify([\n xpub,\n hd.xpubVersions ?? null,\n network.testnet,\n ctx.config.address,\n type,\n template,\n ]);\n let root: HDKey | undefined;\n const parents = new Map<string, HDKey>();\n for (const template of templates) {\n const key = keyOf(template);\n let chain = xpubChains.get(key);\n if (chain) {\n xpubChains.delete(key); // most recently used last\n } else {\n const paths = [\n ...new Set(\n Array.from({ length: XPUB_CHANGE_SEARCH }, (_, index) =>\n template.replace('{index}', String(index)),\n ),\n ),\n ];\n if (!root) {\n deriveXpubChild(xpub, paths[0] as string, hd.xpubVersions, network);\n root = parseExtendedPublicKey(xpub, hd.xpubVersions).node;\n }\n const addresses = new Set<string>();\n for (const path of paths) {\n let child: Uint8Array;\n try {\n child = childKey(root, parents, path);\n } catch {\n child = deriveXpubChild(xpub, path, hd.xpubVersions, network);\n }\n addresses.add(walletAddress(child, type, ctx.config.address).address);\n }\n chain = addresses;\n }\n xpubChains.set(key, chain);\n while (xpubChains.size > XPUB_CACHE_ENTRIES) {\n xpubChains.delete(xpubChains.keys().next().value as string);\n }\n if (chain.has(target)) return true;\n }\n return false;\n}\n\n/**\n * Where change goes. A configured `changeAddress` must be derivable from the wallet: the\n * sending address, or any of the four wallet types of one of the wallet's keys (a bounded\n * search, at most 4 per key). Otherwise it is refused with `CONFIG_INVALID`, naming no\n * address, because a valid but mistyped address would lose every change output. The\n * wallet opts out with `allowExternalChangeAddress: true`.\n */\nexport function changeAddressOf(\n ctx: UtxoContext,\n wallet: WalletOptions,\n sender: Sender,\n keys: readonly WalletKey[],\n): DecodedAddress {\n const { changeAddress, allowExternalChangeAddress } = parseWalletOptions(\n wallet,\n ctx.config,\n );\n if (!changeAddress) return sender.from;\n if (allowExternalChangeAddress) return changeAddress;\n const target = changeAddress.canonical;\n if (target === sender.from.canonical) return changeAddress;\n for (const key of keys) {\n for (const type of ADDRESS_TYPES) {\n let derived: string;\n try {\n derived = walletAddress(key.publicKey, type, ctx.config.address).address;\n } catch {\n continue; // e.g. an x-only key derives only p2tr\n }\n if (derived === target) return changeAddress;\n }\n }\n if (xpubDerives(ctx, wallet, sender.type, target)) return changeAddress;\n throw new ConfigError(\n 'CONFIG_INVALID',\n \"wallet.utxo.changeAddress is not derivable from the wallet's key; set wallet.utxo.allowExternalChangeAddress to send change elsewhere\",\n );\n}\n\n/**\n * The wallet's outputs coin selection may spend. They are read as `listUnspent` reads them:\n * an output the indexer lists twice alike counts once (the funds check sums them), and two\n * listings that disagree decide nothing (retryable).\n */\nexport async function spendable(\n ctx: UtxoContext,\n from: string,\n exclude: readonly string[] | undefined,\n minConfirmations: number,\n signal?: AbortSignal,\n): Promise<Spendable[]> {\n const [utxos, tip] = await Promise.all([\n listUnspent(ctx, from, signal),\n ctx.esplora.tipHeight(withSignal(READ, signal)),\n ]);\n const held = new Set(exclude ?? []);\n return utxos\n .filter((utxo) => {\n if (held.has(utxo.outpoint)) return false;\n if (minConfirmations === 0) return true;\n if (!utxo.confirmed) return false;\n return tip - (utxo.blockHeight as bigint) + 1n >= BigInt(minConfirmations);\n })\n .map((utxo) => ({\n outpoint: utxo.outpoint,\n txid: utxo.txid,\n vout: utxo.vout,\n value: utxo.value,\n }));\n}\n\n/** The fee rate (sat/kvB) of a speed or a `{ satPerVByte }` override. */\nexport async function rateOf(\n ctx: UtxoContext,\n fee: FeeSpeed | FeeOverride,\n signal?: AbortSignal,\n): Promise<bigint> {\n if (isFeeSpeed(fee)) {\n const estimates = await ctx.esplora.feeEstimates(withSignal(READ, signal));\n return rateForSpeed(estimates, fee, ctx.config);\n }\n if (fee === null || typeof fee !== 'object') {\n throw new ValidationError('INVALID_INTENT', 'fee must be a speed or { satPerVByte }');\n }\n return rateFromOverride(fee, ctx.config);\n}\n"]}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * SDK-free types of the UTXO family: the `ext.utxo` API, fee details and overrides, wallet
3
+ * options, and the Esplora wire types the driver reads. Nothing here imports an
4
+ * SDK, so the composition root can export these types.
5
+ */
6
+ import type { FeeSpeed } from '../../core/model/fee';
7
+ import type { CallOptions } from '../../core/transport/types';
8
+ declare module '../../index' {
9
+ interface ChainRegistry {
10
+ bitcoin: {
11
+ family: 'utxo';
12
+ network: 'mainnet' | 'testnet' | 'testnet4' | 'signet' | 'regtest';
13
+ };
14
+ }
15
+ interface FamilyRegistry {
16
+ utxo: {
17
+ library: 'bitcoinjs-lib';
18
+ ext: UtxoExt;
19
+ fee: UtxoFeeDetails;
20
+ };
21
+ }
22
+ }
23
+ /** A network's address encoding: the bech32 human-readable part and base58 version bytes. */
24
+ export interface AddressParams {
25
+ readonly bech32: string;
26
+ readonly pubKeyHash: number;
27
+ readonly scriptHash: number;
28
+ }
29
+ /** The address (and so the input) type of a UTXO wallet; `p2wpkh` is the default. */
30
+ export type UtxoAddressType = 'p2wpkh' | 'p2sh-p2wpkh' | 'p2pkh' | 'p2tr';
31
+ /** Every standard output type a UTXO transfer may pay to. */
32
+ export type UtxoOutputType = 'p2pkh' | 'p2sh' | 'p2wpkh' | 'p2wsh' | 'p2tr';
33
+ /** `WalletConfig.utxo`. */
34
+ export interface UtxoWalletOptions {
35
+ readonly addressType?: UtxoAddressType;
36
+ /**
37
+ * Where change goes; default: the wallet's own address. It must be derivable from the
38
+ * wallet's key (any of the four address types), unless `allowExternalChangeAddress` is set.
39
+ */
40
+ readonly changeAddress?: string;
41
+ /**
42
+ * Send change to a `changeAddress` the wallet's key does not derive (default `false`).
43
+ * Change sent to a valid but foreign address is lost, so without it a mistyped address
44
+ * is refused.
45
+ */
46
+ readonly allowExternalChangeAddress?: boolean;
47
+ }
48
+ /** `FeeEstimate.details` of the `utxo` fee kind. */
49
+ export interface UtxoFeeDetails {
50
+ /** The fee rate in satoshis per 1,000 virtual bytes (Bitcoin Core's unit). */
51
+ readonly satPerKvB: bigint;
52
+ /** Virtual size of the transaction, counting worst-case (72-byte) ECDSA signatures. */
53
+ readonly vsize: number;
54
+ readonly inputs: number;
55
+ /** Outputs including change. */
56
+ readonly outputs: number;
57
+ /** The change amount; `0n` when there is no change output. */
58
+ readonly change: bigint;
59
+ /** Index of the change output, or `-1` when there is none. */
60
+ readonly changeIndex: number;
61
+ }
62
+ /**
63
+ * An explicit UTXO fee (`TransferIntent.fee`): satoshis per virtual byte, as a bigint or a
64
+ * decimal string with at most three fractional digits (e.g. `'1.5'`).
65
+ */
66
+ export type UtxoFeeOverride = {
67
+ readonly satPerVByte: bigint | string;
68
+ };
69
+ /** An unspent output of an address, as `ext.utxo.listUnspent` reports it. */
70
+ export interface UtxoUnspent {
71
+ /** `txid:vout`, the reservation key of this output. */
72
+ readonly outpoint: string;
73
+ readonly txid: string;
74
+ readonly vout: number;
75
+ readonly value: bigint;
76
+ readonly confirmed: boolean;
77
+ readonly blockHeight?: bigint;
78
+ }
79
+ export interface UtxoSelectionRequest {
80
+ readonly from: string;
81
+ readonly outputs: readonly {
82
+ readonly to: string;
83
+ readonly amount: bigint;
84
+ }[];
85
+ readonly fee?: FeeSpeed | UtxoFeeOverride;
86
+ /** Outpoints to leave out (e.g. those held by live Operations). */
87
+ readonly exclude?: readonly string[];
88
+ }
89
+ /** A dry run of the configured coin selection. */
90
+ export interface UtxoSelectionPreview {
91
+ /** The outputs it would spend (every eligible one when `sufficient` is `false`). */
92
+ readonly inputs: readonly {
93
+ readonly outpoint: string;
94
+ readonly value: bigint;
95
+ }[];
96
+ readonly fee: bigint;
97
+ readonly satPerKvB: bigint;
98
+ readonly vsize: number;
99
+ readonly change: bigint;
100
+ /** `false` when the eligible outputs cannot pay for the outputs and the fee. */
101
+ readonly sufficient: boolean;
102
+ }
103
+ /** `bc.ext.utxo`: the UTXO family extension. */
104
+ export interface UtxoExt {
105
+ readonly utxo: {
106
+ /** Unspent outputs of an address (indexer), confirmed first, oldest first. */
107
+ listUnspent(address: string): Promise<readonly UtxoUnspent[]>;
108
+ /** What the configured coin selection would pick for these outputs. Signs nothing. */
109
+ coinSelection(request: UtxoSelectionRequest): Promise<UtxoSelectionPreview>;
110
+ };
111
+ }
112
+ /** The transport tags every UTXO I/O call carries (the `ChainDriver` contract table). */
113
+ export type UtxoCallTags = Pick<CallOptions, 'purpose' | 'retry' | 'quorum' | 'quorumKey' | 'fanout' | 'signal'>;
114
+ /** Esplora's `status` object of a transaction or of a spending transaction. */
115
+ export interface EsploraStatus {
116
+ readonly confirmed: boolean;
117
+ readonly blockHeight?: bigint;
118
+ readonly blockHash?: string;
119
+ readonly blockTime?: number;
120
+ }
121
+ export interface EsploraOutput {
122
+ readonly script: string;
123
+ readonly type: string;
124
+ readonly address?: string;
125
+ readonly value: bigint;
126
+ }
127
+ export interface EsploraInput {
128
+ readonly txid: string;
129
+ readonly vout: number;
130
+ readonly coinbase: boolean;
131
+ readonly sequence: number;
132
+ /** `undefined` for a coinbase input. */
133
+ readonly prevout?: EsploraOutput;
134
+ }
135
+ export interface EsploraTx {
136
+ readonly txid: string;
137
+ readonly version: number;
138
+ readonly locktime: number;
139
+ readonly weight: number;
140
+ readonly fee: bigint;
141
+ readonly vin: readonly EsploraInput[];
142
+ readonly vout: readonly EsploraOutput[];
143
+ readonly status: EsploraStatus;
144
+ }
145
+ export interface EsploraBlock {
146
+ readonly hash: string;
147
+ readonly height: bigint;
148
+ readonly parentHash: string;
149
+ readonly timestamp: number;
150
+ readonly txCount: number;
151
+ }
152
+ export interface EsploraOutspend {
153
+ readonly spent: boolean;
154
+ readonly txid?: string;
155
+ readonly vin?: number;
156
+ readonly status?: EsploraStatus;
157
+ }
158
+ export interface EsploraUtxo {
159
+ readonly txid: string;
160
+ readonly vout: number;
161
+ readonly value: bigint;
162
+ readonly status: EsploraStatus;
163
+ }
164
+ export interface EsploraAddressStats {
165
+ readonly funded: bigint;
166
+ readonly spent: bigint;
167
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/utxo/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * SDK-free types of the UTXO family: the `ext.utxo` API, fee details and overrides, wallet\n * options, and the Esplora wire types the driver reads. Nothing here imports an\n * SDK, so the composition root can export these types.\n */\nimport type { FeeSpeed } from '../../core/model/fee';\nimport type { CallOptions } from '../../core/transport/types';\n\n// Augment the registries through the package entry, as users do with 'crypto-aio'.\ndeclare module '../../index' {\n interface ChainRegistry {\n bitcoin: {\n family: 'utxo';\n network: 'mainnet' | 'testnet' | 'testnet4' | 'signet' | 'regtest';\n };\n }\n interface FamilyRegistry {\n utxo: { library: 'bitcoinjs-lib'; ext: UtxoExt; fee: UtxoFeeDetails };\n }\n}\n\n/** A network's address encoding: the bech32 human-readable part and base58 version bytes. */\nexport interface AddressParams {\n readonly bech32: string;\n readonly pubKeyHash: number;\n readonly scriptHash: number;\n}\n\n/** The address (and so the input) type of a UTXO wallet; `p2wpkh` is the default. */\nexport type UtxoAddressType = 'p2wpkh' | 'p2sh-p2wpkh' | 'p2pkh' | 'p2tr';\n\n/** Every standard output type a UTXO transfer may pay to. */\nexport type UtxoOutputType = 'p2pkh' | 'p2sh' | 'p2wpkh' | 'p2wsh' | 'p2tr';\n\n/** `WalletConfig.utxo`. */\nexport interface UtxoWalletOptions {\n readonly addressType?: UtxoAddressType;\n /**\n * Where change goes; default: the wallet's own address. It must be derivable from the\n * wallet's key (any of the four address types), unless `allowExternalChangeAddress` is set.\n */\n readonly changeAddress?: string;\n /**\n * Send change to a `changeAddress` the wallet's key does not derive (default `false`).\n * Change sent to a valid but foreign address is lost, so without it a mistyped address\n * is refused.\n */\n readonly allowExternalChangeAddress?: boolean;\n}\n\n/** `FeeEstimate.details` of the `utxo` fee kind. */\nexport interface UtxoFeeDetails {\n /** The fee rate in satoshis per 1,000 virtual bytes (Bitcoin Core's unit). */\n readonly satPerKvB: bigint;\n /** Virtual size of the transaction, counting worst-case (72-byte) ECDSA signatures. */\n readonly vsize: number;\n readonly inputs: number;\n /** Outputs including change. */\n readonly outputs: number;\n /** The change amount; `0n` when there is no change output. */\n readonly change: bigint;\n /** Index of the change output, or `-1` when there is none. */\n readonly changeIndex: number;\n}\n\n/**\n * An explicit UTXO fee (`TransferIntent.fee`): satoshis per virtual byte, as a bigint or a\n * decimal string with at most three fractional digits (e.g. `'1.5'`).\n */\nexport type UtxoFeeOverride = { readonly satPerVByte: bigint | string };\n\n/** An unspent output of an address, as `ext.utxo.listUnspent` reports it. */\nexport interface UtxoUnspent {\n /** `txid:vout`, the reservation key of this output. */\n readonly outpoint: string;\n readonly txid: string;\n readonly vout: number;\n readonly value: bigint;\n readonly confirmed: boolean;\n readonly blockHeight?: bigint;\n}\n\nexport interface UtxoSelectionRequest {\n readonly from: string;\n readonly outputs: readonly { readonly to: string; readonly amount: bigint }[];\n readonly fee?: FeeSpeed | UtxoFeeOverride;\n /** Outpoints to leave out (e.g. those held by live Operations). */\n readonly exclude?: readonly string[];\n}\n\n/** A dry run of the configured coin selection. */\nexport interface UtxoSelectionPreview {\n /** The outputs it would spend (every eligible one when `sufficient` is `false`). */\n readonly inputs: readonly { readonly outpoint: string; readonly value: bigint }[];\n readonly fee: bigint;\n readonly satPerKvB: bigint;\n readonly vsize: number;\n readonly change: bigint;\n /** `false` when the eligible outputs cannot pay for the outputs and the fee. */\n readonly sufficient: boolean;\n}\n\n/** `bc.ext.utxo`: the UTXO family extension. */\nexport interface UtxoExt {\n readonly utxo: {\n /** Unspent outputs of an address (indexer), confirmed first, oldest first. */\n listUnspent(address: string): Promise<readonly UtxoUnspent[]>;\n /** What the configured coin selection would pick for these outputs. Signs nothing. */\n coinSelection(request: UtxoSelectionRequest): Promise<UtxoSelectionPreview>;\n };\n}\n\n/** The transport tags every UTXO I/O call carries (the `ChainDriver` contract table). */\nexport type UtxoCallTags = Pick<\n CallOptions,\n 'purpose' | 'retry' | 'quorum' | 'quorumKey' | 'fanout' | 'signal'\n>;\n\n/** Esplora's `status` object of a transaction or of a spending transaction. */\nexport interface EsploraStatus {\n readonly confirmed: boolean;\n readonly blockHeight?: bigint;\n readonly blockHash?: string;\n readonly blockTime?: number;\n}\n\nexport interface EsploraOutput {\n readonly script: string;\n readonly type: string;\n readonly address?: string;\n readonly value: bigint;\n}\n\nexport interface EsploraInput {\n readonly txid: string;\n readonly vout: number;\n readonly coinbase: boolean;\n readonly sequence: number;\n /** `undefined` for a coinbase input. */\n readonly prevout?: EsploraOutput;\n}\n\nexport interface EsploraTx {\n readonly txid: string;\n readonly version: number;\n readonly locktime: number;\n readonly weight: number;\n readonly fee: bigint;\n readonly vin: readonly EsploraInput[];\n readonly vout: readonly EsploraOutput[];\n readonly status: EsploraStatus;\n}\n\nexport interface EsploraBlock {\n readonly hash: string;\n readonly height: bigint;\n readonly parentHash: string;\n readonly timestamp: number;\n readonly txCount: number;\n}\n\nexport interface EsploraOutspend {\n readonly spent: boolean;\n readonly txid?: string;\n readonly vin?: number;\n readonly status?: EsploraStatus;\n}\n\nexport interface EsploraUtxo {\n readonly txid: string;\n readonly vout: number;\n readonly value: bigint;\n readonly status: EsploraStatus;\n}\n\nexport interface EsploraAddressStats {\n readonly funded: bigint;\n readonly spent: bigint;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import type { ResolvedSelection } from '../config/types';
2
+ import type { ChainDriver } from '../driver/types';
3
+ import { type AssetInfo, type AssetRef } from '../model/asset';
4
+ import type { Catalogs } from '../registry/plugin';
5
+ /**
6
+ * Resolves asset inputs strictly within one chain/network. Token metadata is cached per
7
+ * container, and so is a token's own permanent failure (only a non-retryable
8
+ * crypto-aio `ASSET_RESOLUTION` error, e.g. for a contract with no usable `decimals`), so a
9
+ * junk token seen in every scanned block is queried once. Every other failure (a retryable
10
+ * one of any code, any other provider error, or a foreign error) is dropped from the cache,
11
+ * and the next resolution queries again: a provider fault must never pin a token.
12
+ */
13
+ export declare class AssetService {
14
+ #private;
15
+ private readonly catalogs;
16
+ constructor(catalogs: () => Catalogs);
17
+ resolve(selection: ResolvedSelection, driver: ChainDriver, input: AssetRef | string | undefined): Promise<AssetInfo>;
18
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AssetService = void 0;
4
+ const error_1 = require("../errors/error");
5
+ const asset_1 = require("../model/asset");
6
+ /**
7
+ * Resolves asset inputs strictly within one chain/network. Token metadata is cached per
8
+ * container, and so is a token's own permanent failure (only a non-retryable
9
+ * crypto-aio `ASSET_RESOLUTION` error, e.g. for a contract with no usable `decimals`), so a
10
+ * junk token seen in every scanned block is queried once. Every other failure (a retryable
11
+ * one of any code, any other provider error, or a foreign error) is dropped from the cache,
12
+ * and the next resolution queries again: a provider fault must never pin a token.
13
+ */
14
+ class AssetService {
15
+ catalogs;
16
+ #metadata = new Map();
17
+ constructor(catalogs) {
18
+ this.catalogs = catalogs;
19
+ }
20
+ async resolve(selection, driver, input) {
21
+ const chain = selection.chain.id;
22
+ const network = selection.network.id;
23
+ const catalogs = this.catalogs();
24
+ if (input === undefined || input === 'native')
25
+ return catalogs.assets.native(chain, network);
26
+ if (typeof input === 'string') {
27
+ if (!(0, asset_1.isAssetId)(input))
28
+ return catalogs.assets.resolveAlias(chain, network, input);
29
+ const parsed = (0, asset_1.parseAssetId)(input);
30
+ if (parsed.chain !== chain || parsed.network !== network) {
31
+ throw new error_1.ValidationError('ASSET_RESOLUTION', `asset '${input}' belongs to ${parsed.chain}:${parsed.network}, not ${chain}:${network}`);
32
+ }
33
+ return this.resolve(selection, driver, parsed.ref);
34
+ }
35
+ const ref = driver.reader.normalizeTokenRef
36
+ ? driver.reader.normalizeTokenRef(input)
37
+ : input;
38
+ const id = (0, asset_1.assetId)(chain, network, ref);
39
+ const known = catalogs.assets.get(id);
40
+ if (known)
41
+ return known;
42
+ const lookup = driver.reader.getTokenMetadata;
43
+ if (!selection.capabilities.has('tokens') || !lookup) {
44
+ throw new error_1.UnsupportedCapabilityError('UNSUPPORTED_CAPABILITY', `chain '${chain}' does not support tokens`);
45
+ }
46
+ let pending = this.#metadata.get(id);
47
+ if (!pending) {
48
+ pending = lookup.call(driver.reader, ref);
49
+ this.#metadata.set(id, pending);
50
+ pending.catch((error) => {
51
+ if (!(0, error_1.isCryptoAioError)(error, 'ASSET_RESOLUTION') || error.retryable)
52
+ this.#metadata.delete(id);
53
+ });
54
+ }
55
+ const metadata = await pending;
56
+ const problem = (0, asset_1.metadataProblem)(metadata);
57
+ if (problem)
58
+ throw new error_1.ValidationError('ASSET_RESOLUTION', `token '${id}' has unusable metadata: ${problem}`);
59
+ return Object.freeze({
60
+ id,
61
+ chain,
62
+ network,
63
+ ref,
64
+ metadata: Object.freeze({ ...metadata }),
65
+ });
66
+ }
67
+ }
68
+ exports.AssetService = AssetService;
69
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/core/assets/service.ts"],"names":[],"mappings":";;;AAEA,2CAIyB;AACzB,0CASwB;AAGxB;;;;;;;GAOG;AACH,MAAa,YAAY;IAGM;IAFpB,SAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;IAEhE,YAA6B,QAAwB;QAAxB,aAAQ,GAAR,QAAQ,CAAgB;IAAG,CAAC;IAEzD,KAAK,CAAC,OAAO,CACX,SAA4B,EAC5B,MAAmB,EACnB,KAAoC;QAEpC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ;YAC3C,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAA,iBAAS,EAAC,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACzD,MAAM,IAAI,uBAAe,CACvB,kBAAkB,EAClB,UAAU,KAAK,gBAAgB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,SAAS,KAAK,IAAI,OAAO,EAAE,CACzF,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB;YACzC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC;YACxC,CAAC,CAAC,KAAK,CAAC;QACV,MAAM,EAAE,GAAG,IAAA,eAAO,EAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,IAAI,kCAA0B,CAClC,wBAAwB,EACxB,UAAU,KAAK,2BAA2B,CAC3C,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC/B,IAAI,CAAC,IAAA,wBAAgB,EAAC,KAAK,EAAE,kBAAkB,CAAC,IAAI,KAAK,CAAC,SAAS;oBACjE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAA,uBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,OAAO;YACT,MAAM,IAAI,uBAAe,CACvB,kBAAkB,EAClB,UAAU,EAAE,4BAA4B,OAAO,EAAE,CAClD,CAAC;QACJ,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE;YACF,KAAK;YACL,OAAO;YACP,GAAG;YACH,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;CACF;AA/DD,oCA+DC","sourcesContent":["import type { ResolvedSelection } from '../config/types';\nimport type { ChainDriver } from '../driver/types';\nimport {\n UnsupportedCapabilityError,\n ValidationError,\n isCryptoAioError,\n} from '../errors/error';\nimport {\n assetId,\n isAssetId,\n metadataProblem,\n parseAssetId,\n type AssetId,\n type AssetInfo,\n type AssetMetadata,\n type AssetRef,\n} from '../model/asset';\nimport type { Catalogs } from '../registry/plugin';\n\n/**\n * Resolves asset inputs strictly within one chain/network. Token metadata is cached per\n * container, and so is a token's own permanent failure (only a non-retryable\n * crypto-aio `ASSET_RESOLUTION` error, e.g. for a contract with no usable `decimals`), so a\n * junk token seen in every scanned block is queried once. Every other failure (a retryable\n * one of any code, any other provider error, or a foreign error) is dropped from the cache,\n * and the next resolution queries again: a provider fault must never pin a token.\n */\nexport class AssetService {\n readonly #metadata = new Map<AssetId, Promise<AssetMetadata>>();\n\n constructor(private readonly catalogs: () => Catalogs) {}\n\n async resolve(\n selection: ResolvedSelection,\n driver: ChainDriver,\n input: AssetRef | string | undefined,\n ): Promise<AssetInfo> {\n const chain = selection.chain.id;\n const network = selection.network.id;\n const catalogs = this.catalogs();\n if (input === undefined || input === 'native')\n return catalogs.assets.native(chain, network);\n if (typeof input === 'string') {\n if (!isAssetId(input)) return catalogs.assets.resolveAlias(chain, network, input);\n const parsed = parseAssetId(input);\n if (parsed.chain !== chain || parsed.network !== network) {\n throw new ValidationError(\n 'ASSET_RESOLUTION',\n `asset '${input}' belongs to ${parsed.chain}:${parsed.network}, not ${chain}:${network}`,\n );\n }\n return this.resolve(selection, driver, parsed.ref);\n }\n const ref = driver.reader.normalizeTokenRef\n ? driver.reader.normalizeTokenRef(input)\n : input;\n const id = assetId(chain, network, ref);\n const known = catalogs.assets.get(id);\n if (known) return known;\n const lookup = driver.reader.getTokenMetadata;\n if (!selection.capabilities.has('tokens') || !lookup) {\n throw new UnsupportedCapabilityError(\n 'UNSUPPORTED_CAPABILITY',\n `chain '${chain}' does not support tokens`,\n );\n }\n let pending = this.#metadata.get(id);\n if (!pending) {\n pending = lookup.call(driver.reader, ref);\n this.#metadata.set(id, pending);\n pending.catch((error: unknown) => {\n if (!isCryptoAioError(error, 'ASSET_RESOLUTION') || error.retryable)\n this.#metadata.delete(id);\n });\n }\n const metadata = await pending;\n const problem = metadataProblem(metadata);\n if (problem)\n throw new ValidationError(\n 'ASSET_RESOLUTION',\n `token '${id}' has unusable metadata: ${problem}`,\n );\n return Object.freeze({\n id,\n chain,\n network,\n ref,\n metadata: Object.freeze({ ...metadata }),\n });\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { HandleOptions } from '../config/types';
2
+ import type { Blockchain } from './handle';
3
+ export declare function setDefaultBlockchainFactory(create: (config: HandleOptions) => Blockchain): void;
4
+ export declare function defaultBlockchain(config: HandleOptions): Blockchain;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setDefaultBlockchainFactory = setDefaultBlockchainFactory;
4
+ exports.defaultBlockchain = defaultBlockchain;
5
+ const error_1 = require("../errors/error");
6
+ let factory;
7
+ function setDefaultBlockchainFactory(create) {
8
+ factory = create;
9
+ }
10
+ function defaultBlockchain(config) {
11
+ if (!factory) {
12
+ throw new error_1.ConfigError('CONFIG_INVALID', 'the default container is not initialized; import from the package entry point');
13
+ }
14
+ return factory(config);
15
+ }
16
+ //# sourceMappingURL=default-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-ref.js","sourceRoot":"","sources":["../../../src/core/blockchain/default-ref.ts"],"names":[],"mappings":";;AAMA,kEAIC;AAED,8CAQC;AAnBD,2CAA8C;AAG9C,IAAI,OAA4D,CAAC;AAEjE,SAAgB,2BAA2B,CACzC,MAA6C;IAE7C,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAqB;IACrD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,mBAAW,CACnB,gBAAgB,EAChB,+EAA+E,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import type { HandleOptions } from '../config/types';\nimport { ConfigError } from '../errors/error';\nimport type { Blockchain } from './handle';\n\nlet factory: ((config: HandleOptions) => Blockchain) | undefined;\n\nexport function setDefaultBlockchainFactory(\n create: (config: HandleOptions) => Blockchain,\n): void {\n factory = create;\n}\n\nexport function defaultBlockchain(config: HandleOptions): Blockchain {\n if (!factory) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n 'the default container is not initialized; import from the package entry point',\n );\n }\n return factory(config);\n}\n"]}