@node-dlc/core
Version:
74 lines • 4.35 kB
JavaScript
;
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