@atomiqlabs/sdk 7.0.12 → 8.0.8

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 (364) hide show
  1. package/README.md +45 -29
  2. package/dist/SmartChainAssets.d.ts +11 -3
  3. package/dist/SmartChainAssets.js +7 -3
  4. package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
  5. package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
  6. package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
  7. package/dist/bitcoin/LightningNetworkApi.js +2 -0
  8. package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
  9. package/dist/bitcoin/coinselect2/accumulative.js +52 -0
  10. package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
  11. package/dist/bitcoin/coinselect2/blackjack.js +38 -0
  12. package/dist/bitcoin/coinselect2/index.d.ts +19 -0
  13. package/dist/bitcoin/coinselect2/index.js +69 -0
  14. package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
  15. package/dist/bitcoin/coinselect2/utils.js +123 -0
  16. package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
  17. package/dist/bitcoin/mempool/MempoolApi.js +311 -0
  18. package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
  19. package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
  20. package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
  21. package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
  22. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
  23. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
  24. package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
  25. package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
  26. package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
  27. package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
  28. package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
  29. package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
  30. package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
  31. package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
  32. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
  33. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
  34. package/dist/enums/FeeType.d.ts +8 -0
  35. package/dist/enums/FeeType.js +12 -0
  36. package/dist/enums/SwapAmountType.d.ts +8 -0
  37. package/dist/enums/SwapAmountType.js +12 -0
  38. package/dist/enums/SwapDirection.d.ts +8 -0
  39. package/dist/enums/SwapDirection.js +12 -0
  40. package/dist/enums/SwapType.d.ts +14 -0
  41. package/dist/enums/SwapType.js +18 -0
  42. package/dist/errors/IntermediaryError.d.ts +9 -0
  43. package/dist/errors/IntermediaryError.js +26 -0
  44. package/dist/errors/PaymentAuthError.d.ts +11 -0
  45. package/dist/errors/PaymentAuthError.js +23 -0
  46. package/dist/errors/RequestError.d.ts +18 -0
  47. package/dist/errors/RequestError.js +46 -0
  48. package/dist/errors/UserError.d.ts +7 -0
  49. package/dist/errors/UserError.js +15 -0
  50. package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
  51. package/dist/events/UnifiedSwapEventListener.js +130 -0
  52. package/dist/http/HttpUtils.d.ts +27 -0
  53. package/dist/http/HttpUtils.js +91 -0
  54. package/dist/http/paramcoders/IParamReader.d.ts +8 -0
  55. package/dist/http/paramcoders/IParamReader.js +2 -0
  56. package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
  57. package/dist/http/paramcoders/ParamDecoder.js +132 -0
  58. package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
  59. package/dist/http/paramcoders/ParamEncoder.js +31 -0
  60. package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
  61. package/dist/http/paramcoders/SchemaVerifier.js +145 -0
  62. package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
  63. package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
  64. package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
  65. package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
  66. package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
  67. package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
  68. package/dist/index.d.ts +82 -4
  69. package/dist/index.js +128 -4
  70. package/dist/intermediaries/Intermediary.d.ts +111 -0
  71. package/dist/intermediaries/Intermediary.js +115 -0
  72. package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
  73. package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
  74. package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
  75. package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
  76. package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
  77. package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
  78. package/dist/lnurl/LNURL.d.ts +102 -0
  79. package/dist/lnurl/LNURL.js +321 -0
  80. package/dist/prices/RedundantSwapPrice.d.ts +89 -0
  81. package/dist/prices/RedundantSwapPrice.js +202 -0
  82. package/dist/prices/SingleSwapPrice.d.ts +31 -0
  83. package/dist/prices/SingleSwapPrice.js +41 -0
  84. package/dist/prices/SwapPriceWithChain.d.ts +70 -0
  85. package/dist/prices/SwapPriceWithChain.js +91 -0
  86. package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
  87. package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
  88. package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
  89. package/dist/prices/abstract/IPriceProvider.js +74 -0
  90. package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
  91. package/dist/prices/abstract/ISwapPrice.js +219 -0
  92. package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
  93. package/dist/prices/providers/BinancePriceProvider.js +23 -0
  94. package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
  95. package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
  96. package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
  97. package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
  98. package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
  99. package/dist/prices/providers/CustomPriceProvider.js +24 -0
  100. package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
  101. package/dist/prices/providers/KrakenPriceProvider.js +36 -0
  102. package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
  103. package/dist/prices/providers/OKXPriceProvider.js +23 -0
  104. package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
  105. package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
  106. package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
  107. package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
  108. package/dist/storage/IUnifiedStorage.d.ts +73 -0
  109. package/dist/storage/IUnifiedStorage.js +2 -0
  110. package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
  111. package/dist/storage/UnifiedSwapStorage.js +83 -0
  112. package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
  113. package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
  114. package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
  115. package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
  116. package/dist/swapper/Swapper.d.ts +533 -0
  117. package/dist/swapper/Swapper.js +1566 -0
  118. package/dist/swapper/SwapperFactory.d.ts +87 -0
  119. package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +37 -19
  120. package/dist/swapper/SwapperUtils.d.ts +153 -0
  121. package/dist/swapper/SwapperUtils.js +420 -0
  122. package/dist/swapper/SwapperWithChain.d.ts +214 -0
  123. package/dist/swapper/SwapperWithChain.js +315 -0
  124. package/dist/swapper/SwapperWithSigner.d.ts +178 -0
  125. package/dist/swapper/SwapperWithSigner.js +172 -0
  126. package/dist/swaps/IAddressSwap.d.ts +13 -0
  127. package/dist/swaps/IAddressSwap.js +13 -0
  128. package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
  129. package/dist/swaps/IBTCWalletSwap.js +17 -0
  130. package/dist/swaps/IClaimableSwap.d.ts +17 -0
  131. package/dist/swaps/IClaimableSwap.js +14 -0
  132. package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
  133. package/dist/swaps/IClaimableSwapWrapper.js +2 -0
  134. package/dist/swaps/IRefundableSwap.d.ts +17 -0
  135. package/dist/swaps/IRefundableSwap.js +13 -0
  136. package/dist/swaps/ISwap.d.ts +207 -0
  137. package/dist/swaps/ISwap.js +264 -0
  138. package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
  139. package/dist/swaps/ISwapWithGasDrop.js +11 -0
  140. package/dist/swaps/ISwapWrapper.d.ts +153 -0
  141. package/dist/swaps/ISwapWrapper.js +227 -0
  142. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
  143. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
  144. package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
  145. package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
  146. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
  147. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
  148. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
  149. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
  150. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
  151. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
  152. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
  153. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
  154. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
  155. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
  156. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
  157. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
  158. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
  159. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
  160. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
  161. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
  162. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
  163. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
  164. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
  165. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
  166. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
  167. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
  168. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
  169. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
  170. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
  171. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
  172. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
  173. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
  174. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
  175. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
  176. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
  177. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
  178. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
  179. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
  180. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
  181. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
  182. package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
  183. package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
  184. package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
  185. package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
  186. package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
  187. package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
  188. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
  189. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
  190. package/dist/types/AmountData.d.ts +9 -0
  191. package/dist/types/AmountData.js +2 -0
  192. package/dist/types/CustomPriceFunction.d.ts +5 -0
  193. package/dist/types/CustomPriceFunction.js +2 -0
  194. package/dist/types/PriceInfoType.d.ts +28 -0
  195. package/dist/types/PriceInfoType.js +57 -0
  196. package/dist/types/SwapExecutionAction.d.ts +7 -0
  197. package/dist/types/SwapExecutionAction.js +2 -0
  198. package/dist/types/SwapWithSigner.d.ts +14 -0
  199. package/dist/types/SwapWithSigner.js +40 -0
  200. package/dist/types/Token.d.ts +53 -0
  201. package/dist/types/Token.js +58 -0
  202. package/dist/types/TokenAmount.d.ts +57 -0
  203. package/dist/types/TokenAmount.js +47 -0
  204. package/dist/types/fees/Fee.d.ts +49 -0
  205. package/dist/types/fees/Fee.js +2 -0
  206. package/dist/types/fees/FeeBreakdown.d.ts +10 -0
  207. package/dist/types/fees/FeeBreakdown.js +2 -0
  208. package/dist/types/fees/PercentagePPM.d.ts +15 -0
  209. package/dist/types/fees/PercentagePPM.js +17 -0
  210. package/dist/types/lnurl/LNURLPay.d.ts +54 -0
  211. package/dist/types/lnurl/LNURLPay.js +28 -0
  212. package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
  213. package/dist/types/lnurl/LNURLWithdraw.js +24 -0
  214. package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
  215. package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
  216. package/dist/utils/BitcoinUtils.d.ts +13 -0
  217. package/dist/utils/BitcoinUtils.js +98 -0
  218. package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
  219. package/dist/utils/BitcoinWalletUtils.js +14 -0
  220. package/dist/utils/Logger.d.ts +7 -0
  221. package/dist/utils/Logger.js +12 -0
  222. package/dist/utils/RetryUtils.d.ts +21 -0
  223. package/dist/utils/RetryUtils.js +66 -0
  224. package/dist/utils/SwapUtils.d.ts +31 -0
  225. package/dist/utils/SwapUtils.js +18 -0
  226. package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
  227. package/dist/utils/TimeoutUtils.js +55 -0
  228. package/dist/utils/TokenUtils.d.ts +11 -0
  229. package/dist/utils/TokenUtils.js +29 -0
  230. package/dist/utils/TypeUtils.d.ts +7 -0
  231. package/dist/utils/TypeUtils.js +2 -0
  232. package/dist/utils/Utils.d.ts +57 -0
  233. package/dist/utils/Utils.js +178 -0
  234. package/package.json +14 -6
  235. package/src/SmartChainAssets.ts +11 -3
  236. package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
  237. package/src/bitcoin/LightningNetworkApi.ts +16 -0
  238. package/src/bitcoin/coinselect2/accumulative.ts +68 -0
  239. package/src/bitcoin/coinselect2/blackjack.ts +49 -0
  240. package/src/bitcoin/coinselect2/index.ts +92 -0
  241. package/src/bitcoin/coinselect2/utils.ts +189 -0
  242. package/src/bitcoin/mempool/MempoolApi.ts +554 -0
  243. package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
  244. package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
  245. package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
  246. package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
  247. package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
  248. package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
  249. package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
  250. package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
  251. package/src/enums/FeeType.ts +9 -0
  252. package/src/enums/SwapAmountType.ts +9 -0
  253. package/src/enums/SwapDirection.ts +9 -0
  254. package/src/enums/SwapType.ts +15 -0
  255. package/src/errors/IntermediaryError.ts +24 -0
  256. package/src/errors/PaymentAuthError.ts +26 -0
  257. package/src/errors/RequestError.ts +51 -0
  258. package/src/errors/UserError.ts +14 -0
  259. package/src/events/UnifiedSwapEventListener.ts +171 -0
  260. package/src/http/HttpUtils.ts +92 -0
  261. package/src/http/paramcoders/IParamReader.ts +10 -0
  262. package/src/http/paramcoders/ParamDecoder.ts +142 -0
  263. package/src/http/paramcoders/ParamEncoder.ts +37 -0
  264. package/src/http/paramcoders/SchemaVerifier.ts +153 -0
  265. package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
  266. package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
  267. package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
  268. package/src/index.ts +102 -4
  269. package/src/intermediaries/Intermediary.ts +204 -0
  270. package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
  271. package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
  272. package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
  273. package/src/lnurl/LNURL.ts +403 -0
  274. package/src/prices/RedundantSwapPrice.ts +245 -0
  275. package/src/prices/SingleSwapPrice.ts +47 -0
  276. package/src/prices/SwapPriceWithChain.ts +157 -0
  277. package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
  278. package/src/prices/abstract/IPriceProvider.ts +128 -0
  279. package/src/prices/abstract/ISwapPrice.ts +328 -0
  280. package/src/prices/providers/BinancePriceProvider.ts +41 -0
  281. package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
  282. package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
  283. package/src/prices/providers/CustomPriceProvider.ts +29 -0
  284. package/src/prices/providers/KrakenPriceProvider.ts +74 -0
  285. package/src/prices/providers/OKXPriceProvider.ts +53 -0
  286. package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
  287. package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
  288. package/src/storage/IUnifiedStorage.ts +83 -0
  289. package/src/storage/UnifiedSwapStorage.ts +104 -0
  290. package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
  291. package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
  292. package/src/swapper/Swapper.ts +2107 -0
  293. package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +113 -72
  294. package/src/swapper/SwapperUtils.ts +510 -0
  295. package/src/swapper/SwapperWithChain.ts +464 -0
  296. package/src/swapper/SwapperWithSigner.ts +300 -0
  297. package/src/swaps/IAddressSwap.ts +20 -0
  298. package/src/swaps/IBTCWalletSwap.ts +77 -0
  299. package/src/swaps/IClaimableSwap.ts +30 -0
  300. package/src/swaps/IClaimableSwapWrapper.ts +9 -0
  301. package/src/swaps/IRefundableSwap.ts +29 -0
  302. package/src/swaps/ISwap.ts +490 -0
  303. package/src/swaps/ISwapWithGasDrop.ts +19 -0
  304. package/src/swaps/ISwapWrapper.ts +344 -0
  305. package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
  306. package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
  307. package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
  308. package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
  309. package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
  310. package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
  311. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
  312. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
  313. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
  314. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
  315. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
  316. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
  317. package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
  318. package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
  319. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
  320. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
  321. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
  322. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
  323. package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
  324. package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
  325. package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
  326. package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
  327. package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
  328. package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
  329. package/src/types/AmountData.ts +9 -0
  330. package/src/types/CustomPriceFunction.ts +5 -0
  331. package/src/types/PriceInfoType.ts +67 -0
  332. package/src/types/SwapExecutionAction.ts +8 -0
  333. package/src/types/SwapWithSigner.ts +57 -0
  334. package/src/types/Token.ts +90 -0
  335. package/src/types/TokenAmount.ts +110 -0
  336. package/src/types/fees/Fee.ts +55 -0
  337. package/src/types/fees/FeeBreakdown.ts +11 -0
  338. package/src/types/fees/PercentagePPM.ts +24 -0
  339. package/src/types/lnurl/LNURLPay.ts +72 -0
  340. package/src/types/lnurl/LNURLWithdraw.ts +55 -0
  341. package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
  342. package/src/utils/BitcoinUtils.ts +86 -0
  343. package/src/utils/BitcoinWalletUtils.ts +16 -0
  344. package/src/utils/Logger.ts +15 -0
  345. package/src/utils/RetryUtils.ts +71 -0
  346. package/src/utils/SwapUtils.ts +38 -0
  347. package/src/utils/TimeoutUtils.ts +50 -0
  348. package/src/utils/TokenUtils.ts +25 -0
  349. package/src/utils/TypeUtils.ts +9 -0
  350. package/src/utils/Utils.ts +182 -0
  351. package/dist/SwapperFactory.d.ts +0 -52
  352. package/dist/Utils.js +0 -37
  353. package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
  354. package/dist/fs-storage/FileSystemStorageManager.js +0 -60
  355. package/dist/fs-storage/index.d.ts +0 -1
  356. package/dist/fs-storage/index.js +0 -17
  357. package/src/SmartChainAssets.js +0 -75
  358. package/src/SwapperFactory.js +0 -120
  359. package/src/Utils.js +0 -37
  360. package/src/Utils.ts +0 -31
  361. package/src/fs-storage/FileSystemStorageManager.ts +0 -71
  362. package/src/fs-storage/index.ts +0 -1
  363. package/src/index.js +0 -21
  364. package/src/storage/LocalStorageManager.js +0 -72
