@atomiqlabs/sdk 8.6.2 → 8.7.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 (85) hide show
  1. package/dist/events/UnifiedSwapEventListener.js +4 -2
  2. package/dist/http/paramcoders/ParamDecoder.js +9 -4
  3. package/dist/http/paramcoders/ParamEncoder.js +6 -1
  4. package/dist/intermediaries/Intermediary.d.ts +21 -0
  5. package/dist/intermediaries/Intermediary.js +25 -1
  6. package/dist/intermediaries/IntermediaryDiscovery.d.ts +15 -3
  7. package/dist/intermediaries/IntermediaryDiscovery.js +25 -6
  8. package/dist/intermediaries/apis/IntermediaryAPI.d.ts +1 -0
  9. package/dist/swapper/Swapper.d.ts +9 -4
  10. package/dist/swapper/Swapper.js +94 -42
  11. package/dist/swapper/SwapperUtils.js +2 -1
  12. package/dist/swaps/ISwap.d.ts +5 -0
  13. package/dist/swaps/ISwap.js +4 -1
  14. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +5 -5
  15. package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +4 -0
  16. package/dist/swaps/escrow_swaps/IEscrowSwap.js +4 -3
  17. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +19 -6
  18. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +54 -21
  19. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +7 -3
  20. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +3 -4
  21. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +3 -3
  22. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +8 -2
  23. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +12 -8
  24. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +18 -18
  25. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +12 -6
  26. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +38 -24
  27. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +9 -9
  28. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +14 -7
  29. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +54 -38
  30. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +5 -5
  31. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +18 -7
  32. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +61 -33
  33. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +12 -12
  34. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +8 -2
  35. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +13 -8
  36. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +1 -1
  37. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +13 -4
  38. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +44 -28
  39. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +2 -2
  40. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +8 -4
  41. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +29 -21
  42. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +1 -0
  43. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +13 -12
  44. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +21 -10
  45. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +136 -73
  46. package/dist/swaps/trusted/ln/LnForGasWrapper.js +2 -1
  47. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +2 -1
  48. package/dist/utils/RetryUtils.d.ts +2 -1
  49. package/dist/utils/RetryUtils.js +3 -2
  50. package/dist/utils/Utils.d.ts +9 -0
  51. package/dist/utils/Utils.js +15 -1
  52. package/package.json +2 -2
  53. package/src/events/UnifiedSwapEventListener.ts +4 -2
  54. package/src/http/paramcoders/ParamDecoder.ts +8 -4
  55. package/src/http/paramcoders/ParamEncoder.ts +5 -1
  56. package/src/intermediaries/Intermediary.ts +31 -1
  57. package/src/intermediaries/IntermediaryDiscovery.ts +33 -12
  58. package/src/intermediaries/apis/IntermediaryAPI.ts +2 -1
  59. package/src/swapper/Swapper.ts +141 -62
  60. package/src/swapper/SwapperUtils.ts +3 -1
  61. package/src/swaps/ISwap.ts +10 -2
  62. package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +5 -5
  63. package/src/swaps/escrow_swaps/IEscrowSwap.ts +10 -3
  64. package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +64 -26
  65. package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +8 -5
  66. package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +3 -3
  67. package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +22 -12
  68. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +18 -18
  69. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +52 -31
  70. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +9 -9
  71. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +76 -52
  72. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +5 -5
  73. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +82 -38
  74. package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +12 -12
  75. package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +21 -9
  76. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +1 -1
  77. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +56 -33
  78. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +2 -2
  79. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +40 -22
  80. package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +17 -13
  81. package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +149 -83
  82. package/src/swaps/trusted/ln/LnForGasWrapper.ts +2 -1
  83. package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +2 -1
  84. package/src/utils/RetryUtils.ts +11 -4
  85. package/src/utils/Utils.ts +14 -0
@@ -6,6 +6,7 @@ const ToBTCLNSwap_1 = require("./ToBTCLNSwap");
6
6
  const IToBTCWrapper_1 = require("../IToBTCWrapper");
7
7
  const UserError_1 = require("../../../../errors/UserError");
8
8
  const base_1 = require("@atomiqlabs/base");
9
+ const Intermediary_1 = require("../../../../intermediaries/Intermediary");
9
10
  const IntermediaryError_1 = require("../../../../errors/IntermediaryError");
10
11
  const SwapType_1 = require("../../../../enums/SwapType");
11
12
  const Utils_1 = require("../../../../utils/Utils");
@@ -21,13 +22,13 @@ const RetryUtils_1 = require("../../../../utils/RetryUtils");
21
22
  * @category Swaps/Smart chain → Lightning
22
23
  */
23
24
  class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
24
- constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, options, events) {
25
- super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, {
25
+ constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, versionedContracts, options, events) {
26
+ super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, {
26
27
  ...options,
27
28
  paymentTimeoutSeconds: options?.paymentTimeoutSeconds ?? 5 * 24 * 60 * 60,
28
29
  lightningBaseFee: options?.lightningBaseFee ?? 10,
29
30
  lightningFeePPM: options?.lightningFeePPM ?? 2000
30
- }, events);
31
+ }, versionedContracts, events);
31
32
  this.TYPE = SwapType_1.SwapType.TO_BTCLN;
