@atomiqlabs/sdk 8.8.3 → 8.8.4

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 (339) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +1760 -1760
  3. package/dist/SmartChainAssets.d.ts +181 -181
  4. package/dist/SmartChainAssets.js +181 -181
  5. package/dist/bitcoin/coinselect2/accumulative.d.ts +7 -7
  6. package/dist/bitcoin/coinselect2/accumulative.js +52 -52
  7. package/dist/bitcoin/coinselect2/blackjack.d.ts +7 -7
  8. package/dist/bitcoin/coinselect2/blackjack.js +38 -38
  9. package/dist/bitcoin/coinselect2/index.d.ts +20 -20
  10. package/dist/bitcoin/coinselect2/index.js +69 -69
  11. package/dist/bitcoin/coinselect2/utils.d.ts +82 -82
  12. package/dist/bitcoin/coinselect2/utils.js +158 -158
  13. package/dist/bitcoin/wallet/BitcoinWallet.d.ts +113 -113
  14. package/dist/bitcoin/wallet/BitcoinWallet.js +335 -335
  15. package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +116 -116
  16. package/dist/bitcoin/wallet/IBitcoinWallet.js +21 -21
  17. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +106 -106
  18. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +196 -196
  19. package/dist/enums/FeeType.d.ts +15 -15
  20. package/dist/enums/FeeType.js +19 -19
  21. package/dist/enums/SwapAmountType.d.ts +15 -15
  22. package/dist/enums/SwapAmountType.js +19 -19
  23. package/dist/enums/SwapDirection.d.ts +15 -15
  24. package/dist/enums/SwapDirection.js +19 -19
  25. package/dist/enums/SwapSide.d.ts +15 -15
  26. package/dist/enums/SwapSide.js +19 -19
  27. package/dist/enums/SwapType.d.ts +75 -75
  28. package/dist/enums/SwapType.js +79 -79
  29. package/dist/errors/IntermediaryError.d.ts +13 -13
  30. package/dist/errors/IntermediaryError.js +27 -27
  31. package/dist/errors/RequestError.d.ts +32 -32
  32. package/dist/errors/RequestError.js +54 -54
  33. package/dist/errors/UserError.d.ts +8 -8
  34. package/dist/errors/UserError.js +16 -16
  35. package/dist/events/UnifiedSwapEventListener.d.ts +23 -23
  36. package/dist/events/UnifiedSwapEventListener.js +132 -132
  37. package/dist/http/HttpUtils.d.ts +27 -27
  38. package/dist/http/HttpUtils.js +91 -91
  39. package/dist/http/paramcoders/IParamReader.d.ts +8 -8
  40. package/dist/http/paramcoders/IParamReader.js +2 -2
  41. package/dist/http/paramcoders/ParamDecoder.d.ts +44 -44
  42. package/dist/http/paramcoders/ParamDecoder.js +137 -137
  43. package/dist/http/paramcoders/ParamEncoder.d.ts +20 -20
  44. package/dist/http/paramcoders/ParamEncoder.js +36 -36
  45. package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -26
  46. package/dist/http/paramcoders/SchemaVerifier.js +145 -145
  47. package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -11
  48. package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -57
  49. package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -13
  50. package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -26
  51. package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -16
  52. package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -174
  53. package/dist/index.d.ts +85 -85
  54. package/dist/index.js +158 -158
  55. package/dist/intermediaries/Intermediary.d.ts +178 -178
  56. package/dist/intermediaries/Intermediary.js +166 -166
  57. package/dist/intermediaries/IntermediaryDiscovery.d.ts +211 -211
  58. package/dist/intermediaries/IntermediaryDiscovery.js +424 -424
  59. package/dist/intermediaries/apis/IntermediaryAPI.d.ts +450 -450
  60. package/dist/intermediaries/apis/IntermediaryAPI.js +618 -618
  61. package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +155 -155
  62. package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +137 -137
  63. package/dist/lnurl/LNURL.d.ts +102 -102
  64. package/dist/lnurl/LNURL.js +321 -321
  65. package/dist/prices/RedundantSwapPrice.d.ts +110 -110
  66. package/dist/prices/RedundantSwapPrice.js +222 -222
  67. package/dist/prices/SingleSwapPrice.d.ts +34 -34
  68. package/dist/prices/SingleSwapPrice.js +44 -44
  69. package/dist/prices/SwapPriceWithChain.d.ts +107 -107
  70. package/dist/prices/SwapPriceWithChain.js +128 -128
  71. package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -28
  72. package/dist/prices/abstract/ICachedSwapPrice.js +62 -62
  73. package/dist/prices/abstract/IPriceProvider.d.ts +81 -81
  74. package/dist/prices/abstract/IPriceProvider.js +74 -74
  75. package/dist/prices/abstract/ISwapPrice.d.ts +168 -168
  76. package/dist/prices/abstract/ISwapPrice.js +279 -279
  77. package/dist/prices/providers/BinancePriceProvider.d.ts +23 -23
  78. package/dist/prices/providers/BinancePriceProvider.js +30 -30
  79. package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +23 -23
  80. package/dist/prices/providers/CoinGeckoPriceProvider.js +29 -29
  81. package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +25 -25
  82. package/dist/prices/providers/CoinPaprikaPriceProvider.js +29 -29
  83. package/dist/prices/providers/CustomPriceProvider.d.ts +24 -24
  84. package/dist/prices/providers/CustomPriceProvider.js +35 -35
  85. package/dist/prices/providers/KrakenPriceProvider.d.ts +38 -38
  86. package/dist/prices/providers/KrakenPriceProvider.js +45 -45
  87. package/dist/prices/providers/OKXPriceProvider.d.ts +34 -34
  88. package/dist/prices/providers/OKXPriceProvider.js +29 -29
  89. package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +17 -17
  90. package/dist/prices/providers/abstract/ExchangePriceProvider.js +21 -21
  91. package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -7
  92. package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -12
  93. package/dist/storage/IUnifiedStorage.d.ts +85 -85
  94. package/dist/storage/IUnifiedStorage.js +2 -2
  95. package/dist/storage/UnifiedSwapStorage.d.ts +114 -114
  96. package/dist/storage/UnifiedSwapStorage.js +116 -116
  97. package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +63 -63
  98. package/dist/storage-browser/IndexedDBUnifiedStorage.js +298 -298
  99. package/dist/storage-browser/LocalStorageManager.d.ts +49 -49
  100. package/dist/storage-browser/LocalStorageManager.js +93 -93
  101. package/dist/swapper/Swapper.d.ts +732 -732
  102. package/dist/swapper/Swapper.js +1713 -1713
  103. package/dist/swapper/SwapperFactory.d.ts +135 -135
  104. package/dist/swapper/SwapperFactory.js +162 -162
  105. package/dist/swapper/SwapperUtils.d.ts +206 -206
  106. package/dist/swapper/SwapperUtils.js +481 -481
  107. package/dist/swapper/SwapperWithChain.d.ts +404 -404
  108. package/dist/swapper/SwapperWithChain.js +469 -469
  109. package/dist/swapper/SwapperWithSigner.d.ts +322 -322
  110. package/dist/swapper/SwapperWithSigner.js +318 -318
  111. package/dist/swaps/IAddressSwap.d.ts +22 -22
  112. package/dist/swaps/IAddressSwap.js +14 -14
  113. package/dist/swaps/IBTCWalletSwap.d.ts +73 -73
  114. package/dist/swaps/IBTCWalletSwap.js +18 -18
  115. package/dist/swaps/IClaimableSwap.d.ts +49 -49
  116. package/dist/swaps/IClaimableSwap.js +15 -15
  117. package/dist/swaps/IClaimableSwapWrapper.d.ts +15 -15
  118. package/dist/swaps/IClaimableSwapWrapper.js +2 -2
  119. package/dist/swaps/IRefundableSwap.d.ts +43 -43
  120. package/dist/swaps/IRefundableSwap.js +14 -14
  121. package/dist/swaps/ISwap.d.ts +392 -392
  122. package/dist/swaps/ISwap.js +349 -349
  123. package/dist/swaps/ISwapWithGasDrop.d.ts +21 -21
  124. package/dist/swaps/ISwapWithGasDrop.js +12 -12
  125. package/dist/swaps/ISwapWrapper.d.ts +285 -285
  126. package/dist/swaps/ISwapWrapper.js +353 -353
  127. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +98 -98
  128. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +126 -126
  129. package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +139 -139
  130. package/dist/swaps/escrow_swaps/IEscrowSwap.js +170 -170
  131. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +128 -128
  132. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +167 -167
  133. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +105 -105
  134. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +129 -129
  135. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +162 -162
  136. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +190 -190
  137. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +64 -64
  138. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +82 -82
  139. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +531 -531
  140. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +1285 -1285
  141. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +190 -190
  142. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +432 -432
  143. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +583 -583
  144. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +1371 -1371
  145. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +235 -235
  146. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +525 -525
  147. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +458 -458
  148. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +1126 -1126
  149. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +202 -202
  150. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +406 -406
  151. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +403 -403
  152. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +924 -924
  153. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +68 -68
  154. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +117 -117
  155. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +127 -127
  156. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +256 -256
  157. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +251 -251
  158. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +536 -536
  159. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +73 -73
  160. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +155 -155
  161. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +132 -132
  162. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +286 -286
  163. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +637 -637
  164. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1448 -1448
  165. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +257 -257
  166. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +947 -947
  167. package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +261 -261
  168. package/dist/swaps/trusted/ln/LnForGasSwap.js +511 -511
  169. package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +40 -40
  170. package/dist/swaps/trusted/ln/LnForGasWrapper.js +83 -83
  171. package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +342 -342
  172. package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +715 -715
  173. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +69 -69
  174. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +93 -93
  175. package/dist/types/AmountData.d.ts +10 -10
  176. package/dist/types/AmountData.js +2 -2
  177. package/dist/types/CustomPriceFunction.d.ts +11 -11
  178. package/dist/types/CustomPriceFunction.js +2 -2
  179. package/dist/types/PriceInfoType.d.ts +28 -28
  180. package/dist/types/PriceInfoType.js +57 -57
  181. package/dist/types/SwapExecutionAction.d.ts +88 -88
  182. package/dist/types/SwapExecutionAction.js +2 -2
  183. package/dist/types/SwapStateInfo.d.ts +5 -5
  184. package/dist/types/SwapStateInfo.js +2 -2
  185. package/dist/types/SwapWithSigner.d.ts +17 -17
  186. package/dist/types/SwapWithSigner.js +43 -43
  187. package/dist/types/Token.d.ts +99 -99
  188. package/dist/types/Token.js +76 -76
  189. package/dist/types/TokenAmount.d.ts +69 -69
  190. package/dist/types/TokenAmount.js +60 -60
  191. package/dist/types/fees/Fee.d.ts +50 -50
  192. package/dist/types/fees/Fee.js +2 -2
  193. package/dist/types/fees/FeeBreakdown.d.ts +11 -11
  194. package/dist/types/fees/FeeBreakdown.js +2 -2
  195. package/dist/types/fees/PercentagePPM.d.ts +17 -17
  196. package/dist/types/fees/PercentagePPM.js +18 -18
  197. package/dist/types/lnurl/LNURLPay.d.ts +61 -61
  198. package/dist/types/lnurl/LNURLPay.js +31 -31
  199. package/dist/types/lnurl/LNURLWithdraw.d.ts +48 -48
  200. package/dist/types/lnurl/LNURLWithdraw.js +27 -27
  201. package/dist/types/wallets/LightningInvoiceCreateService.d.ts +24 -24
  202. package/dist/types/wallets/LightningInvoiceCreateService.js +15 -15
  203. package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +23 -23
  204. package/dist/types/wallets/MinimalBitcoinWalletInterface.js +2 -2
  205. package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +9 -9
  206. package/dist/types/wallets/MinimalLightningNetworkWalletInterface.js +2 -2
  207. package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -1
  208. package/dist/utils/AutomaticClockDriftCorrection.js +70 -70
  209. package/dist/utils/BitcoinUtils.d.ts +16 -16
  210. package/dist/utils/BitcoinUtils.js +141 -141
  211. package/dist/utils/BitcoinWalletUtils.d.ts +7 -7
  212. package/dist/utils/BitcoinWalletUtils.js +14 -14
  213. package/dist/utils/Logger.d.ts +7 -7
  214. package/dist/utils/Logger.js +12 -12
  215. package/dist/utils/RetryUtils.d.ts +22 -22
  216. package/dist/utils/RetryUtils.js +67 -67
  217. package/dist/utils/SwapUtils.d.ts +88 -88
  218. package/dist/utils/SwapUtils.js +72 -72
  219. package/dist/utils/TimeoutUtils.d.ts +17 -17
  220. package/dist/utils/TimeoutUtils.js +55 -55
  221. package/dist/utils/TokenUtils.d.ts +19 -19
  222. package/dist/utils/TokenUtils.js +37 -37
  223. package/dist/utils/TypeUtils.d.ts +7 -7
  224. package/dist/utils/TypeUtils.js +2 -2
  225. package/dist/utils/Utils.d.ts +67 -67
  226. package/dist/utils/Utils.js +208 -208
  227. package/package.json +43 -43
  228. package/src/SmartChainAssets.ts +186 -186
  229. package/src/bitcoin/coinselect2/accumulative.ts +69 -69
  230. package/src/bitcoin/coinselect2/blackjack.ts +50 -50
  231. package/src/bitcoin/coinselect2/index.ts +93 -93
  232. package/src/bitcoin/coinselect2/utils.ts +236 -236
  233. package/src/bitcoin/wallet/BitcoinWallet.ts +439 -439
  234. package/src/bitcoin/wallet/IBitcoinWallet.ts +140 -140
  235. package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +225 -225
  236. package/src/enums/FeeType.ts +15 -15
  237. package/src/enums/SwapAmountType.ts +16 -16
  238. package/src/enums/SwapDirection.ts +15 -15
  239. package/src/enums/SwapSide.ts +16 -16
  240. package/src/enums/SwapType.ts +75 -75
  241. package/src/errors/IntermediaryError.ts +28 -28
  242. package/src/errors/RequestError.ts +64 -64
  243. package/src/errors/UserError.ts +15 -15
  244. package/src/events/UnifiedSwapEventListener.ts +173 -173
  245. package/src/http/HttpUtils.ts +91 -91
  246. package/src/http/paramcoders/IParamReader.ts +9 -9
  247. package/src/http/paramcoders/ParamDecoder.ts +145 -145
  248. package/src/http/paramcoders/ParamEncoder.ts +40 -40
  249. package/src/http/paramcoders/SchemaVerifier.ts +153 -153
  250. package/src/http/paramcoders/client/ResponseParamDecoder.ts +57 -57
  251. package/src/http/paramcoders/client/StreamParamEncoder.ts +28 -28
  252. package/src/http/paramcoders/client/StreamingFetchPromise.ts +192 -192
  253. package/src/index.ts +140 -140
  254. package/src/intermediaries/Intermediary.ts +280 -280
  255. package/src/intermediaries/IntermediaryDiscovery.ts +541 -541
  256. package/src/intermediaries/apis/IntermediaryAPI.ts +963 -963
  257. package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -257
  258. package/src/lnurl/LNURL.ts +402 -402
  259. package/src/prices/RedundantSwapPrice.ts +264 -264
  260. package/src/prices/SingleSwapPrice.ts +50 -50
  261. package/src/prices/SwapPriceWithChain.ts +194 -194
  262. package/src/prices/abstract/ICachedSwapPrice.ts +85 -85
  263. package/src/prices/abstract/IPriceProvider.ts +127 -127
  264. package/src/prices/abstract/ISwapPrice.ts +390 -390
  265. package/src/prices/providers/BinancePriceProvider.ts +48 -48
  266. package/src/prices/providers/CoinGeckoPriceProvider.ts +46 -46
  267. package/src/prices/providers/CoinPaprikaPriceProvider.ts +49 -49
  268. package/src/prices/providers/CustomPriceProvider.ts +40 -40
  269. package/src/prices/providers/KrakenPriceProvider.ts +83 -83
  270. package/src/prices/providers/OKXPriceProvider.ts +59 -59
  271. package/src/prices/providers/abstract/ExchangePriceProvider.ts +31 -31
  272. package/src/prices/providers/abstract/HttpPriceProvider.ts +14 -14
  273. package/src/storage/IUnifiedStorage.ts +95 -95
  274. package/src/storage/UnifiedSwapStorage.ts +141 -141
  275. package/src/storage-browser/IndexedDBUnifiedStorage.ts +350 -350
  276. package/src/storage-browser/LocalStorageManager.ts +106 -106
  277. package/src/swapper/Swapper.ts +2488 -2488
  278. package/src/swapper/SwapperFactory.ts +307 -307
  279. package/src/swapper/SwapperUtils.ts +570 -570
  280. package/src/swapper/SwapperWithChain.ts +707 -707
  281. package/src/swapper/SwapperWithSigner.ts +511 -511
  282. package/src/swaps/IAddressSwap.ts +30 -30
  283. package/src/swaps/IBTCWalletSwap.ts +92 -92
  284. package/src/swaps/IClaimableSwap.ts +65 -65
  285. package/src/swaps/IClaimableSwapWrapper.ts +17 -17
  286. package/src/swaps/IRefundableSwap.ts +58 -58
  287. package/src/swaps/ISwap.ts +703 -703
  288. package/src/swaps/ISwapWithGasDrop.ts +25 -25
  289. package/src/swaps/ISwapWrapper.ts +539 -539
  290. package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +217 -217
  291. package/src/swaps/escrow_swaps/IEscrowSwap.ts +269 -269
  292. package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +282 -282
  293. package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +169 -169
  294. package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +300 -300
  295. package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +107 -107
  296. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1473 -1474
  297. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +601 -601
  298. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1582 -1582
  299. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +750 -750
  300. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +1299 -1299
  301. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +610 -610
  302. package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +1096 -1096
  303. package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +138 -138
  304. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +304 -304
  305. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +786 -786
  306. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +206 -206
  307. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +401 -401
  308. package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1812 -1812
  309. package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +1236 -1236
  310. package/src/swaps/trusted/ln/LnForGasSwap.ts +589 -589
  311. package/src/swaps/trusted/ln/LnForGasWrapper.ts +91 -91
  312. package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +862 -862
  313. package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +131 -131
  314. package/src/types/AmountData.ts +9 -9
  315. package/src/types/CustomPriceFunction.ts +11 -11
  316. package/src/types/PriceInfoType.ts +66 -66
  317. package/src/types/SwapExecutionAction.ts +99 -99
  318. package/src/types/SwapStateInfo.ts +6 -6
  319. package/src/types/SwapWithSigner.ts +61 -61
  320. package/src/types/Token.ts +163 -163
  321. package/src/types/TokenAmount.ts +132 -132
  322. package/src/types/fees/Fee.ts +56 -56
  323. package/src/types/fees/FeeBreakdown.ts +11 -11
  324. package/src/types/fees/PercentagePPM.ts +26 -26
  325. package/src/types/lnurl/LNURLPay.ts +79 -79
  326. package/src/types/lnurl/LNURLWithdraw.ts +61 -61
  327. package/src/types/wallets/LightningInvoiceCreateService.ts +30 -30
  328. package/src/types/wallets/MinimalBitcoinWalletInterface.ts +21 -21
  329. package/src/types/wallets/MinimalLightningNetworkWalletInterface.ts +9 -9
  330. package/src/utils/AutomaticClockDriftCorrection.ts +71 -71
  331. package/src/utils/BitcoinUtils.ts +132 -132
  332. package/src/utils/BitcoinWalletUtils.ts +15 -15
  333. package/src/utils/Logger.ts +14 -14
  334. package/src/utils/RetryUtils.ts +78 -78
  335. package/src/utils/SwapUtils.ts +99 -99
  336. package/src/utils/TimeoutUtils.ts +49 -49
  337. package/src/utils/TokenUtils.ts +33 -33
  338. package/src/utils/TypeUtils.ts +8 -8
  339. package/src/utils/Utils.ts +212 -212
