@atomiqlabs/sdk 7.0.11 → 8.0.7

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} +40 -22
  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} +116 -75
  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
package/README.md CHANGED
@@ -61,10 +61,14 @@ Create swapper factory, here we can pick and choose which chains we want to have
61
61
  import {SolanaInitializer, SolanaInitializerType} from "@atomiqlabs/chain-solana";
62
62
  import {StarknetInitializer, StarknetInitializerType} from "@atomiqlabs/chain-starknet";
63
63
  import {CitreaInitializer, CitreaInitializerType} from "@atomiqlabs/chain-evm";
64
- import {SwapperFactory} from "@atomiqlabs/sdk";
64
+ import {SwapperFactory, TypedTokens} from "@atomiqlabs/sdk";
65
65
 
66
- const Factory = new SwapperFactory<[SolanaInitializerType, StarknetInitializerType, CitreaInitializerType]>([SolanaInitializer, StarknetInitializer, CitreaInitializer] as const);
67
- const Tokens = Factory.Tokens; //Get the supported tokens for all the specified chains.
66
+ //Define chains that you want to support here
67
+ const chains = [SolanaInitializer, StarknetInitializer, CitreaInitializer] as const;
68
+ type SupportedChains = typeof chains; //It's helpful that we also get the type of the chains array
69
+
70
+ const Factory = new SwapperFactory<SupportedChains>(chains); //Create swapper factory
71
+ const Tokens: TypedTokens<SupportedChains> = Factory.Tokens; //Get the supported tokens for all the specified chains.
68
72
  ```
69
73
 
70
74
  #### Browser
@@ -72,21 +76,21 @@ const Tokens = Factory.Tokens; //Get the supported tokens for all the specified
72
76
  This uses browser's Indexed DB by default
73
77
 
74
78
  ```typescript
75
- import {BitcoinNetwork} from "@atomiqlabs/sdk";
79
+ import {BitcoinNetwork, TypedSwapper} from "@atomiqlabs/sdk";
76
80
 
