@atomiqlabs/sdk 7.0.12 → 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} +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,120 @@
1
+ /// <reference types="node" />
2
+ import { IFromBTCWrapper } from "../IFromBTCWrapper";
3
+ import { FromBTCSwap, FromBTCSwapState } from "./FromBTCSwap";
4
+ import { ChainType, ClaimEvent, InitializeEvent, RefundEvent, RelaySynchronizer, SwapData, BtcRelay } from "@atomiqlabs/base";
5
+ import { EventEmitter } from "events";
6
+ import { Intermediary } from "../../../../intermediaries/Intermediary";
7
+ import { BitcoinRpcWithAddressIndex } from "../../../../bitcoin/BitcoinRpcWithAddressIndex";
8
+ import { ISwapPrice } from "../../../../prices/abstract/ISwapPrice";
9
+ import { ISwapWrapperOptions, WrapperCtorTokens } from "../../../ISwapWrapper";
10
+ import { SwapType } from "../../../../enums/SwapType";
11
+ import { BTC_NETWORK } from "@scure/btc-signer/utils";
12
+ import { UnifiedSwapEventListener } from "../../../../events/UnifiedSwapEventListener";
13
+ import { UnifiedSwapStorage } from "../../../../storage/UnifiedSwapStorage";
14
+ import { ISwap } from "../../../ISwap";
15
+ import { IClaimableSwapWrapper } from "../../../IClaimableSwapWrapper";
16
+ import { IFromBTCSelfInitDefinition } from "../IFromBTCSelfInitSwap";
17
+ import { AmountData } from "../../../../types/AmountData";
18
+ import { AllOptional } from "../../../../utils/TypeUtils";
19
+ export type FromBTCOptions = {
20
+ feeSafetyFactor?: bigint;
21
+ blockSafetyFactor?: number;
22
+ unsafeZeroWatchtowerFee?: boolean;
23
+ };
24
+ export type FromBTCWrapperOptions = ISwapWrapperOptions & {
25
+ safetyFactor: number;
26
+ blocksTillTxConfirms: number;
27
+ maxConfirmations: number;
28
+ minSendWindow: number;
29
+ bitcoinNetwork: BTC_NETWORK;
30
+ bitcoinBlocktime: number;
31
+ };
32
+ export type FromBTCDefinition<T extends ChainType> = IFromBTCSelfInitDefinition<T, FromBTCWrapper<T>, FromBTCSwap<T>>;
33
+ export declare class FromBTCWrapper<T extends ChainType> extends IFromBTCWrapper<T, FromBTCDefinition<T>, FromBTCWrapperOptions> implements IClaimableSwapWrapper<FromBTCSwap<T>> {
34
+ readonly claimableSwapStates: FromBTCSwapState[];
35
+ readonly TYPE = SwapType.FROM_BTC;
36
+ readonly swapDeserializer: typeof FromBTCSwap;
37
+ readonly synchronizer: RelaySynchronizer<any, T["TX"], any>;
38
+ readonly btcRelay: BtcRelay<any, T["TX"], any>;
39
+ readonly btcRpc: BitcoinRpcWithAddressIndex<any>;
40
+ /**
41
+ * @param chainIdentifier
42
+ * @param unifiedStorage Storage interface for the current environment
43
+ * @param unifiedChainEvents On-chain event listener
44
+ * @param chain
45
+ * @param contract Underlying contract handling the swaps
46
+ * @param prices Pricing to use
47
+ * @param tokens
48
+ * @param swapDataDeserializer Deserializer for SwapData
49
+ * @param btcRelay
50
+ * @param synchronizer Btc relay synchronizer
51
+ * @param btcRpc Bitcoin RPC which also supports getting transactions by txoHash
52
+ * @param options
53
+ * @param events Instance to use for emitting events
54
+ */
55
+ constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], contract: T["Contract"], prices: ISwapPrice, tokens: WrapperCtorTokens, swapDataDeserializer: new (data: any) => T["Data"], btcRelay: BtcRelay<any, T["TX"], any>, synchronizer: RelaySynchronizer<any, T["TX"], any>, btcRpc: BitcoinRpcWithAddressIndex<any>, options?: AllOptional<FromBTCWrapperOptions>, events?: EventEmitter<{
56
+ swapState: [ISwap];
57
+ }>);
58
+ readonly pendingSwapStates: FromBTCSwapState[];
59
+ readonly tickSwapState: FromBTCSwapState[];
60
+ protected processEventInitialize(swap: FromBTCSwap<T>, event: InitializeEvent<T["Data"]>): Promise<boolean>;
61
+ protected processEventClaim(swap: FromBTCSwap<T>, event: ClaimEvent<T["Data"]>): Promise<boolean>;
62
+ protected processEventRefund(swap: FromBTCSwap<T>, event: RefundEvent<T["Data"]>): Promise<boolean>;
63
+ /**
64
+ * Returns the swap expiry, leaving enough time for the user to send a transaction and for it to confirm
65
+ *
66
+ * @param data Parsed swap data
67
+ * @param requiredConfirmations Confirmations required to claim the tx
68
+ */
69
+ getOnchainSendTimeout(data: SwapData, requiredConfirmations: number): bigint;
70
+ /**
71
+ * Pre-fetches claimer (watchtower) bounty data for the swap. Doesn't throw, instead returns null and aborts the
72
+ * provided abortController
73
+ *
74
+ * @param signer Smartchain signer address initiating the swap
75
+ * @param amountData
76
+ * @param options Options as passed to the swap creation function
77
+ * @param abortController
78
+ * @private
79
+ */
80
+ private preFetchClaimerBounty;
81
+ /**
82
+ * Returns calculated claimer bounty calculated from the claimer bounty data as fetched from preFetchClaimerBounty()
83
+ *
84
+ * @param data Parsed swap data returned from the intermediary
85
+ * @param options Options as passed to the swap creation function
86
+ * @param claimerBounty Claimer bounty data as fetched from preFetchClaimerBounty() function
87
+ * @private
88
+ */
89
+ private getClaimerBounty;
90
+ /**
91
+ * Verifies response returned from intermediary
92
+ *
93
+ * @param signer
94
+ * @param resp Response as returned by the intermediary
95
+ * @param amountData
96
+ * @param lp Intermediary
97
+ * @param options Options as passed to the swap creation function
98
+ * @param data Parsed swap data returned by the intermediary
99
+ * @param sequence Required swap sequence
100
+ * @param claimerBounty Claimer bount data as returned from the preFetchClaimerBounty() pre-fetch promise
101
+ * @param depositToken
102
+ * @private
103
+ * @throws {IntermediaryError} in case the response is invalid
104
+ */
105
+ private verifyReturnedData;
106
+ /**
107
+ * Returns a newly created swap, receiving 'amount' on chain
108
+ *
109
+ * @param signer Smartchain signer's address intiating the swap
110
+ * @param amountData Amount of token & amount to swap
111
+ * @param lps LPs (liquidity providers) to get the quotes from
112
+ * @param options Quote options
113
+ * @param additionalParams Additional parameters sent to the LP when creating the swap
114
+ * @param abortSignal Abort signal for aborting the process
115
+ */
116
+ create(signer: string, amountData: AmountData, lps: Intermediary[], options?: FromBTCOptions, additionalParams?: Record<string, any>, abortSignal?: AbortSignal): {
117
+ quote: Promise<FromBTCSwap<T>>;
118
+ intermediary: Intermediary;
119
+ }[];
120
+ }
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FromBTCWrapper = void 0;
4
+ const IFromBTCWrapper_1 = require("../IFromBTCWrapper");
5
+ const FromBTCSwap_1 = require("./FromBTCSwap");
6
+ const base_1 = require("@atomiqlabs/base");
7
+ const buffer_1 = require("buffer");
8
+ const IntermediaryError_1 = require("../../../../errors/IntermediaryError");
9
+ const SwapType_1 = require("../../../../enums/SwapType");
10
+ const Utils_1 = require("../../../../utils/Utils");
11
+ const BitcoinUtils_1 = require("../../../../utils/BitcoinUtils");
12
+ const IntermediaryAPI_1 = require("../../../../intermediaries/apis/IntermediaryAPI");
13
+ const RequestError_1 = require("../../../../errors/RequestError");
14
+ const utils_1 = require("@scure/btc-signer/utils");
15
+ const RetryUtils_1 = require("../../../../utils/RetryUtils");
16
+ class FromBTCWrapper extends IFromBTCWrapper_1.IFromBTCWrapper {
17
+ /**
18
+ * @param chainIdentifier
19
+ * @param unifiedStorage Storage interface for the current environment
20
+ * @param unifiedChainEvents On-chain event listener
21
+ * @param chain
22
+ * @param contract Underlying contract handling the swaps
23
+ * @param prices Pricing to use
24
+ * @param tokens
25
+ * @param swapDataDeserializer Deserializer for SwapData
26
+ * @param btcRelay
27
+ * @param synchronizer Btc relay synchronizer
28
+ * @param btcRpc Bitcoin RPC which also supports getting transactions by txoHash
29
+ * @param options
30
+ * @param events Instance to use for emitting events
31
+ */
32
+ constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, btcRelay, synchronizer, btcRpc, options, events) {
33
+ super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, {
34
+ bitcoinNetwork: options?.bitcoinNetwork ?? utils_1.TEST_NETWORK,
35
+ safetyFactor: options?.safetyFactor ?? 2,
36
+ blocksTillTxConfirms: options?.blocksTillTxConfirms ?? 12,
37
+ maxConfirmations: options?.maxConfirmations ?? 6,
38
+ minSendWindow: options?.minSendWindow ?? 30 * 60,
39
+ bitcoinBlocktime: options?.bitcoinBlocktime ?? 10 * 60
40
+ }, events);
41
+ this.claimableSwapStates = [FromBTCSwap_1.FromBTCSwapState.BTC_TX_CONFIRMED];
42
+ this.TYPE = SwapType_1.SwapType.FROM_BTC;
43
+ this.swapDeserializer = FromBTCSwap_1.FromBTCSwap;
44
+ this.pendingSwapStates = [
45
+ FromBTCSwap_1.FromBTCSwapState.PR_CREATED,
46
+ FromBTCSwap_1.FromBTCSwapState.QUOTE_SOFT_EXPIRED,
47
+ FromBTCSwap_1.FromBTCSwapState.CLAIM_COMMITED,
48
+ FromBTCSwap_1.FromBTCSwapState.BTC_TX_CONFIRMED,
49
+ FromBTCSwap_1.FromBTCSwapState.EXPIRED
50
+ ];
51
+ this.tickSwapState = [FromBTCSwap_1.FromBTCSwapState.PR_CREATED, FromBTCSwap_1.FromBTCSwapState.CLAIM_COMMITED, FromBTCSwap_1.FromBTCSwapState.EXPIRED];
52
+ this.btcRelay = btcRelay;
53
+ this.synchronizer = synchronizer;
54
+ this.btcRpc = btcRpc;
55
+ }
56
+ processEventInitialize(swap, event) {
57
+ if (swap.state === FromBTCSwap_1.FromBTCSwapState.PR_CREATED || swap.state === FromBTCSwap_1.FromBTCSwapState.QUOTE_SOFT_EXPIRED) {
58
+ swap.state = FromBTCSwap_1.FromBTCSwapState.CLAIM_COMMITED;
59
+ return Promise.resolve(true);
60
+ }
61
+ return Promise.resolve(false);
62
+ }
63
+ async processEventClaim(swap, event) {
64
+ if (swap.state !== FromBTCSwap_1.FromBTCSwapState.FAILED && swap.state !== FromBTCSwap_1.FromBTCSwapState.CLAIM_CLAIMED) {
65
+ await swap._setBitcoinTxId(buffer_1.Buffer.from(event.result, "hex").reverse().toString("hex")).catch(e => {
66
+ this.logger.warn("processEventClaim(): Error setting bitcoin txId: ", e);
67
+ });
68
+ swap.state = FromBTCSwap_1.FromBTCSwapState.CLAIM_CLAIMED;
69
+ return true;
70
+ }
71
+ return false;
72
+ }
73
+ processEventRefund(swap, event) {
74
+ if (swap.state !== FromBTCSwap_1.FromBTCSwapState.CLAIM_CLAIMED && swap.state !== FromBTCSwap_1.FromBTCSwapState.FAILED) {
75
+ swap.state = FromBTCSwap_1.FromBTCSwapState.FAILED;
76
+ return Promise.resolve(true);
77
+ }
78
+ return Promise.resolve(false);
79
+ }
80
+ /**
81
+ * Returns the swap expiry, leaving enough time for the user to send a transaction and for it to confirm
82
+ *
83
+ * @param data Parsed swap data
84
+ * @param requiredConfirmations Confirmations required to claim the tx
85
+ */
86
+ getOnchainSendTimeout(data, requiredConfirmations) {
87
+ const tsDelta = (this.options.blocksTillTxConfirms + requiredConfirmations) * this.options.bitcoinBlocktime * this.options.safetyFactor;
88
+ return data.getExpiry() - BigInt(tsDelta);
89
+ }
90
+ /**
91
+ * Pre-fetches claimer (watchtower) bounty data for the swap. Doesn't throw, instead returns null and aborts the
92
+ * provided abortController
93
+ *
94
+ * @param signer Smartchain signer address initiating the swap
95
+ * @param amountData
96
+ * @param options Options as passed to the swap creation function
97
+ * @param abortController
98
+ * @private
99
+ */
100
+ async preFetchClaimerBounty(signer, amountData, options, abortController) {
101
+ const startTimestamp = BigInt(Math.floor(Date.now() / 1000));
102
+ if (options.unsafeZeroWatchtowerFee) {
103
+ return {
104
+ feePerBlock: 0n,
105
+ safetyFactor: options.blockSafetyFactor,
106
+ startTimestamp: startTimestamp,
107
+ addBlock: 0,
108
+ addFee: 0n
109
+ };
110
+ }
111
+ const dummyAmount = BigInt(Math.floor(Math.random() * 0x1000000));
112
+ const dummySwapData = await this.contract.createSwapData(base_1.ChainSwapType.CHAIN, signer, signer, amountData.token, dummyAmount, this.contract.getHashForOnchain((0, Utils_1.randomBytes)(20), dummyAmount, 3).toString("hex"), this.getRandomSequence(), startTimestamp, false, true, BigInt(Math.floor(Math.random() * 0x10000)), BigInt(Math.floor(Math.random() * 0x10000)));
113
+ try {
114
+ const [feePerBlock, btcRelayData, currentBtcBlock, claimFeeRate] = await Promise.all([
115
+ this.btcRelay.getFeePerBlock(),
116
+ this.btcRelay.getTipData(),
117
+ this.btcRpc.getTipHeight(),
118
+ this.contract.getClaimFee(signer, dummySwapData)
119
+ ]);
120
+ if (btcRelayData == null)
121
+ throw new Error("Btc relay not initialized!");
122
+ const currentBtcRelayBlock = btcRelayData.blockheight;
123
+ const addBlock = Math.max(currentBtcBlock - currentBtcRelayBlock, 0);
124
+ return {
125
+ feePerBlock: feePerBlock * options.feeSafetyFactor,
126
+ safetyFactor: options.blockSafetyFactor,
127
+ startTimestamp: startTimestamp,
128
+ addBlock,
129
+ addFee: claimFeeRate * options.feeSafetyFactor
130
+ };
131
+ }
132
+ catch (e) {
133
+ abortController.abort(e);
134
+ return undefined;
135
+ }
136
+ }
137
+ /**
138
+ * Returns calculated claimer bounty calculated from the claimer bounty data as fetched from preFetchClaimerBounty()
139
+ *
140
+ * @param data Parsed swap data returned from the intermediary
141
+ * @param options Options as passed to the swap creation function
142
+ * @param claimerBounty Claimer bounty data as fetched from preFetchClaimerBounty() function
143
+ * @private
144
+ */
145
+ getClaimerBounty(data, options, claimerBounty) {
146
+ const tsDelta = data.getExpiry() - claimerBounty.startTimestamp;
147
+ const blocksDelta = tsDelta / BigInt(this.options.bitcoinBlocktime) * BigInt(options.blockSafetyFactor);
148
+ const totalBlock = blocksDelta + BigInt(claimerBounty.addBlock);
149
+ return claimerBounty.addFee + (totalBlock * claimerBounty.feePerBlock);
150
+ }
151
+ /**
152
+ * Verifies response returned from intermediary
153
+ *
154
+ * @param signer
155
+ * @param resp Response as returned by the intermediary
156
+ * @param amountData
157
+ * @param lp Intermediary
158
+ * @param options Options as passed to the swap creation function
159
+ * @param data Parsed swap data returned by the intermediary
160
+ * @param sequence Required swap sequence
161
+ * @param claimerBounty Claimer bount data as returned from the preFetchClaimerBounty() pre-fetch promise
162
+ * @param depositToken
163
+ * @private
164
+ * @throws {IntermediaryError} in case the response is invalid
165
+ */
166
+ verifyReturnedData(signer, resp, amountData, lp, options, data, sequence, claimerBounty, depositToken) {
167
+ if (amountData.exactIn) {
168
+ if (resp.amount !== amountData.amount)
169
+ throw new IntermediaryError_1.IntermediaryError("Invalid amount returned");
170
+ }
171
+ else {
172
+ if (resp.total !== amountData.amount)
173
+ throw new IntermediaryError_1.IntermediaryError("Invalid total returned");
174
+ }
175
+ const requiredConfirmations = resp.confirmations;
176
+ if (requiredConfirmations > this.options.maxConfirmations)
177
+ throw new IntermediaryError_1.IntermediaryError("Requires too many confirmations");
178
+ const totalClaimerBounty = this.getClaimerBounty(data, options, claimerBounty);
179
+ if (data.getClaimerBounty() !== totalClaimerBounty ||
180
+ data.getType() != base_1.ChainSwapType.CHAIN ||
181
+ data.getSequence() !== sequence ||
182
+ data.getAmount() !== resp.total ||
183
+ data.isPayIn() ||
184
+ !data.isToken(amountData.token) ||
185
+ !data.isOfferer(lp.getAddress(this.chainIdentifier)) ||
186
+ !data.isClaimer(signer) ||
187
+ !data.isDepositToken(depositToken) ||
188
+ data.hasSuccessAction()) {
189
+ throw new IntermediaryError_1.IntermediaryError("Invalid data returned");
190
+ }
191
+ //Check that we have enough time to send the TX and for it to confirm
192
+ const expiry = this.getOnchainSendTimeout(data, requiredConfirmations);
193
+ const currentTimestamp = BigInt(Math.floor(Date.now() / 1000));
194
+ if ((expiry - currentTimestamp) < BigInt(this.options.minSendWindow)) {
195
+ throw new IntermediaryError_1.IntermediaryError("Send window too low");
196
+ }
197
+ const lockingScript = (0, BitcoinUtils_1.toOutputScript)(this.options.bitcoinNetwork, resp.btcAddress);
198
+ const desiredExtraData = this.contract.getExtraData(lockingScript, resp.amount, requiredConfirmations);
199
+ const desiredClaimHash = this.contract.getHashForOnchain(lockingScript, resp.amount, requiredConfirmations);
200
+ if (!desiredClaimHash.equals(buffer_1.Buffer.from(data.getClaimHash(), "hex"))) {
201
+ throw new IntermediaryError_1.IntermediaryError("Invalid claim hash returned!");
202
+ }
203
+ const extraData = data.getExtraData();
204
+ if (extraData == null || !desiredExtraData.equals(buffer_1.Buffer.from(extraData, "hex"))) {
205
+ throw new IntermediaryError_1.IntermediaryError("Invalid extra data returned!");
206
+ }
207
+ }
208
+ /**
209
+ * Returns a newly created swap, receiving 'amount' on chain
210
+ *
211
+ * @param signer Smartchain signer's address intiating the swap
212
+ * @param amountData Amount of token & amount to swap
213
+ * @param lps LPs (liquidity providers) to get the quotes from
214
+ * @param options Quote options
215
+ * @param additionalParams Additional parameters sent to the LP when creating the swap
216
+ * @param abortSignal Abort signal for aborting the process
217
+ */
218
+ create(signer, amountData, lps, options, additionalParams, abortSignal) {
219
+ const _options = {
220
+ blockSafetyFactor: options?.blockSafetyFactor ?? 1,
221
+ feeSafetyFactor: options?.feeSafetyFactor ?? 2n,
222
+ unsafeZeroWatchtowerFee: options?.unsafeZeroWatchtowerFee ?? false
223
+ };
224
+ const sequence = this.getRandomSequence();
225
+ const _abortController = (0, Utils_1.extendAbortController)(abortSignal);
226
+ const pricePrefetchPromise = this.preFetchPrice(amountData, _abortController.signal);
227
+ const usdPricePrefetchPromise = this.preFetchUsdPrice(_abortController.signal);
228
+ const claimerBountyPrefetchPromise = this.preFetchClaimerBounty(signer, amountData, _options, _abortController);
229
+ const nativeTokenAddress = this.chain.getNativeCurrencyAddress();
230
+ const feeRatePromise = this.preFetchFeeRate(signer, amountData, undefined, _abortController);
231
+ const _signDataPromise = this.contract.preFetchBlockDataForSignatures == null ?
232
+ this.preFetchSignData(Promise.resolve(true)) :
233
+ undefined;
234
+ return lps.map(lp => {
235
+ return {
236
+ intermediary: lp,
237
+ quote: (async () => {
238
+ if (lp.services[SwapType_1.SwapType.FROM_BTC] == null)
239
+ throw new Error("LP service for processing from btc swaps not found!");
240
+ const abortController = (0, Utils_1.extendAbortController)(_abortController.signal);
241
+ const liquidityPromise = this.preFetchIntermediaryLiquidity(amountData, lp, abortController);
242
+ try {
243
+ const { signDataPromise, resp } = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
244
+ const { signDataPrefetch, response } = IntermediaryAPI_1.IntermediaryAPI.initFromBTC(this.chainIdentifier, lp.url, nativeTokenAddress, {
245
+ claimer: signer,
246
+ amount: amountData.amount,
247
+ token: amountData.token.toString(),
248
+ exactOut: !amountData.exactIn,
249
+ sequence,
250
+ claimerBounty: (0, Utils_1.throwIfUndefined)(claimerBountyPrefetchPromise),
251
+ feeRate: (0, Utils_1.throwIfUndefined)(feeRatePromise),
252
+ additionalParams
253
+ }, this.options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
254
+ return {
255
+ signDataPromise: _signDataPromise ?? this.preFetchSignData(signDataPrefetch),
256
+ resp: await response
257
+ };
258
+ }, undefined, e => e instanceof RequestError_1.RequestError, abortController.signal);
259
+ const data = new this.swapDataDeserializer(resp.data);
260
+ data.setClaimer(signer);
261
+ this.verifyReturnedData(signer, resp, amountData, lp, _options, data, sequence, (await claimerBountyPrefetchPromise), nativeTokenAddress);
262
+ const [pricingInfo, signatureExpiry] = await Promise.all([
263
+ //Get intermediary's liquidity
264
+ this.verifyReturnedPrice(lp.services[SwapType_1.SwapType.FROM_BTC], false, resp.amount, resp.total, amountData.token, {}, pricePrefetchPromise, usdPricePrefetchPromise, abortController.signal),
265
+ this.verifyReturnedSignature(signer, data, resp, feeRatePromise, signDataPromise, abortController.signal),
266
+ this.verifyIntermediaryLiquidity(data.getAmount(), (0, Utils_1.throwIfUndefined)(liquidityPromise)),
267
+ ]);
268
+ const quote = new FromBTCSwap_1.FromBTCSwap(this, {
269
+ pricingInfo,
270
+ url: lp.url,
271
+ expiry: signatureExpiry,
272
+ swapFee: resp.swapFee,
273
+ swapFeeBtc: resp.swapFee * resp.amount / (data.getAmount() - resp.swapFee),
274
+ feeRate: (await feeRatePromise),
275
+ signatureData: resp,
276
+ data,
277
+ address: resp.btcAddress,
278
+ amount: resp.amount,
279
+ exactIn: amountData.exactIn ?? true,
280
+ requiredConfirmations: resp.confirmations
281
+ });
282
+ await quote._save();
283
+ return quote;
284
+ }
285
+ catch (e) {
286
+ abortController.abort(e);
287
+ throw e;
288
+ }
289
+ })()
290
+ };
291
+ });
292
+ }
293
+ }
294
+ exports.FromBTCWrapper = FromBTCWrapper;
@@ -0,0 +1,228 @@
1
+ import { IToBTCDefinition, IToBTCWrapper } from "./IToBTCWrapper";
2
+ import { ChainType, SignatureData, SwapCommitState, SwapData } from "@atomiqlabs/base";
3
+ import { RefundAuthorizationResponse } from "../../../intermediaries/apis/IntermediaryAPI";
4
+ import { Fee } from "../../../types/fees/Fee";
5
+ import { IEscrowSelfInitSwap, IEscrowSelfInitSwapInit } from "../IEscrowSelfInitSwap";
6
+ import { IRefundableSwap } from "../../IRefundableSwap";
7
+ import { FeeType } from "../../../enums/FeeType";
8
+ import { TokenAmount } from "../../../types/TokenAmount";
9
+ import { BtcToken, SCToken } from "../../../types/Token";
10
+ export type IToBTCSwapInit<T extends SwapData> = IEscrowSelfInitSwapInit<T> & {
11
+ signatureData?: SignatureData;
12
+ data: T;
13
+ networkFee: bigint;
14
+ networkFeeBtc: bigint;
15
+ };
16
+ export declare function isIToBTCSwapInit<T extends SwapData>(obj: any): obj is IToBTCSwapInit<T>;
17
+ export declare abstract class IToBTCSwap<T extends ChainType = ChainType, D extends IToBTCDefinition<T, IToBTCWrapper<T, D>, IToBTCSwap<T, D>> = IToBTCDefinition<T, IToBTCWrapper<T, any>, IToBTCSwap<T, any>>> extends IEscrowSelfInitSwap<T, D, ToBTCSwapState> implements IRefundableSwap<T, D, ToBTCSwapState> {
18
+ protected readonly networkFee: bigint;
19
+ protected networkFeeBtc: bigint;
20
+ protected readonly abstract outputToken: BtcToken;
21
+ readonly data: T["Data"];
22
+ readonly signatureData?: SignatureData;
23
+ protected constructor(wrapper: D["Wrapper"], serializedObject: any);
24
+ protected constructor(wrapper: D["Wrapper"], init: IToBTCSwapInit<T["Data"]>);
25
+ protected getSwapData(): T["Data"];
26
+ protected upgradeVersion(): void;
27
+ /**
28
+ * In case swapFee in BTC is not supplied it recalculates it based on swap price
29
+ * @protected
30
+ */
31
+ protected tryRecomputeSwapPrice(): void;
32
+ /**
33
+ * Returns the payment hash identifier to be sent to the LP for getStatus and getRefund
34
+ * @protected
35
+ */
36
+ protected getLpIdentifier(): string;
37
+ /**
38
+ * Sets the payment result for the swap, optionally also checking it (checking that tx exist or swap secret is valid)
39
+ *
40
+ * @param result Result returned by the LP
41
+ * @param check Whether to check the passed result
42
+ * @returns true if check passed, false if check failed with a soft error (e.g. tx not yet found in the mempool)
43
+ * @throws {IntermediaryError} When the data returned by the intermediary isn't valid
44
+ */
45
+ abstract _setPaymentResult(result: {
46
+ secret?: string;
47
+ txId?: string;
48
+ }, check?: boolean): Promise<boolean>;
49
+ getInputAddress(): string | null;
50
+ getInputTxId(): string | null;
51
+ requiresAction(): boolean;
52
+ /**
53
+ * Returns whether the swap is finished and in its terminal state (this can mean successful, refunded or failed)
54
+ */
55
+ isFinished(): boolean;
56
+ isRefundable(): boolean;
57
+ isQuoteExpired(): boolean;
58
+ isQuoteSoftExpired(): boolean;
59
+ isSuccessful(): boolean;
60
+ isFailed(): boolean;
61
+ _getInitiator(): string;
62
+ protected getSwapFee(): Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
63
+ /**
64
+ * Returns network fee for the swap, the fee is represented in source currency & destination currency, but is
65
+ * paid only once
66
+ */
67
+ protected getNetworkFee(): Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
68
+ getFee(): Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
69
+ getFeeBreakdown(): [
70
+ {
71
+ type: FeeType.SWAP;
72
+ fee: Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
73
+ },
74
+ {
75
+ type: FeeType.NETWORK_OUTPUT;
76
+ fee: Fee<T["ChainId"], SCToken<T["ChainId"]>, BtcToken>;
77
+ }
78
+ ];
79
+ getInputToken(): SCToken<T["ChainId"]>;
80
+ getInput(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>;
81
+ getInputWithoutFee(): TokenAmount<T["ChainId"], SCToken<T["ChainId"]>>;
82
+ /**
83
+ * Checks if the intiator/sender has enough balance to go through with the swap
84
+ */
85
+ hasEnoughBalance(): Promise<{
86
+ enoughBalance: boolean;
87
+ balance: TokenAmount;
88
+ required: TokenAmount;
89
+ }>;
90
+ /**
91
+ * Check if the initiator/sender has enough balance to cover the transaction fee for processing the swap
92
+ */
93
+ hasEnoughForTxFees(): Promise<{
94
+ enoughBalance: boolean;
95
+ balance: TokenAmount;
96
+ required: TokenAmount;
97
+ }>;
98
+ /**
99
+ * Executes the swap with the provided smart chain wallet/signer
100
+ *
101
+ * @param signer Smart chain wallet/signer to use to sign the transaction on the source chain
102
+ * @param callbacks Callbacks to track the progress of the swap
103
+ * @param options Optional options for the swap like feeRate, AbortSignal, and timeouts/intervals
104
+ *
105
+ * @returns {boolean} Whether the swap was successfully processed by the LP, in case `false` is returned
106
+ * the user can refund their funds back on the source chain by calling `swap.refund()`
107
+ */
108
+ execute(signer: T["Signer"] | T["NativeSigner"], callbacks?: {
109
+ onSourceTransactionSent?: (sourceTxId: string) => void;
110
+ onSourceTransactionConfirmed?: (sourceTxId: string) => void;
111
+ onSwapSettled?: (destinationTxId: string) => void;
112
+ }, options?: {
113
+ abortSignal?: AbortSignal;
114
+ paymentCheckIntervalSeconds?: number;
115
+ maxWaitTillSwapProcessedSeconds?: number;
116
+ }): Promise<boolean>;
117
+ txsExecute(options?: {
118
+ skipChecks?: boolean;
119
+ }): Promise<{
120
+ name: "Commit";
121
+ description: string;
122
+ chain: T["ChainId"];
123
+ txs: T["TX"][];
124
+ }[]>;
125
+ /**
126
+ * Returns transactions for committing the swap on-chain, initiating the swap
127
+ *
128
+ * @param skipChecks Skip checks like making sure init signature is still valid and swap wasn't commited yet
129
+ * (this is handled on swap creation, if you commit right after quoting, you can use skipChecks=true)
130
+ *
131
+ * @throws {Error} When in invalid state (not PR_CREATED)
132
+ */
133
+ txsCommit(skipChecks?: boolean): Promise<T["TX"][]>;
134
+ /**
135
+ * Commits the swap on-chain, initiating the swap
136
+ *
137
+ * @param _signer Signer to sign the transactions with, must be the same as used in the initialization
138
+ * @param abortSignal Abort signal
139
+ * @param skipChecks Skip checks like making sure init signature is still valid and swap wasn't commited yet
140
+ * (this is handled on swap creation, if you commit right after quoting, you can skipChecks)`
141
+ * @param onBeforeTxSent
142
+ * @throws {Error} If invalid signer is provided that doesn't match the swap data
143
+ */
144
+ commit(_signer: T["Signer"] | T["NativeSigner"], abortSignal?: AbortSignal, skipChecks?: boolean, onBeforeTxSent?: (txId: string) => void): Promise<string>;
145
+ /**
146
+ * Waits till a swap is committed, should be called after sending the commit transactions manually
147
+ *
148
+ * @param abortSignal AbortSignal
149
+ * @throws {Error} If swap is not in the correct state (must be CREATED)
150
+ */
151
+ waitTillCommited(abortSignal?: AbortSignal): Promise<void>;
152
+ protected waitTillIntermediarySwapProcessed(checkIntervalSeconds?: number, abortSignal?: AbortSignal): Promise<RefundAuthorizationResponse>;
153
+ /**
154
+ * Checks whether the swap was already processed by the LP and is either successful (requires proof which is
155
+ * either a HTLC pre-image for LN swaps or valid txId for on-chain swap) or failed and we can cooperatively
156
+ * refund.
157
+ *
158
+ * @param save whether to save the data
159
+ * @returns true if swap is processed, false if the swap is still ongoing
160
+ * @private
161
+ */
162
+ protected checkIntermediarySwapProcessed(save?: boolean): Promise<boolean>;
163
+ /**
164
+ * A blocking promise resolving when swap was concluded by the intermediary,
165
+ * rejecting in case of failure
166
+ *
167
+ * @param maxWaitTimeSeconds Maximum time in seconds to wait for the swap to be settled, an error is thrown if the
168
+ * swap is taking too long to claim
169
+ * @param checkIntervalSeconds How often to poll the intermediary for answer
170
+ * @param abortSignal Abort signal
171
+ * @returns {Promise<boolean>} Was the payment successful? If not we can refund.
172
+ * @throws {IntermediaryError} If a swap is determined expired by the intermediary, but it is actually still valid
173
+ * @throws {SignatureVerificationError} If the swap should be cooperatively refundable but the intermediary returned
174
+ * invalid refund signature
175
+ * @throws {Error} When swap expires or if the swap has invalid state (must be COMMITED)
176
+ */
177
+ waitForPayment(maxWaitTimeSeconds?: number, checkIntervalSeconds?: number, abortSignal?: AbortSignal): Promise<boolean>;
178
+ /**
179
+ * Get the estimated smart chain transaction fee of the refund transaction
180
+ */
181
+ getRefundFee(): Promise<bigint>;
182
+ /**
183
+ * Returns transactions for refunding the swap if the swap is in refundable state, you can check so with isRefundable()
184
+ *
185
+ * @throws {IntermediaryError} If intermediary returns invalid response in case cooperative refund should be used
186
+ * @throws {SignatureVerificationError} If intermediary returned invalid cooperative refund signature
187
+ * @throws {Error} When state is not refundable
188
+ */
189
+ txsRefund(signer?: string): Promise<T["TX"][]>;
190
+ /**
191
+ * Refunds the swap if the swap is in refundable state, you can check so with isRefundable()
192
+ *
193
+ * @param _signer Signer to sign the transactions with, must be the same as used in the initialization
194
+ * @param abortSignal Abort signal
195
+ * @throws {Error} If invalid signer is provided that doesn't match the swap data
196
+ */
197
+ refund(_signer: T["Signer"] | T["NativeSigner"], abortSignal?: AbortSignal): Promise<string>;
198
+ /**
199
+ * Waits till a swap is refunded, should be called after sending the refund transactions manually
200
+ *
201
+ * @param abortSignal AbortSignal
202
+ * @throws {Error} When swap is not in a valid state (must be COMMITED)
203
+ * @throws {Error} If we tried to refund but claimer was able to claim first
204
+ */
205
+ waitTillRefunded(abortSignal?: AbortSignal): Promise<void>;
206
+ serialize(): any;
207
+ /**
208
+ * Checks the swap's state on-chain and compares it to its internal state, updates/changes it according to on-chain
209
+ * data
210
+ *
211
+ * @private
212
+ */
213
+ private syncStateFromChain;
214
+ _shouldFetchCommitStatus(): boolean;
215
+ _shouldFetchExpiryStatus(): boolean;
216
+ _sync(save?: boolean, quoteDefinitelyExpired?: boolean, commitStatus?: SwapCommitState): Promise<boolean>;
217
+ _tick(save?: boolean): Promise<boolean>;
218
+ }
219
+ export declare enum ToBTCSwapState {
220
+ REFUNDED = -3,
221
+ QUOTE_EXPIRED = -2,
222
+ QUOTE_SOFT_EXPIRED = -1,
223
+ CREATED = 0,
224
+ COMMITED = 1,
225
+ SOFT_CLAIMED = 2,
226
+ CLAIMED = 3,
227
+ REFUNDABLE = 4
228
+ }