UNPKG

@atomic-utils/contract

Version:
87 lines 4.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PremiumCalculator = exports.buildDualFundingTxFinalizer = void 0; const core_1 = require("@node-dlc/core"); const messaging_1 = require("@node-dlc/messaging"); const p2wpkhSPK = Buffer.from('0014663117d27e78eb432505180654e603acb30e8a4a', 'hex'); /** * Build a DualFundingTxFinalizer, which is used to * help calculate contract premium after network fees (assuming 1 funding input for both parties) * * @param feeRate * @returns DualFundingTxFinalizer */ const buildDualFundingTxFinalizer = (feeRate) => { if (feeRate < 0) { throw new Error('Fee rate must be non-negative'); } const fundingInput = new messaging_1.FundingInputV0(); fundingInput.maxWitnessLen = 108; fundingInput.redeemScript = Buffer.from([]); // assuming 1 utxo for funding const finalizer = new core_1.DualFundingTxFinalizer([fundingInput], p2wpkhSPK, p2wpkhSPK, [fundingInput], p2wpkhSPK, p2wpkhSPK, BigInt(feeRate)); return finalizer; }; exports.buildDualFundingTxFinalizer = buildDualFundingTxFinalizer; class PremiumCalculator { constructor(feeConfig) { this.feeConfig = feeConfig; /** * Calculates the premium received by the contract offeror after fees. * * If network fees exceed the fee collected by the service provider, no service fees are applied. * * @param premium premium received by the contract offeror in sats * @param feeRate sat/byte fee rate * @returns */ this.calculatePostFeePremium = (premium, feeRate) => { const finalizer = (0, exports.buildDualFundingTxFinalizer)(feeRate); const acceptFees = finalizer.acceptFees, offerFees = finalizer.offerFees; const mmPremium = BigInt(Math.floor(premium * (1 - this.feeConfig.mmDiscount))) - acceptFees - offerFees; const maxPremium = BigInt(Math.floor(premium * (1 - (this.feeConfig.mmDiscount + this.feeConfig.serviceFees)))); const actualPremium = mmPremium > maxPremium ? maxPremium : mmPremium; return Number(actualPremium); }; /** * Calculates the premium received by the contract offeror before fees. * * @param premium premium received by the contract offeror in sats * @param feeRate sat/byte fee rate * @returns */ this.calculatePreFeePremium = (premium, feeRate) => { const finalizer = (0, exports.buildDualFundingTxFinalizer)(feeRate); const acceptFees = finalizer.acceptFees, offerFees = finalizer.offerFees; const premiumBeforeMmPremium = Number((premium + Number(acceptFees + offerFees)) / (1 - this.feeConfig.mmDiscount)); const premiumBeforeMaxPremium = Number(premium / (1 - (this.feeConfig.mmDiscount + this.feeConfig.serviceFees))); let postFeeMmPremium = 0, postFeeMaxPremium = 0; try { postFeeMmPremium = this.calculatePostFeePremium(premiumBeforeMmPremium, feeRate); } catch (e) { // Failed premiumBeforeMmPremium } try { postFeeMaxPremium = this.calculatePostFeePremium(premiumBeforeMaxPremium, feeRate); } catch (e) { // Failed premiumBeforeMaxPremium } switch (premium) { case postFeeMmPremium: return premiumBeforeMmPremium; case postFeeMaxPremium: return premiumBeforeMaxPremium; default: throw Error(`calculatePreFeePremium failed, could not find post fee premium. Premium: ${premium}, feeRate: ${feeRate}, premiumBeforeMmPremium: ${premiumBeforeMmPremium}, premiumBeforeMaxPremium ${premiumBeforeMaxPremium}`); } }; } } exports.PremiumCalculator = PremiumCalculator; //# sourceMappingURL=PremiumCalculator.js.map