77
- const swapper = Factory.newSwapper({
78
- chains: {
79
- SOLANA: {
80
- rpcUrl: solanaRpc //You can also pass Connection object here
81
- },
82
- STARKNET: {
83
- rpcUrl: starknetRpc //You can also pass Provider object here
84
- },
85
- CITREA: {
86
- rpcUrl: citreaRpc, //You can also pass JsonApiProvider object here
87
- }
81
+ const swapper: TypedSwapper<SupportedChains> = Factory.newSwapper({
82
+ chains: {
83
+ SOLANA: {
84
+ rpcUrl: solanaRpc //You can also pass Connection object here
85
+ },
86
+ STARKNET: {
87
+ rpcUrl: starknetRpc //You can also pass Provider object here
88
88
  },
89
- bitcoinNetwork: BitcoinNetwork.TESTNET //or BitcoinNetwork.MAINNET, BitcoinNetwork.TESTNET4 - this also sets the network to use for Solana (solana devnet for bitcoin testnet) & Starknet (sepolia for bitcoin testnet)
89
+ CITREA: {
90
+ rpcUrl: citreaRpc, //You can also pass JsonApiProvider object here
91
+ }
92
+ },
93
+ bitcoinNetwork: BitcoinNetwork.TESTNET //or BitcoinNetwork.MAINNET, BitcoinNetwork.TESTNET4 - this also sets the network to use for Solana (solana devnet for bitcoin testnet) & Starknet (sepolia for bitcoin testnet)
90
94
  });
91
95
  ```
92
96
 
@@ -104,9 +108,9 @@ Then use pass it in the newSwapper function
104
108
 
105
109
  ```typescript
106
110
  import {SqliteStorageManager, SqliteUnifiedStorage} from "@atomiqlabs/storage-sqlite";
107
- import {BitcoinNetwork} from "@atomiqlabs/sdk";
111
+ import {BitcoinNetwork, TypedSwapper} from "@atomiqlabs/sdk";
108
112
 
109
- const swapper = Factory.newSwapper({
113
+ const swapper: TypedSwapper<SupportedChains> = Factory.newSwapper({
110
114
  chains: {
111
115
  SOLANA: {
112
116
  rpcUrl: solanaRpc //You can also pass Connection object here
@@ -194,7 +198,7 @@ Getting swap quote
194
198
 
195
199
  ```typescript
196
200
  //Create the swap: swapping SOL to Bitcoin on-chain, receiving _amount of satoshis (smallest unit of bitcoin) to _address
197
- const swap = await swapper.swap(
201
+ const swap: ToBTCSwap<SolanaChainType> = await swapper.swap(
198
202
  Tokens.SOLANA.SOL, //From specified source token
199
203
  Tokens.BITCOIN.BTC, //Swap to BTC
200
204
  "0.0001", //Amount can be either passed in base units as bigint or in decimal format as string
@@ -321,7 +325,7 @@ Getting swap quote
321
325
 
322
326
  ```typescript
323
327
  //Create the swap: swapping _amount of satoshis of Bitcoin on-chain to SOL
324
- const swap = await swapper.swap(
328
+ const swap: FromBTCSwap<SolanaChainType> = await swapper.swap(
325
329
  Tokens.BITCOIN.BTC, //Swap from BTC
326
330
  Tokens.SOLANA.SOL, //Into specified destination token
327
331
  "0.0001", //Amount can be either passed in base units as bigint or in decimal format as string
@@ -494,7 +498,7 @@ Getting swap quote
494
498
 
495
499
  ```typescript
496
500
  //Create the swap: swapping _amount of satoshis of Bitcoin on-chain to SOL
497
- const swap = await swapper.swap(
501
+ const swap: SpvFromBTCSwap<StarknetChainType> = await swapper.swap(
498
502
  Tokens.BITCOIN.BTC, //Swap from BTC
499
503
  Tokens.STARKNET.STRK, //Into specified destination token
500
504
  "0.0001", //Amount can be either passed in base units as bigint or in decimal format as string
@@ -660,7 +664,7 @@ Getting swap quote
660
664
 
661
665
  ```typescript
662
666
  //Create the swap: swapping SOL to Bitcoin lightning
663
- const swap = await swapper.swap(
667
+ const swap: ToBTCLNSwap<SolanaChainType> = await swapper.swap(
664
668
  Tokens.SOLANA.SOL, //From specified source token
665
669
  Tokens.BITCOIN.BTCLN, //Swap to BTC-LN
666
670
  undefined, //Amount is specified in the lightning network invoice!
@@ -787,7 +791,7 @@ NOTE: Solana uses an old swap protocol for Bitcoin lightning network -> Solana s
787
791
  Getting swap quote
788
792
 
789
793
  ```typescript
790
- const swap = await swapper.swap(
794
+ const swap: FromBTCLNSwap<SolanaChainType> = await swapper.swap(
791
795
  Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
792
796
  Tokens.SOLANA.SOL, //Into specified destination token
793
797
  10000n, //Amount can be either passed in base units as bigint or in decimal format as string
@@ -911,7 +915,7 @@ await swap.execute(
911
915
  Getting swap quote
912
916
 
913
917
  ```typescript
914
- const swap = await swapper.swap(
918
+ const swap: FromBTCLNAutoSwap<StarknetChainType> = await swapper.swap(
915
919
  Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
916
920
  Tokens.STARKNET.STRK, //Into specified destination token
917
921
  10000n, //Amount can be either passed in base units as bigint or in decimal format as string
@@ -1069,7 +1073,7 @@ Getting swap quote
1069
1073
 
1070
1074
  ```typescript
1071
1075
  //Create the swap: swapping SOL to Bitcoin lightning
1072
- const swap = await swapper.swap(
1076
+ const swap: ToBTCLNSwap<SolanaChainType> = await swapper.swap(
1073
1077
  Tokens.SOLANA.SOL, //From specified source token
1074
1078
  Tokens.BITCOIN.BTCLN, //Swap to BTC-LN
1075
1079
  10000n, //Now we can specify an amount for a lightning network payment!
@@ -1189,7 +1193,7 @@ NOTE: Solana uses an old swap protocol for Bitcoin lightning network -> Solana s
1189
1193
  Getting swap quote
1190
1194
 
1191
1195
  ```typescript
1192
- const swap = await swapper.swap(
1196
+ const swap: FromBTCLNSwap<SolanaChainType> = await swapper.swap(
1193
1197
  Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
1194
1198
  Tokens.SOLANA.SOL, //Into specified destination token
1195
1199
  10000n,
@@ -1276,7 +1280,7 @@ await swap.execute(
1276
1280
  Getting swap quote
1277
1281
 
1278
1282
  ```typescript
1279
- const swap = await swapper.swap(
1283
+ const swap: FromBTCLNAutoSwap<StarknetChainType> = await swapper.swap(
1280
1284
  Tokens.BITCOIN.BTCLN, //Swap from BTC-LN
1281
1285
  Tokens.STARKNET.STRK, //Into specified destination token
1282
1286
  10000n,
@@ -1378,7 +1382,7 @@ Getting swap quote
1378
1382
 
1379
1383
  ```typescript
1380
1384
  //Create the swap: swapping SOL to Bitcoin lightning
1381
- const swap = await swapper.swap(
1385
+ const swap: ToBTCLNSwap<SolanaChainType> = await swapper.swap(
1382
1386
  Tokens.SOLANA.SOL, //From specified source token
1383
1387
  Tokens.BITCOIN.BTCLN, //Swap to BTC-LN
1384
1388
  1_000_000_000n, //We can specify an amount for a lightning network payment!
@@ -1571,7 +1575,19 @@ const swapId = swap.getId();
1571
1575
  And then later retrieve it from the storage
1572
1576
 
1573
1577
  ```typescript
1574
- const swap = await swapper.getSwapById(id);
1578
+ import {isSwapType} from "@atomiqlabs/sdk";
1579
+
1580
+ //Use this to obtain a correctly typed swap, returns `undefined` if the type of the
1581
+ // underlying swap is not as requested, `swapType` uses the SwapType enum
1582
+ const typedSwap = await swapper.getTypedSwapById(swapId, chainId, swapType);
1583
+
1584
+ //This returns just a base type `ISwap`, so you have to do typecasting yourself, useful
1585
+ // if you don't know which type of the swap to expect
1586
+ const swap = await swapper.getSwapById(swapId);
1587
+ //You can later narrow this down with the `isSwapType()` typeguard
1588
+ if(isSwapType(swap, swapType)) {
1589
+ //You now have a properly narrowed down type of the swap here
1590
+ }
1575
1591
  ```
1576
1592
 
1577
1593
  #### Get refundable swaps
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Asset definitions for supported smart chain tokens with pricing information
3
+ * @category Tokens
4
+ */
1
5
  export declare const SmartChainAssets: {
2
6
  readonly _TESTNET_WBTC_VESU: {
3
7
  readonly pricing: {
@@ -31,11 +35,11 @@ export declare const SmartChainAssets: {
31
35
  };
32
36
  readonly TBTC: {
33
37
  readonly pricing: {
34
- readonly binancePair: any;
35
- readonly okxPair: any;
38
+ readonly binancePair: undefined;
39
+ readonly okxPair: undefined;
36
40
  readonly coinGeckoCoinId: "tbtc";
37
41
  readonly coinPaprikaCoinId: "tbtc-tbtc";
38
- readonly krakenPair: any;
42
+ readonly krakenPair: undefined;
39
43
  };
40
44
  readonly name: "Threshold BTC (tBTC)";
41
45
  };
@@ -150,4 +154,8 @@ export declare const SmartChainAssets: {
150
154
  readonly name: "pegBTC";
151
155
  };
152
156
  };
157
+ /**
158
+ * Type representing valid smart chain asset ticker symbols
159
+ * @category Tokens
160
+ */
153
161
  export type SmartChainAssetTickers = keyof typeof SmartChainAssets;
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SmartChainAssets = void 0;
4
+ /**
5
+ * Asset definitions for supported smart chain tokens with pricing information
6
+ * @category Tokens
7
+ */
4
8
  exports.SmartChainAssets = {
5
9
  _TESTNET_WBTC_VESU: {
6
10
  pricing: {
@@ -34,11 +38,11 @@ exports.SmartChainAssets = {
34
38
  },
35
39
  TBTC: {
36
40
  pricing: {
37
- binancePair: null,
38
- okxPair: null,
41
+ binancePair: undefined,
42
+ okxPair: undefined,
39
43
  coinGeckoCoinId: "tbtc",
40
44
  coinPaprikaCoinId: "tbtc-tbtc",
41
- krakenPair: null
45
+ krakenPair: undefined
42
46
  },
43
47
  name: "Threshold BTC (tBTC)"
44
48
  },
@@ -0,0 +1,68 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { BitcoinRpc, BtcBlock, BtcTx } from "@atomiqlabs/base";
4
+ import { Buffer } from "buffer";
5
+ export type BtcTxWithBlockheight = BtcTx & {
6
+ blockheight?: number;
7
+ inputAddresses?: string[];
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
+ export interface BitcoinRpcWithAddressIndex<T extends BtcBlock> extends BitcoinRpc<T> {
19
+ getFeeRate(): Promise<number>;
20
+ getAddressBalances(address: string): Promise<{
21
+ confirmedBalance: bigint;
22
+ unconfirmedBalance: bigint;
23
+ }>;
24
+ getAddressUTXOs(address: string): Promise<BtcAddressUtxo[]>;
25
+ getCPFPData(txId: string): Promise<{
26
+ effectiveFeePerVsize: number;
27
+ adjustedVsize: number;
28
+ }>;
29
+ getTransaction(txId: string): Promise<BtcTxWithBlockheight | null>;
30
+ waitForTransaction(txId: string, requiredConfirmations: number, stateUpdateCbk: (btcTx?: BtcTxWithBlockheight, txEtaMS?: number) => void, abortSignal?: AbortSignal, intervalSeconds?: number): Promise<BtcTxWithBlockheight>;
31
+ /**
32
+ * Returns an estimate after which time the tx will confirm with the required amount of confirmations,
33
+ * confirmationDelay of -1 means the transaction won't confirm in the near future
34
+ *
35
+ * @param tx
36
+ * @param requiredConfirmations
37
+ * @private
38
+ *
39
+ * @returns estimated confirmation delay, -1 if the transaction won't confirm in the near future, null if the
40
+ * transaction was replaced or was confirmed in the meantime
41
+ */
42
+ getConfirmationDelay(tx: BtcTx, requiredConfirmations: number): Promise<number | null>;
43
+ /**
44
+ * Checks if an address received the transaction with the required txoHash, returns info about that
45
+ * specific transaction if found, or null if not found
46
+ *
47
+ * @param address Address that should receive the transaction
48
+ * @param txoHash Required output txoHash
49
+ */
50
+ checkAddressTxos(address: string, txoHash: Buffer): Promise<{
51
+ tx: Omit<BtcTxWithBlockheight, "hex" | "raw">;
52
+ vout: number;
53
+ } | null>;
54
+ /**
55
+ * Waits till the address receives a transaction containing a specific txoHash
56
+ *
57
+ * @param address Address that should receive the transaction
58
+ * @param txoHash Required output txoHash
59
+ * @param requiredConfirmations Required confirmations of the transaction
60
+ * @param stateUpdateCbk Callback for transaction state updates
61
+ * @param abortSignal Abort signal
62
+ * @param intervalSeconds How often to check new transaction
63
+ */
64
+ waitForAddressTxo(address: string, txoHash: Buffer, requiredConfirmations: number, stateUpdateCbk: (btcTx?: Omit<BtcTxWithBlockheight, "hex" | "raw">, vout?: number, txEtaMS?: number) => void, abortSignal?: AbortSignal, intervalSeconds?: number): Promise<{
65
+ tx: Omit<BtcTxWithBlockheight, "hex" | "raw">;
66
+ vout: number;
67
+ }>;
68
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ export type LNNodeLiquidity = {
2
+ publicKey: string;
3
+ capacity: bigint;
4
+ numChannels: number;
5
+ };
6
+ export interface LightningNetworkApi {
7
+ /**
8
+ * Returns the lightning network's node liquidity as identified by an identity public key
9
+ * @param pubkey
10
+ */
11
+ getLNNodeLiquidity(pubkey: string): Promise<LNNodeLiquidity | null>;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput } from "./utils";
2
+ export declare function accumulative(utxos: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, type: CoinselectAddressTypes, requiredInputs?: CoinselectTxInput[]): {
3
+ inputs?: CoinselectTxInput[];
4
+ outputs?: CoinselectTxOutput[];
5
+ fee: number;
6
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.accumulative = void 0;
4
+ const utils_1 = require("./utils");
5
+ const Logger_1 = require("../../utils/Logger");
6
+ const logger = (0, Logger_1.getLogger)("CoinSelect: ");
7
+ // add inputs until we reach or surpass the target value (or deplete)
8
+ // worst-case: O(n)
9
+ function accumulative(utxos, outputs, feeRate, type, requiredInputs) {
10
+ if (!isFinite(utils_1.utils.uintOrNaN(feeRate)))
11
+ throw new Error("Invalid feeRate passed!");
12
+ const inputs = requiredInputs == null ? [] : [...requiredInputs];
13
+ let bytesAccum = utils_1.utils.transactionBytes(inputs, outputs, type);
14
+ let fee = feeRate * bytesAccum;
15
+ let cpfpAddFee = 0;
16
+ let inAccum = utils_1.utils.sumOrNaN(inputs);
17
+ const outAccum = utils_1.utils.sumOrNaN(outputs);
18
+ logger.debug("accumulative(): total output: ", outAccum);
19
+ for (let i = 0; i < utxos.length; ++i) {
20
+ const utxo = utxos[i];
21
+ const utxoBytes = utils_1.utils.inputBytes(utxo);
22
+ const utxoFee = feeRate * utxoBytes;
23
+ const utxoValue = utils_1.utils.uintOrNaN(utxo.value);
24
+ let cpfpFee = 0;
25
+ if (utxo.cpfp != null && utxo.cpfp.txEffectiveFeeRate < feeRate)
26
+ cpfpFee = Math.ceil(utxo.cpfp.txVsize * (feeRate - utxo.cpfp.txEffectiveFeeRate));
27
+ // skip detrimental input
28
+ if (utxoFee + cpfpFee > utxo.value) {
29
+ logger.debug("accumulative(" + i + "): Skipping detrimental output, cpfpFee: " + cpfpFee + " utxoFee: " + utxoFee + " value: " + utxo.value);
30
+ if (i === utxos.length - 1)
31
+ return { fee: (feeRate * (bytesAccum + utxoBytes)) + cpfpAddFee + cpfpFee };
32
+ continue;
33
+ }
34
+ bytesAccum += utxoBytes;
35
+ inAccum += utxoValue;
36
+ cpfpAddFee += cpfpFee;
37
+ inputs.push(utxo);
38
+ fee = Math.ceil((feeRate * bytesAccum) + cpfpAddFee);
39
+ logger.debug("accumulative(" + i + "): total fee: ", fee);
40
+ logger.debug("accumulative(" + i + "): input value: ", inAccum);
41
+ logger.debug("accumulative(" + i + "): cpfpAddFee: ", cpfpAddFee);
42
+ // go again?
43
+ if (inAccum < outAccum + fee)
44
+ continue;
45
+ logger.debug("accumulative(" + i + "): Finalizing transaction, inputs: ", inputs);
46
+ logger.debug("accumulative(" + i + "): Finalizing transaction, outputs: ", outputs);
47
+ logger.debug("accumulative(" + i + "): Finalizing transaction, feeRate: ", feeRate);
48
+ return utils_1.utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
49
+ }
50
+ return { fee };
51
+ }
52
+ exports.accumulative = accumulative;
@@ -0,0 +1,6 @@
1
+ import { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput } from "./utils";
2
+ export declare function blackjack(utxos: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, type: CoinselectAddressTypes, requiredInputs?: CoinselectTxInput[]): {
3
+ inputs?: CoinselectTxInput[];
4
+ outputs?: CoinselectTxOutput[];
5
+ fee: number;
6
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.blackjack = void 0;
4
+ const utils_1 = require("./utils");
5
+ // add inputs until we reach or surpass the target value (or deplete)
6
+ // worst-case: O(n)
7
+ function blackjack(utxos, outputs, feeRate, type, requiredInputs) {
8
+ if (!isFinite(utils_1.utils.uintOrNaN(feeRate)))
9
+ throw new Error("Invalid feeRate passed!");
10
+ const inputs = requiredInputs == null ? [] : [...requiredInputs];
11
+ let bytesAccum = utils_1.utils.transactionBytes(inputs, outputs, type);
12
+ let inAccum = utils_1.utils.sumOrNaN(inputs);
13
+ let cpfpAddFee = 0;
14
+ const outAccum = utils_1.utils.sumOrNaN(outputs);
15
+ const threshold = utils_1.utils.dustThreshold({ type });
16
+ for (let i = 0; i < utxos.length; ++i) {
17
+ const input = utxos[i];
18
+ const inputBytes = utils_1.utils.inputBytes(input);
19
+ let cpfpFee = 0;
20
+ if (input.cpfp != null && input.cpfp.txEffectiveFeeRate < feeRate)
21
+ cpfpFee = Math.ceil(input.cpfp.txVsize * (feeRate - input.cpfp.txEffectiveFeeRate));
22
+ const fee = Math.ceil((feeRate * (bytesAccum + inputBytes)) + cpfpAddFee + cpfpFee);
23
+ const inputValue = utils_1.utils.uintOrNaN(input.value);
24
+ // would it waste value?
25
+ if ((inAccum + inputValue) > (outAccum + fee + threshold))
26
+ continue;
27
+ bytesAccum += inputBytes;
28
+ inAccum += inputValue;
29
+ cpfpAddFee += cpfpFee;
30
+ inputs.push(input);
31
+ // go again?
32
+ if (inAccum < outAccum + fee)
33
+ continue;
34
+ return utils_1.utils.finalize(inputs, outputs, feeRate, type, cpfpAddFee);
35
+ }
36
+ return { fee: (feeRate * bytesAccum) + cpfpAddFee };
37
+ }
38
+ exports.blackjack = blackjack;
@@ -0,0 +1,19 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS } from "./utils";
4
+ export { CoinselectAddressTypes, CoinselectTxInput, CoinselectTxOutput, DUST_THRESHOLDS };
5
+ export declare function coinSelect(utxos: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, type: CoinselectAddressTypes, requiredInputs?: CoinselectTxInput[]): {
6
+ inputs?: CoinselectTxInput[];
7
+ outputs?: CoinselectTxOutput[];
8
+ fee: number;
9
+ };
10
+ export declare function maxSendable(utxos: CoinselectTxInput[], output: {
11
+ script: Buffer;
12
+ type: CoinselectAddressTypes;
13
+ }, feeRate: number, requiredInputs?: CoinselectTxInput[], additionalOutputs?: {
14
+ script: Buffer;
15
+ value: number;
16
+ }[]): {
17
+ value: number;
18
+ fee: number;
19
+ };
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maxSendable = exports.coinSelect = exports.DUST_THRESHOLDS = void 0;
4
+ const accumulative_1 = require("./accumulative");
5
+ const blackjack_1 = require("./blackjack");
6
+ const utils_1 = require("./utils");
7
+ Object.defineProperty(exports, "DUST_THRESHOLDS", { enumerable: true, get: function () { return utils_1.DUST_THRESHOLDS; } });
8
+ // order by descending value, minus the inputs approximate fee
9
+ function utxoScore(x, feeRate) {
10
+ let valueAfterFee = x.value - (feeRate * utils_1.utils.inputBytes(x));
11
+ if (x.cpfp != null && x.cpfp.txEffectiveFeeRate < feeRate)
12
+ valueAfterFee -= x.cpfp.txVsize * (feeRate - x.cpfp.txEffectiveFeeRate);
13
+ return valueAfterFee;
14
+ }
15
+ function coinSelect(utxos, outputs, feeRate, type, requiredInputs) {
16
+ // order by descending value, minus the inputs approximate fee
17
+ utxos = utxos.sort((a, b) => {
18
+ // if(a.cpfp!=null && b.cpfp==null) return 1;
19
+ // if(a.cpfp==null && b.cpfp!=null) return -1;
20
+ return utxoScore(b, feeRate) - utxoScore(a, feeRate);
21
+ });
22
+ // attempt to use the blackjack strategy first (no change output)
23
+ const base = (0, blackjack_1.blackjack)(utxos, outputs, feeRate, type, requiredInputs);
24
+ if (base.inputs)
25
+ return base;
26
+ // else, try the accumulative strategy
27
+ return (0, accumulative_1.accumulative)(utxos, outputs, feeRate, type, requiredInputs);
28
+ }
29
+ exports.coinSelect = coinSelect;
30
+ function maxSendable(utxos, output, feeRate, requiredInputs, additionalOutputs) {
31
+ if (!isFinite(utils_1.utils.uintOrNaN(feeRate)))
32
+ throw new Error("Invalid feeRate passed!");
33
+ const outputs = additionalOutputs ?? [];
34
+ const inputs = requiredInputs ?? [];
35
+ let bytesAccum = utils_1.utils.transactionBytes(inputs, outputs.concat([output]));
36
+ let cpfpAddFee = 0;
37
+ let inAccum = utils_1.utils.sumOrNaN(inputs);
38
+ let outAccum = utils_1.utils.sumOrNaN(outputs);
39
+ for (let i = 0; i < utxos.length; ++i) {
40
+ const utxo = utxos[i];
41
+ const utxoBytes = utils_1.utils.inputBytes(utxo);
42
+ const utxoFee = feeRate * utxoBytes;
43
+ let cpfpFee = 0;
44
+ if (utxo.cpfp != null && utxo.cpfp.txEffectiveFeeRate < feeRate)
45
+ cpfpFee = utxo.cpfp.txVsize * (feeRate - utxo.cpfp.txEffectiveFeeRate);
46
+ const utxoValue = utils_1.utils.uintOrNaN(utxo.value);
47
+ // skip detrimental input
48
+ if (utxoFee + cpfpFee > utxo.value) {
49
+ continue;
50
+ }
51
+ bytesAccum += utxoBytes;
52
+ inAccum += utxoValue;
53
+ cpfpAddFee += cpfpFee;
54
+ inputs.push(utxo);
55
+ }
56
+ const fee = (feeRate * bytesAccum) + cpfpAddFee;
57
+ const outputValue = inAccum - fee - outAccum;
58
+ const dustThreshold = utils_1.DUST_THRESHOLDS[output.type];
59
+ if (outputValue < dustThreshold)
60
+ return {
61
+ fee,
62
+ value: 0
63
+ };
64
+ return {
65
+ fee,
66
+ value: outputValue
67
+ };
68
+ }
69
+ exports.maxSendable = maxSendable;
@@ -0,0 +1,71 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ export type CoinselectAddressTypes = "p2sh-p2wpkh" | "p2wpkh" | "p2wsh" | "p2tr" | "p2pkh";
4
+ export type CoinselectTxInput = {
5
+ script?: Buffer;
6
+ txId: string;
7
+ vout: number;
8
+ type?: CoinselectAddressTypes;
9
+ value: number;
10
+ outputScript?: Buffer;
11
+ address?: string;
12
+ cpfp?: {
13
+ txVsize: number;
14
+ txEffectiveFeeRate: number;
15
+ };
16
+ };
17
+ export type CoinselectTxOutput = {
18
+ script?: Buffer;
19
+ address?: string;
20
+ type?: CoinselectAddressTypes;
21
+ value: number;
22
+ };
23
+ declare function inputBytes(input: {
24
+ script?: Buffer;
25
+ type?: CoinselectAddressTypes;
26
+ }): number;
27
+ declare function outputBytes(output: {
28
+ script?: Buffer;
29
+ type?: CoinselectAddressTypes;
30
+ }): number;
31
+ export declare const DUST_THRESHOLDS: {
32
+ "p2sh-p2wpkh": number;
33
+ p2wpkh: number;
34
+ p2tr: number;
35
+ p2pkh: number;
36
+ p2wsh: number;
37
+ };
38
+ declare function dustThreshold(output: {
39
+ script?: Buffer;
40
+ type: CoinselectAddressTypes;
41
+ }): number;
42
+ declare function transactionBytes(inputs: {
43
+ script?: Buffer;
44
+ type?: CoinselectAddressTypes;
45
+ }[], outputs: {
46
+ script?: Buffer;
47
+ type?: CoinselectAddressTypes;
48
+ }[], changeType?: CoinselectAddressTypes): number;
49
+ declare function uintOrNaN(v: number): number;
50
+ declare function sumForgiving(range: {
51
+ value: number;
52
+ }[]): number;
53
+ declare function sumOrNaN(range: {
54
+ value: number;
55
+ }[]): number;
56
+ declare function finalize(inputs: CoinselectTxInput[], outputs: CoinselectTxOutput[], feeRate: number, changeType: CoinselectAddressTypes, cpfpAddFee?: number): {
57
+ inputs?: CoinselectTxInput[];
58
+ outputs?: CoinselectTxOutput[];
59
+ fee: number;
60
+ };
61
+ export declare const utils: {
62
+ dustThreshold: typeof dustThreshold;
63
+ finalize: typeof finalize;
64
+ inputBytes: typeof inputBytes;
65
+ outputBytes: typeof outputBytes;
66
+ sumOrNaN: typeof sumOrNaN;
67
+ sumForgiving: typeof sumForgiving;
68
+ transactionBytes: typeof transactionBytes;
69
+ uintOrNaN: typeof uintOrNaN;
70
+ };
71
+ export {};