32
33
  /**
33
34
  * @internal
@@ -116,7 +117,7 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
116
117
  throw new IntermediaryError_1.IntermediaryError("Invalid data returned - total amount");
117
118
  if (parsedPr.tagsObject.payment_hash == null)
118
119
  throw new Error("Swap invoice doesn't contain payment hash field!");
119
- const claimHash = this._contract.getHashForHtlc(Buffer.from(parsedPr.tagsObject.payment_hash, "hex"));
120
+ const claimHash = this._contract(lp.getContractVersion(this.chainIdentifier)).getHashForHtlc(Buffer.from(parsedPr.tagsObject.payment_hash, "hex"));
120
121
  if (data.getAmount() !== resp.total ||
121
122
  !Buffer.from(data.getClaimHash(), "hex").equals(claimHash) ||
122
123
  data.getExpiry() !== calculatedOptions.expiryTimestamp ||
@@ -148,8 +149,9 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
148
149
  async getIntermediaryQuote(signer, amountData, lp, pr, parsedPr, calculatedOptions, preFetches, abort, additionalParams) {
149
150
  if (lp.services[SwapType_1.SwapType.TO_BTCLN] == null)
150
151
  throw new Error("LP service for processing to btcln swaps not found!");
152
+ const version = lp.getContractVersion(this.chainIdentifier);
151
153
  const abortController = abort instanceof AbortController ? abort : (0, Utils_1.extendAbortController)(abort);
152
- const reputationPromise = this.preFetchIntermediaryReputation(amountData, lp, abortController);
154
+ const reputationPromise = this.preFetchIntermediaryReputation(amountData, lp, abortController, version);
153
155
  try {
154
156
  const { signDataPromise, resp } = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
155
157
  const { signDataPrefetch, response } = IntermediaryAPI_1.IntermediaryAPI.initToBTCLN(this.chainIdentifier, lp.url, {
@@ -158,12 +160,12 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
158
160
  maxFee: await calculatedOptions.maxFee,
159
161
  expiryTimestamp: calculatedOptions.expiryTimestamp,
160
162
  token: amountData.token,
161
- feeRate: (0, Utils_1.throwIfUndefined)(preFetches.feeRatePromise),
163
+ feeRate: (0, Utils_1.throwIfUndefined)(preFetches.feeRatePromise[version]),
162
164
  additionalParams
163
165
  }, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
164
- let signDataPromise = preFetches.signDataPrefetchPromise;
166
+ let signDataPromise = preFetches.signDataPrefetchPromise?.[version];
165
167
  if (signDataPromise == null) {
166
- signDataPromise = this.preFetchSignData(signDataPrefetch);
168
+ signDataPromise = this.preFetchSignData(signDataPrefetch, version);
167
169
  }
168
170
  else
169
171
  signDataPrefetch.catch(() => { });
@@ -176,12 +178,12 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
176
178
  throw new Error("Swap invoice doesn't have msat amount field!");
177
179
  const amountOut = (BigInt(parsedPr.millisatoshis) + 999n) / 1000n;
178
180
  const totalFee = resp.swapFee + resp.maxFee;
179
- const data = new this._swapDataDeserializer(resp.data);
181
+ const data = new (this._swapDataDeserializer(version))(resp.data);
180
182
  data.setOfferer(signer);
181
183
  await this.verifyReturnedData(signer, resp, parsedPr, amountData.token, lp, calculatedOptions, data);
182
184
  const [pricingInfo, signatureExpiry, reputation] = await Promise.all([
183
185
  this.verifyReturnedPrice(lp.services[SwapType_1.SwapType.TO_BTCLN], true, amountOut, data.getAmount(), amountData.token, { networkFee: resp.maxFee }, preFetches.pricePreFetchPromise, preFetches.usdPricePrefetchPromise, abortController.signal),
184
- this.verifyReturnedSignature(signer, data, resp, preFetches.feeRatePromise, signDataPromise, abortController.signal),
186
+ this.verifyReturnedSignature(signer, data, resp, preFetches.feeRatePromise[version], signDataPromise, version, abortController.signal),
185
187
  reputationPromise
186
188
  ]);
187
189
  abortController.signal.throwIfAborted();
@@ -194,14 +196,15 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
194
196
  expiry: signatureExpiry,
195
197
  swapFee: resp.swapFee,
196
198
  swapFeeBtc,
197
- feeRate: (await preFetches.feeRatePromise),
199
+ feeRate: (await preFetches.feeRatePromise[version]),
198
200
  signatureData: resp,
199
201
  data,
200
202
  networkFee: resp.maxFee,
201
203
  networkFeeBtc: resp.routingFeeSats,
202
204
  confidence: resp.confidence,
203
205
  pr,
204
- exactIn: false
206
+ exactIn: false,
207
+ contractVersion: version
205
208
  });
206
209
  return quote;
207
210
  }
@@ -228,17 +231,24 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
228
231
  if (parsedPr.millisatoshis == null)
229
232
  throw new UserError_1.UserError("Must be an invoice with amount");
230
233
  const amountOut = (BigInt(parsedPr.millisatoshis) + 999n) / 1000n;
234
+ const lpVersions = Intermediary_1.Intermediary.getContractVersionsForLps(this.chainIdentifier, lps);
231
235
  const _options = this.toRequiredSwapOptions({ ...amountData, amount: amountOut }, options);
232
236
  if (parsedPr.tagsObject.payment_hash == null)
233
237
  throw new Error("Provided lightning invoice doesn't contain payment hash field!");
234
238
  await this.checkPaymentHashWasPaid(parsedPr.tagsObject.payment_hash);
235
- const claimHash = this._contract.getHashForHtlc(Buffer.from(parsedPr.tagsObject.payment_hash, "hex"));
239
+ const _hash = (0, Utils_1.mapArrayToObject)(lpVersions, (contractVersion) => {
240
+ return this._contract(contractVersion).getHashForHtlc(Buffer.from(parsedPr.tagsObject.payment_hash, "hex")).toString("hex");
241
+ });
236
242
  const _abortController = (0, Utils_1.extendAbortController)(abortSignal);
237
243
  const _preFetches = preFetches ?? {
238
244
  pricePreFetchPromise: this.preFetchPrice(amountData, _abortController.signal),
239
- feeRatePromise: this.preFetchFeeRate(signer, amountData, claimHash.toString("hex"), _abortController),
245
+ feeRatePromise: this.preFetchFeeRate(signer, amountData, _hash, _abortController, lpVersions),
240
246
  usdPricePrefetchPromise: this.preFetchUsdPrice(_abortController.signal),
241
- signDataPrefetchPromise: this._contract.preFetchBlockDataForSignatures == null ? this.preFetchSignData(Promise.resolve(true)) : undefined
247
+ signDataPrefetchPromise: (0, Utils_1.mapArrayToObject)(lpVersions, (contractVersion) => {
248
+ return this._contract(contractVersion).preFetchBlockDataForSignatures == null ?
249
+ this.preFetchSignData(Promise.resolve(true), contractVersion) :
250
+ undefined;
251
+ })
242
252
  };
243
253
  return lps.map(lp => {
244
254
  return {
@@ -285,8 +295,9 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
285
295
  async getIntermediaryQuoteExactIn(signer, amountData, invoiceCreateService, lp, dummyPr, calculatedOptions, preFetches, abortSignal, additionalParams) {
286
296
  if (lp.services[SwapType_1.SwapType.TO_BTCLN] == null)
287
297
  throw new Error("LP service for processing to btcln swaps not found!");
298
+ const version = lp.getContractVersion(this.chainIdentifier);
288
299
  const abortController = (0, Utils_1.extendAbortController)(abortSignal);
289
- const reputationPromise = this.preFetchIntermediaryReputation(amountData, lp, abortController);
300
+ const reputationPromise = this.preFetchIntermediaryReputation(amountData, lp, abortController, version);
290
301
  try {
291
302
  const { signDataPromise, prepareResp } = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
292
303
  const { signDataPrefetch, response } = IntermediaryAPI_1.IntermediaryAPI.prepareToBTCLNExactIn(this.chainIdentifier, lp.url, {
@@ -299,7 +310,7 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
299
310
  additionalParams
300
311
  }, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
301
312
  return {
302
- signDataPromise: this.preFetchSignData(signDataPrefetch),
313
+ signDataPromise: this.preFetchSignData(signDataPrefetch, version),
303
314
  prepareResp: await response
304
315
  };
305
316
  }, undefined, e => e instanceof RequestError_1.RequestError, abortController.signal);
@@ -318,19 +329,19 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
318
329
  const resp = await (0, RetryUtils_1.tryWithRetries)((retryCount) => IntermediaryAPI_1.IntermediaryAPI.initToBTCLNExactIn(lp.url, {
319
330
  pr: invoice,
320
331
  reqId: prepareResp.reqId,
321
- feeRate: (0, Utils_1.throwIfUndefined)(preFetches.feeRatePromise),
332
+ feeRate: (0, Utils_1.throwIfUndefined)(preFetches.feeRatePromise[version]),
322
333
  additionalParams
323
334
  }, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined), undefined, RequestError_1.RequestError, abortController.signal);
324
335
  if (parsedInvoice.millisatoshis == null)
325
336
  throw new Error("Swap invoice doesn't have msat amount field!");
326
337
  const amountOut = (BigInt(parsedInvoice.millisatoshis) + 999n) / 1000n;
327
338
  const totalFee = resp.swapFee + resp.maxFee;
328
- const data = new this._swapDataDeserializer(resp.data);
339
+ const data = new (this._swapDataDeserializer(version))(resp.data);
329
340
  data.setOfferer(signer);
330
341
  await this.verifyReturnedData(signer, resp, parsedInvoice, amountData.token, lp, calculatedOptions, data, amountData.amount);
331
342
  const [pricingInfo, signatureExpiry, reputation] = await Promise.all([
332
343
  this.verifyReturnedPrice(lp.services[SwapType_1.SwapType.TO_BTCLN], true, prepareResp.amount, data.getAmount(), amountData.token, { networkFee: resp.maxFee }, preFetches.pricePreFetchPromise, preFetches.usdPricePrefetchPromise, abortSignal),
333
- this.verifyReturnedSignature(signer, data, resp, preFetches.feeRatePromise, signDataPromise, abortController.signal),
344
+ this.verifyReturnedSignature(signer, data, resp, preFetches.feeRatePromise[version], signDataPromise, version, abortController.signal),
334
345
  reputationPromise
335
346
  ]);
336
347
  abortController.signal.throwIfAborted();
@@ -343,14 +354,15 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
343
354
  expiry: signatureExpiry,
344
355
  swapFee: resp.swapFee,
345
356
  swapFeeBtc,
346
- feeRate: (await preFetches.feeRatePromise),
357
+ feeRate: (await preFetches.feeRatePromise[version]),
347
358
  signatureData: resp,
348
359
  data,
349
360
  networkFee: resp.maxFee,
350
361
  networkFeeBtc: resp.routingFeeSats,
351
362
  confidence: resp.confidence,
352
363
  pr: invoice,
353
- exactIn: true
364
+ exactIn: true,
365
+ contractVersion: version
354
366
  });
355
367
  return quote;
356
368
  }
@@ -375,13 +387,16 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
375
387
  async createViaInvoiceCreateService(signer, invoiceCreateServicePromise, amountData, lps, options, additionalParams, abortSignal) {
376
388
  if (!this.isInitialized)
377
389
  throw new Error("Not initialized, call init() first!");
390
+ const lpVersions = Intermediary_1.Intermediary.getContractVersionsForLps(this.chainIdentifier, lps);
378
391
  const _abortController = (0, Utils_1.extendAbortController)(abortSignal);
379
392
  const pricePreFetchPromise = this.preFetchPrice(amountData, _abortController.signal);
380
393
  const usdPricePrefetchPromise = this.preFetchUsdPrice(_abortController.signal);
381
- const feeRatePromise = this.preFetchFeeRate(signer, amountData, undefined, _abortController);
382
- const signDataPrefetchPromise = this._contract.preFetchBlockDataForSignatures == null ?
383
- this.preFetchSignData(Promise.resolve(true)) :
384
- undefined;
394
+ const feeRatePromise = this.preFetchFeeRate(signer, amountData, undefined, _abortController, lpVersions);
395
+ const signDataPrefetchPromise = (0, Utils_1.mapArrayToObject)(lpVersions, (contractVersion) => {
396
+ return this._contract(contractVersion).preFetchBlockDataForSignatures == null ?
397
+ this.preFetchSignData(Promise.resolve(true), contractVersion) :
398
+ undefined;
399
+ });
385
400
  const _options = this.toRequiredSwapOptions(amountData, options, pricePreFetchPromise, _abortController.signal);
386
401
  try {
387
402
  const invoiceCreateService = await invoiceCreateServicePromise;
@@ -476,7 +491,7 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
476
491
  /**
477
492
  * @inheritDoc
478
493
  */