@@ -0,0 +1,57 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Buffer } from "buffer";
4
+ /**
5
+ * Returns a promise that rejects if the passed promise resolves to `undefined` or `null`
6
+ *
7
+ * @param promise Promise to check resolve value of
8
+ * @param msg Optional message to pass to the thrown `Error`
9
+ * @category Utilities
10
+ */
11
+ export declare function throwIfUndefined<T>(promise: Promise<T | undefined>, msg?: string): Promise<T>;
12
+ /**
13
+ * Returns a promise that resolves when any of the passed promises resolves, and rejects if all the underlying
14
+ * promises fail with an array of errors returned by the respective promises
15
+ *
16
+ * @param promises A list of promises
17
+ * @category Utilities
18
+ */
19
+ export declare function promiseAny<T>(promises: Promise<T>[]): Promise<T>;
20
+ /**
21
+ * Maps a JS object to another JS object based on the translation function, the translation function is called for every
22
+ * property (value/key) of the old object and returns the new value of for this property
23
+ *
24
+ * @param obj
25
+ * @param translator
26
+ */
27
+ export declare function objectMap<InputObject extends {
28
+ [key in string]: any;
29
+ }, OutputObject extends {
30
+ [key in keyof InputObject]: any;
31
+ }>(obj: InputObject, translator: <InputKey extends Extract<keyof InputObject, string>>(value: InputObject[InputKey], key: InputKey) => OutputObject[InputKey]): {
32
+ [key in keyof InputObject]: OutputObject[key];
33
+ };
34
+ /**
35
+ * Maps the entries from the map to the array using the translator function
36
+ *
37
+ * @param map
38
+ * @param translator
39
+ */
40
+ export declare function mapToArray<K, V, Output>(map: Map<K, V>, translator: (key: K, value: V) => Output): Output[];
41
+ /**
42
+ * Creates a new abort controller that will abort if the passed abort signal aborts
43
+ *
44
+ * @param abortSignal
45
+ */
46
+ export declare function extendAbortController(abortSignal?: AbortSignal): AbortController;
47
+ export declare function bigIntMin(a: bigint, b: bigint): bigint;
48
+ export declare function bigIntMin(a?: bigint, b?: bigint): bigint | undefined;
49
+ export declare function bigIntMax(a: bigint, b: bigint): bigint;
50
+ export declare function bigIntMax(a?: bigint, b?: bigint): bigint | undefined;
51
+ export declare function bigIntCompare(a: bigint, b: bigint): -1 | 0 | 1;
52
+ export declare function toBigInt(value: string): bigint;
53
+ export declare function toBigInt(value: undefined): undefined;
54
+ export declare function randomBytes(bytesLength: number): Buffer;
55
+ export declare function getTxoHash(outputScriptHex: string, value: number): Buffer;
56
+ export declare function fromDecimal(amount: string, decimalCount: number): bigint;
57
+ export declare function toDecimal(amount: bigint, decimalCount: number, cut?: boolean, displayDecimals?: number): string;
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toDecimal = exports.fromDecimal = exports.getTxoHash = exports.randomBytes = exports.toBigInt = exports.bigIntCompare = exports.bigIntMax = exports.bigIntMin = exports.extendAbortController = exports.mapToArray = exports.objectMap = exports.promiseAny = exports.throwIfUndefined = void 0;
4
+ const buffer_1 = require("buffer");
5
+ const utils_1 = require("@noble/hashes/utils");
6
+ const sha2_1 = require("@noble/hashes/sha2");
7
+ const base_1 = require("@atomiqlabs/base");
8
+ /**
9
+ * Returns a promise that rejects if the passed promise resolves to `undefined` or `null`
10
+ *
11
+ * @param promise Promise to check resolve value of
12
+ * @param msg Optional message to pass to the thrown `Error`
13
+ * @category Utilities
14
+ */
15
+ function throwIfUndefined(promise, msg) {
16
+ return promise.then(val => {
17
+ if (val == undefined)
18
+ throw new Error(msg ?? "Promise value is undefined!");
19
+ return val;
20
+ });
21
+ }
22
+ exports.throwIfUndefined = throwIfUndefined;
23
+ /**
24
+ * Returns a promise that resolves when any of the passed promises resolves, and rejects if all the underlying
25
+ * promises fail with an array of errors returned by the respective promises
26
+ *
27
+ * @param promises A list of promises
28
+ * @category Utilities
29
+ */
30
+ function promiseAny(promises) {
31
+ return new Promise((resolve, reject) => {
32
+ let numRejected = 0;
33
+ const rejectReasons = Array(promises.length);
34
+ promises.forEach((promise, index) => {
35
+ promise.then((val) => {
36
+ if (resolve != null)
37
+ resolve(val);
38
+ resolve = null;
39
+ }).catch(err => {
40
+ rejectReasons[index] = err;
41
+ numRejected++;
42
+ if (numRejected === promises.length) {
43
+ reject(rejectReasons);
44
+ }
45
+ });
46
+ });
47
+ });
48
+ }
49
+ exports.promiseAny = promiseAny;
50
+ /**
51
+ * Maps a JS object to another JS object based on the translation function, the translation function is called for every
52
+ * property (value/key) of the old object and returns the new value of for this property
53
+ *
54
+ * @param obj
55
+ * @param translator
56
+ */
57
+ function objectMap(obj, translator) {
58
+ const resp = {};
59
+ for (let key in obj) {
60
+ resp[key] = translator(obj[key], key);
61
+ }
62
+ return resp;
63
+ }
64
+ exports.objectMap = objectMap;
65
+ /**
66
+ * Maps the entries from the map to the array using the translator function
67
+ *
68
+ * @param map
69
+ * @param translator
70
+ */
71
+ function mapToArray(map, translator) {
72
+ const arr = Array(map.size);
73
+ let pointer = 0;
74
+ for (let entry of map.entries()) {
75
+ arr[pointer++] = translator(entry[0], entry[1]);
76
+ }
77
+ return arr;
78
+ }
79
+ exports.mapToArray = mapToArray;
80
+ /**
81
+ * Creates a new abort controller that will abort if the passed abort signal aborts
82
+ *
83
+ * @param abortSignal
84
+ */
85
+ function extendAbortController(abortSignal) {
86
+ const _abortController = new AbortController();
87
+ if (abortSignal != null) {
88
+ abortSignal.throwIfAborted();
89
+ abortSignal.onabort = () => _abortController.abort(abortSignal.reason);
90
+ }
91
+ return _abortController;
92
+ }
93
+ exports.extendAbortController = extendAbortController;
94
+ function bigIntMin(a, b) {
95
+ if (a == null)
96
+ return b;
97
+ if (b == null)
98
+ return a;
99
+ return a > b ? b : a;
100
+ }
101
+ exports.bigIntMin = bigIntMin;
102
+ function bigIntMax(a, b) {
103
+ if (a == null)
104
+ return b;
105
+ if (b == null)
106
+ return a;
107
+ return b > a ? b : a;
108
+ }
109
+ exports.bigIntMax = bigIntMax;
110
+ function bigIntCompare(a, b) {
111
+ return a > b ? 1 : a === b ? 0 : -1;
112
+ }
113
+ exports.bigIntCompare = bigIntCompare;
114
+ function toBigInt(value) {
115
+ if (value == null)
116
+ return undefined;
117
+ return BigInt(value);
118
+ }
119
+ exports.toBigInt = toBigInt;
120
+ function randomBytes(bytesLength) {
121
+ return buffer_1.Buffer.from((0, utils_1.randomBytes)(bytesLength));
122
+ }
123
+ exports.randomBytes = randomBytes;
124
+ function getTxoHash(outputScriptHex, value) {
125
+ return buffer_1.Buffer.from((0, sha2_1.sha256)(buffer_1.Buffer.concat([
126
+ base_1.BigIntBufferUtils.toBuffer(BigInt(value), "le", 8),
127
+ buffer_1.Buffer.from(outputScriptHex, "hex")
128
+ ])));
129
+ }
130
+ exports.getTxoHash = getTxoHash;
131
+ function fromDecimal(amount, decimalCount) {
132
+ if (amount.includes(".")) {
133
+ const [before, after] = amount.split(".");
134
+ if (decimalCount < 0) {
135
+ return BigInt(before.substring(0, before.length + decimalCount));
136
+ }
137
+ if (after.length > decimalCount) {
138
+ //Cut the last digits
139
+ return BigInt((before === "0" ? "" : before) + after.substring(0, decimalCount));
140
+ }
141
+ return BigInt((before === "0" ? "" : before) + after.padEnd(decimalCount, "0"));
142
+ }
143
+ else {
144
+ if (decimalCount < 0) {
145
+ return BigInt(amount.substring(0, amount.length + decimalCount));
146
+ }
147
+ else {
148
+ return BigInt(amount + "0".repeat(decimalCount));
149
+ }
150
+ }
151
+ }
152
+ exports.fromDecimal = fromDecimal;
153
+ function toDecimal(amount, decimalCount, cut, displayDecimals) {
154
+ if (decimalCount <= 0) {
155
+ return amount.toString(10) + "0".repeat(-decimalCount);
156
+ }
157
+ const amountStr = amount.toString(10).padStart(decimalCount + 1, "0");
158
+ const splitPoint = amountStr.length - decimalCount;
159
+ const decimalPart = amountStr.substring(splitPoint, amountStr.length);
160
+ let cutTo = decimalPart.length;
161
+ if (cut && cutTo > 0) {
162
+ for (let i = decimalPart.length - 1; i--; i >= 0) {
163
+ if (decimalPart.charAt(i) === "0") {
164
+ cutTo = i;
165
+ }
166
+ else
167
+ break;
168
+ }
169
+ if (cutTo === 0)
170
+ cutTo = 1;
171
+ }
172
+ if (displayDecimals === 0)
173
+ return amountStr.substring(0, splitPoint);
174
+ if (displayDecimals != null && cutTo > displayDecimals)
175
+ cutTo = displayDecimals;
176
+ return amountStr.substring(0, splitPoint) + "." + decimalPart.substring(0, cutTo);
177
+ }
178
+ exports.toDecimal = toDecimal;
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@atomiqlabs/sdk",
3
- "version": "7.0.12",
3
+ "version": "8.0.8",
4
4
  "description": "atomiq labs SDK for cross-chain swaps between smart chains and bitcoin",
