UNPKG

@atomiqlabs/sdk-lib

Version:

Basic SDK functionality library for atomiq

146 lines (145 loc) 5.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ToBTCLNSwap = exports.isToBTCLNSwapInit = void 0; const bolt11_1 = require("@atomiqlabs/bolt11"); const IToBTCSwap_1 = require("../IToBTCSwap"); const SwapType_1 = require("../../SwapType"); const buffer_1 = require("buffer"); const sha2_1 = require("@noble/hashes/sha2"); const IntermediaryError_1 = require("../../../errors/IntermediaryError"); const LNURL_1 = require("../../../utils/LNURL"); const Tokens_1 = require("../../Tokens"); const Utils_1 = require("../../../utils/Utils"); function isToBTCLNSwapInit(obj) { return typeof (obj.confidence) === "number" && typeof (obj.pr) === "string" && (obj.lnurl == null || typeof (obj.lnurl) === "string") && (obj.successAction == null || (0, LNURL_1.isLNURLPaySuccessAction)(obj.successAction)) && (0, IToBTCSwap_1.isIToBTCSwapInit)(obj); } exports.isToBTCLNSwapInit = isToBTCLNSwapInit; class ToBTCLNSwap extends IToBTCSwap_1.IToBTCSwap { constructor(wrapper, initOrObj) { if (isToBTCLNSwapInit(initOrObj)) initOrObj.url += "/tobtcln"; super(wrapper, initOrObj); this.outputToken = Tokens_1.BitcoinTokens.BTCLN; this.TYPE = SwapType_1.SwapType.TO_BTCLN; if (!isToBTCLNSwapInit(initOrObj)) { this.confidence = initOrObj.confidence; this.pr = initOrObj.pr; this.lnurl = initOrObj.lnurl; this.successAction = initOrObj.successAction; this.secret = initOrObj.secret; } this.paymentHash = this.getPaymentHash().toString("hex"); this.logger = (0, Utils_1.getLogger)("ToBTCLN(" + this.getIdentifierHashString() + "): "); this.tryCalculateSwapFee(); } _setPaymentResult(result, check = false) { if (result == null) return Promise.resolve(false); if (result.secret == null) throw new IntermediaryError_1.IntermediaryError("No payment secret returned!"); if (check) { const secretBuffer = buffer_1.Buffer.from(result.secret, "hex"); const hash = buffer_1.Buffer.from((0, sha2_1.sha256)(secretBuffer)); if (!hash.equals(this.getPaymentHash())) throw new IntermediaryError_1.IntermediaryError("Invalid payment secret returned"); } this.secret = result.secret; return Promise.resolve(true); } ////////////////////////////// //// Amounts & fees getOutput() { const parsedPR = (0, bolt11_1.decode)(this.pr); const amount = (BigInt(parsedPR.millisatoshis) + 999n) / 1000n; return (0, Tokens_1.toTokenAmount)(amount, this.outputToken, this.wrapper.prices); } ////////////////////////////// //// Getters & utils getOutputTxId() { return this.getLpIdentifier(); } /** * Returns the lightning BOLT11 invoice where the BTC will be sent to */ getLightningInvoice() { return this.pr; } /** * Returns payment secret (pre-image) as a proof of payment */ getSecret() { return this.secret; } /** * Returns the confidence of the intermediary that this payment will succeed * Value between 0 and 1, where 0 is not likely and 1 is very likely */ getConfidence() { return this.confidence; } getIdentifierHash() { const paymentHashBuffer = this.getPaymentHash(); if (this.randomNonce == null) return paymentHashBuffer; return buffer_1.Buffer.concat([paymentHashBuffer, buffer_1.Buffer.from(this.randomNonce, "hex")]); } getPaymentHash() { if (this.pr == null) return null; const parsed = (0, bolt11_1.decode)(this.pr); return buffer_1.Buffer.from(parsed.tagsObject.payment_hash, "hex"); } getLpIdentifier() { if (this.pr == null) return null; const parsed = (0, bolt11_1.decode)(this.pr); return parsed.tagsObject.payment_hash; } getRecipient() { return this.lnurl ?? this.pr; } ////////////////////////////// //// LNURL-pay /** * Is this an LNURL-pay swap? */ isLNURL() { return this.lnurl != null; } /** * Gets the used LNURL or null if this is not an LNURL-pay swap */ getLNURL() { return this.lnurl; } /** * Checks whether this LNURL payment contains a success message */ hasSuccessAction() { return this.successAction != null; } /** * Returns the success action after a successful payment, else null */ getSuccessAction() { return LNURL_1.LNURL.decodeSuccessAction(this.successAction, this.secret); } ////////////////////////////// //// Storage serialize() { return { ...super.serialize(), paymentHash: this.getPaymentHash().toString("hex"), pr: this.pr, confidence: this.confidence, secret: this.secret, lnurl: this.lnurl, successAction: this.successAction }; } } exports.ToBTCLNSwap = ToBTCLNSwap;