@atomiqlabs/sdk 8.1.7 → 8.3.1

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 (253) hide show
  1. package/dist/bitcoin/wallet/BitcoinWallet.d.ts +41 -5
  2. package/dist/bitcoin/wallet/BitcoinWallet.js +36 -1
  3. package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +52 -2
  4. package/dist/bitcoin/wallet/IBitcoinWallet.js +2 -1
  5. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +42 -7
  6. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +36 -1
  7. package/dist/enums/FeeType.d.ts +7 -0
  8. package/dist/enums/FeeType.js +7 -0
  9. package/dist/enums/SwapAmountType.d.ts +7 -0
  10. package/dist/enums/SwapAmountType.js +7 -0
  11. package/dist/enums/SwapDirection.d.ts +7 -0
  12. package/dist/enums/SwapDirection.js +7 -0
  13. package/dist/enums/SwapType.d.ts +62 -1
  14. package/dist/enums/SwapType.js +62 -1
  15. package/dist/errors/IntermediaryError.d.ts +4 -0
  16. package/dist/errors/IntermediaryError.js +1 -0
  17. package/dist/errors/RequestError.d.ts +15 -1
  18. package/dist/errors/RequestError.js +8 -0
  19. package/dist/errors/UserError.d.ts +1 -0
  20. package/dist/errors/UserError.js +1 -0
  21. package/dist/index.d.ts +4 -5
  22. package/dist/index.js +3 -4
  23. package/dist/intermediaries/Intermediary.d.ts +57 -10
  24. package/dist/intermediaries/Intermediary.js +37 -10
  25. package/dist/intermediaries/IntermediaryDiscovery.d.ts +55 -22
  26. package/dist/intermediaries/IntermediaryDiscovery.js +35 -22
  27. package/dist/prices/RedundantSwapPrice.d.ts +24 -3
  28. package/dist/prices/RedundantSwapPrice.js +21 -1
  29. package/dist/prices/SingleSwapPrice.d.ts +9 -6
  30. package/dist/prices/SingleSwapPrice.js +10 -7
  31. package/dist/prices/SwapPriceWithChain.d.ts +54 -16
  32. package/dist/prices/SwapPriceWithChain.js +58 -20
  33. package/dist/prices/abstract/ISwapPrice.d.ts +94 -45
  34. package/dist/prices/abstract/ISwapPrice.js +103 -55
  35. package/dist/prices/providers/BinancePriceProvider.d.ts +7 -0
  36. package/dist/prices/providers/BinancePriceProvider.js +7 -0
  37. package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +6 -0
  38. package/dist/prices/providers/CoinGeckoPriceProvider.js +6 -0
  39. package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +6 -0
  40. package/dist/prices/providers/CoinPaprikaPriceProvider.js +6 -0
  41. package/dist/prices/providers/CustomPriceProvider.d.ts +11 -0
  42. package/dist/prices/providers/CustomPriceProvider.js +11 -0
  43. package/dist/prices/providers/KrakenPriceProvider.d.ts +9 -0
  44. package/dist/prices/providers/KrakenPriceProvider.js +9 -0
  45. package/dist/prices/providers/OKXPriceProvider.d.ts +6 -0
  46. package/dist/prices/providers/OKXPriceProvider.js +6 -0
  47. package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +3 -0
  48. package/dist/prices/providers/abstract/ExchangePriceProvider.js +3 -0
  49. package/dist/storage/IUnifiedStorage.d.ts +19 -7
  50. package/dist/storage/UnifiedSwapStorage.d.ts +33 -3
  51. package/dist/storage/UnifiedSwapStorage.js +29 -1
  52. package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +31 -7
  53. package/dist/storage-browser/IndexedDBUnifiedStorage.js +29 -6
  54. package/dist/storage-browser/LocalStorageManager.d.ts +25 -1
  55. package/dist/storage-browser/LocalStorageManager.js +25 -1
  56. package/dist/swapper/Swapper.d.ts +303 -222
  57. package/dist/swapper/Swapper.js +376 -344
  58. package/dist/swapper/SwapperFactory.d.ts +41 -17
  59. package/dist/swapper/SwapperFactory.js +23 -2
  60. package/dist/swapper/SwapperUtils.d.ts +75 -28
  61. package/dist/swapper/SwapperUtils.js +107 -60
  62. package/dist/swapper/SwapperWithChain.d.ts +286 -91
  63. package/dist/swapper/SwapperWithChain.js +218 -64
  64. package/dist/swapper/SwapperWithSigner.d.ts +229 -80
  65. package/dist/swapper/SwapperWithSigner.js +190 -44
  66. package/dist/swaps/IAddressSwap.d.ts +10 -1
  67. package/dist/swaps/IAddressSwap.js +2 -1
  68. package/dist/swaps/IBTCWalletSwap.d.ts +24 -6
  69. package/dist/swaps/IBTCWalletSwap.js +2 -1
  70. package/dist/swaps/IClaimableSwap.d.ts +36 -4
  71. package/dist/swaps/IClaimableSwap.js +2 -1
  72. package/dist/swaps/IClaimableSwapWrapper.d.ts +11 -1
  73. package/dist/swaps/IRefundableSwap.d.ts +29 -3
  74. package/dist/swaps/IRefundableSwap.js +2 -1
  75. package/dist/swaps/ISwap.d.ts +159 -21
  76. package/dist/swaps/ISwap.js +90 -33
  77. package/dist/swaps/ISwapWithGasDrop.d.ts +6 -0
  78. package/dist/swaps/ISwapWithGasDrop.js +1 -0
  79. package/dist/swaps/ISwapWrapper.d.ts +157 -48
  80. package/dist/swaps/ISwapWrapper.js +130 -72
  81. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +49 -6
  82. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +22 -12
  83. package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +65 -12
  84. package/dist/swaps/escrow_swaps/IEscrowSwap.js +38 -19
  85. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +39 -9
  86. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +30 -21
  87. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +31 -15
  88. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +33 -18
  89. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +94 -29
  90. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +90 -27
  91. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +22 -9
  92. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +24 -11
  93. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +275 -58
  94. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +516 -239
  95. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +76 -25
  96. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +131 -49
  97. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +311 -51
  98. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +542 -193
  99. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +87 -26
  100. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +147 -58
  101. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +209 -53
  102. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +449 -242
  103. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +77 -23
  104. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +116 -46
  105. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +197 -56
  106. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +326 -189
  107. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +30 -5
  108. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +44 -19
  109. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +60 -19
  110. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +74 -31
  111. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +76 -50
  112. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +106 -101
  113. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +36 -13
  114. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +65 -19
  115. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +46 -17
  116. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +82 -27
  117. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +328 -92
  118. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +460 -219
  119. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +76 -24
  120. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +244 -124
  121. package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +146 -18
  122. package/dist/swaps/trusted/ln/LnForGasSwap.js +173 -43
  123. package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +29 -10
  124. package/dist/swaps/trusted/ln/LnForGasWrapper.js +30 -11
  125. package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +200 -47
  126. package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +230 -78
  127. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +34 -12
  128. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +33 -14
  129. package/dist/types/AmountData.d.ts +2 -1
  130. package/dist/types/CustomPriceFunction.d.ts +7 -1
  131. package/dist/types/SwapExecutionAction.d.ts +74 -4
  132. package/dist/types/SwapWithSigner.d.ts +4 -1
  133. package/dist/types/SwapWithSigner.js +5 -2
  134. package/dist/types/Token.d.ts +11 -5
  135. package/dist/types/Token.js +6 -3
  136. package/dist/types/TokenAmount.d.ts +3 -0
  137. package/dist/types/TokenAmount.js +2 -0
  138. package/dist/types/fees/Fee.d.ts +2 -1
  139. package/dist/types/fees/FeeBreakdown.d.ts +2 -1
  140. package/dist/types/fees/PercentagePPM.d.ts +2 -0
  141. package/dist/types/fees/PercentagePPM.js +1 -0
  142. package/dist/types/lnurl/LNURLPay.d.ts +14 -6
  143. package/dist/types/lnurl/LNURLPay.js +6 -2
  144. package/dist/types/lnurl/LNURLWithdraw.d.ts +12 -5
  145. package/dist/types/lnurl/LNURLWithdraw.js +6 -2
  146. package/dist/types/wallets/LightningInvoiceCreateService.d.ts +20 -0
  147. package/dist/types/wallets/LightningInvoiceCreateService.js +15 -0
  148. package/dist/types/wallets/MinimalBitcoinWalletInterface.d.ts +3 -1
  149. package/dist/types/wallets/MinimalLightningNetworkWalletInterface.d.ts +3 -1
  150. package/dist/utils/BitcoinUtils.d.ts +1 -0
  151. package/dist/utils/BitcoinUtils.js +5 -1
  152. package/dist/utils/SwapUtils.d.ts +56 -1
  153. package/dist/utils/SwapUtils.js +53 -1
  154. package/dist/utils/TokenUtils.d.ts +10 -2
  155. package/dist/utils/TokenUtils.js +12 -4
  156. package/package.json +3 -3
  157. package/src/bitcoin/wallet/BitcoinWallet.ts +41 -5
  158. package/src/bitcoin/wallet/IBitcoinWallet.ts +57 -2
  159. package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +42 -6
  160. package/src/enums/FeeType.ts +7 -0
  161. package/src/enums/SwapAmountType.ts +7 -0
  162. package/src/enums/SwapDirection.ts +7 -0
  163. package/src/enums/SwapType.ts +62 -2
  164. package/src/errors/IntermediaryError.ts +4 -0
  165. package/src/errors/RequestError.ts +15 -1
  166. package/src/errors/UserError.ts +1 -0
  167. package/src/index.ts +6 -5
  168. package/src/intermediaries/Intermediary.ts +57 -10
  169. package/src/intermediaries/IntermediaryDiscovery.ts +60 -27
  170. package/src/prices/RedundantSwapPrice.ts +24 -4
  171. package/src/prices/SingleSwapPrice.ts +10 -7
  172. package/src/prices/SwapPriceWithChain.ts +59 -21
  173. package/src/prices/abstract/ISwapPrice.ts +114 -65
  174. package/src/prices/providers/BinancePriceProvider.ts +7 -0
  175. package/src/prices/providers/CoinGeckoPriceProvider.ts +6 -0
  176. package/src/prices/providers/CoinPaprikaPriceProvider.ts +6 -0
  177. package/src/prices/providers/CustomPriceProvider.ts +11 -0
  178. package/src/prices/providers/KrakenPriceProvider.ts +9 -0
  179. package/src/prices/providers/OKXPriceProvider.ts +6 -0
  180. package/src/prices/providers/abstract/ExchangePriceProvider.ts +3 -0
  181. package/src/storage/IUnifiedStorage.ts +19 -7
  182. package/src/storage/UnifiedSwapStorage.ts +33 -3
  183. package/src/storage-browser/IndexedDBUnifiedStorage.ts +31 -8
  184. package/src/storage-browser/LocalStorageManager.ts +25 -1
  185. package/src/swapper/Swapper.ts +513 -379
  186. package/src/swapper/SwapperFactory.ts +44 -21
  187. package/src/swapper/SwapperUtils.ts +107 -60
  188. package/src/swapper/SwapperWithChain.ts +320 -81
  189. package/src/swapper/SwapperWithSigner.ts +263 -56
  190. package/src/swaps/IAddressSwap.ts +11 -1
  191. package/src/swaps/IBTCWalletSwap.ts +24 -8
  192. package/src/swaps/IClaimableSwap.ts +39 -4
  193. package/src/swaps/IClaimableSwapWrapper.ts +11 -2
  194. package/src/swaps/IRefundableSwap.ts +32 -3
  195. package/src/swaps/ISwap.ts +221 -82
  196. package/src/swaps/ISwapWithGasDrop.ts +6 -0
  197. package/src/swaps/ISwapWrapper.ts +212 -94
  198. package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +62 -18
  199. package/src/swaps/escrow_swaps/IEscrowSwap.ts +83 -37
  200. package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +61 -30
  201. package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +37 -19
  202. package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +120 -51
  203. package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +24 -11
  204. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +559 -256
  205. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +155 -61
  206. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +590 -226
  207. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +177 -74
  208. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +470 -243
  209. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +141 -59
  210. package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +352 -193
  211. package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +48 -23
  212. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +86 -39
  213. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +110 -110
  214. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +88 -33
  215. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +101 -31
  216. package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +534 -263
  217. package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +289 -148
  218. package/src/swaps/trusted/ln/LnForGasSwap.ts +184 -45
  219. package/src/swaps/trusted/ln/LnForGasWrapper.ts +34 -15
  220. package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +260 -86
  221. package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +41 -19
  222. package/src/types/AmountData.ts +2 -1
  223. package/src/types/CustomPriceFunction.ts +7 -1
  224. package/src/types/SwapExecutionAction.ts +84 -5
  225. package/src/types/SwapWithSigner.ts +7 -3
  226. package/src/types/Token.ts +12 -5
  227. package/src/types/TokenAmount.ts +3 -0
  228. package/src/types/fees/Fee.ts +2 -1
  229. package/src/types/fees/FeeBreakdown.ts +2 -1
  230. package/src/types/fees/PercentagePPM.ts +2 -0
  231. package/src/types/lnurl/LNURLPay.ts +14 -6
  232. package/src/types/lnurl/LNURLWithdraw.ts +12 -5
  233. package/src/types/wallets/LightningInvoiceCreateService.ts +26 -0
  234. package/src/types/wallets/MinimalBitcoinWalletInterface.ts +3 -1
  235. package/src/types/wallets/MinimalLightningNetworkWalletInterface.ts +3 -1
  236. package/src/utils/BitcoinUtils.ts +5 -0
  237. package/src/utils/SwapUtils.ts +61 -1
  238. package/src/utils/TokenUtils.ts +12 -4
  239. package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +0 -68
  240. package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +0 -2
  241. package/dist/bitcoin/LightningNetworkApi.d.ts +0 -12
  242. package/dist/bitcoin/LightningNetworkApi.js +0 -2
  243. package/dist/bitcoin/mempool/MempoolApi.d.ts +0 -350
  244. package/dist/bitcoin/mempool/MempoolApi.js +0 -311
  245. package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +0 -44
  246. package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +0 -48
  247. package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +0 -119
  248. package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +0 -361
  249. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +0 -22
  250. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +0 -105
  251. package/dist/errors/PaymentAuthError.d.ts +0 -11
  252. package/dist/errors/PaymentAuthError.js +0 -23
  253. package/src/errors/PaymentAuthError.ts +0 -26