479
- async recoverFromSwapDataAndState(init, state, lp) {
494
+ async recoverFromSwapDataAndState(init, state, contractVersion, lp) {
480
495
  const data = init.data;
481
496
  let paymentHash = data.getHTLCHashHint();
482
497
  let secret;
@@ -504,7 +519,8 @@ class ToBTCLNWrapper extends IToBTCWrapper_1.IToBTCWrapper {
504
519
  networkFeeBtc: 0n,
505
520
  confidence: 0,
506
521
  pr: paymentHash ?? undefined,
507
- exactIn: false
522
+ exactIn: false,
523
+ contractVersion
508
524
  };
509
525
  const swap = new ToBTCLNSwap_1.ToBTCLNSwap(this, swapInit);
510
526
  swap._commitTxId = await init.getInitTxId();
@@ -73,11 +73,11 @@ class ToBTCSwap extends IToBTCSwap_1.IToBTCSwap {
73
73
  let requiredConfirmations = this.requiredConfirmations;
74
74
  const foundVout = btcTx.outs.find(vout => {
75
75
  if (requiredConfirmations != null) {
76
- return this._data.getClaimHash() === this.wrapper._contract.getHashForOnchain(buffer_1.Buffer.from(vout.scriptPubKey.hex, "hex"), BigInt(vout.value), requiredConfirmations, nonce).toString("hex");
76
+ return this._data.getClaimHash() === this._contract.getHashForOnchain(buffer_1.Buffer.from(vout.scriptPubKey.hex, "hex"), BigInt(vout.value), requiredConfirmations, nonce).toString("hex");
77
77
  }
78
78
  else {
79
79
  for (let i = 1; i <= 20; i++) {
80
- if (this._data.getClaimHash() === this.wrapper._contract.getHashForOnchain(buffer_1.Buffer.from(vout.scriptPubKey.hex, "hex"), BigInt(vout.value), i, nonce).toString("hex")) {
80
+ if (this._data.getClaimHash() === this._contract.getHashForOnchain(buffer_1.Buffer.from(vout.scriptPubKey.hex, "hex"), BigInt(vout.value), i, nonce).toString("hex")) {
81
81
  requiredConfirmations = i;
82
82
  return true;
83
83
  }
@@ -52,15 +52,19 @@ export declare class ToBTCWrapper<T extends ChainType> extends IToBTCWrapper<T,
52
52
  * @param unifiedStorage Storage interface for the current environment
53
53
  * @param unifiedChainEvents Smart chain on-chain event listener
54
54
  * @param chain
55
- * @param contract Chain specific swap contract
55
+ * @param versionedContracts Chain specific versioned contracts
56
56
  * @param prices Swap pricing handler
57
57
  * @param tokens
58
- * @param swapDataDeserializer Deserializer for chain specific SwapData
59
58
  * @param btcRpc Bitcoin RPC api
60
59
  * @param options
61
60
  * @param events Instance to use for emitting events
62
61
  */
63
- constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], contract: T["Contract"], prices: ISwapPrice, tokens: WrapperCtorTokens, swapDataDeserializer: new (data: any) => T["Data"], btcRpc: BitcoinRpc<any>, options?: AllOptional<ToBTCWrapperOptions>, events?: EventEmitter<{
62
+ constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], prices: ISwapPrice, tokens: WrapperCtorTokens, versionedContracts: {
63
+ [version: string]: {
64
+ swapContract: T["Contract"];
65
+ swapDataConstructor: new (data: any) => T["Data"];
66
+ };
67
+ }, btcRpc: BitcoinRpc<any>, options?: AllOptional<ToBTCWrapperOptions>, events?: EventEmitter<{
64
68
  swapState: [ISwap];
65
69
  }>);
66
70
  /**
@@ -124,5 +128,5 @@ export declare class ToBTCWrapper<T extends ChainType> extends IToBTCWrapper<T,
124
128
  blockTime: number;
125
129
  blockHeight: number;
126
130
  }>;
127
- }, state: SwapCommitState, lp?: Intermediary): Promise<ToBTCSwap<T> | null>;
131
+ }, state: SwapCommitState, contractVersion: string, lp?: Intermediary): Promise<ToBTCSwap<T> | null>;
128
132
  }
@@ -4,6 +4,7 @@ exports.ToBTCWrapper = void 0;
4
4
  const ToBTCSwap_1 = require("./ToBTCSwap");
5
5
  const IToBTCWrapper_1 = require("../IToBTCWrapper");
6
6
  const base_1 = require("@atomiqlabs/base");
7
+ const Intermediary_1 = require("../../../../intermediaries/Intermediary");
7
8
  const UserError_1 = require("../../../../errors/UserError");
8
9
  const IntermediaryError_1 = require("../../../../errors/IntermediaryError");
9
10
  const SwapType_1 = require("../../../../enums/SwapType");
@@ -25,16 +26,15 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
25
26
  * @param unifiedStorage Storage interface for the current environment
26
27
  * @param unifiedChainEvents Smart chain on-chain event listener
27
28
  * @param chain
28
- * @param contract Chain specific swap contract
29
+ * @param versionedContracts Chain specific versioned contracts
29
30
  * @param prices Swap pricing handler
30
31
  * @param tokens
31
- * @param swapDataDeserializer Deserializer for chain specific SwapData
32
32
  * @param btcRpc Bitcoin RPC api
33
33
  * @param options
34
34
  * @param events Instance to use for emitting events
35
35
  */
36
- constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, btcRpc, options, events) {
37
- super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, contract, prices, tokens, swapDataDeserializer, {
36
+ constructor(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, versionedContracts, btcRpc, options, events) {
37
+ super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain, prices, tokens, {
38
38
  ...options,
39
39
  bitcoinNetwork: options?.bitcoinNetwork ?? utils_1.TEST_NETWORK,
40
40
  safetyFactor: options?.safetyFactor ?? 2,
@@ -42,7 +42,7 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
42
42
  bitcoinBlocktime: options?.bitcoinBlocktime ?? (60 * 10),
43
43
  maxExpectedOnchainSendSafetyFactor: options?.maxExpectedOnchainSendSafetyFactor ?? 4,
44
44
  maxExpectedOnchainSendGracePeriodBlocks: options?.maxExpectedOnchainSendGracePeriodBlocks ?? 12,
45
- }, events);
45
+ }, versionedContracts, events);
46
46
  this.TYPE = SwapType_1.SwapType.TO_BTC;
47
47
  /**
48
48
  * @internal
@@ -146,26 +146,32 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
146
146
  confirmationTarget: options?.confirmationTarget ?? 3,
147
147
  confirmations: options?.confirmations ?? 2
148
148
  };
149
+ const lpVersions = Intermediary_1.Intermediary.getContractVersionsForLps(this.chainIdentifier, lps);
149
150
  const nonce = this.getRandomNonce();
150
151
  const outputScript = this.btcAddressToOutputScript(recipient);
151
152
  const _hash = !amountData.exactIn ?
152
- this._contract.getHashForOnchain(outputScript, amountData.amount, _options.confirmations, nonce).toString("hex") :
153
+ (0, Utils_1.mapArrayToObject)(lpVersions, (contractVersion) => {
154
+ return this._contract(contractVersion).getHashForOnchain(outputScript, amountData.amount, _options.confirmations, nonce).toString("hex");
155
+ }) :
153
156
  undefined;
154
157
  const _abortController = (0, Utils_1.extendAbortController)(abortSignal);
155
158
  const pricePreFetchPromise = this.preFetchPrice(amountData, _abortController.signal);
156
159
  const usdPricePrefetchPromise = this.preFetchUsdPrice(_abortController.signal);
157
- const feeRatePromise = this.preFetchFeeRate(signer, amountData, _hash, _abortController);
158
- const _signDataPromise = this._contract.preFetchBlockDataForSignatures == null ?
159
- this.preFetchSignData(Promise.resolve(true)) :
160
- undefined;
160
+ const feeRatePromise = this.preFetchFeeRate(signer, amountData, _hash, _abortController, lpVersions);
161
+ const _signDataPromise = (0, Utils_1.mapArrayToObject)(lpVersions, (contractVersion) => {
162
+ return this._contract(contractVersion).preFetchBlockDataForSignatures == null ?
163
+ this.preFetchSignData(Promise.resolve(true), contractVersion) :
164
+ undefined;
165
+ });
161
166
  return lps.map(lp => {
162
167
  return {
163
168
  intermediary: lp,
164
169
  quote: (async () => {
165
170
  if (lp.services[SwapType_1.SwapType.TO_BTC] == null)
166
171
  throw new Error("LP service for processing to btc swaps not found!");
172
+ const version = lp.getContractVersion(this.chainIdentifier);
167
173
  const abortController = (0, Utils_1.extendAbortController)(_abortController.signal);
168
- const reputationPromise = this.preFetchIntermediaryReputation(amountData, lp, abortController);
174
+ const reputationPromise = this.preFetchIntermediaryReputation(amountData, lp, abortController, version);
169
175
  try {
170
176
  const { signDataPromise, resp } = await (0, RetryUtils_1.tryWithRetries)(async (retryCount) => {
171
177
  const { signDataPrefetch, response } = IntermediaryAPI_1.IntermediaryAPI.initToBTC(this.chainIdentifier, lp.url, {
@@ -177,12 +183,12 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
177
183
  token: amountData.token,
178
184
  offerer: signer,
179
185
  exactIn: amountData.exactIn,
180
- feeRate: (0, Utils_1.throwIfUndefined)(feeRatePromise),
186
+ feeRate: (0, Utils_1.throwIfUndefined)(feeRatePromise[version]),
181
187
  additionalParams
182
188
  }, this._options.postRequestTimeout, abortController.signal, retryCount > 0 ? false : undefined);
183
- let signDataPromise = _signDataPromise;
189
+ let signDataPromise = _signDataPromise[version];
184
190
  if (signDataPromise == null) {
185
- signDataPromise = this.preFetchSignData(signDataPrefetch);
191
+ signDataPromise = this.preFetchSignData(signDataPrefetch, version);
186
192
  }
187
193
  else
188
194
  signDataPrefetch.catch(() => { });
@@ -191,13 +197,13 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
191
197
  resp: await response
192
198
  };
193
199
  }, undefined, RequestError_1.RequestError, abortController.signal);
194
- let hash = _hash ?? this._contract.getHashForOnchain(outputScript, resp.amount, _options.confirmations, nonce).toString("hex");
195
- const data = new this._swapDataDeserializer(resp.data);
200
+ let hash = _hash?.[version] ?? this._contract(version).getHashForOnchain(outputScript, resp.amount, _options.confirmations, nonce).toString("hex");
201
+ const data = new (this._swapDataDeserializer(version))(resp.data);
196
202
  data.setOfferer(signer);
197
203
  this.verifyReturnedData(signer, resp, amountData, lp, _options, data, hash);
198
204
  const [pricingInfo, signatureExpiry, reputation] = await Promise.all([
199
205
  this.verifyReturnedPrice(lp.services[SwapType_1.SwapType.TO_BTC], true, resp.amount, data.getAmount(), amountData.token, resp, pricePreFetchPromise, usdPricePrefetchPromise, abortController.signal),
200
- this.verifyReturnedSignature(signer, data, resp, feeRatePromise, signDataPromise, abortController.signal),
206
+ this.verifyReturnedSignature(signer, data, resp, feeRatePromise[version], signDataPromise, version, abortController.signal),
201
207
  reputationPromise
202
208
  ]);
203
209
  abortController.signal.throwIfAborted();
@@ -212,7 +218,7 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
212
218
  expiry: signatureExpiry,
213
219
  swapFee: resp.swapFee,
214
220
  swapFeeBtc,
215
- feeRate: (await feeRatePromise),
221
+ feeRate: (await feeRatePromise[version]),
216
222
  signatureData: resp,
217
223
  data,
218
224
  networkFee: resp.networkFee,
@@ -223,7 +229,8 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
223
229
  satsPerVByte: Number(resp.satsPervByte),
224
230
  exactIn: amountData.exactIn,
225
231
  requiredConfirmations: _options.confirmations,
226
- nonce
232
+ nonce,
233
+ contractVersion: version
227
234
  });
228
235
  return quote;
229
236
  }
@@ -238,7 +245,7 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
238
245
  /**
239
246
  * @inheritDoc
240
247
  */
241
- async recoverFromSwapDataAndState(init, state, lp) {
248
+ async recoverFromSwapDataAndState(init, state, contractVersion, lp) {
242
249
  const data = init.data;
243
250
  const swapInit = {
244
251
  pricingInfo: {
@@ -262,7 +269,8 @@ class ToBTCWrapper extends IToBTCWrapper_1.IToBTCWrapper {
262
269
  data,
263
270
  networkFee: 0n,
264
271
  networkFeeBtc: 0n,
265
- exactIn: true
272
+ exactIn: true,
273
+ contractVersion
266
274
  };
267
275
  const swap = new ToBTCSwap_1.ToBTCSwap(this, swapInit);
268
276
  swap._commitTxId = await init.getInitTxId();
@@ -200,6 +200,7 @@ export declare class SpvFromBTCSwap<T extends ChainType> extends ISwap<T, SpvFro
200
200
  * @private
201
201
  */
202
202
  private btcTxConfirmedAt?;
203
+ private _contract;
203
204
  constructor(wrapper: SpvFromBTCWrapper<T>, init: SpvFromBTCSwapInit);
204
205
  constructor(wrapper: SpvFromBTCWrapper<T>, obj: any);
205
206
  /**
@@ -216,10 +216,11 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
216
216
  this.btcTxConfirmedAt = initOrObject.btcTxConfirmedAt;
217
217
  this.posted = initOrObject.posted;
218
218
  if (initOrObject.data != null)
219
- this._data = new this.wrapper._spvWithdrawalDataDeserializer(initOrObject.data);
219
+ this._data = new (this.wrapper._spvWithdrawalDataDeserializer(this._contractVersion))(initOrObject.data);
220
220
  }
221
221
  this.tryCalculateSwapFee();
222
222
  this.logger = (0, Logger_1.getLogger)("SPVFromBTC(" + this.getId() + "): ");
223
+ this._contract = wrapper._contract(this._contractVersion);
223
224
  }
224
225
  /**
225
226
  * @inheritDoc
@@ -555,7 +556,7 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
555
556
  const [txId, voutStr] = this.vaultUtxo.split(":");
556
557
  const vaultScript = (0, BitcoinUtils_1.toOutputScript)(this.wrapper._options.bitcoinNetwork, this.vaultBtcAddress);
557
558
  const out2script = (0, BitcoinUtils_1.toOutputScript)(this.wrapper._options.bitcoinNetwork, this.btcDestinationAddress);
558
- const opReturnData = this.wrapper._contract.toOpReturnData(this.recipient, [
559
+ const opReturnData = this._contract.toOpReturnData(this.recipient, [
559
560
  this.outputTotalSwap / this.vaultTokenMultipliers[0],
560
561
  this.outputTotalGas / this.vaultTokenMultipliers[1]
561
562
  ]);
@@ -691,7 +692,7 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
691
692
  psbt.finalizeIdx(i);
692
693
  }
693
694
  const btcTx = await this.wrapper._btcRpc.parseTransaction(buffer_1.Buffer.from(psbt.toBytes(true)).toString("hex"));
694
- const data = await this.wrapper._contract.getWithdrawalData(btcTx);
695
+ const data = await this._contract.getWithdrawalData(btcTx);
695
696
  this.logger.debug("submitPsbt(): parsed withdrawal data: ", data);
696
697
  //Verify correct withdrawal data
697
698
  if (!data.isRecipient(this.recipient) ||
@@ -719,7 +720,7 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
719
720
  }
720
721
  //Verify tx is parsable by the contract
721
722
  try {
722
- await this.wrapper._contract.checkWithdrawalTx(data);
723
+ await this._contract.checkWithdrawalTx(data);
723
724
  }
724
725
  catch (e) {
725
726
  throw new Error("Transaction not parsable by the contract: " + (e.message ?? e.toString()));
@@ -972,7 +973,7 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
972
973
  throw new Error("Must be in BTC_TX_CONFIRMED state!");
973
974
  if (this._data == null)
974
975
  throw new Error("Expected swap to have withdrawal data filled!");
975
- const vaultData = await this.wrapper._contract.getVaultData(this.vaultOwner, this.vaultId);
976
+ const vaultData = await this._contract.getVaultData(this.vaultOwner, this.vaultId);
976
977
  if (vaultData == null)
977
978
  throw new Error(`Vault data for ${this.vaultOwner}:${this.vaultId.toString(10)} not found (already closed???)!`);
978
979
  const btcTx = await this.wrapper._btcRpc.getTransaction(this._data.btcTx.txid);
@@ -990,9 +991,9 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
990
991
  //Parse transactions to withdrawal data
991
992
  const withdrawalData = [];
992
993
  for (let tx of txs) {
993
- withdrawalData.push(await this.wrapper._contract.getWithdrawalData(tx));
994
+ withdrawalData.push(await this._contract.getWithdrawalData(tx));
994
995
  }
995
- return await this.wrapper._contract.txsClaim(address ?? this._getInitiator(), vaultData, withdrawalData.map(tx => { return { tx }; }), this.wrapper._synchronizer, true);
996
+ return await this._contract.txsClaim(address ?? this._getInitiator(), vaultData, withdrawalData.map(tx => { return { tx }; }), this.wrapper._synchronizer(this._contractVersion), true);
996
997
  }
997
998
  /**
998
999
  * Settles the swap by claiming the funds on the destination chain if the swap requires manual settlement, you can
@@ -1028,7 +1029,7 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
1028
1029
  this.logger.info("claim(): Transaction state is CLAIMED, swap was successfully claimed by the watchtower");
1029
1030
  return this._claimTxId;
1030
1031
  }
1031
- const withdrawalState = await this.wrapper._contract.getWithdrawalState(this._data, this._genesisSmartChainBlockHeight);
1032
+ const withdrawalState = await this._contract.getWithdrawalState(this._data, this._genesisSmartChainBlockHeight);
1032
1033
  if (withdrawalState != null && withdrawalState.type === base_1.SpvWithdrawalStateType.CLAIMED) {
1033
1034
  this.logger.info("claim(): Transaction status is CLAIMED, swap was successfully claimed by the watchtower");
1034
1035
  this._claimTxId = withdrawalState.txId;
@@ -1061,7 +1062,7 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
1061
1062
  try {
1062
1063
  //Be smart about checking withdrawal state
1063
1064
  if (await this._shouldCheckWithdrawalState()) {
1064
- status = await this.wrapper._contract.getWithdrawalState(this._data, this._genesisSmartChainBlockHeight) ?? { type: base_1.SpvWithdrawalStateType.NOT_FOUND };
1065
+ status = await this._contract.getWithdrawalState(this._data, this._genesisSmartChainBlockHeight) ?? { type: base_1.SpvWithdrawalStateType.NOT_FOUND };
1065
1066
  }
1066
1067
  }
1067
1068
  catch (e) {
@@ -1313,7 +1314,7 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
1313
1314
  }
1314
1315
  if (this._state === SpvFromBTCSwapState.BROADCASTED || this._state === SpvFromBTCSwapState.BTC_TX_CONFIRMED) {
1315
1316
  if (await this._shouldCheckWithdrawalState()) {
1316
- const status = await this.wrapper._contract.getWithdrawalState(this._data, this._genesisSmartChainBlockHeight);
1317
+ const status = await this._contract.getWithdrawalState(this._data, this._genesisSmartChainBlockHeight);
1317
1318
  this.logger.debug("syncStateFromChain(): status of " + this._data.btcTx.txid, status);
1318
1319
  switch (status?.type) {
1319
1320
  case base_1.SpvWithdrawalStateType.FRONTED:
@@ -1401,9 +1402,9 @@ class SpvFromBTCSwap extends ISwap_1.ISwap {
1401
1402
  */
1402
1403
  async _shouldCheckWithdrawalState(frontingAddress, vaultDataUtxo) {
1403
1404
  if (frontingAddress === undefined)
1404
- frontingAddress = await this.wrapper._contract.getFronterAddress(this.vaultOwner, this.vaultId, this._data);
1405
+ frontingAddress = await this._contract.getFronterAddress(this.vaultOwner, this.vaultId, this._data);
1405
1406
  if (vaultDataUtxo === undefined)
1406
- vaultDataUtxo = await this.wrapper._contract.getVaultLatestUtxo(this.vaultOwner, this.vaultId);
1407
+ vaultDataUtxo = await this._contract.getVaultLatestUtxo(this.vaultOwner, this.vaultId);
1407
1408
  if (frontingAddress != null)
1408
1409
  return true; //In case the swap is fronted there will for sure be a fronted event
1409
1410
  if (vaultDataUtxo == null)
@@ -81,7 +81,7 @@ export declare class SpvFromBTCWrapper<T extends ChainType> extends ISwapWrapper
81
81
  /**
82
82
  * @internal
83
83
  */
84
- protected readonly btcRelay: T["BtcRelay"];
84
+ protected readonly btcRelay: (version?: string) => BtcRelay<any, T["TX"], any>;
85
85
  /**
86
86
  * @internal
87
87
  */
@@ -89,11 +89,11 @@ export declare class SpvFromBTCWrapper<T extends ChainType> extends ISwapWrapper
89
89
  /**
90
90
  * @internal
91
91
  */
92
- readonly _synchronizer: RelaySynchronizer<any, T["TX"], any>;
92
+ readonly _synchronizer: (version?: string) => RelaySynchronizer<any, T["TX"], any>;
93
93
  /**
94
94
  * @internal
95
95
  */
96
- readonly _contract: T["SpvVaultContract"];
96
+ readonly _contract: (version?: string) => T["SpvVaultContract"];
97
97
  /**
98
98
  * @internal
99
99
  */
@@ -101,27 +101,37 @@ export declare class SpvFromBTCWrapper<T extends ChainType> extends ISwapWrapper
101
101
  /**
102
102
  * @internal
103
103
  */
104
- readonly _spvWithdrawalDataDeserializer: new (data: any) => T["SpvVaultWithdrawalData"];
104
+ readonly _spvWithdrawalDataDeserializer: (version?: string) => (new (data: any) => T["SpvVaultWithdrawalData"]);
105
105
  /**
106
106
  * @internal
107
107
  */
108
108
  readonly _pendingSwapStates: Array<SpvFromBTCSwap<T>["_state"]>;
109
+ private readonly versionedContracts;
110
+ private readonly versionedSynchronizer;
109
111
  /**
110
112
  * @param chainIdentifier
111
113
  * @param unifiedStorage Storage interface for the current environment
112
114
  * @param unifiedChainEvents On-chain event listener
113
115
  * @param chain
114
- * @param contract Underlying contract handling the swaps
115
116
  * @param prices Pricing to use
116
117
  * @param tokens
117
- * @param spvWithdrawalDataDeserializer Deserializer for SpvVaultWithdrawalData
118
- * @param btcRelay
119
- * @param synchronizer Btc relay synchronizer
118
+ * @param versionedContracts
119
+ * @param versionedSynchronizer
120
120
  * @param btcRpc Bitcoin RPC which also supports getting transactions by txoHash
121
121
  * @param options
122
122
  * @param events Instance to use for emitting events
123
123
  */
124
- constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], contract: T["SpvVaultContract"], prices: ISwapPrice, tokens: WrapperCtorTokens, spvWithdrawalDataDeserializer: new (data: any) => T["SpvVaultWithdrawalData"], btcRelay: BtcRelay<any, T["TX"], any>, synchronizer: RelaySynchronizer<any, T["TX"], any>, btcRpc: BitcoinRpcWithAddressIndex<any>, options?: AllOptional<SpvFromBTCWrapperOptions>, events?: EventEmitter<{
124
+ constructor(chainIdentifier: string, unifiedStorage: UnifiedSwapStorage<T>, unifiedChainEvents: UnifiedSwapEventListener<T>, chain: T["ChainInterface"], prices: ISwapPrice, tokens: WrapperCtorTokens, versionedContracts: {
125
+ [version: string]: {
126
+ btcRelay: BtcRelay<any, T["TX"], any>;
127
+ spvVaultContract: T["SpvVaultContract"];
128
+ spvVaultWithdrawalDataConstructor: new (data: any) => T["SpvVaultWithdrawalData"];
129
+ };
130
+ }, versionedSynchronizer: {
131
+ [version: string]: {
132
+ synchronizer: RelaySynchronizer<any, T["TX"], any>;
133
+ };
134
+ }, btcRpc: BitcoinRpcWithAddressIndex<any>, options?: AllOptional<SpvFromBTCWrapperOptions>, events?: EventEmitter<{
125
135
  swapState: [ISwap];
126
136
  }>);
127
137
  private processEventFront;
@@ -148,6 +158,7 @@ export declare class SpvFromBTCWrapper<T extends ChainType> extends ISwapWrapper
148
158
  * @param pricePrefetch
149
159
  * @param nativeTokenPricePrefetch
150
160
  * @param abortController
161
+ * @param contractVersion
151
162
  * @private
152
163
  */
153
164
  private preFetchCallerFeeShare;
@@ -188,7 +199,7 @@ export declare class SpvFromBTCWrapper<T extends ChainType> extends ISwapWrapper
188
199
  * @param vault SPV vault processing the swap
189
200
  * @param lp Intermediary (LP) used as a counterparty for the swap
190
201
  */
191
- recoverFromState(state: SpvWithdrawalClaimedState | SpvWithdrawalFrontedState, vault?: SpvVaultData | null, lp?: Intermediary): Promise<SpvFromBTCSwap<T> | null>;
202
+ recoverFromState(state: SpvWithdrawalClaimedState | SpvWithdrawalFrontedState, contractVersion: string, vault?: SpvVaultData | null, lp?: Intermediary): Promise<SpvFromBTCSwap<T> | null>;
192
203
  /**
193
204
  * Returns a random dummy PSBT that can be used for fee estimation, the last output (the LP output) is omitted
194
205
  * to allow for coinselection algorithm to determine maximum sendable amount there