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,380 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PREVIOUS_TX_READS = void 0;
4
+ exports.utxoBuilder = utxoBuilder;
5
+ exports.utxoBroadcaster = utxoBroadcaster;
6
+ exports.utxoReplacement = utxoReplacement;
7
+ const error_1 = require("../../core/errors/error");
8
+ const asset_1 = require("../../core/model/asset");
9
+ const address_1 = require("./address");
10
+ const codec_1 = require("./codec");
11
+ const coinselect_1 = require("./coinselect");
12
+ const context_1 = require("./context");
13
+ const errors_1 = require("./errors");
14
+ const proofs_1 = require("./proofs");
15
+ const rawtx_1 = require("./rawtx");
16
+ const fees_1 = require("./fees");
17
+ const spend_1 = require("./spend");
18
+ const speedOf = (fee) => typeof fee === 'string' ? fee : 'custom';
19
+ const paidOf = (fee) => fee.charges.reduce((sum, charge) => sum + charge.amount, 0n);
20
+ function draft(from, speed, fee, details, bound) {
21
+ return {
22
+ kind: 'utxo',
23
+ speed,
24
+ charges: [{ asset: 'native', amount: fee, label: 'network' }],
25
+ bound,
26
+ payer: from,
27
+ details: { ...details },
28
+ };
29
+ }
30
+ /** `UtxoFeeDetails` of a stored fee, checked (it is our own plain data). */
31
+ function detailsOf(fee) {
32
+ const d = fee.details;
33
+ if (fee.kind !== 'utxo' ||
34
+ typeof d.satPerKvB !== 'bigint' ||
35
+ !Number.isSafeInteger(d.vsize) ||
36
+ d.vsize < 1 ||
37
+ typeof d.change !== 'bigint' ||
38
+ !Number.isSafeInteger(d.changeIndex)) {
39
+ throw new error_1.ValidationError('INVALID_INTENT', 'the fee is not a UTXO fee estimate');
40
+ }
41
+ return d;
42
+ }
43
+ const scopeOf = (ctx, network) => ({
44
+ ctx,
45
+ network,
46
+ sequence: ctx.config.rbf ? codec_1.SEQUENCE_RBF : codec_1.SEQUENCE_FINAL_LOCKTIME,
47
+ });
48
+ const changeOf = (scope, build, sender) => (0, spend_1.changeAddressOf)(scope.ctx, build.wallet, sender, build.keys);
49
+ /**
50
+ * The message is a fixed text, so no amount reaches a log line; the amounts go only in
51
+ * the details, as decimal strings, as in every family.
52
+ */
53
+ const insufficient = (what, required, available) => new error_1.ChainError('INSUFFICIENT_FUNDS', `insufficient funds for ${what}`, {
54
+ details: { required: required.toString(), available: available.toString() },
55
+ });
56
+ /** At most this many previous transactions are read at once for one build. */
57
+ exports.PREVIOUS_TX_READS = 4;
58
+ /**
59
+ * A refusal of a previous transaction put on the provider: the inputs' outpoints and values
60
+ * are the indexer's, and their previous transactions are bound to their txids, so authentic
61
+ * bytes that disagree with the indexer's output decide nothing (retryable), never a user
62
+ * error.
63
+ */
64
+ function onProvider(work) {
65
+ try {
66
+ return work();
67
+ }
68
+ catch (error) {
69
+ if (!(0, codec_1.isPreviousTxRefusal)(error))
70
+ throw error;
71
+ throw new error_1.ProviderError('PROVIDER_INCONSISTENT', "the indexer's unspent output disagrees with its previous transaction", { retryable: true, cause: error });
72
+ }
73
+ }
74
+ /** The previous transaction of each txid, read at most `PREVIOUS_TX_READS` at a time. */
75
+ async function previousTxs(scope, txids, signal) {
76
+ const found = new Map();
77
+ await (0, context_1.forEachBounded)(txids, exports.PREVIOUS_TX_READS, async (txid) => {
78
+ const prev = await scope.ctx.esplora.previousTx(txid, (0, context_1.withSignal)(context_1.READ, signal));
79
+ if (prev === null) {
80
+ throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'the previous transaction of an input is not available');
81
+ }
82
+ found.set(txid, prev);
83
+ });
84
+ return found;
85
+ }
86
+ /**
87
+ * Every input's value and script, authenticated against its previous transaction
88
+ * (all wallet types, whatever `nonWitnessUtxo` says), so the node never judges bytes built
89
+ * on an indexer's wrong value, and an outpoint its transaction does not have (a phantom
90
+ * that nothing would ever spend, so never proven dead) is never built on. Either would
91
+ * stall the Operation for good with its inputs held, since signed bytes cannot be
92
+ * abandoned. A new input's previous transaction must also be in a block the proof quorum
93
+ * attests, unless it is the wallet's own sent transaction and `minInputConfirmations` is
94
+ * 0: a made-up parent would freeze the transfer the same way. p2pkh inputs carry it, and
95
+ * segwit v0 ones while `nonWitnessUtxo` is on; taproot never does: BIP341 commits to
96
+ * every amount, and `signed-psbt.ts` refuses one on a taproot input.
97
+ */
98
+ async function authenticated(scope, wallet, inputs, fresh, signal) {
99
+ const { esplora, config } = scope.ctx;
100
+ // First, each new input's parent must be in a block the proof quorum attests,
101
+ // at its own height; only then are its bytes read. Self-authenticating bytes prove what a
102
+ // transaction is, never that a chain holds it.
103
+ const parents = inputs
104
+ .filter((input) => !fresh.kept.has(input.outpoint))
105
+ .map((input) => input.txid)
106
+ .filter((txid) => !(fresh.ownUnconfirmed && esplora.isOwn(txid)));
107
+ await (0, proofs_1.assertConfirmed)(scope.ctx, parents, config.minInputConfirmations, signal);
108
+ const embed = wallet.type === 'p2pkh' ||
109
+ (wallet.type !== 'p2tr' && scope.ctx.config.nonWitnessUtxo);
110
+ const txs = await previousTxs(scope, [...new Set(inputs.map((i) => i.txid))], signal);
111
+ return inputs.map((input) => {
112
+ const prevTx = txs.get(input.txid);
113
+ onProvider(() => (0, codec_1.assertPrevious)(prevTx, input, wallet.script));
114
+ return embed ? { ...input, prevTx } : { ...input };
115
+ });
116
+ }
117
+ /** `buildTx`, with its refusal of a previous transaction put on the provider. */
118
+ function builtFor(scope, wallet, inputs, outputs) {
119
+ return onProvider(() => (0, codec_1.buildTx)(scope.network, wallet, inputs, outputs, scope.sequence));
120
+ }
121
+ /** The unsigned transaction for a selection: PSBT, one request per input, exact fee, ordering. */
122
+ async function unsignedFor(scope, build, sender, selection, outputs, changeScript, rate, speed, summary, fresh) {
123
+ const { wallet, key } = (0, spend_1.walletOf)(scope.ctx, sender, build.keys);
124
+ (0, fees_1.assertSaneFee)(selection.fee, selection.vsize, scope.ctx.config);
125
+ const all = selection.change > 0n
126
+ ? [...outputs, { script: changeScript, value: selection.change }]
127
+ : [...outputs];
128
+ const inputs = await authenticated(scope, wallet, selection.inputs, fresh, build.signal);
129
+ const built = builtFor(scope, wallet, inputs, all);
130
+ const signingRequests = built.digests.map((digest, index) => ({
131
+ id: `in:${index}`,
132
+ scheme: wallet.type === 'p2tr' ? 'secp256k1-schnorr' : 'secp256k1-ecdsa',
133
+ payload: digest,
134
+ payloadKind: 'digest',
135
+ publicKey: wallet.type === 'p2tr' ? wallet.outputKey : wallet.publicKey,
136
+ ...(key.keyRef ? { keyRef: key.keyRef } : {}),
137
+ ...(wallet.tweak ? { params: { tweak: wallet.tweak } } : {}),
138
+ }));
139
+ return {
140
+ payload: { encoding: 'base64', data: built.psbt },
141
+ ...(built.txid !== undefined
142
+ ? { expectedRef: { id: built.txid, idKind: 'txid', canonical: true } }
143
+ : {}),
144
+ signingRequests,
145
+ ordering: { kind: 'inputs', inputs: selection.inputs.map((i) => i.outpoint).sort() },
146
+ fee: draft(sender.from.canonical, speed, selection.fee, {
147
+ satPerKvB: rate,
148
+ vsize: selection.vsize,
149
+ inputs: selection.inputs.length,
150
+ outputs: all.length,
151
+ change: selection.change,
152
+ changeIndex: selection.change > 0n ? outputs.length : -1,
153
+ }, 'exact'),
154
+ summary,
155
+ };
156
+ }
157
+ /** The replaced Attempt: its inputs (values from its PSBT), payments (no change) and fee. */
158
+ function previousOf(scope, previous, sender) {
159
+ const details = detailsOf(previous.fee);
160
+ const view = (0, codec_1.viewPsbt)(previous.payload.data, scope.network);
161
+ const inputs = view.inputs.map((i) => ({
162
+ outpoint: i.outpoint,
163
+ txid: i.txid,
164
+ vout: i.vout,
165
+ value: i.value,
166
+ }));
167
+ const outputs = view.outputs.filter((_, index) => index !== details.changeIndex);
168
+ // A real signature may be a byte shorter than the worst case the estimate counts: a
169
+ // full vbyte per legacy input, a quarter per witness input.
170
+ const slack = sender.type === 'p2pkh' ? inputs.length : Math.ceil(inputs.length / 4);
171
+ const minVsize = Math.max(1, details.vsize - slack);
172
+ return { vsize: details.vsize, minVsize, inputs, outputs, paid: paidOf(previous.fee) };
173
+ }
174
+ function utxoBuilder(ctx, network) {
175
+ const scope = scopeOf(ctx, network);
176
+ const { config } = ctx;
177
+ const native = (0, asset_1.assetId)(ctx.chain.id, ctx.network.id, 'native');
178
+ const plan = async (intent, rate, build) => {
179
+ (0, spend_1.assertNative)(intent.asset);
180
+ // Defence in depth behind the network's capability check: nothing here writes a memo,
181
+ // and the core would otherwise accept one this builder drops.
182
+ if (intent.memo !== undefined) {
183
+ throw new error_1.UnsupportedCapabilityError('UNSUPPORTED_CAPABILITY', 'Bitcoin transfers carry no memo (OP_RETURN is not supported)');
184
+ }
185
+ const sender = (0, spend_1.senderOf)(ctx, intent.from);
186
+ const outputs = (0, spend_1.plannedOutputs)(ctx, intent.outputs);
187
+ const changeScript = changeOf(scope, build, sender).script;
188
+ const candidates = await (0, spend_1.spendable)(ctx, sender.from.canonical, build.excludeInputs, config.minInputConfirmations, build.signal);
189
+ const selection = (0, coinselect_1.selectCoins)({
190
+ candidates,
191
+ outputs,
192
+ changeScript,
193
+ inputType: sender.type,
194
+ rate,
195
+ dustRelayFee: config.dustRelayFee,
196
+ strategy: config.coinSelection,
197
+ });
198
+ return { sender, outputs, changeScript, selection };
199
+ };
200
+ return {
201
+ async estimateFee(intent, build) {
202
+ const rate = await (0, spend_1.rateOf)(ctx, intent.fee, build.signal);
203
+ const { sender, selection } = await plan(intent, rate, build);
204
+ const change = selection.ok ? selection.change : 0n;
205
+ return draft(sender.from.canonical, speedOf(intent.fee), selection.fee, {
206
+ satPerKvB: rate,
207
+ vsize: selection.vsize,
208
+ inputs: selection.ok ? selection.inputs.length : 0,
209
+ outputs: intent.outputs.length + (change > 0n ? 1 : 0),
210
+ change,
211
+ changeIndex: change > 0n ? intent.outputs.length : -1,
212
+ }, 'expected');
213
+ },
214
+ async checkFunds(intent, fee, build) {
215
+ (0, spend_1.assertNative)(intent.asset);
216
+ const candidates = await (0, spend_1.spendable)(ctx, (0, spend_1.senderOf)(ctx, intent.from).from.canonical, build.excludeInputs, config.minInputConfirmations, build.signal);
217
+ const available = candidates.reduce((sum, c) => sum + c.value, 0n);
218
+ const required = intent.outputs.reduce((sum, o) => sum + o.amount, 0n) + paidOf(fee);
219
+ return available >= required
220
+ ? { ok: true }
221
+ : { ok: false, asset: 'native', required, available };
222
+ },
223
+ async build(intent, fee, build) {
224
+ const rate = detailsOf(fee).satPerKvB;
225
+ const { sender, outputs, changeScript, selection } = await plan(intent, rate, build);
226
+ if (!selection.ok) {
227
+ throw insufficient('this transfer', selection.required, selection.available);
228
+ }
229
+ return unsignedFor(scope, build, sender, selection, outputs, changeScript, rate, fee.speed, {
230
+ asset: native,
231
+ outputs: intent.outputs.map((o) => ({ to: o.to, amount: o.amount.toString() })),
232
+ }, { kept: new Set(), ownUnconfirmed: config.minInputConfirmations === 0 });
233
+ },
234
+ async assemble(unsigned, signatures) {
235
+ const { hex, txid } = (0, codec_1.assembleTx)(unsigned.payload.data, network, unsigned.signingRequests, signatures);
236
+ if (unsigned.expectedRef && unsigned.expectedRef.id !== txid) {
237
+ throw new error_1.SigningError('SIGNING_FAILED', 'the signed transaction id differs from the prepared one');
238
+ }
239
+ return {
240
+ raw: { encoding: 'hex', data: hex },
241
+ ref: { id: txid, idKind: 'txid', canonical: true },
242
+ };
243
+ },
244
+ signaturesFrom(unsigned, signed) {
245
+ if (signed.encoding !== 'base64') {
246
+ throw new error_1.ValidationError('INVALID_INTENT', 'a signed PSBT is expected, as base64');
247
+ }
248
+ return (0, codec_1.signaturesFromPsbt)(unsigned.payload.data, signed.data, network, unsigned.signingRequests);
249
+ },
250
+ };
251
+ }
252
+ /**
253
+ * Twice Bitcoin Core's `MAX_BLOCK_SERIALIZED_SIZE`: no transaction's hex is longer, so
254
+ * the untrusted text is capped before any decoding. A flat character class, never a
255
+ * repeated group: V8's regexp stack overflows on a repeated group of a few million
256
+ * matches, which a valid transaction can have.
257
+ */
258
+ const MAX_TX_HEX = 8_000_000;
259
+ const HEX = /^[0-9a-fA-F]+$/;
260
+ /**
261
+ * An Attempt's bytes a node took (accepted, or already holds) are this wallet's
262
+ * own sent transaction: its client keeps them. A bare broadcast (no ref) is not an Attempt.
263
+ */
264
+ function rememberOwn(ctx, signed, hex) {
265
+ if (signed.ref.id === '')
266
+ return;
267
+ const tx = (0, codec_1.previousTxOf)(hex);
268
+ if (tx?.txid === signed.ref.id)
269
+ ctx.esplora.rememberOwn(tx);
270
+ }
271
+ function utxoBroadcaster(ctx) {
272
+ return {
273
+ async broadcast(signed, options = {}) {
274
+ const { encoding, data } = signed.raw;
275
+ if (encoding !== 'hex' ||
276
+ data.length > MAX_TX_HEX ||
277
+ data.length % 2 !== 0 ||
278
+ !HEX.test(data)) {
279
+ throw new error_1.ValidationError('INVALID_INTENT', 'a raw Bitcoin transaction is hex');
280
+ }
281
+ const hex = data.toLowerCase();
282
+ try {
283
+ const txid = await ctx.esplora.broadcast(hex, {
284
+ purpose: 'broadcast',
285
+ retry: 'ambiguous-on-failure',
286
+ ...(options.fanout !== undefined ? { fanout: options.fanout } : {}),
287
+ ...(options.signal ? { signal: options.signal } : {}),
288
+ });
289
+ // A bare broadcast (no ref) is checked against the bytes' own txid.
290
+ const expected = signed.ref.id !== ''
291
+ ? signed.ref.id
292
+ : (0, rawtx_1.readTxHex)(hex, { maxStripped: rawtx_1.MAX_TX_BYTES })?.txid;
293
+ if (txid !== expected) {
294
+ // The node accepted something under another id: the outcome is unknown.
295
+ throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'the node answered another txid', {
296
+ ambiguous: true,
297
+ });
298
+ }
299
+ rememberOwn(ctx, signed, hex);
300
+ return { kind: 'accepted' };
301
+ }
302
+ catch (error) {
303
+ // A definitive 400 is bitcoind's answer; anything else is rethrown. A rejection
304
+ // stands only when its reason holds for these bytes, checked here.
305
+ if ((0, error_1.isCryptoAioError)(error, 'RPC_ERROR') &&
306
+ !error.ambiguous &&
307
+ error.details?.status === 400) {
308
+ const result = (0, errors_1.classifyOwnBroadcast)((0, errors_1.parseNodeError)(String(error.details.body ?? '')), hex);
309
+ if (result.kind === 'already-known')
310
+ rememberOwn(ctx, signed, hex);
311
+ return result;
312
+ }
313
+ throw error;
314
+ }
315
+ },
316
+ };
317
+ }
318
+ const tooLow = () => new error_1.ChainError('FEE_TOO_LOW', 'a replacement must pay the replaced fee plus the incremental relay fee, at a higher rate');
319
+ function utxoReplacement(ctx, network) {
320
+ const scope = scopeOf(ctx, network);
321
+ const { config } = ctx;
322
+ return {
323
+ replace: true,
324
+ cancel: true,
325
+ async buildReplacement(previous, fee, build) {
326
+ const sender = (0, spend_1.senderOf)(ctx, build.from);
327
+ const prev = previousOf(scope, previous, sender);
328
+ const rate = await (0, spend_1.rateOf)(ctx, fee, build.signal);
329
+ const changeScript = changeOf(scope, build, sender).script;
330
+ // BIP125 rule 2: an input it adds must be confirmed; it never takes a held one.
331
+ const candidates = await (0, spend_1.spendable)(ctx, sender.from.canonical, [...(build.excludeInputs ?? []), ...prev.inputs.map((i) => i.outpoint)], Math.max(1, config.minInputConfirmations), build.signal);
332
+ const selection = (0, coinselect_1.selectCoins)({
333
+ candidates,
334
+ required: prev.inputs,
335
+ outputs: prev.outputs,
336
+ changeScript,
337
+ inputType: sender.type,
338
+ rate,
339
+ dustRelayFee: config.dustRelayFee,
340
+ strategy: 'accumulative',
341
+ });
342
+ if (!selection.ok) {
343
+ throw insufficient('the replacement', selection.required, selection.available);
344
+ }
345
+ const floor = (0, fees_1.replacementFloor)({ fee: prev.paid, vsize: prev.vsize, minVsize: prev.minVsize }, selection.vsize, config.incrementalRelayFee);
346
+ if (selection.fee < floor)
347
+ throw tooLow();
348
+ return unsignedFor(scope, build, sender, selection, prev.outputs, changeScript, rate, speedOf(fee), previous.summary, { kept: new Set(prev.inputs.map((i) => i.outpoint)), ownUnconfirmed: false });
349
+ },
350
+ async buildCancel(previous, build, fee) {
351
+ const sender = (0, spend_1.senderOf)(ctx, build.from);
352
+ const prev = previousOf(scope, previous, sender);
353
+ // A cancel pays everything back to the sending address itself, never to a
354
+ // configured change address (under `allowExternalChangeAddress` an external one). A
355
+ // misconfigured change address is still refused here, as on every path.
356
+ changeOf(scope, build, sender);
357
+ const own = sender.from;
358
+ const total = prev.inputs.reduce((sum, i) => sum + i.value, 0n);
359
+ const vsize = (0, coinselect_1.vsizeOf)((0, coinselect_1.txWeight)(sender.type, prev.inputs.length, [own.script.length]));
360
+ const floor = (0, fees_1.replacementFloor)({ fee: prev.paid, vsize: prev.vsize, minVsize: prev.minVsize }, vsize, config.incrementalRelayFee);
361
+ let paid = floor;
362
+ let rate = (floor * 1000n + BigInt(vsize) - 1n) / BigInt(vsize);
363
+ if (fee !== undefined) {
364
+ rate = await (0, spend_1.rateOf)(ctx, fee, build.signal);
365
+ paid = (0, fees_1.feeAt)(rate, vsize);
366
+ if (paid < floor)
367
+ throw tooLow();
368
+ }
369
+ const dust = (0, address_1.dustThreshold)(own.script, config.dustRelayFee);
370
+ if (total - paid < dust)
371
+ throw insufficient('a cancel', paid + dust, total);
372
+ const value = total - paid;
373
+ return unsignedFor(scope, build, sender, { ok: true, inputs: prev.inputs, change: 0n, fee: paid, vsize }, [{ script: own.script, value }], own.script, rate, fee === undefined ? 'custom' : speedOf(fee), {
374
+ asset: previous.summary.asset,
375
+ outputs: [{ to: own.canonical, amount: value.toString() }],
376
+ }, { kept: new Set(prev.inputs.map((i) => i.outpoint)), ownUnconfirmed: false });
377
+ },
378
+ };
379
+ }
380
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/adapters/utxo/builder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The UTXO builder, broadcaster and RBF replacement policy.\n *\n * - `build` spends only outputs not held by another live Operation (`ctx.excludeInputs`),\n * pays change to the wallet's change address, and records the spent outpoints as the\n * `inputs` ordering. The fee is `exact` once built; the absurd-fee guard runs first.\n * - Every input a build, a replacement or a cancel spends is authenticated against its\n * previous transaction first: the indexer's value and script count only when the\n * bytes that hash to the outpoint's txid say the same. A lied value could burn the\n * difference as fee, or make our own signed bytes invalid for good and stall the\n * Operation with its inputs held.\n * - Replacements and cancels keep EVERY input of the Attempt they replace (and may add\n * confirmed ones), so each new Attempt conflicts with every earlier one (exclusion is\n * not transitive). Neither ever raises a fee on its own: a fee below the\n * replacement floor is `FEE_TOO_LOW`.\n * - A cancel pays everything back to the sending address itself.\n * - Broadcast answers are classified by `errors.ts`; an ambiguous transport failure is\n * rethrown unclassified. A node's rejection is a claim: it stands only when its reason\n * holds for the bytes that were sent, checked here; else `refused`. A terminal\n * `rejected` frees the inputs, so a lying endpoint that relayed our valid bytes would\n * let the caller's retry spend other coins, and both transactions could confirm.\n */\nimport type {\n BroadcastResult,\n Broadcaster,\n BuildContext,\n ReplacementPolicy,\n TxBuilder,\n} from '../../core/driver/types';\nimport {\n ChainError,\n ProviderError,\n SigningError,\n UnsupportedCapabilityError,\n ValidationError,\n isCryptoAioError,\n} from '../../core/errors/error';\nimport { assetId } from '../../core/model/asset';\nimport type { FeeEstimateDraft, FeeOverride, FeeSpeed } from '../../core/model/fee';\nimport type { DriverIntent, IntentSummary } from '../../core/model/intent';\nimport type { RawTx, SignedTx, UnsignedTx } from '../../core/model/transaction';\nimport type { SignatureBundle, SigningRequest } from '../../core/signing/types';\nimport { dustThreshold, type DecodedAddress, type WalletAddress } from './address';\nimport {\n assembleTx,\n assertPrevious,\n buildTx,\n isPreviousTxRefusal,\n previousTxOf,\n signaturesFromPsbt,\n viewPsbt,\n SEQUENCE_FINAL_LOCKTIME,\n SEQUENCE_RBF,\n type BuiltTx,\n type PlannedInput,\n type PreviousTx,\n} from './codec';\nimport {\n selectCoins,\n txWeight,\n vsizeOf,\n type PlannedOutput,\n type Selection,\n type Spendable,\n} from './coinselect';\nimport { READ, forEachBounded, withSignal, type UtxoContext } from './context';\nimport { classifyOwnBroadcast, parseNodeError } from './errors';\nimport { assertConfirmed } from './proofs';\nimport { MAX_TX_BYTES, readTxHex } from './rawtx';\nimport { assertSaneFee, feeAt, replacementFloor } from './fees';\nimport type { Network } from './sdk';\nimport {\n assertNative,\n changeAddressOf,\n plannedOutputs,\n rateOf,\n senderOf,\n spendable,\n walletOf,\n type Sender,\n} from './spend';\nimport type { UtxoFeeDetails } from './types';\n\nconst speedOf = (fee: FeeSpeed | FeeOverride): FeeSpeed | 'custom' =>\n typeof fee === 'string' ? fee : 'custom';\n\nconst paidOf = (fee: FeeEstimateDraft): bigint =>\n fee.charges.reduce((sum, charge) => sum + charge.amount, 0n);\n\nfunction draft(\n from: string,\n speed: FeeSpeed | 'custom',\n fee: bigint,\n details: UtxoFeeDetails,\n bound: 'exact' | 'expected',\n): FeeEstimateDraft {\n return {\n kind: 'utxo',\n speed,\n charges: [{ asset: 'native', amount: fee, label: 'network' }],\n bound,\n payer: from,\n details: { ...details },\n };\n}\n\n/** `UtxoFeeDetails` of a stored fee, checked (it is our own plain data). */\nfunction detailsOf(fee: FeeEstimateDraft): UtxoFeeDetails {\n const d = fee.details as Partial<UtxoFeeDetails>;\n if (\n fee.kind !== 'utxo' ||\n typeof d.satPerKvB !== 'bigint' ||\n !Number.isSafeInteger(d.vsize) ||\n (d.vsize as number) < 1 ||\n typeof d.change !== 'bigint' ||\n !Number.isSafeInteger(d.changeIndex)\n ) {\n throw new ValidationError('INVALID_INTENT', 'the fee is not a UTXO fee estimate');\n }\n return d as UtxoFeeDetails;\n}\n\n/** Everything that builds a transaction; shared by the builder and the replacement policy. */\ninterface Scope {\n readonly ctx: UtxoContext;\n readonly network: Network;\n readonly sequence: number;\n}\n\nconst scopeOf = (ctx: UtxoContext, network: Network): Scope => ({\n ctx,\n network,\n sequence: ctx.config.rbf ? SEQUENCE_RBF : SEQUENCE_FINAL_LOCKTIME,\n});\n\nconst changeOf = (scope: Scope, build: BuildContext, sender: Sender): DecodedAddress =>\n changeAddressOf(scope.ctx, build.wallet, sender, build.keys);\n\n/**\n * The message is a fixed text, so no amount reaches a log line; the amounts go only in\n * the details, as decimal strings, as in every family.\n */\nconst insufficient = (\n what: 'this transfer' | 'the replacement' | 'a cancel',\n required: bigint,\n available: bigint,\n): ChainError =>\n new ChainError('INSUFFICIENT_FUNDS', `insufficient funds for ${what}`, {\n details: { required: required.toString(), available: available.toString() },\n });\n\n/** At most this many previous transactions are read at once for one build. */\nexport const PREVIOUS_TX_READS = 4;\n\n/**\n * A refusal of a previous transaction put on the provider: the inputs' outpoints and values\n * are the indexer's, and their previous transactions are bound to their txids, so authentic\n * bytes that disagree with the indexer's output decide nothing (retryable), never a user\n * error.\n */\nfunction onProvider<T>(work: () => T): T {\n try {\n return work();\n } catch (error) {\n if (!isPreviousTxRefusal(error)) throw error;\n throw new ProviderError(\n 'PROVIDER_INCONSISTENT',\n \"the indexer's unspent output disagrees with its previous transaction\",\n { retryable: true, cause: error },\n );\n }\n}\n\n/** The previous transaction of each txid, read at most `PREVIOUS_TX_READS` at a time. */\nasync function previousTxs(\n scope: Scope,\n txids: readonly string[],\n signal?: AbortSignal,\n): Promise<ReadonlyMap<string, PreviousTx>> {\n const found = new Map<string, PreviousTx>();\n await forEachBounded(txids, PREVIOUS_TX_READS, async (txid) => {\n const prev = await scope.ctx.esplora.previousTx(txid, withSignal(READ, signal));\n if (prev === null) {\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n 'the previous transaction of an input is not available',\n );\n }\n found.set(txid, prev);\n });\n return found;\n}\n\n/** Which inputs of a build are new, and how their parents must be confirmed. */\ninterface NewInputs {\n /** The outpoints a replacement or cancel keeps: attested when their Attempt was built. */\n readonly kept: ReadonlySet<string>;\n /**\n * `minInputConfirmations: 0` on a transfer: an output of the wallet's own sent transaction\n * (its bytes known to this client) may be spent before a block holds it.\n */\n readonly ownUnconfirmed: boolean;\n}\n\n/**\n * Every input's value and script, authenticated against its previous transaction\n * (all wallet types, whatever `nonWitnessUtxo` says), so the node never judges bytes built\n * on an indexer's wrong value, and an outpoint its transaction does not have (a phantom\n * that nothing would ever spend, so never proven dead) is never built on. Either would\n * stall the Operation for good with its inputs held, since signed bytes cannot be\n * abandoned. A new input's previous transaction must also be in a block the proof quorum\n * attests, unless it is the wallet's own sent transaction and `minInputConfirmations` is\n * 0: a made-up parent would freeze the transfer the same way. p2pkh inputs carry it, and\n * segwit v0 ones while `nonWitnessUtxo` is on; taproot never does: BIP341 commits to\n * every amount, and `signed-psbt.ts` refuses one on a taproot input.\n */\nasync function authenticated(\n scope: Scope,\n wallet: WalletAddress,\n inputs: readonly Spendable[],\n fresh: NewInputs,\n signal?: AbortSignal,\n): Promise<PlannedInput[]> {\n const { esplora, config } = scope.ctx;\n // First, each new input's parent must be in a block the proof quorum attests,\n // at its own height; only then are its bytes read. Self-authenticating bytes prove what a\n // transaction is, never that a chain holds it.\n const parents = inputs\n .filter((input) => !fresh.kept.has(input.outpoint))\n .map((input) => input.txid)\n .filter((txid) => !(fresh.ownUnconfirmed && esplora.isOwn(txid)));\n await assertConfirmed(scope.ctx, parents, config.minInputConfirmations, signal);\n const embed =\n wallet.type === 'p2pkh' ||\n (wallet.type !== 'p2tr' && scope.ctx.config.nonWitnessUtxo);\n const txs = await previousTxs(scope, [...new Set(inputs.map((i) => i.txid))], signal);\n return inputs.map((input) => {\n const prevTx = txs.get(input.txid) as PreviousTx;\n onProvider(() => assertPrevious(prevTx, input, wallet.script));\n return embed ? { ...input, prevTx } : { ...input };\n });\n}\n\n/** `buildTx`, with its refusal of a previous transaction put on the provider. */\nfunction builtFor(\n scope: Scope,\n wallet: WalletAddress,\n inputs: readonly PlannedInput[],\n outputs: readonly PlannedOutput[],\n): BuiltTx {\n return onProvider(() =>\n buildTx(scope.network, wallet, inputs, outputs, scope.sequence),\n );\n}\n\n/** The unsigned transaction for a selection: PSBT, one request per input, exact fee, ordering. */\nasync function unsignedFor(\n scope: Scope,\n build: BuildContext,\n sender: Sender,\n selection: Selection,\n outputs: readonly PlannedOutput[],\n changeScript: Uint8Array,\n rate: bigint,\n speed: FeeSpeed | 'custom',\n summary: IntentSummary,\n fresh: NewInputs,\n): Promise<UnsignedTx> {\n const { wallet, key } = walletOf(scope.ctx, sender, build.keys);\n assertSaneFee(selection.fee, selection.vsize, scope.ctx.config);\n const all: PlannedOutput[] =\n selection.change > 0n\n ? [...outputs, { script: changeScript, value: selection.change }]\n : [...outputs];\n const inputs = await authenticated(\n scope,\n wallet,\n selection.inputs,\n fresh,\n build.signal,\n );\n const built = builtFor(scope, wallet, inputs, all);\n const signingRequests: SigningRequest[] = built.digests.map((digest, index) => ({\n id: `in:${index}`,\n scheme: wallet.type === 'p2tr' ? 'secp256k1-schnorr' : 'secp256k1-ecdsa',\n payload: digest,\n payloadKind: 'digest',\n publicKey:\n wallet.type === 'p2tr' ? (wallet.outputKey as Uint8Array) : wallet.publicKey,\n ...(key.keyRef ? { keyRef: key.keyRef } : {}),\n ...(wallet.tweak ? { params: { tweak: wallet.tweak } } : {}),\n }));\n return {\n payload: { encoding: 'base64', data: built.psbt },\n ...(built.txid !== undefined\n ? { expectedRef: { id: built.txid, idKind: 'txid', canonical: true } }\n : {}),\n signingRequests,\n ordering: { kind: 'inputs', inputs: selection.inputs.map((i) => i.outpoint).sort() },\n fee: draft(\n sender.from.canonical,\n speed,\n selection.fee,\n {\n satPerKvB: rate,\n vsize: selection.vsize,\n inputs: selection.inputs.length,\n outputs: all.length,\n change: selection.change,\n changeIndex: selection.change > 0n ? outputs.length : -1,\n },\n 'exact',\n ),\n summary,\n };\n}\n\n/** The replaced Attempt: its inputs (values from its PSBT), payments (no change) and fee. */\nfunction previousOf(scope: Scope, previous: UnsignedTx, sender: Sender) {\n const details = detailsOf(previous.fee);\n const view = viewPsbt(previous.payload.data, scope.network);\n const inputs: Spendable[] = view.inputs.map((i) => ({\n outpoint: i.outpoint,\n txid: i.txid,\n vout: i.vout,\n value: i.value,\n }));\n const outputs = view.outputs.filter((_, index) => index !== details.changeIndex);\n // A real signature may be a byte shorter than the worst case the estimate counts: a\n // full vbyte per legacy input, a quarter per witness input.\n const slack = sender.type === 'p2pkh' ? inputs.length : Math.ceil(inputs.length / 4);\n const minVsize = Math.max(1, details.vsize - slack);\n return { vsize: details.vsize, minVsize, inputs, outputs, paid: paidOf(previous.fee) };\n}\n\nexport interface UtxoBuilder extends TxBuilder {\n signaturesFrom(unsigned: UnsignedTx, signed: RawTx): readonly SignatureBundle[];\n}\n\nexport function utxoBuilder(ctx: UtxoContext, network: Network): UtxoBuilder {\n const scope = scopeOf(ctx, network);\n const { config } = ctx;\n const native = assetId(ctx.chain.id, ctx.network.id, 'native');\n\n const plan = async (intent: DriverIntent, rate: bigint, build: BuildContext) => {\n assertNative(intent.asset);\n // Defence in depth behind the network's capability check: nothing here writes a memo,\n // and the core would otherwise accept one this builder drops.\n if (intent.memo !== undefined) {\n throw new UnsupportedCapabilityError(\n 'UNSUPPORTED_CAPABILITY',\n 'Bitcoin transfers carry no memo (OP_RETURN is not supported)',\n );\n }\n const sender = senderOf(ctx, intent.from);\n const outputs = plannedOutputs(ctx, intent.outputs);\n const changeScript = changeOf(scope, build, sender).script;\n const candidates = await spendable(\n ctx,\n sender.from.canonical,\n build.excludeInputs,\n config.minInputConfirmations,\n build.signal,\n );\n const selection = selectCoins({\n candidates,\n outputs,\n changeScript,\n inputType: sender.type,\n rate,\n dustRelayFee: config.dustRelayFee,\n strategy: config.coinSelection,\n });\n return { sender, outputs, changeScript, selection };\n };\n\n return {\n async estimateFee(intent, build) {\n const rate = await rateOf(ctx, intent.fee, build.signal);\n const { sender, selection } = await plan(intent, rate, build);\n const change = selection.ok ? selection.change : 0n;\n return draft(\n sender.from.canonical,\n speedOf(intent.fee),\n selection.fee,\n {\n satPerKvB: rate,\n vsize: selection.vsize,\n inputs: selection.ok ? selection.inputs.length : 0,\n outputs: intent.outputs.length + (change > 0n ? 1 : 0),\n change,\n changeIndex: change > 0n ? intent.outputs.length : -1,\n },\n 'expected',\n );\n },\n\n async checkFunds(intent, fee, build) {\n assertNative(intent.asset);\n const candidates = await spendable(\n ctx,\n senderOf(ctx, intent.from).from.canonical,\n build.excludeInputs,\n config.minInputConfirmations,\n build.signal,\n );\n const available = candidates.reduce((sum, c) => sum + c.value, 0n);\n const required =\n intent.outputs.reduce((sum, o) => sum + o.amount, 0n) + paidOf(fee);\n return available >= required\n ? { ok: true }\n : { ok: false, asset: 'native', required, available };\n },\n\n async build(intent, fee, build) {\n const rate = detailsOf(fee).satPerKvB;\n const { sender, outputs, changeScript, selection } = await plan(\n intent,\n rate,\n build,\n );\n if (!selection.ok) {\n throw insufficient('this transfer', selection.required, selection.available);\n }\n return unsignedFor(\n scope,\n build,\n sender,\n selection,\n outputs,\n changeScript,\n rate,\n fee.speed,\n {\n asset: native,\n outputs: intent.outputs.map((o) => ({ to: o.to, amount: o.amount.toString() })),\n },\n { kept: new Set(), ownUnconfirmed: config.minInputConfirmations === 0 },\n );\n },\n\n async assemble(unsigned, signatures) {\n const { hex, txid } = assembleTx(\n unsigned.payload.data,\n network,\n unsigned.signingRequests,\n signatures,\n );\n if (unsigned.expectedRef && unsigned.expectedRef.id !== txid) {\n throw new SigningError(\n 'SIGNING_FAILED',\n 'the signed transaction id differs from the prepared one',\n );\n }\n return {\n raw: { encoding: 'hex', data: hex },\n ref: { id: txid, idKind: 'txid', canonical: true },\n };\n },\n\n signaturesFrom(unsigned, signed) {\n if (signed.encoding !== 'base64') {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'a signed PSBT is expected, as base64',\n );\n }\n return signaturesFromPsbt(\n unsigned.payload.data,\n signed.data,\n network,\n unsigned.signingRequests,\n );\n },\n };\n}\n\n/**\n * Twice Bitcoin Core's `MAX_BLOCK_SERIALIZED_SIZE`: no transaction's hex is longer, so\n * the untrusted text is capped before any decoding. A flat character class, never a\n * repeated group: V8's regexp stack overflows on a repeated group of a few million\n * matches, which a valid transaction can have.\n */\nconst MAX_TX_HEX = 8_000_000;\nconst HEX = /^[0-9a-fA-F]+$/;\n\n/**\n * An Attempt's bytes a node took (accepted, or already holds) are this wallet's\n * own sent transaction: its client keeps them. A bare broadcast (no ref) is not an Attempt.\n */\nfunction rememberOwn(ctx: UtxoContext, signed: SignedTx, hex: string): void {\n if (signed.ref.id === '') return;\n const tx = previousTxOf(hex);\n if (tx?.txid === signed.ref.id) ctx.esplora.rememberOwn(tx);\n}\n\nexport function utxoBroadcaster(ctx: UtxoContext): Broadcaster {\n return {\n async broadcast(signed: SignedTx, options = {}): Promise<BroadcastResult> {\n const { encoding, data } = signed.raw;\n if (\n encoding !== 'hex' ||\n data.length > MAX_TX_HEX ||\n data.length % 2 !== 0 ||\n !HEX.test(data)\n ) {\n throw new ValidationError('INVALID_INTENT', 'a raw Bitcoin transaction is hex');\n }\n const hex = data.toLowerCase();\n try {\n const txid = await ctx.esplora.broadcast(hex, {\n purpose: 'broadcast',\n retry: 'ambiguous-on-failure',\n ...(options.fanout !== undefined ? { fanout: options.fanout } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n // A bare broadcast (no ref) is checked against the bytes' own txid.\n const expected =\n signed.ref.id !== ''\n ? signed.ref.id\n : readTxHex(hex, { maxStripped: MAX_TX_BYTES })?.txid;\n if (txid !== expected) {\n // The node accepted something under another id: the outcome is unknown.\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n 'the node answered another txid',\n {\n ambiguous: true,\n },\n );\n }\n rememberOwn(ctx, signed, hex);\n return { kind: 'accepted' };\n } catch (error) {\n // A definitive 400 is bitcoind's answer; anything else is rethrown. A rejection\n // stands only when its reason holds for these bytes, checked here.\n if (\n isCryptoAioError(error, 'RPC_ERROR') &&\n !error.ambiguous &&\n error.details?.status === 400\n ) {\n const result = classifyOwnBroadcast(\n parseNodeError(String(error.details.body ?? '')),\n hex,\n );\n if (result.kind === 'already-known') rememberOwn(ctx, signed, hex);\n return result;\n }\n throw error;\n }\n },\n };\n}\n\nconst tooLow = (): ChainError =>\n new ChainError(\n 'FEE_TOO_LOW',\n 'a replacement must pay the replaced fee plus the incremental relay fee, at a higher rate',\n );\n\nexport function utxoReplacement(ctx: UtxoContext, network: Network): ReplacementPolicy {\n const scope = scopeOf(ctx, network);\n const { config } = ctx;\n return {\n replace: true,\n cancel: true,\n\n async buildReplacement(previous, fee, build) {\n const sender = senderOf(ctx, build.from);\n const prev = previousOf(scope, previous, sender);\n const rate = await rateOf(ctx, fee, build.signal);\n const changeScript = changeOf(scope, build, sender).script;\n // BIP125 rule 2: an input it adds must be confirmed; it never takes a held one.\n const candidates = await spendable(\n ctx,\n sender.from.canonical,\n [...(build.excludeInputs ?? []), ...prev.inputs.map((i) => i.outpoint)],\n Math.max(1, config.minInputConfirmations),\n build.signal,\n );\n const selection = selectCoins({\n candidates,\n required: prev.inputs,\n outputs: prev.outputs,\n changeScript,\n inputType: sender.type,\n rate,\n dustRelayFee: config.dustRelayFee,\n strategy: 'accumulative',\n });\n if (!selection.ok) {\n throw insufficient('the replacement', selection.required, selection.available);\n }\n const floor = replacementFloor(\n { fee: prev.paid, vsize: prev.vsize, minVsize: prev.minVsize },\n selection.vsize,\n config.incrementalRelayFee,\n );\n if (selection.fee < floor) throw tooLow();\n return unsignedFor(\n scope,\n build,\n sender,\n selection,\n prev.outputs,\n changeScript,\n rate,\n speedOf(fee),\n previous.summary,\n { kept: new Set(prev.inputs.map((i) => i.outpoint)), ownUnconfirmed: false },\n );\n },\n\n async buildCancel(previous, build, fee) {\n const sender = senderOf(ctx, build.from);\n const prev = previousOf(scope, previous, sender);\n // A cancel pays everything back to the sending address itself, never to a\n // configured change address (under `allowExternalChangeAddress` an external one). A\n // misconfigured change address is still refused here, as on every path.\n changeOf(scope, build, sender);\n const own = sender.from;\n const total = prev.inputs.reduce((sum, i) => sum + i.value, 0n);\n const vsize = vsizeOf(\n txWeight(sender.type, prev.inputs.length, [own.script.length]),\n );\n const floor = replacementFloor(\n { fee: prev.paid, vsize: prev.vsize, minVsize: prev.minVsize },\n vsize,\n config.incrementalRelayFee,\n );\n let paid = floor;\n let rate = (floor * 1_000n + BigInt(vsize) - 1n) / BigInt(vsize);\n if (fee !== undefined) {\n rate = await rateOf(ctx, fee, build.signal);\n paid = feeAt(rate, vsize);\n if (paid < floor) throw tooLow();\n }\n const dust = dustThreshold(own.script, config.dustRelayFee);\n if (total - paid < dust) throw insufficient('a cancel', paid + dust, total);\n const value = total - paid;\n return unsignedFor(\n scope,\n build,\n sender,\n { ok: true, inputs: prev.inputs, change: 0n, fee: paid, vsize },\n [{ script: own.script, value }],\n own.script,\n rate,\n fee === undefined ? 'custom' : speedOf(fee),\n {\n asset: previous.summary.asset,\n outputs: [{ to: own.canonical, amount: value.toString() }],\n },\n { kept: new Set(prev.inputs.map((i) => i.outpoint)), ownUnconfirmed: false },\n );\n },\n };\n}\n"]}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The built-in Bitcoin chain and networks. Genesis hashes and address prefixes are
3
+ * verified against Bitcoin Core's `src/kernel/chainparams.cpp`, and relay-policy numbers
4
+ * against its `src/policy/policy.h` and `policy.cpp`; the rest is library policy:
5
+ * - `finality: 6 confirmations` on every network, `defaultConfirmations: 1`
6
+ * (`waitForConfirmation` waits for inclusion by default; credit deposits on `final`).
7
+ * - `reorgWindow: 24` (four times the finality depth).
8
+ * - `maxLagBlocks`: 2 on mainnet and signet, 6 on the testnets (their 20-minute
9
+ * minimum-difficulty rule produces bursts of blocks), the transport default on regtest.
10
+ * - `minRelayFee` and `incrementalRelayFee` 1,000 sat/kvB (1 sat/vB): the defaults of
11
+ * Bitcoin Core before v30, so older nodes relay what this library builds.
12
+ * - `feeFallback`: the rate used when a test network's estimator has no data (never on
13
+ * mainnet, where a missing estimate fails the read instead).
14
+ */
15
+ import type { ChainInfo } from '../../core/model/chain';
16
+ /** Deep-frozen, so no caller can change a network another handle uses. */
17
+ export declare const BITCOIN_CHAIN: ChainInfo;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BITCOIN_CHAIN = void 0;
4
+ const freeze_1 = require("../../core/util/freeze");
5
+ const NETWORKS = [
6
+ {
7
+ id: 'mainnet',
8
+ genesis: '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f',
9
+ testnet: false,
10
+ bech32: 'bc',
11
+ pubKeyHash: 0x00,
12
+ scriptHash: 0x05,
13
+ explorer: 'https://blockstream.info',
14
+ maxLagBlocks: 2,
15
+ },
16
+ {
17
+ id: 'testnet',
18
+ genesis: '000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943',
19
+ testnet: true,
20
+ bech32: 'tb',
21
+ pubKeyHash: 0x6f,
22
+ scriptHash: 0xc4,
23
+ explorer: 'https://blockstream.info/testnet',
24
+ maxLagBlocks: 6,
25
+ feeFallback: 1000n,
26
+ },
27
+ {
28
+ id: 'testnet4',
29
+ genesis: '00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043',
30
+ testnet: true,
31
+ bech32: 'tb',
32
+ pubKeyHash: 0x6f,
33
+ scriptHash: 0xc4,
34
+ maxLagBlocks: 6,
35
+ feeFallback: 1000n,
36
+ },
37
+ {
38
+ id: 'signet',
39
+ genesis: '00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6',
40
+ testnet: true,
41
+ bech32: 'tb',
42
+ pubKeyHash: 0x6f,
43
+ scriptHash: 0xc4,
44
+ explorer: 'https://blockstream.info/signet',
45
+ maxLagBlocks: 2,
46
+ feeFallback: 1000n,
47
+ },
48
+ {
49
+ id: 'regtest',
50
+ genesis: '0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206',
51
+ testnet: true,
52
+ bech32: 'bcrt',
53
+ pubKeyHash: 0x6f,
54
+ scriptHash: 0xc4,
55
+ feeFallback: 1000n,
56
+ },
57
+ ];
58
+ function network(spec) {
59
+ return {
60
+ id: spec.id,
61
+ identity: spec.genesis,
62
+ testnet: spec.testnet,
63
+ feeModel: 'utxo',
64
+ finality: { kind: 'confirmations', confirmations: 6 },
65
+ defaultConfirmations: 1,
66
+ reorgWindow: 24,
67
+ ...(spec.maxLagBlocks !== undefined ? { maxLagBlocks: spec.maxLagBlocks } : {}),
68
+ ...(spec.explorer !== undefined
69
+ ? {
70
+ explorer: {
71
+ tx: `${spec.explorer}/tx/{id}`,
72
+ address: `${spec.explorer}/address/{address}`,
73
+ },
74
+ }
75
+ : {}),
76
+ params: {
77
+ bech32: spec.bech32,
78
+ pubKeyHash: spec.pubKeyHash,
79
+ scriptHash: spec.scriptHash,
80
+ dustRelayFee: 3000n,
81
+ minRelayFee: 1000n,
82
+ incrementalRelayFee: 1000n,
83
+ ...(spec.feeFallback !== undefined ? { feeFallback: spec.feeFallback } : {}),
84
+ },
85
+ };
86
+ }
87
+ /** Deep-frozen, so no caller can change a network another handle uses. */
88
+ exports.BITCOIN_CHAIN = (0, freeze_1.deepFreeze)({
89
+ id: 'bitcoin',
90
+ family: 'utxo',
91
+ model: 'utxo',
92
+ ordering: 'inputs',
93
+ // keys[0] (the ECDSA key) defines the address; p2tr wallets also sign with Schnorr.
94
+ schemes: ['secp256k1-ecdsa', 'secp256k1-schnorr'],
95
+ nativeAsset: { symbol: 'BTC', decimals: 8, name: 'Bitcoin' },
96
+ defaultNetwork: 'mainnet',
97
+ networks: Object.fromEntries(NETWORKS.map((spec) => [spec.id, network(spec)])),
98
+ });
99
+ //# sourceMappingURL=chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/adapters/utxo/chains.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The built-in Bitcoin chain and networks. Genesis hashes and address prefixes are\n * verified against Bitcoin Core's `src/kernel/chainparams.cpp`, and relay-policy numbers\n * against its `src/policy/policy.h` and `policy.cpp`; the rest is library policy:\n * - `finality: 6 confirmations` on every network, `defaultConfirmations: 1`\n * (`waitForConfirmation` waits for inclusion by default; credit deposits on `final`).\n * - `reorgWindow: 24` (four times the finality depth).\n * - `maxLagBlocks`: 2 on mainnet and signet, 6 on the testnets (their 20-minute\n * minimum-difficulty rule produces bursts of blocks), the transport default on regtest.\n * - `minRelayFee` and `incrementalRelayFee` 1,000 sat/kvB (1 sat/vB): the defaults of\n * Bitcoin Core before v30, so older nodes relay what this library builds.\n * - `feeFallback`: the rate used when a test network's estimator has no data (never on\n * mainnet, where a missing estimate fails the read instead).\n */\nimport type { ChainInfo, NetworkInfo } from '../../core/model/chain';\nimport { deepFreeze } from '../../core/util/freeze';\n\ninterface NetworkSpec {\n readonly id: string;\n readonly genesis: string;\n readonly testnet: boolean;\n readonly bech32: string;\n readonly pubKeyHash: number;\n readonly scriptHash: number;\n readonly explorer?: string;\n readonly maxLagBlocks?: number;\n readonly feeFallback?: bigint;\n}\n\nconst NETWORKS: readonly NetworkSpec[] = [\n {\n id: 'mainnet',\n genesis: '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f',\n testnet: false,\n bech32: 'bc',\n pubKeyHash: 0x00,\n scriptHash: 0x05,\n explorer: 'https://blockstream.info',\n maxLagBlocks: 2,\n },\n {\n id: 'testnet',\n genesis: '000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943',\n testnet: true,\n bech32: 'tb',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n explorer: 'https://blockstream.info/testnet',\n maxLagBlocks: 6,\n feeFallback: 1_000n,\n },\n {\n id: 'testnet4',\n genesis: '00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043',\n testnet: true,\n bech32: 'tb',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n maxLagBlocks: 6,\n feeFallback: 1_000n,\n },\n {\n id: 'signet',\n genesis: '00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6',\n testnet: true,\n bech32: 'tb',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n explorer: 'https://blockstream.info/signet',\n maxLagBlocks: 2,\n feeFallback: 1_000n,\n },\n {\n id: 'regtest',\n genesis: '0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206',\n testnet: true,\n bech32: 'bcrt',\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n feeFallback: 1_000n,\n },\n];\n\nfunction network(spec: NetworkSpec): NetworkInfo {\n return {\n id: spec.id,\n identity: spec.genesis,\n testnet: spec.testnet,\n feeModel: 'utxo',\n finality: { kind: 'confirmations', confirmations: 6 },\n defaultConfirmations: 1,\n reorgWindow: 24,\n ...(spec.maxLagBlocks !== undefined ? { maxLagBlocks: spec.maxLagBlocks } : {}),\n ...(spec.explorer !== undefined\n ? {\n explorer: {\n tx: `${spec.explorer}/tx/{id}`,\n address: `${spec.explorer}/address/{address}`,\n },\n }\n : {}),\n params: {\n bech32: spec.bech32,\n pubKeyHash: spec.pubKeyHash,\n scriptHash: spec.scriptHash,\n dustRelayFee: 3_000n,\n minRelayFee: 1_000n,\n incrementalRelayFee: 1_000n,\n ...(spec.feeFallback !== undefined ? { feeFallback: spec.feeFallback } : {}),\n },\n };\n}\n\n/** Deep-frozen, so no caller can change a network another handle uses. */\nexport const BITCOIN_CHAIN: ChainInfo = deepFreeze({\n id: 'bitcoin',\n family: 'utxo',\n model: 'utxo',\n ordering: 'inputs',\n // keys[0] (the ECDSA key) defines the address; p2tr wallets also sign with Schnorr.\n schemes: ['secp256k1-ecdsa', 'secp256k1-schnorr'],\n nativeAsset: { symbol: 'BTC', decimals: 8, name: 'Bitcoin' },\n defaultNetwork: 'mainnet',\n networks: Object.fromEntries(NETWORKS.map((spec) => [spec.id, network(spec)])),\n});\n"]}