@@ -13,6 +13,13 @@ const RequestError_1 = require("../../errors/RequestError");
13
13
  const IntermediaryError_1 = require("../../errors/IntermediaryError");
14
14
  const btc_signer_1 = require("@scure/btc-signer");
15
15
  const RetryUtils_1 = require("../../utils/RetryUtils");
16
+ /**
17
+ * New spv vault (UTXO-controlled vault) based swaps for Bitcoin -> Smart chain swaps not requiring
18
+ * any initiation on the destination chain, and with the added possibility for the user to receive
19
+ * a native token on the destination chain as part of the swap (a "gas drop" feature).
20
+ *
21
+ * @category Swaps
22
+ */
16
23
  class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
17
24
  /**
18
25
  * @param chainIdentifier
@@ -30,97 +37,104 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
30
37
  * @param events Instance to use for emitting events
31
38
  */
32
39
  constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, spvWithdrawalDataDeserializer, btcRelay, synchronizer, btcRpc, options, events) {
33
- if (options == null)
34
- options = {};
35
- options.bitcoinNetwork ??= utils_1.TEST_NETWORK;
36
- options.maxConfirmations ??= 6;
37
- options.bitcoinBlocktime ??= 10 * 60;
38
- options.maxTransactionsDelta ??= 3;
39
- options.maxRawAmountAdjustmentDifferencePPM ??= 100;
40
- options.maxBtcFeeOffset ??= 5;
41
- options.maxBtcFeeMultiplier ??= 1.5;
42
40
  super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, {
43
- bitcoinNetwork: options.bitcoinNetwork ?? utils_1.TEST_NETWORK,
44
- maxConfirmations: options.maxConfirmations ?? 6,
45
- bitcoinBlocktime: options.bitcoinBlocktime ?? 10 * 60,
46
- maxTransactionsDelta: options.maxTransactionsDelta ?? 3,
47
- maxRawAmountAdjustmentDifferencePPM: options.maxRawAmountAdjustmentDifferencePPM ?? 100,
48
- maxBtcFeeOffset: options.maxBtcFeeOffset ?? 5,
49
- maxBtcFeeMultiplier: options.maxBtcFeeMultiplier ?? 1.5
41
+ bitcoinNetwork: options?.bitcoinNetwork ?? utils_1.TEST_NETWORK,
42
+ maxConfirmations: options?.maxConfirmations ?? 6,
43
+ bitcoinBlocktime: options?.bitcoinBlocktime ?? 10 * 60,
44
+ maxTransactionsDelta: options?.maxTransactionsDelta ?? 3,
45
+ maxRawAmountAdjustmentDifferencePPM: options?.maxRawAmountAdjustmentDifferencePPM ?? 100,
46
+ maxBtcFeeOffset: options?.maxBtcFeeOffset ?? 10,
47
+ maxBtcFeeMultiplier: options?.maxBtcFeeMultiplier ?? 1.5
50
48
  }, events);
