UNPKG

@atomiqlabs/sdk

Version:

atomiq labs SDK for cross-chain swaps between smart chains and bitcoin

118 lines (117 loc) 4.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IToBTCWrapper = void 0; const IToBTCSwap_1 = require("./IToBTCSwap"); const IntermediaryError_1 = require("../../../errors/IntermediaryError"); const IEscrowSwapWrapper_1 = require("../IEscrowSwapWrapper"); const Utils_1 = require("../../../utils/Utils"); /** * Base class for wrappers of escrow-based Smart chain -> Bitcoin (on-chain & lightning) swaps * * @category Swaps/Smart chain → Bitcoin */ class IToBTCWrapper extends IEscrowSwapWrapper_1.IEscrowSwapWrapper { constructor() { super(...arguments); /** * @internal */ this.tickSwapState = [IToBTCSwap_1.ToBTCSwapState.CREATED, IToBTCSwap_1.ToBTCSwapState.COMMITED, IToBTCSwap_1.ToBTCSwapState.SOFT_CLAIMED]; /** * @internal */ this._pendingSwapStates = [ IToBTCSwap_1.ToBTCSwapState.CREATED, IToBTCSwap_1.ToBTCSwapState.QUOTE_SOFT_EXPIRED, IToBTCSwap_1.ToBTCSwapState.COMMITED, IToBTCSwap_1.ToBTCSwapState.SOFT_CLAIMED, IToBTCSwap_1.ToBTCSwapState.REFUNDABLE ]; /** * @internal */ this._refundableSwapStates = [IToBTCSwap_1.ToBTCSwapState.REFUNDABLE]; } /** * Pre-fetches intermediary's reputation, doesn't throw, instead aborts via abortController and returns null * * @param amountData * @param lp Intermediary * @param abortController * @param contractVersion * @returns Intermediary's reputation or null if failed * @throws {IntermediaryError} If the intermediary vault doesn't exist * * @internal */ preFetchIntermediaryReputation(amountData, lp, abortController, contractVersion) { return lp.getReputation(this.chainIdentifier, this._contract(contractVersion), [amountData.token.toString()], abortController.signal).then(res => { if (res == null) throw new IntermediaryError_1.IntermediaryError("Invalid data returned - invalid LP vault"); return res; }).catch(e => { this.logger.warn("preFetchIntermediaryReputation(): Error: ", e); abortController.abort(e); return undefined; }); } /** * Pre-fetches feeRate for a given swap * * @param signer Address of the swap initiator * @param amountData * @param claimHash optional hash of the swap or null * @param abortController * @param contractVersions * @returns Fee rate * * @internal */ preFetchFeeRate(signer, amountData, claimHash, abortController, contractVersions) { return (0, Utils_1.mapArrayToObject)(contractVersions, (contractVersion) => { return this._contract(contractVersion).getInitPayInFeeRate(signer, this._chain.randomAddress(), amountData.token, claimHash?.[contractVersion]) .catch(e => { this.logger.warn("preFetchFeeRate(): Error: ", e); abortController.abort(e); return undefined; }); }); } /** * @internal */ async processEventInitialize(swap, event) { if (swap._state === IToBTCSwap_1.ToBTCSwapState.CREATED || swap._state === IToBTCSwap_1.ToBTCSwapState.QUOTE_SOFT_EXPIRED) { swap._state = IToBTCSwap_1.ToBTCSwapState.COMMITED; return true; } return false; } /** * @internal */ async processEventClaim(swap, event) { if (swap._state !== IToBTCSwap_1.ToBTCSwapState.REFUNDED && swap._state !== IToBTCSwap_1.ToBTCSwapState.CLAIMED) { await swap._setPaymentResult({ secret: event.result, txId: Buffer.from(event.result, "hex").reverse().toString("hex") }).catch(e => { this.logger.warn(`processEventClaim(): Failed to set payment result ${event.result}: `, e); }); swap._state = IToBTCSwap_1.ToBTCSwapState.CLAIMED; return true; } return false; } /** * @internal */ processEventRefund(swap, event) { if (swap._state !== IToBTCSwap_1.ToBTCSwapState.CLAIMED && swap._state !== IToBTCSwap_1.ToBTCSwapState.REFUNDED) { swap._state = IToBTCSwap_1.ToBTCSwapState.REFUNDED; return Promise.resolve(true); } return Promise.resolve(false); } } exports.IToBTCWrapper = IToBTCWrapper;