UNPKG

@node-dlc/core

Version:
74 lines 4.35 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getOptionInfoFromOffer = exports.getOptionInfoFromContractInfo = void 0; const messaging_1 = require("@node-dlc/messaging"); const bignumber_js_1 = __importDefault(require("bignumber.js")); const HyperbolaPayoutCurve_1 = require("../HyperbolaPayoutCurve"); const CoveredCall_1 = require("./CoveredCall"); const ShortPut_1 = require("./ShortPut"); function getOptionInfoFromContractInfo(_contractInfo) { if (_contractInfo.type !== messaging_1.MessageType.ContractInfoV0) throw Error('Only ContractInfoV0 currently supported'); const contractInfo = _contractInfo; if (contractInfo.contractDescriptor.type !== messaging_1.MessageType.ContractDescriptorV1) throw Error('Only ContractDescriptorV1 currently supported'); const oracleInfo = contractInfo.oracleInfo; const { eventMaturityEpoch } = oracleInfo.announcement.oracleEvent; const eventDescriptor = oracleInfo.announcement.oracleEvent .eventDescriptor; const { base: oracleBase, nbDigits: oracleDigits } = eventDescriptor; if (oracleInfo.announcement.oracleEvent.eventDescriptor.type !== messaging_1.MessageType.DigitDecompositionEventDescriptorV0) throw Error('Only DigitDecompositionEventDescriptorV0 currently supported'); const contractDescriptor = contractInfo.contractDescriptor; if (contractDescriptor.payoutFunction.type !== messaging_1.MessageType.PayoutFunctionV0) throw Error('Only PayoutFunctionV0 currently supported'); const payoutFunction = contractDescriptor.payoutFunction; if (payoutFunction.pieces.length === 0) throw Error('PayoutFunction must have at least once PayoutCurvePiece'); if (payoutFunction.pieces.length > 1) throw Error('More than one PayoutCurvePiece not supported'); const payoutCurvePiece = payoutFunction.pieces[0] .payoutCurvePiece; if (payoutCurvePiece.type !== messaging_1.MessageType.HyperbolaPayoutCurvePiece && payoutCurvePiece.type !== messaging_1.MessageType.OldHyperbolaPayoutCurvePiece) throw Error('Must be HyperbolaPayoutCurvePiece'); if (payoutCurvePiece.b !== BigInt(0) || payoutCurvePiece.c !== BigInt(0)) throw Error('b and c HyperbolaPayoutCurvePiece values must be 0'); const curve = HyperbolaPayoutCurve_1.HyperbolaPayoutCurve.fromPayoutCurvePiece(payoutCurvePiece); const maxOutcome = BigInt(new bignumber_js_1.default(oracleBase).pow(oracleDigits).minus(1).toString(10)); const isAscending = curve .getPayout(maxOutcome) .gt(Number(payoutFunction.endpointPayout0)); const expiry = new Date(eventMaturityEpoch * 1000); const totalCollateral = contractInfo.totalCollateral; // if curve is ascending, assume it is a put. const contractSize = isAscending ? payoutCurvePiece.translatePayout - totalCollateral : totalCollateral + payoutCurvePiece.translatePayout; const strikePrice = payoutCurvePiece.d / contractSize; // rebuild payout curve from option info and perform a sanity check const { payoutCurve: sanityCurve } = isAscending ? ShortPut_1.ShortPut.buildCurve(strikePrice, contractSize, totalCollateral, oracleBase, oracleDigits) : CoveredCall_1.CoveredCall.buildCurve(strikePrice, contractSize, oracleBase, oracleDigits); const type = isAscending ? 'put' : 'call'; if (!curve.equals(sanityCurve)) throw new Error('Payout curve built from extracted OptionInfo does not match original payout curve'); return { contractSize, strikePrice, expiry, type }; } exports.getOptionInfoFromContractInfo = getOptionInfoFromContractInfo; function getOptionInfoFromOffer(offer) { if (offer.type !== messaging_1.MessageType.DlcOfferV0 && offer.type !== messaging_1.MessageType.OrderOfferV0) throw Error('Only DlcOfferV0 and OrderOfferV0 currently supported'); const premium = offer.contractInfo.totalCollateral - offer.offerCollateralSatoshis; return { ...getOptionInfoFromContractInfo(offer.contractInfo), premium, }; } exports.getOptionInfoFromOffer = getOptionInfoFromOffer; //# sourceMappingURL=OptionInfo.js.map