@@ -1,703 +1,703 @@
1
- import {SwapType} from "../enums/SwapType";
2
- import {EventEmitter} from "events";
3
- import {ISwapWrapper, SwapTypeDefinition} from "./ISwapWrapper";
4
- import {ChainType} from "@atomiqlabs/base";
5
- import {randomBytes, toBigInt} from "../utils/Utils";
6
- import {SwapDirection} from "../enums/SwapDirection";
7
- import {Fee} from "../types/fees/Fee";
8
- import {FeeBreakdown} from "../types/fees/FeeBreakdown";
9
- import {PercentagePPM, ppmToPercentage} from "../types/fees/PercentagePPM";
10
- import {TokenAmount} from "../types/TokenAmount";
11
- import {isSCToken, Token} from "../types/Token";
12
- import {SwapExecutionAction} from "../types/SwapExecutionAction";
13
- import {LoggerType} from "../utils/Logger";
14
- import {isPriceInfoType, PriceInfoType} from "../types/PriceInfoType";
15
- import {SwapStateInfo} from "../types/SwapStateInfo";
16
-
17
- /**
18
- * Initialization data for creating a swap
19
- *
20
- * @category Swaps/Base
21
- */
22
- export type ISwapInit = {
23
- pricingInfo: PriceInfoType,
24
- url?: string,
25
- expiry: number,
26
- swapFee: bigint,
27
- swapFeeBtc: bigint,
28
- exactIn: boolean,
29
- contractVersion: string
30
- };
31
-
32
- /**
33
- * Type guard to check if an object is an ISwapInit
34
- *
35
- * @category Swaps/Base
36
- */
37
- export function isISwapInit(obj: any): obj is ISwapInit {
38
- return typeof obj === 'object' &&
39
- obj != null &&
40
- isPriceInfoType(obj.pricingInfo) &&
41
- (obj.url==null || typeof obj.url === 'string') &&
42
- typeof obj.expiry === 'number' &&
43
- typeof(obj.swapFee) === "bigint" &&
44
- typeof(obj.swapFeeBtc) === "bigint" &&
45
- (typeof obj.exactIn === 'boolean');
46
- }
47
-
48
- /**
49
- * Base abstract class for all swap types
50
- *
51
- * @category Swaps/Base
52
- */
53
- export abstract class ISwap<
54
- T extends ChainType = ChainType,
55
- D extends SwapTypeDefinition<T, ISwapWrapper<T, D>, ISwap<T, D, S>> = SwapTypeDefinition<T, ISwapWrapper<T, any>, ISwap<T, any, any>>,
56
- S extends number = number
57
- > {
58
- /**
59
- * Swap type
60
- */
61
- protected readonly abstract TYPE: SwapType;
62
-
63
- /**
64
- * Description for the states
65
- * @internal
66
- */
67
- protected readonly abstract swapStateDescription: Record<S, string>;
68
- /**
69
- * Name of the states
70
- * @internal
71
- */
72
- protected readonly abstract swapStateName: (state: number) => string;
73
- /**
74
- * Swap logger
75
- * @internal
76
- */
77
- protected readonly abstract logger: LoggerType;
78
- /**
79
- * Current newest defined version of the swap
80
- * @internal
81
- */
82
- protected readonly currentVersion: number = 1;
83
- /**
84
- * Wrapper instance holding this swap
85
- * @internal
86
- */
87
- protected readonly wrapper: D["Wrapper"];
88
-
89
-
90
- /**
91
- * The current version of the swap
92
- * @internal
93
- */
94
- protected version: number;
95
- /**
96
- * Whether a swap was initialized, a swap is considered initialize on first interaction with it, i.e.
97
- * calling commit() on a Smart chain -> Bitcoin swaps, calling waitForPayment() or similar on the other
98
- * direction. Not initiated swaps are not saved to the persistent storage by default (see
99
- * {@link SwapperOptions.saveUninitializedSwaps})
100
- * @internal
101
- */
102
- protected initiated: boolean = false;
103
- /**
104
- * Expiration of the swap quote
105
- * @internal
106
- */
107
- protected expiry: number;
108
- /**
109
- * Pricing information of the swap
110
- * @internal
111
- */
112
- protected pricingInfo?: PriceInfoType;
113
- /**
114
- * Swap fee in the non-bitcoin token
115
- * @internal
116
- */
117
- protected swapFee: bigint;
118
- /**
119
- * Swap fee in bitcoin satoshis
120
- * @internal
121
- */
122
- protected swapFeeBtc: bigint;
123
-
124
-
125
- /**
126
- * Swap state
127
- * @internal
128
- */
129
- _state: S = 0 as S;
130
- /**
131
- * Random nonce to differentiate the swap from others with the same identifier hash (i.e. when quoting the same swap
132
- * from multiple LPs)
133
- * @internal
134
- */
135
- _randomNonce: string;
136
- /**
137
- * Whether the swap is saved in the persistent storage or not.
138
- *
139
- * @remarks This field itself is not persisted but is instead derived during runtime
140
- *
141
- * @internal
142
- */
143
- _persisted: boolean = false;
144
- /**
145
- * @internal
146
- */
147
- _contractVersion?: string;
148
-
149
-
150
- /**
151
- * Event emitter emitting `"swapState"` event when swap's state changes
152
- */
153
- readonly events: EventEmitter<{swapState: [D["Swap"]]}> = new EventEmitter();
154
- /**
155
- * URL of the intermediary (LP) used for this swap, already has the swap service specific path appended
156
- */
157
- readonly url?: string;
158
- /**
159
- * Smart chain identifier string corresponding to this swap
160
- */
161
- readonly chainIdentifier: T["ChainId"];
162
- /**
163
- * Whether a swap is an exact input swap
164
- */
165
- readonly exactIn: boolean;
166
- /**
167
- * A UNIX milliseconds timestamps of when this swap was created
168
- */
169
- createdAt: number;
170
-
171
- protected constructor(wrapper: D["Wrapper"], obj: any);
172
- protected constructor(wrapper: D["Wrapper"], swapInit: ISwapInit);
173
- protected constructor(
174
- wrapper: D["Wrapper"],
175
- swapInitOrObj: ISwapInit | any,
176
- ) {
177
- this.chainIdentifier = wrapper.chainIdentifier;
178
- this.wrapper = wrapper;
179
- if(isISwapInit(swapInitOrObj)) {
180
- this.pricingInfo = swapInitOrObj.pricingInfo;
181
- this.url = swapInitOrObj.url;
182
- this.expiry = swapInitOrObj.expiry;
183
- this.swapFee = swapInitOrObj.swapFee;
184
- this.swapFeeBtc = swapInitOrObj.swapFeeBtc;
185
- this.exactIn = swapInitOrObj.exactIn;
186
- this.version = this.currentVersion;
187
- this.createdAt = Date.now();
188
- this._randomNonce = randomBytes(16).toString("hex");
189
- this._contractVersion = swapInitOrObj.contractVersion;
190
- } else {
191
- this.expiry = swapInitOrObj.expiry;
192
- this.url = swapInitOrObj.url;
193
-
194
- this._state = swapInitOrObj.state;
195
-
196
- if(
197
- swapInitOrObj._isValid!=null && swapInitOrObj._differencePPM!=null && swapInitOrObj._satsBaseFee!=null &&
198
- swapInitOrObj._feePPM!=null && swapInitOrObj._swapPriceUSatPerToken!=null
199
- ) {
200
- this.pricingInfo = {
201
- isValid: swapInitOrObj._isValid,
202
- differencePPM: BigInt(swapInitOrObj._differencePPM),
203
- satsBaseFee: BigInt(swapInitOrObj._satsBaseFee),
204
- feePPM: BigInt(swapInitOrObj._feePPM),
205
- realPriceUSatPerToken: toBigInt(swapInitOrObj._realPriceUSatPerToken),
206
- realPriceUsdPerBitcoin: swapInitOrObj._realPriceUsdPerBitcoin,
207
- swapPriceUSatPerToken: BigInt(swapInitOrObj._swapPriceUSatPerToken),
208
- };
209
- }
210
-
211
- this.swapFee = toBigInt(swapInitOrObj.swapFee);
212
- this.swapFeeBtc = toBigInt(swapInitOrObj.swapFeeBtc);
213
-
214
- this.version = swapInitOrObj.version;
215
- this.initiated = swapInitOrObj.initiated;
216
- this.exactIn = swapInitOrObj.exactIn;
217
- this.createdAt = swapInitOrObj.createdAt ?? swapInitOrObj.expiry;
218
-
219
- this._randomNonce = swapInitOrObj.randomNonce;
220
- this._contractVersion = swapInitOrObj.contractVersion;
221
- }
222
- if(this.version!==this.currentVersion) {
223
- this.upgradeVersion();
224
- }
225
- if(this.initiated==null) this.initiated = true;
226
- }
227
-
228
- /**
229
- * Called when swap is deserialized to potentially update the version of the data for the swap
230
- *
231
- * @internal
232
- */
233
- protected abstract upgradeVersion(): void;
234
-
235
- /**
236
- * Waits till the swap reaches a specific state
237
- *
238
- * @param targetState The state to wait for
239
- * @param type Whether to wait for the state exactly or also to a state with a higher number
240
- * @param abortSignal Abort signal
241
- * @internal
242
- */
243
- protected waitTillState(targetState: S, type: "eq" | "gte" | "neq" = "eq", abortSignal?: AbortSignal): Promise<void> {
244
- //TODO: This doesn't hold strong reference to the swap, hence if no other strong reference to the
245
- // swap exists, it will just never resolve!
246
- return new Promise((resolve, reject) => {
247
- let listener: () => void;
248
- listener = () => {
249
- if(type==="eq" ? this._state===targetState : type==="gte" ? this._state>=targetState : this._state!=targetState) {
250
- resolve();
251
- this.events.removeListener("swapState", listener);
252
- }
253
- };
254
- this.events.on("swapState", listener);
255
- if(abortSignal!=null) abortSignal.addEventListener("abort", () => {
256
- this.events.removeListener("swapState", listener);
257
- reject(abortSignal.reason);
258
- });
259
- });
260
- }
261
-
262
- /**
263
- * Returns a list of steps or transactions required to finish and settle the swap
264
- *
265
- * @param options Additional options for executing the swap
266
- */
267
- public abstract txsExecute(options?: any): Promise<SwapExecutionAction<T>[]>;
268
-
269
- /**
270
- * Executes the swap with the provided wallet, the exact arguments for this functions differ for various swap
271
- * types. Check the `execute()` function signature in the respective swap class to see the required arguments.
272
- *
273
- * @param args Execution arguments, usually contains a source wallet object, callbacks and options, for exact
274
- * syntax check the respective swap class.
275
- *
276
- * @returns Whether a swap was successfully executed or not, if it wasn't the user can refund or claim manually
277
- */
278
- public abstract execute(...args: any[]): Promise<boolean>;
279
-
280
- //////////////////////////////
281
- //// Pricing
282
-
283
- /**
284
- * This attempts to populate missing fields in the pricing info based on the swap amounts
285
- *
286
- * @internal
287
- */
288
- protected tryRecomputeSwapPrice(): void {
289
- if(this.pricingInfo==null) return;
290
- if(this.pricingInfo.swapPriceUSatPerToken==null) {
291
- const priceUsdPerBtc = this.pricingInfo.realPriceUsdPerBitcoin;
292
- const input = this.getInput();
293
- const output = this.getOutput();
294
- if(input.isUnknown || output.isUnknown) return;
295
- if(isSCToken(input.token) && this.getDirection()===SwapDirection.TO_BTC) {
296
- this.pricingInfo = this.wrapper._prices.recomputePriceInfoSend(
297
- this.chainIdentifier,
298
- output.rawAmount!,
299
- this.pricingInfo.satsBaseFee,
300
- this.pricingInfo.feePPM,
301
- input.rawAmount!,
302
- input.token.address
303
- );
304
- this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
305
- } else if(isSCToken(output.token) && this.getDirection()===SwapDirection.FROM_BTC) {
306
- this.pricingInfo = this.wrapper._prices.recomputePriceInfoReceive(
307
- this.chainIdentifier,
308
- input.rawAmount!,
309
- this.pricingInfo.satsBaseFee,
310
- this.pricingInfo.feePPM,
311
- output.rawAmount!,
312
- output.token.address
313
- );
314
- this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
315
- }
316
- }
317
- }
318
-
319
- /**
320
- * Re-fetches & revalidates the price data based on the current market prices
321
- */
322
- public async refreshPriceData(): Promise<void> {
323
- if(this.pricingInfo==null) return;
324
- const priceUsdPerBtc = this.pricingInfo.realPriceUsdPerBitcoin;
325
- const output = this.getOutput();
326
- if(output.isUnknown) return;
327
-
328
- if(isSCToken(this.getInputToken()) && this.getDirection()===SwapDirection.TO_BTC) {
329
- const input = this.getInputWithoutFee();
330
- if(input.isUnknown) return;
331
-
332
- this.pricingInfo = await this.wrapper._prices.isValidAmountSend(
333
- this.chainIdentifier,
334
- output.rawAmount!,
335
- this.pricingInfo.satsBaseFee,
336
- this.pricingInfo.feePPM,
337
- input.rawAmount! + this.swapFee,
338
- input.token.address,
339
- undefined,
340
- undefined,
341
- this.swapFeeBtc
342
- );
343
- this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
344
- } else if(isSCToken(output.token) && this.getDirection()===SwapDirection.FROM_BTC) {
345
- const input = this.getInput();
346
- if(input.isUnknown) return;
347
-
348
- this.pricingInfo = await this.wrapper._prices.isValidAmountReceive(
349
- this.chainIdentifier,
350
- input.rawAmount!,
351
- this.pricingInfo.satsBaseFee,
352
- this.pricingInfo.feePPM,
353
- output.rawAmount!,
354
- output.token.address,
355
- undefined,
356
- undefined,
357
- this.swapFeeBtc
358
- );
359
- this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
360
- }
361
- }
362
-
363
- /**
364
- * Checks if the pricing for the swap is valid, according to max allowed price difference set in the ISwapPrice
365
- */
366
- public hasValidPrice(): boolean {
367
- if(this.pricingInfo==null) throw new Error("Pricing info not found, cannot check price validity!");
368
- return this.pricingInfo.isValid;
369
- }
370
-
371
- /**
372
- * Returns pricing info about the swap
373
- */
374
- public getPriceInfo(): {
375
- marketPrice?: number,
376
- swapPrice: number,
377
- difference: PercentagePPM
378
- } {
379
- if(this.pricingInfo==null) throw new Error("Pricing info not provided and not known!");
380
-
381
- const swapPrice = this.getDirection()===SwapDirection.TO_BTC ?
382
- 100_000_000_000_000/Number(this.pricingInfo.swapPriceUSatPerToken) :
383
- Number(this.pricingInfo.swapPriceUSatPerToken)/100_000_000_000_000;
384
-
385
- let marketPrice: number | undefined;
386
- if(this.pricingInfo.realPriceUSatPerToken!=null)
387
- marketPrice = this.getDirection()===SwapDirection.TO_BTC ?
388
- 100_000_000_000_000/Number(this.pricingInfo.realPriceUSatPerToken) :
389
- Number(this.pricingInfo.realPriceUSatPerToken)/100_000_000_000_000;
390
-
391
- return {
392
- marketPrice,
393
- swapPrice,
394
- difference: ppmToPercentage(this.pricingInfo.differencePPM)
395
- }
396
- }
397
-
398
-
399
- //////////////////////////////
400
- //// Getters & utils
401
-
402
- /**
403
- * Asserts a given signer is the initiator of this swap
404
- *
405
- * @param signer Signer to check with this swap's initiator
406
- * @throws {Error} When signer's address doesn't match with the swap's initiator one
407
- * @internal
408
- */
409
- protected checkSigner(signer: T["Signer"] | string): void {
410
- if((typeof(signer)==="string" ? signer : signer.getAddress())!==this._getInitiator()) throw new Error("Invalid signer provided!");
411
- }
412
-
413
- /**
414
- * Returns an escrow hash of the swap
415
- *
416
- * @internal
417
- */
418
- abstract _getEscrowHash(): string | null;
419
-
420
- /**
421
- * Checks if the swap's quote is expired for good (i.e. the swap strictly cannot be initiated anymore)
422
- * @internal
423
- */
424
- abstract _verifyQuoteDefinitelyExpired(): Promise<boolean>;
425
-
426
- /**
427
- * Checks if the swap's quote is still valid
428
- * @internal
429
- */
430
- abstract _verifyQuoteValid(): Promise<boolean>;
431
-
432
- /**
433
- * Returns the intiator address of the swap - address that created this swap
434
- * @internal
435
- */
436
- abstract _getInitiator(): string;
437
-
438
- /**
439
- * Sets this swap as initiated
440
- * @internal
441
- */
442
- _setInitiated(): void {
443
- this.initiated = true;
444
- }
445
-
446
- /**
447
- * Returns source address of the swap
448
- */
449
- public abstract getInputAddress(): string | null;
450
-
451
- /**
452
- * Returns destination address of the swap
453
- */
454
- public abstract getOutputAddress(): string | null;
455
-
456
- /**
457
- * Returns swap input transaction ID on the source chain
458
- */
459
- public abstract getInputTxId(): string | null;
460
-
461
- /**
462
- * Returns swap output transaction ID on the destination chain
463
- */
464
- public abstract getOutputTxId(): string | null;
465
-
466
- /**
467
- * Returns the ID of the swap, as used in the storage
468
- */
469
- public abstract getId(): string;
470
-
471
- /**
472
- * Checks whether there is some action required from the user for this swap - can mean either refundable or claimable
473
- */
474
- public abstract requiresAction(): boolean;
475
-
476
- /**
477
- * Returns whether the swap is finished and in its terminal state (this can mean successful, refunded or failed)
478
- */
479
- public abstract isFinished(): boolean;
480
-
481
- /**
482
- * Checks whether the swap's quote has definitely expired and cannot be committed anymore, we can remove such swap
483
- */
484
- public abstract isQuoteExpired(): boolean;
485
-
486
- /**
487
- * Checks whether the swap's quote is soft expired (this means there is not enough time buffer for it to commit,
488
- * but it still can happen)
489
- */
490
- public abstract isQuoteSoftExpired(): boolean;
491
-
492
- /**
493
- * Returns whether the swap finished successful
494
- */
495
- public abstract isSuccessful(): boolean;
496
-
497
- /**
498
- * Returns whether the swap failed (e.g. was refunded)
499
- */
500
- public abstract isFailed(): boolean;
501
-
502
- /**
503
- * Returns whether the swap is currently being processed
504
- */
505
- public abstract isInProgress(): boolean;
506
-
507
- /**
508
- * Whether a swap was initialized, a swap is considered initialized on first interaction with it, i.e.
509
- * calling commit() on a Smart chain -> Bitcoin swaps, calling waitForPayment() or similar on the other
510
- * direction. Not initiated swaps are not saved to the persistent storage by default (see
511
- * {@link SwapperOptions.saveUninitializedSwaps})
512
- */
513
- public isInitiated(): boolean {
514
- return this.initiated;
515
- }
516
-
517
- /**
518
- * Returns quote expiry in UNIX millis
519
- */
520
- public getQuoteExpiry(): number {
521
- return this.expiry;
522
- }
523
-
524
- /**
525
- * Returns the type of the swap
526
- */
527
- public getType(): SwapType {
528
- return this.TYPE;
529
- }
530
-
531
- /**
532
- * Returns the direction of the swap
533
- */
534
- public getDirection(): SwapDirection {
535
- return this.TYPE===SwapType.TO_BTC || this.TYPE===SwapType.TO_BTCLN ? SwapDirection.TO_BTC : SwapDirection.FROM_BTC;
536
- }
537
-
538
- /**
539
- * Returns the current state of the swap
540
- */
541
- public getState(): S {
542
- return this._state;
543
- }
544
-
545
- /**
546
- * Returns the current state of the swap along with the human-readable description of the state
547
- */
548
- public getStateInfo(): SwapStateInfo<S> {
549
- return {
550
- state: this._state,
551
- name: this.swapStateName(this._state),
552
- description: this.swapStateDescription[this._state]
553
- }
554
- }
555
-
556
- /**
557
- * Returns a state-dependent set of actions for the user to execute, or empty array if there is currently
558
- * no action required from the user to execute.
559
- */
560
- public abstract getCurrentActions(): Promise<SwapExecutionAction<T>[]>;
561
-
562
- //////////////////////////////
563
- //// Amounts & fees
564
-
565
- /**
566
- * Returns output amount of the swap, user receives this much
567
- */
568
- public abstract getOutput(): TokenAmount;
569
-
570
- /**
571
- * Returns the output token of the swap
572
- */
573
- public abstract getOutputToken(): Token<T["ChainId"]>;
574
-
575
- /**
576
- * Returns input amount of the swap, user needs to pay this much
577
- */
578
- public abstract getInput(): TokenAmount;
579
-
580
- /**
581
- * Returns the input token of the swap
582
- */
583
- public abstract getInputToken(): Token<T["ChainId"]>;
584
-
585
- /**
586
- * Returns input amount of the swap without the fees (swap fee, network fee)
587
- */
588
- public abstract getInputWithoutFee(): TokenAmount;
589
-
590
- /**
591
- * Returns total fee for the swap, the fee is represented in source currency & destination currency, but is
592
- * paid only once
593
- */
594
- public abstract getFee(): Fee;
595
-
596
- /**
597
- * Returns the breakdown of all the fees paid
598
- */
599
- public abstract getFeeBreakdown(): FeeBreakdown<T["ChainId"]>;
600
-
601
-
602
- //////////////////////////////
603
- //// Storage
604
-
605
- /**
606
- * Saves the swap data to the underlying storage, or removes it if it is in a quote expired state
607
- *
608
- * @internal
609
- */
610
- _save(): Promise<void> {
611
- if(this.isQuoteExpired()) {
612
- return this.wrapper._removeSwapData(this);
613
- } else {
614
- return this.wrapper._saveSwapData(this);
615
- }
616
- }
617
-
618
- /**
619
- * Saves the swap data and also emits a swap state change
620
- *
621
- * @param state Optional state to set before the swap is saved an event emitted
622
- *
623
- * @internal
624
- */
625
- async _saveAndEmit(state?: S): Promise<void> {
626
- if(state!=null) this._state = state;
627
- await this._save();
628
- this._emitEvent();
629
- }
630
-
631
- /**
632
- * Serializes the swap to a JSON stringifiable representation (i.e. no bigints, buffers etc.)
633
- */
634
- public serialize(): any {
635
- if(this.pricingInfo==null) return {};
636
- return {
637
- id: this.getId(),
638
- type: this.getType(),
639
- escrowHash: this._getEscrowHash(),
640
- initiator: this._getInitiator(),
641
-
642
- _isValid: this.pricingInfo.isValid,
643
- _differencePPM: this.pricingInfo.differencePPM==null ? null :this.pricingInfo.differencePPM.toString(10),
644
- _satsBaseFee: this.pricingInfo.satsBaseFee==null ? null :this.pricingInfo.satsBaseFee.toString(10),
645
- _feePPM: this.pricingInfo.feePPM==null ? null :this.pricingInfo.feePPM.toString(10),
646
- _realPriceUSatPerToken: this.pricingInfo.realPriceUSatPerToken==null ? null :this.pricingInfo.realPriceUSatPerToken.toString(10),
647
- _realPriceUsdPerBitcoin: this.pricingInfo.realPriceUsdPerBitcoin,
648
- _swapPriceUSatPerToken: this.pricingInfo.swapPriceUSatPerToken==null ? null :this.pricingInfo.swapPriceUSatPerToken.toString(10),
649
- state: this._state,
650
- url: this.url,
651
- swapFee: this.swapFee==null ? null : this.swapFee.toString(10),
652
- swapFeeBtc: this.swapFeeBtc==null ? null : this.swapFeeBtc.toString(10),
653
- expiry: this.expiry,
654
- version: this.version,
655
- initiated: this.initiated,
656
- exactIn: this.exactIn,
657
- createdAt: this.createdAt,
658
- randomNonce: this._randomNonce,
659
- contractVersion: this._contractVersion
660
- }
661
- }
662
-
663
-
664
- //////////////////////////////
665
- //// Events
666
-
667
- /**
668
- * Emits a `swapState` event with the current swap
669
- *
670
- * @internal
671
- */
672
- _emitEvent() {
673
- this.wrapper.events.emit("swapState", this);
674
- this.events.emit("swapState", this);
675
- }
676
-
677
-
678
- //////////////////////////////
679
- //// Swap ticks & sync
680
-
681
- /**
682
- * Synchronizes swap state from chain and/or LP node, usually ran on startup
683
- *
684
- * @param save whether to save the new swap state or not
685
- *
686
- * @returns {boolean} true if the swap changed, false if the swap hasn't changed
687
- *
688
- * @internal
689
- */
690
- abstract _sync(save?: boolean): Promise<boolean>;
691
-
692
- /**
693
- * Runs quick checks on the swap, such as checking the expiry, usually ran periodically every few seconds
694
- *
695
- * @param save whether to save the new swap state or not
696
- *
697
- * @returns {boolean} true if the swap changed, false if the swap hasn't changed
698
- *
699
- * @internal
700
- */
701
- abstract _tick(save?: boolean): Promise<boolean>;
702
-
703
- }
1
+ import {SwapType} from "../enums/SwapType";
2
+ import {EventEmitter} from "events";
3
+ import {ISwapWrapper, SwapTypeDefinition} from "./ISwapWrapper";
4
+ import {ChainType} from "@atomiqlabs/base";
5
+ import {randomBytes, toBigInt} from "../utils/Utils";
6
+ import {SwapDirection} from "../enums/SwapDirection";
7
+ import {Fee} from "../types/fees/Fee";
8
+ import {FeeBreakdown} from "../types/fees/FeeBreakdown";
9
+ import {PercentagePPM, ppmToPercentage} from "../types/fees/PercentagePPM";
10
+ import {TokenAmount} from "../types/TokenAmount";
11
+ import {isSCToken, Token} from "../types/Token";
12
+ import {SwapExecutionAction} from "../types/SwapExecutionAction";
13
+ import {LoggerType} from "../utils/Logger";
14
+ import {isPriceInfoType, PriceInfoType} from "../types/PriceInfoType";
15
+ import {SwapStateInfo} from "../types/SwapStateInfo";
16
+
17
+ /**
18
+ * Initialization data for creating a swap
19
+ *
20
+ * @category Swaps/Base
21
+ */
22
+ export type ISwapInit = {
23
+ pricingInfo: PriceInfoType,
24
+ url?: string,
25
+ expiry: number,
26
+ swapFee: bigint,
27
+ swapFeeBtc: bigint,
28
+ exactIn: boolean,
29
+ contractVersion: string
30
+ };
31
+
32
+ /**
33
+ * Type guard to check if an object is an ISwapInit
34
+ *
35
+ * @category Swaps/Base
36
+ */
37
+ export function isISwapInit(obj: any): obj is ISwapInit {
38
+ return typeof obj === 'object' &&
39
+ obj != null &&
40
+ isPriceInfoType(obj.pricingInfo) &&
41
+ (obj.url==null || typeof obj.url === 'string') &&
42
+ typeof obj.expiry === 'number' &&
43
+ typeof(obj.swapFee) === "bigint" &&
44
+ typeof(obj.swapFeeBtc) === "bigint" &&
45
+ (typeof obj.exactIn === 'boolean');
46
+ }
47
+
48
+ /**
49
+ * Base abstract class for all swap types
50
+ *
51
+ * @category Swaps/Base
52
+ */
53
+ export abstract class ISwap<
54
+ T extends ChainType = ChainType,
55
+ D extends SwapTypeDefinition<T, ISwapWrapper<T, D>, ISwap<T, D, S>> = SwapTypeDefinition<T, ISwapWrapper<T, any>, ISwap<T, any, any>>,
56
+ S extends number = number
57
+ > {
58
+ /**
59
+ * Swap type
60
+ */
61
+ protected readonly abstract TYPE: SwapType;
62
+
63
+ /**
64
+ * Description for the states
65
+ * @internal
66
+ */
67
+ protected readonly abstract swapStateDescription: Record<S, string>;
68
+ /**
69
+ * Name of the states
70
+ * @internal
71
+ */
72
+ protected readonly abstract swapStateName: (state: number) => string;
73
+ /**
74
+ * Swap logger
75
+ * @internal
76
+ */
77
+ protected readonly abstract logger: LoggerType;
78
+ /**
79
+ * Current newest defined version of the swap
80
+ * @internal
81
+ */
82
+ protected readonly currentVersion: number = 1;
83
+ /**
84
+ * Wrapper instance holding this swap
85
+ * @internal
86
+ */
87
+ protected readonly wrapper: D["Wrapper"];
88
+
89
+
90
+ /**
91
+ * The current version of the swap
92
+ * @internal
93
+ */
94
+ protected version: number;
95
+ /**
96
+ * Whether a swap was initialized, a swap is considered initialize on first interaction with it, i.e.
97
+ * calling commit() on a Smart chain -> Bitcoin swaps, calling waitForPayment() or similar on the other
98
+ * direction. Not initiated swaps are not saved to the persistent storage by default (see
99
+ * {@link SwapperOptions.saveUninitializedSwaps})
100
+ * @internal
101
+ */
102
+ protected initiated: boolean = false;
103
+ /**
104
+ * Expiration of the swap quote
105
+ * @internal
106
+ */
107
+ protected expiry: number;
108
+ /**
109
+ * Pricing information of the swap
110
+ * @internal
111
+ */
112
+ protected pricingInfo?: PriceInfoType;
113
+ /**
114
+ * Swap fee in the non-bitcoin token
115
+ * @internal
116
+ */
117
+ protected swapFee: bigint;
118
+ /**
119
+ * Swap fee in bitcoin satoshis
120
+ * @internal
121
+ */
122
+ protected swapFeeBtc: bigint;
123
+
124
+
125
+ /**
126
+ * Swap state
127
+ * @internal
128
+ */
129
+ _state: S = 0 as S;
130
+ /**
131
+ * Random nonce to differentiate the swap from others with the same identifier hash (i.e. when quoting the same swap
132
+ * from multiple LPs)
133
+ * @internal
134
+ */
135
+ _randomNonce: string;
136
+ /**
137
+ * Whether the swap is saved in the persistent storage or not.
138
+ *
139
+ * @remarks This field itself is not persisted but is instead derived during runtime
140
+ *
141
+ * @internal
142
+ */
143
+ _persisted: boolean = false;
144
+ /**
145
+ * @internal
146
+ */
147
+ _contractVersion?: string;
148
+
149
+
150
+ /**
151
+ * Event emitter emitting `"swapState"` event when swap's state changes
152
+ */
153
+ readonly events: EventEmitter<{swapState: [D["Swap"]]}> = new EventEmitter();
154
+ /**
155
+ * URL of the intermediary (LP) used for this swap, already has the swap service specific path appended
156
+ */
157
+ readonly url?: string;
158
+ /**
159
+ * Smart chain identifier string corresponding to this swap
160
+ */
161
+ readonly chainIdentifier: T["ChainId"];
162
+ /**
163
+ * Whether a swap is an exact input swap
164
+ */
165
+ readonly exactIn: boolean;
166
+ /**
167
+ * A UNIX milliseconds timestamps of when this swap was created
168
+ */
169
+ createdAt: number;
170
+
171
+ protected constructor(wrapper: D["Wrapper"], obj: any);
172
+ protected constructor(wrapper: D["Wrapper"], swapInit: ISwapInit);
173
+ protected constructor(
174
+ wrapper: D["Wrapper"],
175
+ swapInitOrObj: ISwapInit | any,
176
+ ) {
177
+ this.chainIdentifier = wrapper.chainIdentifier;
178
+ this.wrapper = wrapper;
179
+ if(isISwapInit(swapInitOrObj)) {
180
+ this.pricingInfo = swapInitOrObj.pricingInfo;
181
+ this.url = swapInitOrObj.url;
182
+ this.expiry = swapInitOrObj.expiry;
183
+ this.swapFee = swapInitOrObj.swapFee;
184
+ this.swapFeeBtc = swapInitOrObj.swapFeeBtc;
185
+ this.exactIn = swapInitOrObj.exactIn;
186
+ this.version = this.currentVersion;
187
+ this.createdAt = Date.now();
188
+ this._randomNonce = randomBytes(16).toString("hex");
189
+ this._contractVersion = swapInitOrObj.contractVersion;
190
+ } else {
191
+ this.expiry = swapInitOrObj.expiry;
192
+ this.url = swapInitOrObj.url;
193
+
194
+ this._state = swapInitOrObj.state;
195
+
196
+ if(
197
+ swapInitOrObj._isValid!=null && swapInitOrObj._differencePPM!=null && swapInitOrObj._satsBaseFee!=null &&
198
+ swapInitOrObj._feePPM!=null && swapInitOrObj._swapPriceUSatPerToken!=null
199
+ ) {
200
+ this.pricingInfo = {
201
+ isValid: swapInitOrObj._isValid,
202
+ differencePPM: BigInt(swapInitOrObj._differencePPM),
203
+ satsBaseFee: BigInt(swapInitOrObj._satsBaseFee),
204
+ feePPM: BigInt(swapInitOrObj._feePPM),
205
+ realPriceUSatPerToken: toBigInt(swapInitOrObj._realPriceUSatPerToken),
206
+ realPriceUsdPerBitcoin: swapInitOrObj._realPriceUsdPerBitcoin,
207
+ swapPriceUSatPerToken: BigInt(swapInitOrObj._swapPriceUSatPerToken),
208
+ };
209
+ }
210
+
211
+ this.swapFee = toBigInt(swapInitOrObj.swapFee);
212
+ this.swapFeeBtc = toBigInt(swapInitOrObj.swapFeeBtc);
213
+
214
+ this.version = swapInitOrObj.version;
215
+ this.initiated = swapInitOrObj.initiated;
216
+ this.exactIn = swapInitOrObj.exactIn;
217
+ this.createdAt = swapInitOrObj.createdAt ?? swapInitOrObj.expiry;
218
+
219
+ this._randomNonce = swapInitOrObj.randomNonce;
220
+ this._contractVersion = swapInitOrObj.contractVersion;
221
+ }
222
+ if(this.version!==this.currentVersion) {
223
+ this.upgradeVersion();
224
+ }
225
+ if(this.initiated==null) this.initiated = true;
226
+ }
227
+
228
+ /**
229
+ * Called when swap is deserialized to potentially update the version of the data for the swap
230
+ *
231
+ * @internal
232
+ */
233
+ protected abstract upgradeVersion(): void;
234
+
235
+ /**
236
+ * Waits till the swap reaches a specific state
237
+ *
238
+ * @param targetState The state to wait for
239
+ * @param type Whether to wait for the state exactly or also to a state with a higher number
240
+ * @param abortSignal Abort signal
241
+ * @internal
242
+ */
243
+ protected waitTillState(targetState: S, type: "eq" | "gte" | "neq" = "eq", abortSignal?: AbortSignal): Promise<void> {
244
+ //TODO: This doesn't hold strong reference to the swap, hence if no other strong reference to the
245
+ // swap exists, it will just never resolve!
246
+ return new Promise((resolve, reject) => {
247
+ let listener: () => void;
248
+ listener = () => {
249
+ if(type==="eq" ? this._state===targetState : type==="gte" ? this._state>=targetState : this._state!=targetState) {
250
+ resolve();
251
+ this.events.removeListener("swapState", listener);
252
+ }
253
+ };
254
+ this.events.on("swapState", listener);
255
+ if(abortSignal!=null) abortSignal.addEventListener("abort", () => {
256
+ this.events.removeListener("swapState", listener);
257
+ reject(abortSignal.reason);
258
+ });
259
+ });
260
+ }
261
+
262
+ /**
263
+ * Returns a list of steps or transactions required to finish and settle the swap
264
+ *
265
+ * @param options Additional options for executing the swap
266
+ */
267
+ public abstract txsExecute(options?: any): Promise<SwapExecutionAction<T>[]>;
268
+
269
+ /**
270
+ * Executes the swap with the provided wallet, the exact arguments for this functions differ for various swap
271
+ * types. Check the `execute()` function signature in the respective swap class to see the required arguments.
272
+ *
273
+ * @param args Execution arguments, usually contains a source wallet object, callbacks and options, for exact
274
+ * syntax check the respective swap class.
275
+ *
276
+ * @returns Whether a swap was successfully executed or not, if it wasn't the user can refund or claim manually
277
+ */
278
+ public abstract execute(...args: any[]): Promise<boolean>;
279
+
280
+ //////////////////////////////
281
+ //// Pricing
282
+
283
+ /**
284
+ * This attempts to populate missing fields in the pricing info based on the swap amounts
285
+ *
286
+ * @internal
287
+ */
288
+ protected tryRecomputeSwapPrice(): void {
289
+ if(this.pricingInfo==null) return;
290
+ if(this.pricingInfo.swapPriceUSatPerToken==null) {
291
+ const priceUsdPerBtc = this.pricingInfo.realPriceUsdPerBitcoin;
292
+ const input = this.getInput();
293
+ const output = this.getOutput();
294
+ if(input.isUnknown || output.isUnknown) return;
295
+ if(isSCToken(input.token) && this.getDirection()===SwapDirection.TO_BTC) {
296
+ this.pricingInfo = this.wrapper._prices.recomputePriceInfoSend(
297
+ this.chainIdentifier,
298
+ output.rawAmount!,
299
+ this.pricingInfo.satsBaseFee,
300
+ this.pricingInfo.feePPM,
301
+ input.rawAmount!,
302
+ input.token.address
303
+ );
304
+ this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
305
+ } else if(isSCToken(output.token) && this.getDirection()===SwapDirection.FROM_BTC) {
306
+ this.pricingInfo = this.wrapper._prices.recomputePriceInfoReceive(
307
+ this.chainIdentifier,
308
+ input.rawAmount!,
309
+ this.pricingInfo.satsBaseFee,
310
+ this.pricingInfo.feePPM,
311
+ output.rawAmount!,
312
+ output.token.address
313
+ );
314
+ this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
315
+ }
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Re-fetches & revalidates the price data based on the current market prices
321
+ */
322
+ public async refreshPriceData(): Promise<void> {
323
+ if(this.pricingInfo==null) return;
324
+ const priceUsdPerBtc = this.pricingInfo.realPriceUsdPerBitcoin;
325
+ const output = this.getOutput();
326
+ if(output.isUnknown) return;
327
+
328
+ if(isSCToken(this.getInputToken()) && this.getDirection()===SwapDirection.TO_BTC) {
329
+ const input = this.getInputWithoutFee();
330
+ if(input.isUnknown) return;
331
+
332
+ this.pricingInfo = await this.wrapper._prices.isValidAmountSend(
333
+ this.chainIdentifier,
334
+ output.rawAmount!,
335
+ this.pricingInfo.satsBaseFee,
336
+ this.pricingInfo.feePPM,
337
+ input.rawAmount! + this.swapFee,
338
+ input.token.address,
339
+ undefined,
340
+ undefined,
341
+ this.swapFeeBtc
342
+ );
343
+ this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
344
+ } else if(isSCToken(output.token) && this.getDirection()===SwapDirection.FROM_BTC) {
345
+ const input = this.getInput();
346
+ if(input.isUnknown) return;
347
+
348
+ this.pricingInfo = await this.wrapper._prices.isValidAmountReceive(
349
+ this.chainIdentifier,
350
+ input.rawAmount!,
351
+ this.pricingInfo.satsBaseFee,
352
+ this.pricingInfo.feePPM,
353
+ output.rawAmount!,
354
+ output.token.address,
355
+ undefined,
356
+ undefined,
357
+ this.swapFeeBtc
358
+ );
359
+ this.pricingInfo.realPriceUsdPerBitcoin = priceUsdPerBtc;
360
+ }
361
+ }
362
+
363
+ /**
364
+ * Checks if the pricing for the swap is valid, according to max allowed price difference set in the ISwapPrice
365
+ */
366
+ public hasValidPrice(): boolean {
367
+ if(this.pricingInfo==null) throw new Error("Pricing info not found, cannot check price validity!");
368
+ return this.pricingInfo.isValid;
369
+ }
370
+
371
+ /**
372
+ * Returns pricing info about the swap
373
+ */
374
+ public getPriceInfo(): {
375
+ marketPrice?: number,
376
+ swapPrice: number,
377
+ difference: PercentagePPM
378
+ } {
379
+ if(this.pricingInfo==null) throw new Error("Pricing info not provided and not known!");
380
+
381
+ const swapPrice = this.getDirection()===SwapDirection.TO_BTC ?
382
+ 100_000_000_000_000/Number(this.pricingInfo.swapPriceUSatPerToken) :
383
+ Number(this.pricingInfo.swapPriceUSatPerToken)/100_000_000_000_000;
384
+
385
+ let marketPrice: number | undefined;
386
+ if(this.pricingInfo.realPriceUSatPerToken!=null)
387
+ marketPrice = this.getDirection()===SwapDirection.TO_BTC ?
388
+ 100_000_000_000_000/Number(this.pricingInfo.realPriceUSatPerToken) :
389
+ Number(this.pricingInfo.realPriceUSatPerToken)/100_000_000_000_000;
390
+
391
+ return {
392
+ marketPrice,
393
+ swapPrice,
394
+ difference: ppmToPercentage(this.pricingInfo.differencePPM)
395
+ }
396
+ }
397
+
398
+
399
+ //////////////////////////////
400
+ //// Getters & utils
401
+
402
+ /**
403
+ * Asserts a given signer is the initiator of this swap
404
+ *
405
+ * @param signer Signer to check with this swap's initiator
406
+ * @throws {Error} When signer's address doesn't match with the swap's initiator one
407
+ * @internal
408
+ */
409
+ protected checkSigner(signer: T["Signer"] | string): void {
410
+ if((typeof(signer)==="string" ? signer : signer.getAddress())!==this._getInitiator()) throw new Error("Invalid signer provided!");
411
+ }
412
+
413
+ /**
414
+ * Returns an escrow hash of the swap
415
+ *
416
+ * @internal
417
+ */
418
+ abstract _getEscrowHash(): string | null;
419
+
420
+ /**
421
+ * Checks if the swap's quote is expired for good (i.e. the swap strictly cannot be initiated anymore)
422
+ * @internal
423
+ */
424
+ abstract _verifyQuoteDefinitelyExpired(): Promise<boolean>;
425
+
426
+ /**
427
+ * Checks if the swap's quote is still valid
428
+ * @internal
429
+ */
430
+ abstract _verifyQuoteValid(): Promise<boolean>;
431
+
432
+ /**
433
+ * Returns the intiator address of the swap - address that created this swap
434
+ * @internal
435
+ */
436
+ abstract _getInitiator(): string;
437
+
438
+ /**
439
+ * Sets this swap as initiated
440
+ * @internal
441
+ */
442
+ _setInitiated(): void {
443
+ this.initiated = true;
444
+ }
445
+
446
+ /**
447
+ * Returns source address of the swap
448
+ */
449
+ public abstract getInputAddress(): string | null;
450
+
451
+ /**
452
+ * Returns destination address of the swap
453
+ */
454
+ public abstract getOutputAddress(): string | null;
455
+
456
+ /**
457
+ * Returns swap input transaction ID on the source chain
458
+ */
459
+ public abstract getInputTxId(): string | null;
460
+
461
+ /**
462
+ * Returns swap output transaction ID on the destination chain
463
+ */
464
+ public abstract getOutputTxId(): string | null;
465
+
466
+ /**
467
+ * Returns the ID of the swap, as used in the storage
468
+ */
469
+ public abstract getId(): string;
470
+
471
+ /**
472
+ * Checks whether there is some action required from the user for this swap - can mean either refundable or claimable
473
+ */
474
+ public abstract requiresAction(): boolean;
475
+
476
+ /**
477
+ * Returns whether the swap is finished and in its terminal state (this can mean successful, refunded or failed)
478
+ */
479
+ public abstract isFinished(): boolean;
480
+
481
+ /**
482
+ * Checks whether the swap's quote has definitely expired and cannot be committed anymore, we can remove such swap
483
+ */
484
+ public abstract isQuoteExpired(): boolean;
485
+
486
+ /**
487
+ * Checks whether the swap's quote is soft expired (this means there is not enough time buffer for it to commit,
488
+ * but it still can happen)
489
+ */
490
+ public abstract isQuoteSoftExpired(): boolean;
491
+
492
+ /**
493
+ * Returns whether the swap finished successful
494
+ */
495
+ public abstract isSuccessful(): boolean;
496
+
497
+ /**
498
+ * Returns whether the swap failed (e.g. was refunded)
499
+ */
500
+ public abstract isFailed(): boolean;
501
+
502
+ /**
503
+ * Returns whether the swap is currently being processed
504
+ */
505
+ public abstract isInProgress(): boolean;
506
+
507
+ /**
508
+ * Whether a swap was initialized, a swap is considered initialized on first interaction with it, i.e.
509
+ * calling commit() on a Smart chain -> Bitcoin swaps, calling waitForPayment() or similar on the other
510
+ * direction. Not initiated swaps are not saved to the persistent storage by default (see
511
+ * {@link SwapperOptions.saveUninitializedSwaps})
512
+ */
513
+ public isInitiated(): boolean {
514
+ return this.initiated;
515
+ }
516
+
517
+ /**
518
+ * Returns quote expiry in UNIX millis
519
+ */
520
+ public getQuoteExpiry(): number {
521
+ return this.expiry;
522
+ }
523
+
524
+ /**
525
+ * Returns the type of the swap
526
+ */
527
+ public getType(): SwapType {
528
+ return this.TYPE;
529
+ }
530
+
531
+ /**
532
+ * Returns the direction of the swap
533
+ */
534
+ public getDirection(): SwapDirection {
535
+ return this.TYPE===SwapType.TO_BTC || this.TYPE===SwapType.TO_BTCLN ? SwapDirection.TO_BTC : SwapDirection.FROM_BTC;
536
+ }
537
+
538
+ /**
539
+ * Returns the current state of the swap
540
+ */
541
+ public getState(): S {
542
+ return this._state;
543
+ }
544
+
545
+ /**
546
+ * Returns the current state of the swap along with the human-readable description of the state
547
+ */
548
+ public getStateInfo(): SwapStateInfo<S> {
549
+ return {
550
+ state: this._state,
551
+ name: this.swapStateName(this._state),
552
+ description: this.swapStateDescription[this._state]
553
+ }
554
+ }
555
+
556
+ /**
557
+ * Returns a state-dependent set of actions for the user to execute, or empty array if there is currently
558
+ * no action required from the user to execute.
559
+ */
560
+ public abstract getCurrentActions(): Promise<SwapExecutionAction<T>[]>;
561
+
562
+ //////////////////////////////
563
+ //// Amounts & fees
564
+
565
+ /**
566
+ * Returns output amount of the swap, user receives this much
567
+ */
568
+ public abstract getOutput(): TokenAmount;
569
+
570
+ /**
571
+ * Returns the output token of the swap
572
+ */
573
+ public abstract getOutputToken(): Token<T["ChainId"]>;
574
+
575
+ /**
576
+ * Returns input amount of the swap, user needs to pay this much
577
+ */
578
+ public abstract getInput(): TokenAmount;
579
+
580
+ /**
581
+ * Returns the input token of the swap
582
+ */
583
+ public abstract getInputToken(): Token<T["ChainId"]>;
584
+
585
+ /**
586
+ * Returns input amount of the swap without the fees (swap fee, network fee)
587
+ */
588
+ public abstract getInputWithoutFee(): TokenAmount;
589
+
590
+ /**
591
+ * Returns total fee for the swap, the fee is represented in source currency & destination currency, but is
592
+ * paid only once
593
+ */
594
+ public abstract getFee(): Fee;
595
+
596
+ /**
597
+ * Returns the breakdown of all the fees paid
598
+ */
599
+ public abstract getFeeBreakdown(): FeeBreakdown<T["ChainId"]>;
600
+
601
+
602
+ //////////////////////////////
603
+ //// Storage
604
+
605
+ /**
606
+ * Saves the swap data to the underlying storage, or removes it if it is in a quote expired state
607
+ *
608
+ * @internal
609
+ */
610
+ _save(): Promise<void> {
611
+ if(this.isQuoteExpired()) {
612
+ return this.wrapper._removeSwapData(this);
613
+ } else {
614
+ return this.wrapper._saveSwapData(this);
615
+ }
616
+ }
617
+
618
+ /**
619
+ * Saves the swap data and also emits a swap state change
620
+ *
621
+ * @param state Optional state to set before the swap is saved an event emitted
622
+ *
623
+ * @internal
624
+ */
625
+ async _saveAndEmit(state?: S): Promise<void> {
626
+ if(state!=null) this._state = state;
627
+ await this._save();
628
+ this._emitEvent();
629
+ }
630
+
631
+ /**
632
+ * Serializes the swap to a JSON stringifiable representation (i.e. no bigints, buffers etc.)
633
+ */
634
+ public serialize(): any {
635
+ if(this.pricingInfo==null) return {};
636
+ return {
637
+ id: this.getId(),
638
+ type: this.getType(),
639
+ escrowHash: this._getEscrowHash(),
640
+ initiator: this._getInitiator(),
641
+
642
+ _isValid: this.pricingInfo.isValid,
643
+ _differencePPM: this.pricingInfo.differencePPM==null ? null :this.pricingInfo.differencePPM.toString(10),
644
+ _satsBaseFee: this.pricingInfo.satsBaseFee==null ? null :this.pricingInfo.satsBaseFee.toString(10),
645
+ _feePPM: this.pricingInfo.feePPM==null ? null :this.pricingInfo.feePPM.toString(10),
646
+ _realPriceUSatPerToken: this.pricingInfo.realPriceUSatPerToken==null ? null :this.pricingInfo.realPriceUSatPerToken.toString(10),
647
+ _realPriceUsdPerBitcoin: this.pricingInfo.realPriceUsdPerBitcoin,
648
+ _swapPriceUSatPerToken: this.pricingInfo.swapPriceUSatPerToken==null ? null :this.pricingInfo.swapPriceUSatPerToken.toString(10),
649
+ state: this._state,
650
+ url: this.url,
651
+ swapFee: this.swapFee==null ? null : this.swapFee.toString(10),
652
+ swapFeeBtc: this.swapFeeBtc==null ? null : this.swapFeeBtc.toString(10),
653
+ expiry: this.expiry,
654
+ version: this.version,
655
+ initiated: this.initiated,
656
+ exactIn: this.exactIn,
657
+ createdAt: this.createdAt,
658
+ randomNonce: this._randomNonce,
659
+ contractVersion: this._contractVersion
660
+ }
661
+ }
662
+
663
+
664
+ //////////////////////////////
665
+ //// Events
666
+
667
+ /**
668
+ * Emits a `swapState` event with the current swap
669
+ *
670
+ * @internal
671
+ */
672
+ _emitEvent() {
673
+ this.wrapper.events.emit("swapState", this);
674
+ this.events.emit("swapState", this);
675
+ }
676
+
677
+
678
+ //////////////////////////////
679
+ //// Swap ticks & sync
680
+
681
+ /**
682
+ * Synchronizes swap state from chain and/or LP node, usually ran on startup
683
+ *
684
+ * @param save whether to save the new swap state or not
685
+ *
686
+ * @returns {boolean} true if the swap changed, false if the swap hasn't changed
687
+ *
688
+ * @internal
689
+ */
690
+ abstract _sync(save?: boolean): Promise<boolean>;
691
+
692
+ /**
693
+ * Runs quick checks on the swap, such as checking the expiry, usually ran periodically every few seconds
694
+ *
695
+ * @param save whether to save the new swap state or not
696
+ *
697
+ * @returns {boolean} true if the swap changed, false if the swap hasn't changed
698
+ *
699
+ * @internal
700
+ */
701
+ abstract _tick(save?: boolean): Promise<boolean>;
702
+
703
+ }