5
5
  "main": "./dist/index.js",
6
6
  "types:": "./dist/index.d.ts",
7
7
  "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1"
8
+ "test": "echo \"Error: no test specified\" && exit 1",
9
+ "build:ts4": "npx -p typescript@4.9 tsc --noEmit",
10
+ "build:ts5": "npx -p typescript@5.9 tsc --noEmit"
9
11
  },
10
12
  "files": [
11
13
  "/dist",
@@ -21,12 +23,18 @@
21
23
  "author": "adambor",
22
24
  "license": "ISC",
23
25
  "dependencies": {
24
- "@atomiqlabs/base": "^12.0.4",
25
- "@atomiqlabs/messenger-nostr": "^1.0.1",
26
- "@atomiqlabs/sdk-lib": "^16.2.7"
26
+ "@atomiqlabs/base": "^13.0.4",
27
+ "@atomiqlabs/bolt11": "1.6.1",
28
+ "@atomiqlabs/messenger-nostr": "^2.0.0",
29
+ "@noble/ciphers": "^1.2.1",
30
+ "@noble/hashes": "^1.7.1",
31
+ "@scure/base": "^1.2.4",
32
+ "@scure/btc-signer": "1.7.0",
33
+ "buffer": "6.0.3",
34
+ "events": "3.3.0"
27
35
  },
28
36
  "devDependencies": {
29
37
  "@types/node": "22.13.5",
30
- "typescript": "4.9.5"
38
+ "typescript": ">=4"
31
39
  }
32
40
  }
