@atomic-utils/contract
Version:
87 lines • 4.08 kB
JavaScript
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
;