51
- this.claimableSwapStates = [SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED];
52
49
  this.TYPE = SwapType_1.SwapType.SPV_VAULT_FROM_BTC;
53
- this.swapDeserializer = SpvFromBTCSwap_1.SpvFromBTCSwap;
54
- this.pendingSwapStates = [
50
+ /**
51
+ * @internal
52
+ */
53
+ this._claimableSwapStates = [SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED];
54
+ /**
55
+ * @internal
56
+ */
57
+ this._swapDeserializer = SpvFromBTCSwap_1.SpvFromBTCSwap;
58
+ /**
59
+ * @internal
60
+ */
61
+ this.tickSwapState = [
55
62
  SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED,
63
+ SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED,
56
64
  SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED,
57
65
  SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED,
58
- SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED,
59
- SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED,
60
- SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED,
61
- SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED
66
+ SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED
62
67
  ];
63
- this.tickSwapState = [
68
+ /**
69
+ * @internal
70
+ */
71
+ this._pendingSwapStates = [
64
72
  SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED,
65
- SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED,
66
73
  SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED,
67
74
  SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED,
68
- SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED
75
+ SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED,
76
+ SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED,
77
+ SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED,
78
+ SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED
69
79
  ];
70
- this.spvWithdrawalDataDeserializer = spvWithdrawalDataDeserializer;
71
- this.contract = contract;
80
+ this._spvWithdrawalDataDeserializer = spvWithdrawalDataDeserializer;
81
+ this._contract = contract;
72
82
  this.btcRelay = btcRelay;
73
- this.synchronizer = synchronizer;
74
- this.btcRpc = btcRpc;
83
+ this._synchronizer = synchronizer;
84
+ this._btcRpc = btcRpc;
75
85
  }
76
86
  async processEventFront(event, swap) {
77
- if (swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
78
- swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
79
- swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
87
+ if (swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
88
+ swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
89
+ swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
80
90
  await swap._setBitcoinTxId(event.btcTxId).catch(e => {
81
91
  this.logger.warn("processEventFront(): Failed to set bitcoin txId: ", e);
82
92
  });
83
- swap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
93
+ swap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
84
94
  return true;
85
95
  }
86
96
  return false;
87
97
  }
88
98
  async processEventClaim(event, swap) {
89
- if (swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
90
- swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
91
- swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
99
+ if (swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
100
+ swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
101
+ swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
92
102
  await swap._setBitcoinTxId(event.btcTxId).catch(e => {
93
103
  this.logger.warn("processEventClaim(): Failed to set bitcoin txId: ", e);
94
104
  });
95
- swap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
105
+ swap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
96
106
  return true;
97
107
  }
98
108
  return false;
99
109
  }
100
110
  processEventClose(event, swap) {
101
- if (swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
102
- swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
103
- swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
104
- swap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLOSED;
111
+ if (swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
112
+ swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
113
+ swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED || swap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
114
+ swap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLOSED;
105
115
  return Promise.resolve(true);
106
116
  }
107
117
  return Promise.resolve(false);
108
118
  }
119
+ /**
120
+ * @inheritDoc
121
+ * @internal
122
+ */
109
123
  async processEvent(event, swap) {
110
124
  if (swap == null)
111
125
  return;
112
126
  let swapChanged = false;
113
127
  if (event instanceof base_1.SpvVaultFrontEvent) {
114
128
  swapChanged = await this.processEventFront(event, swap);
115
- if (event.meta?.txId != null && swap.frontTxId !== event.meta.txId) {
116
- swap.frontTxId = event.meta.txId;
129
+ if (event.meta?.txId != null && swap._frontTxId !== event.meta.txId) {
130
+ swap._frontTxId = event.meta.txId;
117
131
  swapChanged ||= true;
118
132
  }
119
133
  }
120
134
  if (event instanceof base_1.SpvVaultClaimEvent) {
121
135
  swapChanged = await this.processEventClaim(event, swap);
122
- if (event.meta?.txId != null && swap.claimTxId !== event.meta.txId) {
123
- swap.claimTxId = event.meta.txId;
136
+ if (event.meta?.txId != null && swap._claimTxId !== event.meta.txId) {
137
+ swap._claimTxId = event.meta.txId;
124
138
  swapChanged ||= true;
125
139
  }
126
140
  }
@@ -140,7 +154,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
140
154
  */
141
155
  async preFetchFinalizedBlockHeight(abortController) {
142
156
  try {
143
- const block = await this.chain.getFinalizedBlock();
157
+ const block = await this._chain.getFinalizedBlock();
144
158
  return block.height;
145
159
  }
146
160
  catch (e) {
@@ -167,33 +181,33 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
167
181
  const [feePerBlock, btcRelayData, currentBtcBlock, claimFeeRate, nativeTokenPrice] = await Promise.all([
168
182
  this.btcRelay.getFeePerBlock(),
169
183
  this.btcRelay.getTipData(),
170
- this.btcRpc.getTipHeight(),
171
- this.contract.getClaimFee(this.chain.randomAddress()),
172
- nativeTokenPricePrefetch ?? (amountData.token === this.chain.getNativeCurrencyAddress() ?
184
+ this._btcRpc.getTipHeight(),
185
+ this._contract.getClaimFee(this._chain.randomAddress()),
186
+ nativeTokenPricePrefetch ?? (amountData.token === this._chain.getNativeCurrencyAddress() ?
173
187
  pricePrefetch :
174
- this.prices.preFetchPrice(this.chainIdentifier, this.chain.getNativeCurrencyAddress(), abortController.signal))
188
+ this._prices.preFetchPrice(this.chainIdentifier, this._chain.getNativeCurrencyAddress(), abortController.signal))
175
189
  ]);
176
190
  if (btcRelayData == null)
177
191
  throw new Error("Btc relay doesn't seem to be initialized!");
178
192
  const currentBtcRelayBlock = btcRelayData.blockheight;
179
- const blockDelta = Math.max(currentBtcBlock - currentBtcRelayBlock + this.options.maxConfirmations, 0);
193
+ const blockDelta = Math.max(currentBtcBlock - currentBtcRelayBlock + this._options.maxConfirmations, 0);
180
194
  const totalFeeInNativeToken = ((BigInt(blockDelta) * feePerBlock) +
181
- (claimFeeRate * BigInt(this.options.maxTransactionsDelta))) * BigInt(Math.floor(options.feeSafetyFactor * 1000000)) / 1000000n;
195
+ (claimFeeRate * BigInt(this._options.maxTransactionsDelta))) * BigInt(Math.floor(options.feeSafetyFactor * 1000000)) / 1000000n;
182
196
  let payoutAmount;
183
197
  if (amountData.exactIn) {
184
198
  //Convert input amount in BTC to
185
- const amountInNativeToken = await this.prices.getFromBtcSwapAmount(this.chainIdentifier, amountData.amount, this.chain.getNativeCurrencyAddress(), abortController.signal, nativeTokenPrice);
199
+ const amountInNativeToken = await this._prices.getFromBtcSwapAmount(this.chainIdentifier, amountData.amount, this._chain.getNativeCurrencyAddress(), abortController.signal, nativeTokenPrice);
186
200
  payoutAmount = amountInNativeToken - totalFeeInNativeToken;
187
201
  }
188
202
  else {
189
- if (amountData.token === this.chain.getNativeCurrencyAddress()) {
203
+ if (amountData.token === this._chain.getNativeCurrencyAddress()) {
190
204
  //Both amounts in same currency
191
205
  payoutAmount = amountData.amount;
192
206
  }
193
207
  else {
194
208
  //Need to convert both to native currency
195
- const btcAmount = await this.prices.getToBtcSwapAmount(this.chainIdentifier, amountData.amount, amountData.token, abortController.signal, await pricePrefetch);
196
- payoutAmount = await this.prices.getFromBtcSwapAmount(this.chainIdentifier, btcAmount, this.chain.getNativeCurrencyAddress(), abortController.signal, nativeTokenPrice);
209
+ const btcAmount = await this._prices.getToBtcSwapAmount(this.chainIdentifier, amountData.amount, amountData.token, abortController.signal, await pricePrefetch);
210
+ payoutAmount = await this._prices.getFromBtcSwapAmount(this.chainIdentifier, btcAmount, this._chain.getNativeCurrencyAddress(), abortController.signal, nativeTokenPrice);
197
211
  }
198
212
  }
199
213
  this.logger.debug("preFetchCallerFeeShare(): Caller fee in native token: " + totalFeeInNativeToken.toString(10) + " total payout in native token: " + payoutAmount.toString(10));
@@ -225,16 +239,16 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
225
239
  const btcFeeRate = await (0, Utils_1.throwIfUndefined)(bitcoinFeeRatePromise, "Bitcoin fee rate promise failed!");
226
240
  abortSignal.throwIfAborted();
227
241
  if (btcFeeRate != null && resp.btcFeeRate > btcFeeRate)
228
- throw new IntermediaryError_1.IntermediaryError("Bitcoin fee rate returned too high!");
242
+ throw new IntermediaryError_1.IntermediaryError(`Required bitcoin fee rate returned from the LP is too high! Maximum accepted: ${btcFeeRate} sats/vB, required by LP: ${resp.btcFeeRate} sats/vB`);
229
243
  //Vault related
230
244
  let vaultScript;
231
245
  let vaultAddressType;
232
246
  let btcAddressScript;
233
247
  //Ensure valid btc addresses returned
234
248
  try {
235
- vaultScript = (0, BitcoinUtils_1.toOutputScript)(this.options.bitcoinNetwork, resp.vaultBtcAddress);
249
+ vaultScript = (0, BitcoinUtils_1.toOutputScript)(this._options.bitcoinNetwork, resp.vaultBtcAddress);
236
250
  vaultAddressType = (0, BitcoinUtils_1.toCoinselectAddressType)(vaultScript);
237
- btcAddressScript = (0, BitcoinUtils_1.toOutputScript)(this.options.bitcoinNetwork, resp.btcAddress);
251
+ btcAddressScript = (0, BitcoinUtils_1.toOutputScript)(this._options.bitcoinNetwork, resp.btcAddress);
238
252
  }
239
253
  catch (e) {
240
254
  throw new IntermediaryError_1.IntermediaryError("Invalid btc address data returned", e);
@@ -271,7 +285,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
271
285
  //Fetch vault data
272
286
  let vault;
273
287
  try {
274
- vault = await this.contract.getVaultData(resp.address, resp.vaultId);
288
+ vault = await this._contract.getVaultData(resp.address, resp.vaultId);
275
289
  }
276
290
  catch (e) {
277
291
  this.logger.error("Error getting spv vault (owner: " + resp.address + " vaultId: " + resp.vaultId.toString(10) + "): ", e);
@@ -282,7 +296,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
282
296
  if (vault == null || !vault.isOpened())
283
297
  throw new IntermediaryError_1.IntermediaryError("Returned spv swap vault is not opened!");
284
298
  //Make sure the vault doesn't require insane amount of confirmations
285
- if (vault.getConfirmations() > this.options.maxConfirmations)
299
+ if (vault.getConfirmations() > this._options.maxConfirmations)
286
300
  throw new IntermediaryError_1.IntermediaryError("SPV swap vault needs too many confirmations: " + vault.getConfirmations());
287
301
  const tokenData = vault.getTokenData();
288
302
  //Amounts - make sure the amounts match
@@ -294,7 +308,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
294
308
  //Check the difference between amount adjusted due to scaling to raw amount
295
309
  const adjustedAmount = amountData.amount / tokenData[0].multiplier * tokenData[0].multiplier;
296
310
  const adjustmentPPM = (amountData.amount - adjustedAmount) * 1000000n / amountData.amount;
297
- if (adjustmentPPM > this.options.maxRawAmountAdjustmentDifferencePPM)
311
+ if (adjustmentPPM > this._options.maxRawAmountAdjustmentDifferencePPM)
298
312
  throw new IntermediaryError_1.IntermediaryError("Invalid amount0 multiplier used, rawAmount diff too high");
299
313
  if (resp.total !== adjustedAmount)
300
314
  throw new IntermediaryError_1.IntermediaryError("Invalid total returned");
@@ -307,7 +321,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
307
321
  //Check the difference between amount adjusted due to scaling to raw amount
308
322
  const adjustedGasAmount = options.gasAmount / tokenData[0].multiplier * tokenData[0].multiplier;
309
323
  const adjustmentPPM = (options.gasAmount - adjustedGasAmount) * 1000000n / options.gasAmount;
310
- if (adjustmentPPM > this.options.maxRawAmountAdjustmentDifferencePPM)
324
+ if (adjustmentPPM > this._options.maxRawAmountAdjustmentDifferencePPM)
311
325
  throw new IntermediaryError_1.IntermediaryError("Invalid amount1 multiplier used, rawAmount diff too high");
312
326
  if (resp.totalGas !== adjustedGasAmount)
313
327
  throw new IntermediaryError_1.IntermediaryError("Invalid gas total returned");
@@ -316,7 +330,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
316
330
  })(),
317
331
  (async () => {
318
332
  //Require the vault UTXO to have at least 1 confirmation
319
- let btcTx = await this.btcRpc.getTransaction(txId);
333
+ let btcTx = await this._btcRpc.getTransaction(txId);
320
334
  if (btcTx == null)
321
335
  throw new IntermediaryError_1.IntermediaryError("Invalid UTXO, doesn't exist (txId)");
322
336
  abortController.signal.throwIfAborted();
@@ -330,7 +344,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
330
344
  })(),
331
345
  (async () => {
332
346
  //Require vault UTXO is unspent
333
- if (await this.btcRpc.isSpent(utxo))
347
+ if (await this._btcRpc.isSpent(utxo))
334
348
  throw new IntermediaryError_1.IntermediaryError("Returned spv vault UTXO is already spent", null, true);
335
349
  abortController.signal.throwIfAborted();
336
350
  })()
@@ -345,18 +359,18 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
345
359
  const [txId, voutStr] = utxo.split(":");
346
360
  //Such that 1st tx isn't fetched twice
347
361
  if (btcTx.txid !== txId) {
348
- const _btcTx = await this.btcRpc.getTransaction(txId);
362
+ const _btcTx = await this._btcRpc.getTransaction(txId);
349
363
  if (_btcTx == null)
350
364
  throw new IntermediaryError_1.IntermediaryError("Invalid ancestor transaction (not found)");
351
365
  btcTx = _btcTx;
352
366
  }
353
- const withdrawalData = await this.contract.getWithdrawalData(btcTx);
367
+ const withdrawalData = await this._contract.getWithdrawalData(btcTx);
354
368
  abortSignal.throwIfAborted();
355
369
  pendingWithdrawals.unshift(withdrawalData);
356
370
  utxo = pendingWithdrawals[0].getSpentVaultUtxo();
357
371
  this.logger.debug("verifyReturnedData(): Vault UTXO: " + vault.getUtxo() + " current utxo: " + utxo);
358
- if (pendingWithdrawals.length >= this.options.maxTransactionsDelta)
359
- throw new IntermediaryError_1.IntermediaryError("BTC <> SC state difference too deep, maximum: " + this.options.maxTransactionsDelta);
372
+ if (pendingWithdrawals.length >= this._options.maxTransactionsDelta)
373
+ throw new IntermediaryError_1.IntermediaryError("BTC <> SC state difference too deep, maximum: " + this._options.maxTransactionsDelta);
360
374
  }
361
375
  //Verify that the vault has enough balance after processing all pending withdrawals
362
376
  let vaultBalances;
@@ -376,7 +390,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
376
390
  //Also verify that all the withdrawal txns are valid, this is an extra sanity check
377
391
  try {
378
392
  for (let withdrawal of pendingWithdrawals) {
379
- await this.contract.checkWithdrawalTx(withdrawal);
393
+ await this._contract.checkWithdrawalTx(withdrawal);
380
394
  }
381
395
  }
382
396
  catch (e) {
@@ -390,16 +404,18 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
390
404
  };
391
405
  }
392
406
  /**
393
- * Returns a newly created swap, receiving 'amount' on chain
407
+ * Returns a newly created Bitcoin -> Smart chain swap using the SPV vault (UTXO-controlled vault) swap protocol,
408
+ * with the passed amount. Also allows specifying additional "gas drop" native token that the receipient receives
409
+ * on the destination chain in the `options` argument.
394
410
  *
395
- * @param signer Smartchain signer's address intiating the swap
396
- * @param amountData Amount of token & amount to swap
397
- * @param lps LPs (liquidity providers) to get the quotes from
398
- * @param options Quote options
399
- * @param additionalParams Additional parameters sent to the LP when creating the swap
400
- * @param abortSignal Abort signal for aborting the process
411
+ * @param recipient Recipient address on the destination smart chain
412
+ * @param amountData Amount, token and exact input/output data for to swap
413
+ * @param lps An array of intermediaries (LPs) to get the quotes from
414
+ * @param options Optional additional quote options
415
+ * @param additionalParams Optional additional parameters sent to the LP when creating the swap
416
+ * @param abortSignal Abort signal
401
417
  */
402
- create(signer, amountData, lps, options, additionalParams, abortSignal) {
418
+ create(recipient, amountData, lps, options, additionalParams, abortSignal) {
403
419
  const _options = {
404
420
  gasAmount: options?.gasAmount ?? 0n,
405
421
  unsafeZeroWatchtowerFee: options?.unsafeZeroWatchtowerFee ?? false,
@@ -410,14 +426,14 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
410
426
  const pricePrefetchPromise = this.preFetchPrice(amountData, _abortController.signal);
411
427
  const usdPricePrefetchPromise = this.preFetchUsdPrice(_abortController.signal);
412
428
  const finalizedBlockHeightPrefetchPromise = this.preFetchFinalizedBlockHeight(_abortController);
413
- const nativeTokenAddress = this.chain.getNativeCurrencyAddress();
429
+ const nativeTokenAddress = this._chain.getNativeCurrencyAddress();
414
430
  const gasTokenPricePrefetchPromise = _options.gasAmount === 0n ?
415
431
  undefined :
416
432
  this.preFetchPrice({ token: nativeTokenAddress }, _abortController.signal);
417
433
  const callerFeePrefetchPromise = this.preFetchCallerFeeShare(amountData, _options, pricePrefetchPromise, gasTokenPricePrefetchPromise, _abortController);
418
434
  const bitcoinFeeRatePromise = _options.maxAllowedNetworkFeeRate != Infinity ?
419
435
  Promise.resolve(_options.maxAllowedNetworkFeeRate) :
420
- this.btcRpc.getFeeRate().then(x => this.options.maxBtcFeeOffset + (x * this.options.maxBtcFeeMultiplier)).catch(e => {
436
+ this._btcRpc.getFeeRate().then(x => this._options.maxBtcFeeOffset + (x * this._options.maxBtcFeeMultiplier)).catch(e => {
421
437
  _abortController.abort(e);
422
438
  return undefined;
423
439
  });
@@ -431,7 +447,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
431
447
  try {
432
448
  const resp = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
433
449
  return await IntermediaryAPI_1.IntermediaryAPI.prepareSpvFromBTC(this.chainIdentifier, lp.url, {
434
- address: signer,
450
+ address: recipient,
435
451
  amount: amountData.amount,
436
452
  token: amountData.token.toString(),
437
453
  exactOut: !amountData.exactIn,
@@ -440,7 +456,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
440
456
  callerFeeRate: (0, Utils_1.throwIfUndefined)(callerFeePrefetchPromise, "Caller fee prefetch failed!"),
441
457
  frontingFeeRate: 0n,
442
458
  additionalParams
443
- }, this.options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
459
+ }, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
444
460
  }, undefined, e => e instanceof RequestError_1.RequestError, abortController.signal);
445
461
  this.logger.debug("create(" + lp.url + "): LP response: ", resp);
446
462
  const callerFeeShare = (await callerFeePrefetchPromise);
@@ -458,7 +474,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
458
474
  swapFeeBtc: resp.swapFeeBtc,
459
475
  exactIn: amountData.exactIn ?? true,
460
476
  quoteId: resp.quoteId,
461
- recipient: signer,
477
+ recipient,
462
478
  vaultOwner: resp.address,
463
479
  vaultId: resp.vaultId,
464
480
  vaultRequiredConfirmations: vault.getConfirmations(),
@@ -495,11 +511,114 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
495
511
  };
496
512
  });
497
513
  }
514
+ /**
515
+ * Recovers an SPV vault (UTXO-controlled vault) based swap from smart chain on-chain data
516
+ *
517
+ * @param state State of the spv vault withdrawal recovered from on-chain data
518
+ * @param vault SPV vault processing the swap
519
+ * @param lp Intermediary (LP) used as a counterparty for the swap
520
+ */
521
+ async recoverFromState(state, vault, lp) {
522
+ //Get the vault
523
+ vault ??= await this._contract.getVaultData(state.owner, state.vaultId);
524
+ if (vault == null)
525
+ return null;
526
+ if (state.btcTxId == null)
527
+ return null;
528
+ const btcTx = await this._btcRpc.getTransaction(state.btcTxId);
529
+ if (btcTx == null)
530
+ return null;
531
+ const withdrawalData = await this._contract.getWithdrawalData(btcTx)
532
+ .catch(e => {
533
+ this.logger.warn(`Error parsing withdrawal data for tx ${btcTx.txid}: `, e);
534
+ return null;
535
+ });
536
+ if (withdrawalData == null)
537
+ return null;
538
+ const vaultTokens = vault.getTokenData();
539
+ const withdrawalDataOutputs = withdrawalData.getTotalOutput();
540
+ const txBlock = await state.getTxBlock?.();
541
+ const swapInit = {
542
+ pricingInfo: {
543
+ isValid: true,
544
+ satsBaseFee: 0n,
545
+ swapPriceUSatPerToken: 100000000000000n,
546
+ realPriceUSatPerToken: 100000000000000n,
547
+ differencePPM: 0n,
548
+ feePPM: 0n,
549
+ },
550
+ url: lp?.url,
551
+ expiry: 0,
552
+ swapFee: 0n,
553
+ swapFeeBtc: 0n,
554
+ exactIn: true,
555
+ //Use bitcoin tx id as quote id, even though this is not strictly correct as this
556
+ // is an off-chain identifier presented by the LP that cannot be recovered from on-chain
557
+ // data
558
+ quoteId: btcTx.txid,
559
+ recipient: state.recipient,
560
+ vaultOwner: state.owner,
561
+ vaultId: state.vaultId,
562
+ vaultRequiredConfirmations: vault.getConfirmations(),
563
+ vaultTokenMultipliers: vault.getTokenData().map(val => val.multiplier),
564
+ vaultBtcAddress: (0, BitcoinUtils_1.fromOutputScript)(this._options.bitcoinNetwork, withdrawalData.getNewVaultScript().toString("hex")),
565
+ vaultUtxo: withdrawalData.getSpentVaultUtxo(),
566
+ vaultUtxoValue: BigInt(withdrawalData.getNewVaultBtcAmount()),
567
+ btcDestinationAddress: (0, BitcoinUtils_1.fromOutputScript)(this._options.bitcoinNetwork, btcTx.outs[2].scriptPubKey.hex),
568
+ btcAmount: BigInt(btcTx.outs[2].value),
569
+ btcAmountSwap: BigInt(btcTx.outs[2].value),
570
+ btcAmountGas: 0n,
571
+ minimumBtcFeeRate: 0,
572
+ outputTotalSwap: withdrawalDataOutputs[0] * vaultTokens[0].multiplier,
573
+ outputSwapToken: vaultTokens[0].token,
574
+ outputTotalGas: withdrawalDataOutputs[1] * vaultTokens[1].multiplier,
575
+ outputGasToken: vaultTokens[1].token,
576
+ gasSwapFeeBtc: 0n,
577
+ gasSwapFee: 0n,
578
+ gasPricingInfo: {
579
+ isValid: true,
580
+ satsBaseFee: 0n,
581
+ swapPriceUSatPerToken: 100000000000000n,
582
+ realPriceUSatPerToken: 100000000000000n,
583
+ differencePPM: 0n,
584
+ feePPM: 0n,
585
+ },
586
+ callerFeeShare: withdrawalData.callerFeeRate,
587
+ frontingFeeShare: withdrawalData.frontingFeeRate,
588
+ executionFeeShare: withdrawalData.executionFeeRate,
589
+ genesisSmartChainBlockHeight: txBlock?.blockHeight ?? 0
590
+ };
591
+ const quote = new SpvFromBTCSwap_1.SpvFromBTCSwap(this, swapInit);
592
+ quote._data = withdrawalData;
593
+ if (txBlock != null) {
594
+ quote.createdAt = txBlock.blockTime * 1000;
595
+ }
596
+ else if (btcTx.blockhash == null) {
597
+ quote.createdAt = Date.now();
598
+ }
599
+ else {
600
+ const blockHeader = await this._btcRpc.getBlockHeader(btcTx.blockhash);
601
+ quote.createdAt = blockHeader == null ? Date.now() : blockHeader.getTimestamp() * 1000;
602
+ }
603
+ quote._setInitiated();
604
+ if (btcTx.inputAddresses != null)
605
+ quote._senderAddress = btcTx.inputAddresses[1];
606
+ if (state.type === base_1.SpvWithdrawalStateType.FRONTED) {
607
+ quote._frontTxId = state.txId;
608
+ quote._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
609
+ }
610
+ else {
611
+ quote._claimTxId = state.txId;
612
+ quote._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
613
+ }
614
+ await quote._save();
615
+ return quote;
616
+ }
498
617
  /**
499
618
  * Returns a random dummy PSBT that can be used for fee estimation, the last output (the LP output) is omitted
500
619
  * to allow for coinselection algorithm to determine maximum sendable amount there
501
620
  *
502
- * @param includeGasToken Whether to return the PSBT also with the gas token amount (increases the vSize by 8)
621
+ * @param includeGasToken Whether to return the PSBT also with the gas token amount (increases the vSize by 8)
503
622
  */
504
623
  getDummySwapPsbt(includeGasToken = false) {
505
624
  //Construct dummy swap psbt
@@ -521,7 +640,7 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
521
640
  script: randomVaultOutScript,
522
641
  amount: 600n
523
642
  });
524
- const opReturnData = this.contract.toOpReturnData(this.chain.randomAddress(), includeGasToken ? [0xffffffffffffffffn, 0xffffffffffffffffn] : [0xffffffffffffffffn]);
643
+ const opReturnData = this._contract.toOpReturnData(this._chain.randomAddress(), includeGasToken ? [0xffffffffffffffffn, 0xffffffffffffffffn] : [0xffffffffffffffffn]);
525
644
  psbt.addOutput({
526
645
  script: Buffer.concat([
527
646
  opReturnData.length <= 75 ? Buffer.from([0x6a, opReturnData.length]) : Buffer.from([0x6a, 0x4c, opReturnData.length]),
@@ -531,31 +650,35 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
531
650
  });
532
651
  return psbt;
533
652
  }
653
+ /**
654
+ * @inheritDoc
655
+ * @internal
656
+ */
534
657
  async _checkPastSwaps(pastSwaps) {
535
658
  const changedSwaps = new Set();
536
659
  const removeSwaps = [];
537
660
  const broadcastedOrConfirmedSwaps = [];
538
661
  for (let pastSwap of pastSwaps) {
539
662
  let changed = false;
540
- if (pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED ||
541
- pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
542
- pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED ||
543
- pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED ||
544
- pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
545
- pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
663
+ if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED ||
664
+ pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED ||
665
+ pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED ||
666
+ pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED ||
667
+ pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.DECLINED ||
668
+ pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
546
669
  //Check BTC transaction
547
670
  if (await pastSwap._syncStateFromBitcoin(false))
548
671
  changed ||= true;
549
672
  }
550
- if (pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED ||
551
- pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED ||
552
- pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED) {
553
- if (pastSwap.expiry < Date.now()) {
554
- if (pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED) {
555
- pastSwap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_EXPIRED;
673
+ if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED ||
674
+ pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.SIGNED ||
675
+ pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.POSTED) {
676
+ if (await pastSwap._verifyQuoteDefinitelyExpired()) {
677
+ if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.CREATED) {
678
+ pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_EXPIRED;
556
679
  }
557
680
  else {
558
- pastSwap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED;
681
+ pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.QUOTE_SOFT_EXPIRED;
559
682
  }
560
683
  changed ||= true;
561
684
  }
@@ -566,56 +689,53 @@ class SpvFromBTCWrapper extends ISwapWrapper_1.ISwapWrapper {
566
689
  }
567
690
  if (changed)
568
691
  changedSwaps.add(pastSwap);
569
- if (pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || pastSwap.state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
570
- if (pastSwap.data != null)
692
+ if (pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BROADCASTED || pastSwap._state === SpvFromBTCSwap_1.SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
693
+ if (pastSwap._data != null)
571
694
  broadcastedOrConfirmedSwaps.push(pastSwap);
572
695
  }
573
696
  }
574
697
  const checkWithdrawalStateSwaps = [];
575
- const _fronts = await this.contract.getFronterAddresses(broadcastedOrConfirmedSwaps.map(val => ({
576
- owner: val.vaultOwner,
577
- vaultId: val.vaultId,
578
- withdrawal: val.data
579
- })));
580
- const _vaultUtxos = await this.contract.getVaultLatestUtxos(broadcastedOrConfirmedSwaps.map(val => ({
581
- owner: val.vaultOwner,
582
- vaultId: val.vaultId
698
+ const _fronts = await this._contract.getFronterAddresses(broadcastedOrConfirmedSwaps.map(val => ({
699
+ ...val.getSpvVaultData(),
700
+ withdrawal: val._data
583
701
  })));
702
+ const _vaultUtxos = await this._contract.getVaultLatestUtxos(broadcastedOrConfirmedSwaps.map(val => val.getSpvVaultData()));
584
703
  for (const pastSwap of broadcastedOrConfirmedSwaps) {
585
- const fronterAddress = _fronts[pastSwap.data.getTxId()];
586
- const latestVaultUtxo = _vaultUtxos[pastSwap.vaultOwner]?.[pastSwap.vaultId.toString(10)];
704
+ const fronterAddress = _fronts[pastSwap._data.getTxId()];
705
+ const vault = pastSwap.getSpvVaultData();
706
+ const latestVaultUtxo = _vaultUtxos[vault.owner]?.[vault.vaultId.toString(10)];
587
707
  if (fronterAddress === undefined)
588
- this.logger.warn(`_checkPastSwaps(): No fronter address returned for ${pastSwap.data.getTxId()}`);
708
+ this.logger.warn(`_checkPastSwaps(): No fronter address returned for ${pastSwap._data.getTxId()}`);
589
709
  if (latestVaultUtxo === undefined)
590
- this.logger.warn(`_checkPastSwaps(): No last vault utxo returned for ${pastSwap.data.getTxId()}`);
710
+ this.logger.warn(`_checkPastSwaps(): No last vault utxo returned for ${pastSwap._data.getTxId()}`);
591
711
  if (await pastSwap._shouldCheckWithdrawalState(fronterAddress, latestVaultUtxo))
592
712
  checkWithdrawalStateSwaps.push(pastSwap);
593
713
  }
594
- const withdrawalStates = await this.contract.getWithdrawalStates(checkWithdrawalStateSwaps.map(val => ({
595
- withdrawal: val.data,
596
- scStartBlockheight: val.genesisSmartChainBlockHeight
714
+ const withdrawalStates = await this._contract.getWithdrawalStates(checkWithdrawalStateSwaps.map(val => ({
715
+ withdrawal: val._data,
716
+ scStartBlockheight: val._genesisSmartChainBlockHeight
597
717
  })));
598
718
  for (const pastSwap of checkWithdrawalStateSwaps) {
599
- const status = withdrawalStates[pastSwap.data.getTxId()];
719
+ const status = withdrawalStates[pastSwap._data.getTxId()];
600
720
  if (status == null) {
601
- this.logger.warn(`_checkPastSwaps(): No withdrawal state returned for ${pastSwap.data.getTxId()}`);
721
+ this.logger.warn(`_checkPastSwaps(): No withdrawal state returned for ${pastSwap._data.getTxId()}`);
602
722
  continue;
603
723
  }
604
- this.logger.debug("syncStateFromChain(): status of " + pastSwap.data.btcTx.txid, status?.type);
724
+ this.logger.debug("syncStateFromChain(): status of " + pastSwap._data.btcTx.txid, status?.type);
605
725
  let changed = false;
606
726
  switch (status.type) {
607
727
  case base_1.SpvWithdrawalStateType.FRONTED:
608
- pastSwap.frontTxId = status.txId;
609
- pastSwap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
728
+ pastSwap._frontTxId = status.txId;
729
+ pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.FRONTED;
610
730
  changed ||= true;
611
731
  break;
612
732
  case base_1.SpvWithdrawalStateType.CLAIMED:
613
- pastSwap.claimTxId = status.txId;
614
- pastSwap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
733
+ pastSwap._claimTxId = status.txId;
734
+ pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLAIMED;
615
735
  changed ||= true;
616
736
  break;
617
737
  case base_1.SpvWithdrawalStateType.CLOSED:
618
- pastSwap.state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLOSED;
738
+ pastSwap._state = SpvFromBTCSwap_1.SpvFromBTCSwapState.CLOSED;
619
739
  changed ||= true;
620
740
  break;
621
741
  }