@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.
- package/dist/events/UnifiedSwapEventListener.js +4 -2
- package/dist/http/paramcoders/ParamDecoder.js +9 -4
- package/dist/http/paramcoders/ParamEncoder.js +6 -1
- package/dist/intermediaries/Intermediary.d.ts +21 -0
- package/dist/intermediaries/Intermediary.js +25 -1
- package/dist/intermediaries/IntermediaryDiscovery.d.ts +15 -3
- package/dist/intermediaries/IntermediaryDiscovery.js +25 -6
- package/dist/intermediaries/apis/IntermediaryAPI.d.ts +1 -0
- package/dist/swapper/Swapper.d.ts +9 -4
- package/dist/swapper/Swapper.js +94 -42
- package/dist/swapper/SwapperUtils.js +2 -1
- package/dist/swaps/ISwap.d.ts +5 -0
- package/dist/swaps/ISwap.js +4 -1
- package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +5 -5
- package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +4 -0
- package/dist/swaps/escrow_swaps/IEscrowSwap.js +4 -3
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +19 -6
- package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +54 -21
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +7 -3
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +3 -4
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +3 -3
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +8 -2
- package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +12 -8
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +18 -18
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +12 -6
- package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +38 -24
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +9 -9
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +14 -7
- package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +54 -38
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +5 -5
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +18 -7
- package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +61 -33
- package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +12 -12
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +8 -2
- package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +13 -8
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +1 -1
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +13 -4
- package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +44 -28
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +2 -2
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +8 -4
- package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +29 -21
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +1 -0
- package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +13 -12
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +21 -10
- package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +136 -73
- package/dist/swaps/trusted/ln/LnForGasWrapper.js +2 -1
- package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +2 -1
- package/dist/utils/RetryUtils.d.ts +2 -1
- package/dist/utils/RetryUtils.js +3 -2
- package/dist/utils/Utils.d.ts +9 -0
- package/dist/utils/Utils.js +15 -1
- package/package.json +2 -2
- package/src/events/UnifiedSwapEventListener.ts +4 -2
- package/src/http/paramcoders/ParamDecoder.ts +8 -4
- package/src/http/paramcoders/ParamEncoder.ts +5 -1
- package/src/intermediaries/Intermediary.ts +31 -1
- package/src/intermediaries/IntermediaryDiscovery.ts +33 -12
- package/src/intermediaries/apis/IntermediaryAPI.ts +2 -1
- package/src/swapper/Swapper.ts +141 -62
- package/src/swapper/SwapperUtils.ts +3 -1
- package/src/swaps/ISwap.ts +10 -2
- package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +5 -5
- package/src/swaps/escrow_swaps/IEscrowSwap.ts +10 -3
- package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +64 -26
- package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +8 -5
- package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +3 -3
- package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +22 -12
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +18 -18
- package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +52 -31
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +9 -9
- package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +76 -52
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +5 -5
- package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +82 -38
- package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +12 -12
- package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +21 -9
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +1 -1
- package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +56 -33
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +2 -2
- package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +40 -22
- package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +17 -13
- package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +149 -83
- package/src/swaps/trusted/ln/LnForGasWrapper.ts +2 -1
- package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +2 -1
- package/src/utils/RetryUtils.ts +11 -4
- 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,
|
|
25
|
-
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain,
|
|
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
|
|
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,
|
|
245
|
+
feeRatePromise: this.preFetchFeeRate(signer, amountData, _hash, _abortController, lpVersions),
|
|
240
246
|
usdPricePrefetchPromise: this.preFetchUsdPrice(_abortController.signal),
|
|
241
|
-
signDataPrefetchPromise:
|
|
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 =
|
|
383
|
-
this.
|
|
384
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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"],
|
|
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
|
|
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,
|
|
37
|
-
super(chainIdentifier, unifiedStorage, unifiedChainEvents, chain,
|
|
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
|
-
|
|
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 =
|
|
159
|
-
this.
|
|
160
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
994
|
+
withdrawalData.push(await this._contract.getWithdrawalData(tx));
|
|
994
995
|
}
|
|
995
|
-
return await this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1405
|
+
frontingAddress = await this._contract.getFronterAddress(this.vaultOwner, this.vaultId, this._data);
|
|
1405
1406
|
if (vaultDataUtxo === undefined)
|
|
1406
|
-
vaultDataUtxo = await this.
|
|
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["
|
|
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
|
|
118
|
-
* @param
|
|
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"],
|
|
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
|