@@ -1,4 +1,8 @@
1
1
 
2
+ /**
3
+ * Asset definitions for supported smart chain tokens with pricing information
4
+ * @category Tokens
5
+ */
2
6
  export const SmartChainAssets = {
3
7
  _TESTNET_WBTC_VESU: {
4
8
  pricing: {
@@ -32,11 +36,11 @@ export const SmartChainAssets = {
32
36
  },
33
37
  TBTC: {
34
38
  pricing: {
35
- binancePair: null,
36
- okxPair: null,
39
+ binancePair: undefined,
40
+ okxPair: undefined,
37
41
  coinGeckoCoinId: "tbtc",
38
42
  coinPaprikaCoinId: "tbtc-tbtc",
39
- krakenPair: null
43
+ krakenPair: undefined
40
44
  },
41
45
  name: "Threshold BTC (tBTC)"
42
46
  },
@@ -155,4 +159,8 @@ export const SmartChainAssets = {
155
159
  }
156
160
  } as const;
157
161
 
162
+ /**
163
+ * Type representing valid smart chain asset ticker symbols
164
+ * @category Tokens
165
+ */
158
166
  export type SmartChainAssetTickers = keyof typeof SmartChainAssets;
@@ -0,0 +1,87 @@
1
+ import {BitcoinRpc, BtcBlock, BtcTx} from "@atomiqlabs/base";
2
+ import {Buffer} from "buffer";
3
+
4
+ export type BtcTxWithBlockheight = BtcTx & {
5
+ blockheight?: number,
6
+ inputAddresses?: string[]
7
+ };
8
+
9
+ export type BtcAddressUtxo = {
10
+ txid: string,
11
+ vout: number,
12
+ confirmed: boolean,
13
+ block_height: number,
14
+ block_hash: string,
15
+ block_time: number
16
+ value: bigint
17
+ };
18
+
19
+ export interface BitcoinRpcWithAddressIndex<T extends BtcBlock> extends BitcoinRpc<T> {
20
+
21
+ getFeeRate(): Promise<number>;
22
+ getAddressBalances(address: string): Promise<{
23
+ confirmedBalance: bigint,
24
+ unconfirmedBalance: bigint
25
+ }>;
26
+ getAddressUTXOs(address: string): Promise<BtcAddressUtxo[]>;
27
+ getCPFPData(txId: string): Promise<{
28
+ effectiveFeePerVsize: number,
29
+ adjustedVsize: number
30
+ }>;
31
+ getTransaction(txId: string): Promise<BtcTxWithBlockheight | null>;
32
+ waitForTransaction(
33
+ txId: string,
34
+ requiredConfirmations: number,
35
+ stateUpdateCbk: (btcTx?: BtcTxWithBlockheight, txEtaMS?: number) => void,
36
+ abortSignal?: AbortSignal,
37
+ intervalSeconds?: number
38
+ ): Promise<BtcTxWithBlockheight>;
39
+
40
+ /**
41
+ * Returns an estimate after which time the tx will confirm with the required amount of confirmations,
42
+ * confirmationDelay of -1 means the transaction won't confirm in the near future
43
+ *
44
+ * @param tx
45
+ * @param requiredConfirmations
46
+ * @private
47
+ *
48
+ * @returns estimated confirmation delay, -1 if the transaction won't confirm in the near future, null if the
49
+ * transaction was replaced or was confirmed in the meantime
50
+ */
51
+ getConfirmationDelay(tx: BtcTx, requiredConfirmations: number): Promise<number | null>
52
+
53
+ /**
54
+ * Checks if an address received the transaction with the required txoHash, returns info about that
55
+ * specific transaction if found, or null if not found
56
+ *
57
+ * @param address Address that should receive the transaction
58
+ * @param txoHash Required output txoHash
59
+ */
60
+ checkAddressTxos(address: string, txoHash: Buffer): Promise<{
61
+ tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
62
+ vout: number
63
+ } | null>;
64
+
65
+ /**
66
+ * Waits till the address receives a transaction containing a specific txoHash
67
+ *
68
+ * @param address Address that should receive the transaction
69
+ * @param txoHash Required output txoHash
70
+ * @param requiredConfirmations Required confirmations of the transaction
71
+ * @param stateUpdateCbk Callback for transaction state updates
72
+ * @param abortSignal Abort signal
73
+ * @param intervalSeconds How often to check new transaction
74
+ */
75
+ waitForAddressTxo(
76
+ address: string,
77
+ txoHash: Buffer,
78
+ requiredConfirmations: number,
79
+ stateUpdateCbk: (btcTx?: Omit<BtcTxWithBlockheight, "hex" | "raw">, vout?: number, txEtaMS?: number) => void,
80
+ abortSignal?: AbortSignal,
81
+ intervalSeconds?: number
82
+ ): Promise<{
83
+ tx: Omit<BtcTxWithBlockheight, "hex" | "raw">,
84
+ vout: number
85
+ }>;
86
+
87
+ }
@@ -0,0 +1,16 @@
1
+
2
+ export type LNNodeLiquidity = {
3
+ publicKey: string,
4
+ capacity: bigint,
5
+ numChannels: number
6
+ };
7
+
8
+ export interface LightningNetworkApi {
9
+
10
+ /**
11
+ * Returns the lightning network's node liquidity as identified by an identity public key
12
+ * @param pubkey
13
+ */
14
+ getLNNodeLiquidity(pubkey: string): Promise<LNNodeLiquidity | null>
15
+
16
+ }
@@ -0,0 +1,68 @@
1
+ import {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, utils} from "./utils";
2
+
3
+ import {getLogger} from "../../utils/Logger";
4
+
5
+ const logger = getLogger("CoinSelect: ");
6
+
7
+ // add inputs until we reach or surpass the target value (or deplete)
8
+ // worst-case: O(n)
9
+ export function accumulative (
10
+ utxos: CoinselectTxInput[],
11
+ outputs: CoinselectTxOutput[],
12
+ feeRate: number,
13
+ type: CoinselectAddressTypes,
14
+ requiredInputs?: CoinselectTxInput[]
15
+ ): {
16
+ inputs?: CoinselectTxInput[],
17
+ outputs?: CoinselectTxOutput[],
18
+ fee: number
19
+ } {
20
+ if (!isFinite(utils.uintOrNaN(feeRate))) throw new Error("Invalid feeRate passed!");
21
+
22
+ const inputs = requiredInputs==null ? [] : [...requiredInputs];
23
+ let bytesAccum = utils.transactionBytes(inputs, outputs, type);
24
+ let fee = feeRate * bytesAccum;
25
+ let cpfpAddFee = 0;
26
+ let inAccum = utils.sumOrNaN(inputs);
27
+ const outAccum = utils.sumOrNaN(outputs);
28
+
29
+ logger.debug("accumulative(): total output: ",outAccum);
30
+
31
+ for (let i = 0; i < utxos.length; ++i) {
32
+ const utxo = utxos[i];
33
+ const utxoBytes = utils.inputBytes(utxo);
34
+ const utxoFee = feeRate * utxoBytes;
35
+ const utxoValue = utils.uintOrNaN(utxo.value);
36
+
37
+ let cpfpFee = 0;
38
+ if(utxo.cpfp!=null && utxo.cpfp.txEffectiveFeeRate<feeRate) cpfpFee = Math.ceil(utxo.cpfp.txVsize * (feeRate - utxo.cpfp.txEffectiveFeeRate));
39
+
40
+ // skip detrimental input
41
+ if (utxoFee + cpfpFee > utxo.value) {
42
+ logger.debug("accumulative("+i+"): Skipping detrimental output, cpfpFee: "+cpfpFee+" utxoFee: "+utxoFee+" value: "+utxo.value);
43
+ if (i === utxos.length - 1) return { fee: (feeRate * (bytesAccum + utxoBytes)) + cpfpAddFee + cpfpFee };
44
+ continue
45
+ }
46
+
47
+ bytesAccum += utxoBytes;
48
+ inAccum += utxoValue;
49
+ cpfpAddFee += cpfpFee;
50
+ inputs.push(utxo);
51
+
52
+ fee = Math.ceil((feeRate * bytesAccum) + cpfpAddFee);
53
+
54
+ logger.debug("accumulative("+i+"): total fee: ", fee);
55
+ logger.debug("accumulative("+i+"): input value: ", inAccum);
56
+ logger.debug("accumulative("+i+"): cpfpAddFee: ", cpfpAddFee);
57
+
58
+ // go again?
59
+ if (inAccum < outAccum + fee) continue;
60
+
61
+ logger.debug("accumulative("+i+"): Finalizing transaction, inputs: ", inputs);
62
+ logger.debug("accumulative("+i+"): Finalizing transaction, outputs: ", outputs);
63
+ logger.debug("accumulative("+i+"): Finalizing transaction, feeRate: ", feeRate);
64
+ return utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
65
+ }
66
+
67
+ return { fee };
68
+ }
@@ -0,0 +1,49 @@
1
+ import {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, utils} from "./utils";
2
+
3
+ // add inputs until we reach or surpass the target value (or deplete)
4
+ // worst-case: O(n)
5
+ export function blackjack (
6
+ utxos: CoinselectTxInput[],
7
+ outputs: CoinselectTxOutput[],
8
+ feeRate: number,
9
+ type: CoinselectAddressTypes,
10
+ requiredInputs?: CoinselectTxInput[]
11
+ ): {
12
+ inputs?: CoinselectTxInput[],
13
+ outputs?: CoinselectTxOutput[],
14
+ fee: number
15
+ } {
16
+ if (!isFinite(utils.uintOrNaN(feeRate))) throw new Error("Invalid feeRate passed!");
17
+
18
+ const inputs = requiredInputs==null ? [] : [...requiredInputs];
19
+ let bytesAccum = utils.transactionBytes(inputs, outputs, type);
20
+ let inAccum = utils.sumOrNaN(inputs);
21
+ let cpfpAddFee = 0;
22
+ const outAccum = utils.sumOrNaN(outputs);
23
+ const threshold = utils.dustThreshold({type});
24
+
25
+ for (let i = 0; i < utxos.length; ++i) {
26
+ const input = utxos[i];
27
+ const inputBytes = utils.inputBytes(input);
28
+ let cpfpFee = 0;
29
+ if(input.cpfp!=null && input.cpfp.txEffectiveFeeRate<feeRate) cpfpFee = Math.ceil(input.cpfp.txVsize * (feeRate - input.cpfp.txEffectiveFeeRate));
30
+
31
+ const fee = Math.ceil((feeRate * (bytesAccum + inputBytes)) + cpfpAddFee + cpfpFee);
32
+ const inputValue = utils.uintOrNaN(input.value);
33
+
34
+ // would it waste value?
35
+ if ((inAccum + inputValue) > (outAccum + fee + threshold)) continue;
36
+
37
+ bytesAccum += inputBytes;
38
+ inAccum += inputValue;
39
+ cpfpAddFee += cpfpFee;
40
+ inputs.push(input);
41
+
42
+ // go again?
43
+ if (inAccum < outAccum + fee) continue;
44
+
45
+ return utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
46
+ }
47
+
48
+ return { fee: (feeRate * bytesAccum) + cpfpAddFee };
49
+ }
@@ -0,0 +1,92 @@
1
+ import {accumulative} from "./accumulative"
2
+ import {blackjack} from "./blackjack"
3
+ import {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS, utils} from "./utils"
4
+
5
+ // order by descending value, minus the inputs approximate fee
6
+ function utxoScore (x: CoinselectTxInput, feeRate: number) {
7
+ let valueAfterFee = x.value - (feeRate * utils.inputBytes(x))
8
+ if(x.cpfp!=null && x.cpfp.txEffectiveFeeRate<feeRate) valueAfterFee -= x.cpfp.txVsize*(feeRate - x.cpfp.txEffectiveFeeRate);
9
+ return valueAfterFee;
10
+ }
11
+
12
+ export {CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS};
13
+
14
+ export function coinSelect (
15
+ utxos: CoinselectTxInput[],
16
+ outputs: CoinselectTxOutput[],
17
+ feeRate: number,
18
+ type: CoinselectAddressTypes,
19
+ requiredInputs?: CoinselectTxInput[]
20
+ ): {
21
+ inputs?: CoinselectTxInput[],
22
+ outputs?: CoinselectTxOutput[],
23
+ fee: number
24
+ } {
25
+ // order by descending value, minus the inputs approximate fee
26
+ utxos = utxos.sort((a, b) => {
27
+ // if(a.cpfp!=null && b.cpfp==null) return 1;
28
+ // if(a.cpfp==null && b.cpfp!=null) return -1;
29
+ return utxoScore(b, feeRate) - utxoScore(a, feeRate);
30
+ });
31
+
32
+ // attempt to use the blackjack strategy first (no change output)
33
+ const base = blackjack(utxos, outputs, feeRate, type, requiredInputs);
34
+ if (base.inputs) return base;
35
+
36
+ // else, try the accumulative strategy
37
+ return accumulative(utxos, outputs, feeRate, type, requiredInputs);
38
+ }
39
+
40
+ export function maxSendable (
41
+ utxos: CoinselectTxInput[],
42
+ output: {script: Buffer, type: CoinselectAddressTypes},
43
+ feeRate: number,
44
+ requiredInputs?: CoinselectTxInput[],
45
+ additionalOutputs?: {script: Buffer, value: number}[],
46
+ ): {
47
+ value: number,
48
+ fee: number
49
+ } {
50
+ if (!isFinite(utils.uintOrNaN(feeRate))) throw new Error("Invalid feeRate passed!");
51
+
52
+ const outputs = additionalOutputs ?? [];
53
+ const inputs = requiredInputs ?? [];
54
+ let bytesAccum = utils.transactionBytes(inputs, (outputs as {script: Buffer}[]).concat([output]));
55
+ let cpfpAddFee = 0;
56
+ let inAccum = utils.sumOrNaN(inputs);
57
+ let outAccum = utils.sumOrNaN(outputs);
58
+
59
+ for (let i = 0; i < utxos.length; ++i) {
60
+ const utxo = utxos[i];
61
+ const utxoBytes = utils.inputBytes(utxo);
62
+ const utxoFee = feeRate * utxoBytes;
63
+ let cpfpFee = 0;
64
+ if(utxo.cpfp!=null && utxo.cpfp.txEffectiveFeeRate<feeRate) cpfpFee = utxo.cpfp.txVsize*(feeRate - utxo.cpfp.txEffectiveFeeRate);
65
+ const utxoValue = utils.uintOrNaN(utxo.value);
66
+
67
+ // skip detrimental input
68
+ if (utxoFee + cpfpFee > utxo.value) {
69
+ continue;
70
+ }
71
+
72
+ bytesAccum += utxoBytes;
73
+ inAccum += utxoValue;
74
+ cpfpAddFee += cpfpFee;
75
+ inputs.push(utxo);
76
+ }
77
+
78
+ const fee = (feeRate * bytesAccum) + cpfpAddFee;
79
+ const outputValue = inAccum - fee - outAccum;
80
+
81
+ const dustThreshold = DUST_THRESHOLDS[output.type];
82
+
83
+ if(outputValue<dustThreshold) return {
84
+ fee,
85
+ value: 0
86
+ };
87
+
88
+ return {
89
+ fee,
90
+ value: outputValue
91
+ };
92
+ }