From f7e383d7231190735c3a422827e162f485a73ab9 Mon Sep 17 00:00:00 2001 From: Max Polizzo Date: Thu, 1 Jun 2023 11:42:45 -0600 Subject: [PATCH] WIP: add toPre163 function to post-163 classes --wip-- [skip ci] --- .../lib/messages/CetAdaptorSignatures.ts | 10 ++++ .../lib/messages/ContractDescriptor.ts | 49 ++++++++++++++- .../messaging/lib/messages/ContractInfo.ts | 51 +++++++++++++++- packages/messaging/lib/messages/DlcAccept.ts | 24 ++++++++ packages/messaging/lib/messages/DlcCancel.ts | 19 ++++++ packages/messaging/lib/messages/DlcClose.ts | 37 ++++++++++++ packages/messaging/lib/messages/DlcInfo.ts | 27 +++++++++ packages/messaging/lib/messages/DlcOffer.ts | 23 ++++++++ packages/messaging/lib/messages/DlcSign.ts | 15 +++++ .../messaging/lib/messages/DlcTransactions.ts | 18 ++++++ .../messaging/lib/messages/FundingInput.ts | 13 ++++ .../lib/messages/FundingSignatures.ts | 10 ++++ .../lib/messages/NegotiationFields.ts | 36 +++++++++++ .../lib/messages/OracleIdentifier.ts | 23 ++++++++ packages/messaging/lib/messages/OracleInfo.ts | 22 ++++++- .../messaging/lib/messages/OrderAccept.ts | 28 +++++++++ .../messaging/lib/messages/OrderIrcInfo.ts | 19 ++++++ .../messaging/lib/messages/OrderMetadata.ts | 21 +++++++ .../lib/messages/OrderNegotiationFields.ts | 52 ++++++++++++++++ packages/messaging/lib/messages/OrderOffer.ts | 50 +++++++++++++++- .../lib/messages/PayoutCurvePiece.ts | 59 ++++++++++++++++++- .../messaging/lib/messages/PayoutFunction.ts | 44 +++++++++++++- .../lib/messages/RoundingIntervals.ts | 12 +++- .../messaging/lib/messages/ScriptWitness.ts | 18 ++++++ .../lib/messages/pre-163/NegotiationFields.ts | 2 +- .../lib/messages/pre-163/OrderOffer.ts | 1 - 26 files changed, 668 insertions(+), 15 deletions(-) diff --git a/packages/messaging/lib/messages/CetAdaptorSignatures.ts b/packages/messaging/lib/messages/CetAdaptorSignatures.ts index cfc918d3..e6eee79f 100644 --- a/packages/messaging/lib/messages/CetAdaptorSignatures.ts +++ b/packages/messaging/lib/messages/CetAdaptorSignatures.ts @@ -48,6 +48,16 @@ export class CetAdaptorSignatures implements IDlcMessage { return instance; } + public static toPre163( + cetSignatures: CetAdaptorSignatures, + ): CetAdaptorSignaturesV0Pre163 { + const instance = new CetAdaptorSignaturesV0Pre163(); + + instance.sigs = cetSignatures.sigs; + + return instance; + } + /** * The type for cet_adaptor_signature message. cet_adaptor_signature = 42774 */ diff --git a/packages/messaging/lib/messages/ContractDescriptor.ts b/packages/messaging/lib/messages/ContractDescriptor.ts index dc6febc6..33e3a74f 100644 --- a/packages/messaging/lib/messages/ContractDescriptor.ts +++ b/packages/messaging/lib/messages/ContractDescriptor.ts @@ -35,7 +35,7 @@ export abstract class ContractDescriptor { } } - public static from163( + public static fromPre163( contractDescriptor: ContractDescriptorPre163, ): ContractDescriptor { if (contractDescriptor instanceof ContractDescriptorV0Pre163) { @@ -49,6 +49,20 @@ export abstract class ContractDescriptor { } } + public static toPre163( + contractDescriptor: ContractDescriptor, + ): ContractDescriptorPre163 { + if (contractDescriptor instanceof EnumeratedContractDescriptor) { + return EnumeratedContractDescriptor.toPre163(contractDescriptor); + } else if (contractDescriptor instanceof NumericContractDescriptor) { + return NumericContractDescriptor.toPre163(contractDescriptor); + } else { + throw new Error( + 'Contract Descriptor must be EnumeratedContractDescriptor or NumericContractDescriptor', + ); + } + } + public abstract type: number; public abstract toJSON(): @@ -114,6 +128,21 @@ export class EnumeratedContractDescriptor return instance; } + public static toPre163( + contractDescriptor: EnumeratedContractDescriptor, + ): ContractDescriptorV0Pre163 { + const instance = new ContractDescriptorV0Pre163(); + + instance.outcomes = contractDescriptor.outcomes.map((outcome) => { + return { + outcome: Buffer.from(outcome.outcome, 'utf-8'), + localPayout: outcome.localPayout, + }; + }); + + return instance; + } + /** * The type for enumerated_contract_descriptor message */ @@ -201,7 +230,23 @@ export class NumericContractDescriptor instance.payoutFunction = PayoutFunction.fromPre163( contractDescriptor.payoutFunction, ); - instance.roundingIntervals = RoundingIntervals.from163( + instance.roundingIntervals = RoundingIntervals.fromPre163( + contractDescriptor.roundingIntervals, + ); + + return instance; + } + + public static toPre163( + contractDescriptor: NumericContractDescriptor, + ): ContractDescriptorV1Pre163 { + const instance = new ContractDescriptorV1Pre163(); + + instance.numDigits = contractDescriptor.numDigits; + instance.payoutFunction = PayoutFunction.toPre163( + contractDescriptor.payoutFunction, + ); + instance.roundingIntervals = RoundingIntervals.toPre163( contractDescriptor.roundingIntervals, ); diff --git a/packages/messaging/lib/messages/ContractInfo.ts b/packages/messaging/lib/messages/ContractInfo.ts index 166691d2..1e5a536e 100644 --- a/packages/messaging/lib/messages/ContractInfo.ts +++ b/packages/messaging/lib/messages/ContractInfo.ts @@ -63,6 +63,20 @@ export abstract class ContractInfo implements IDlcMessage { } } + public static toPre163( + contractInfo: ContractInfo, + ): ContractInfoV0Pre163 | ContractInfoV1Pre163 { + if (contractInfo instanceof SingleContractInfo) { + return SingleContractInfo.toPre163(contractInfo); + } else if (contractInfo instanceof DisjointContractInfo) { + return DisjointContractInfo.toPre163(contractInfo); + } else { + throw new Error( + 'ContractInfo must be SingleContractInfo or DisjointContractInfo', + ); + } + } + public abstract type: number; public abstract totalCollateral: bigint; @@ -109,7 +123,7 @@ export class SingleContractInfo extends ContractInfo implements IDlcMessage { const instance = new SingleContractInfo(); instance.totalCollateral = contractInfo.totalCollateral; - instance.contractDescriptor = ContractDescriptor.from163( + instance.contractDescriptor = ContractDescriptor.fromPre163( contractInfo.contractDescriptor, ); instance.oracleInfo = OracleInfo.fromPre163(contractInfo.oracleInfo); @@ -117,6 +131,20 @@ export class SingleContractInfo extends ContractInfo implements IDlcMessage { return instance; } + public static toPre163( + contractInfo: SingleContractInfo, + ): ContractInfoV0Pre163 { + const instance = new ContractInfoV0Pre163(); + + instance.totalCollateral = contractInfo.totalCollateral; + instance.contractDescriptor = ContractDescriptor.toPre163( + contractInfo.contractDescriptor, + ); + instance.oracleInfo = OracleInfo.toPre163(contractInfo.oracleInfo); + + return instance; + } + /** * The type for single_contract_info message. */ @@ -273,7 +301,7 @@ export class DisjointContractInfo implements IDlcMessage { contractInfo.contractOraclePairs.forEach((oraclePair) => { instance.contractOraclePairs.push({ - contractDescriptor: ContractDescriptor.from163( + contractDescriptor: ContractDescriptor.fromPre163( oraclePair.contractDescriptor, ), oracleInfo: OracleInfo.fromPre163(oraclePair.oracleInfo), @@ -283,6 +311,25 @@ export class DisjointContractInfo implements IDlcMessage { return instance; } + public static toPre163( + contractInfo: DisjointContractInfo, + ): ContractInfoV1Pre163 { + const instance = new ContractInfoV1Pre163(); + + instance.totalCollateral = contractInfo.totalCollateral; + + contractInfo.contractOraclePairs.forEach((oraclePair) => { + instance.contractOraclePairs.push({ + contractDescriptor: ContractDescriptor.toPre163( + oraclePair.contractDescriptor, + ), + oracleInfo: OracleInfo.toPre163(oraclePair.oracleInfo), + }); + }); + + return instance; + } + /** * The type for contract_info_v1 message. contract_info_v0 = 55342 */ diff --git a/packages/messaging/lib/messages/DlcAccept.ts b/packages/messaging/lib/messages/DlcAccept.ts index d01295ec..c3cdcf8a 100644 --- a/packages/messaging/lib/messages/DlcAccept.ts +++ b/packages/messaging/lib/messages/DlcAccept.ts @@ -127,6 +127,30 @@ export class DlcAcceptV0 extends DlcAccept implements IDlcMessage { return instance; } + public static toPre163(accept: DlcAcceptV0): DlcAcceptV0Pre163 { + const instance = new DlcAcceptV0Pre163(); + + instance.tempContractId = accept.temporaryContractId; + instance.acceptCollateralSatoshis = accept.acceptCollateral; + instance.fundingPubKey = accept.fundingPubKey; + instance.payoutSPK = accept.payoutSPK; + instance.payoutSerialId = accept.payoutSerialId; + instance.fundingInputs = accept.fundingInputs.map((input) => + FundingInput.toPre163(input), + ); + instance.changeSPK = accept.changeSPK; + instance.changeSerialId = accept.changeSerialId; + instance.cetSignatures = CetAdaptorSignatures.toPre163( + accept.cetSignatures, + ); + instance.refundSignature = accept.refundSignature; + instance.negotiationFields = NegotiationFields.toPre163( + accept.negotiationFields, + ); + + return instance; + } + /** * The type for accept_channel message. accept_channel = 33 */ diff --git a/packages/messaging/lib/messages/DlcCancel.ts b/packages/messaging/lib/messages/DlcCancel.ts index c29db715..5de4adbe 100644 --- a/packages/messaging/lib/messages/DlcCancel.ts +++ b/packages/messaging/lib/messages/DlcCancel.ts @@ -3,6 +3,7 @@ import assert from 'assert'; import { MessageType } from '../MessageType'; import { IDlcMessage } from './DlcMessage'; +import { DlcCancelV0Pre163 } from './pre-163/DlcCancel'; export abstract class DlcCancel { public static deserialize(reader: Buffer | BufferReader): DlcCancelV0 { @@ -50,6 +51,24 @@ export class DlcCancelV0 extends DlcCancel implements IDlcMessage { return instance; } + public static fromPre163(cancel: DlcCancelV0Pre163): DlcCancelV0 { + const instance = new DlcCancelV0(); + + instance.contractId = cancel.contractId; + instance.cancelType = cancel.cancelType; + + return instance; + } + + public static toPre163(cancel: DlcCancelV0): DlcCancelV0Pre163 { + const instance = new DlcCancelV0Pre163(); + + instance.contractId = cancel.contractId; + instance.cancelType = cancel.cancelType; + + return instance; + } + /** * The type for cancel_dlc_v0 message. cancel_dlc_v0 = 52172 */ diff --git a/packages/messaging/lib/messages/DlcClose.ts b/packages/messaging/lib/messages/DlcClose.ts index 49bedf14..d73494d9 100644 --- a/packages/messaging/lib/messages/DlcClose.ts +++ b/packages/messaging/lib/messages/DlcClose.ts @@ -7,6 +7,7 @@ import { FundingInput, IFundingInputJSON } from './FundingInput'; import { FundingSignatures, IFundingSignaturesJSON } from './FundingSignatures'; import { getTlv } from "../serialize/getTlv"; import { deserializeTlv, ITlv, serializeTlv } from "../serialize/deserializeTlv"; +import { DlcCloseV0Pre163 } from "./pre-163/DlcClose"; export abstract class DlcClose { public static deserialize(reader: Buffer | BufferReader): DlcCloseV0 { @@ -71,6 +72,42 @@ export class DlcCloseV0 extends DlcClose implements IDlcMessage { return instance; } + public static fromPre163(cancel: DlcCloseV0Pre163): DlcCloseV0 { + const instance = new DlcCloseV0(); + + instance.contractId = cancel.contractId; + instance.closeSignature = cancel.closeSignature; + instance.offerPayoutSatoshis = cancel.offerPayoutSatoshis; + instance.acceptPayoutSatoshis = cancel.acceptPayoutSatoshis; + instance.fundInputSerialId = cancel.fundInputSerialId; + cancel.fundingInputs.forEach((fundingInput) => { + instance.fundingInputs.push(FundingInput.fromPre163(fundingInput)); + }); + instance.fundingSignatures = FundingSignatures.fromPre163( + cancel.fundingSignatures, + ); + + return instance; + } + + public static toPre163(cancel: DlcCloseV0): DlcCloseV0Pre163 { + const instance = new DlcCloseV0Pre163(); + + instance.contractId = cancel.contractId; + instance.closeSignature = cancel.closeSignature; + instance.offerPayoutSatoshis = cancel.offerPayoutSatoshis; + instance.acceptPayoutSatoshis = cancel.acceptPayoutSatoshis; + instance.fundInputSerialId = cancel.fundInputSerialId; + cancel.fundingInputs.forEach((fundingInput) => { + instance.fundingInputs.push(FundingInput.toPre163(fundingInput)); + }); + instance.fundingSignatures = FundingSignatures.toPre163( + cancel.fundingSignatures, + ); + + return instance; + } + /** * The type for close_dlc_v0 message. close_dlc_v0 = 52170 // TODO */ diff --git a/packages/messaging/lib/messages/DlcInfo.ts b/packages/messaging/lib/messages/DlcInfo.ts index 905423e2..43155817 100644 --- a/packages/messaging/lib/messages/DlcInfo.ts +++ b/packages/messaging/lib/messages/DlcInfo.ts @@ -3,6 +3,7 @@ import assert from 'assert'; import { MessageType } from '../MessageType'; import { IDlcMessage } from './DlcMessage'; +import { DlcInfoV0Pre163 } from './pre-163/DlcInfo'; export abstract class DlcInfo { public static deserialize(reader: Buffer | BufferReader): DlcInfoV0 { @@ -52,6 +53,32 @@ export class DlcInfoV0 extends DlcInfo implements IDlcMessage { return instance; } + public static fromPre163(cancel: DlcInfoV0Pre163): DlcInfoV0 { + const instance = new DlcInfoV0(); + + instance.numDlcOffers = cancel.numDlcOffers; + instance.numDlcAccepts = cancel.numDlcAccepts; + instance.numDlcSigns = cancel.numDlcSigns; + instance.numDlcCancels = cancel.numDlcCancels; + instance.numDlcCloses = cancel.numDlcCloses; + instance.numDlcTransactions = cancel.numDlcTransactions; + + return instance; + } + + public static toPre163(cancel: DlcInfoV0): DlcInfoV0Pre163 { + const instance = new DlcInfoV0Pre163(); + + instance.numDlcOffers = cancel.numDlcOffers; + instance.numDlcAccepts = cancel.numDlcAccepts; + instance.numDlcSigns = cancel.numDlcSigns; + instance.numDlcCancels = cancel.numDlcCancels; + instance.numDlcCloses = cancel.numDlcCloses; + instance.numDlcTransactions = cancel.numDlcTransactions; + + return instance; + } + /** * The type for dlc_info_v0 message */ diff --git a/packages/messaging/lib/messages/DlcOffer.ts b/packages/messaging/lib/messages/DlcOffer.ts index 8225d6a9..db583d5d 100644 --- a/packages/messaging/lib/messages/DlcOffer.ts +++ b/packages/messaging/lib/messages/DlcOffer.ts @@ -131,6 +131,29 @@ export class DlcOfferV0 extends DlcOffer implements IDlcMessage { return instance; } + public static toPre163(offer: DlcOfferV0): DlcOfferV0Pre163 { + const instance = new DlcOfferV0Pre163(); + + instance.contractFlags = Buffer.from(offer.contractFlags.toString()); + instance.chainHash = offer.chainHash; + instance.contractInfo = ContractInfo.toPre163(offer.contractInfo); + instance.fundingPubKey = offer.fundingPubKey; + instance.payoutSPK = offer.payoutSPK; + instance.payoutSerialId = offer.payoutSerialId; + instance.offerCollateralSatoshis = offer.offerCollateral; + instance.fundingInputs = offer.fundingInputs.map((input) => + FundingInput.toPre163(input), + ); + instance.changeSPK = offer.changeSPK; + instance.changeSerialId = offer.changeSerialId; + instance.fundOutputSerialId = offer.fundOutputSerialId; + instance.feeRatePerVb = offer.feeRatePerVb; + instance.cetLocktime = offer.cetLocktime; + instance.refundLocktime = offer.refundLocktime; + + return instance; + } + /** * The type for offer_dlc_v0 message. offer_dlc_v0 = 42778 */ diff --git a/packages/messaging/lib/messages/DlcSign.ts b/packages/messaging/lib/messages/DlcSign.ts index 1853607e..9be93d2e 100644 --- a/packages/messaging/lib/messages/DlcSign.ts +++ b/packages/messaging/lib/messages/DlcSign.ts @@ -88,6 +88,21 @@ export class DlcSignV0 extends DlcSign implements IDlcMessage { return instance; } + public static toPre163(sign: DlcSignV0): DlcSignV0Pre163 { + const instance = new DlcSignV0Pre163(); + + instance.contractId = sign.contractId; + instance.cetSignatures = CetAdaptorSignatures.toPre163( + sign.cetSignatures, + ); + instance.refundSignature = sign.refundSignature; + instance.fundingSignatures = FundingSignatures.toPre163( + sign.fundingSignatures, + ); + + return instance; + } + /** * The type for sign_dlc_v0 message. sign_dlc_v0 = 42782 */ diff --git a/packages/messaging/lib/messages/DlcTransactions.ts b/packages/messaging/lib/messages/DlcTransactions.ts index 9ea08f44..26ff8a6e 100644 --- a/packages/messaging/lib/messages/DlcTransactions.ts +++ b/packages/messaging/lib/messages/DlcTransactions.ts @@ -120,6 +120,24 @@ export class DlcTransactionsV0 extends DlcTransactions implements IDlcMessage { return instance; } + public static toPre163(dlcTxs: DlcTransactionsV0): DlcTransactionsV0Pre163 { + const instance = new DlcTransactionsV0Pre163(); + + instance.contractId = dlcTxs.contractId; + instance.fundTx = dlcTxs.fundTx; + instance.fundTxVout = dlcTxs.fundTxVout; + instance.fundEpoch = dlcTxs.fundEpoch; + instance.fundBroadcastHeight = dlcTxs.fundBroadcastHeight; + instance.refundTx = dlcTxs.refundTx; + instance.cets = dlcTxs.cets; + instance.closeEpoch = dlcTxs.closeEpoch; + instance.closeTxHash = dlcTxs.closeTxHash; + instance.closeType = dlcTxs.closeType; + instance.closeBroadcastHeight = dlcTxs.closeBroadcastHeight; + + return instance; + } + /** * The type for offer_dlc_v0 message. offer_dlc_v0 = 42778 */ diff --git a/packages/messaging/lib/messages/FundingInput.ts b/packages/messaging/lib/messages/FundingInput.ts index 879b805a..e2f5a235 100644 --- a/packages/messaging/lib/messages/FundingInput.ts +++ b/packages/messaging/lib/messages/FundingInput.ts @@ -49,6 +49,19 @@ export class FundingInput implements IDlcMessage { return instance; } + public static toPre163(fundingInput: FundingInput): FundingInputV0Pre163 { + const instance = new FundingInputV0Pre163(); + + instance.inputSerialId = fundingInput.inputSerialId; + instance.prevTx = fundingInput.prevTx; + instance.prevTxVout = fundingInput.prevTxVout; + instance.sequence = fundingInput.sequence; + instance.maxWitnessLen = fundingInput.maxWitnessLen; + instance.redeemScript = fundingInput.redeemScript; + + return instance; + } + /** * The type for funding_input_v0 message. funding_input_v0 = 42772 */ diff --git a/packages/messaging/lib/messages/FundingSignatures.ts b/packages/messaging/lib/messages/FundingSignatures.ts index e966c32f..973ae4ef 100644 --- a/packages/messaging/lib/messages/FundingSignatures.ts +++ b/packages/messaging/lib/messages/FundingSignatures.ts @@ -43,6 +43,16 @@ export class FundingSignatures implements IDlcMessage { return instance; } + public static toPre163( + fundingSignatures: FundingSignatures, + ): FundingSignaturesV0Pre163 { + const instance = new FundingSignaturesV0Pre163(); + + instance.witnessElements = fundingSignatures.witnessElements; + + return instance; + } + /** * The type for funding_signatures_v0 message. funding_signatures_v0 = 42776 */ diff --git a/packages/messaging/lib/messages/NegotiationFields.ts b/packages/messaging/lib/messages/NegotiationFields.ts index 3d62ff96..cb164312 100644 --- a/packages/messaging/lib/messages/NegotiationFields.ts +++ b/packages/messaging/lib/messages/NegotiationFields.ts @@ -52,6 +52,20 @@ export abstract class NegotiationFields { } } + public static toPre163( + negotiationFields: NegotiationFields, + ): NegotiationFieldsPre163 { + if (negotiationFields instanceof SingleNegotiationFields) { + return SingleNegotiationFields.toPre163(negotiationFields); + } else if (negotiationFields instanceof DisjointNegotiationFields) { + return DisjointNegotiationFields.toPre163(negotiationFields); + } else { + throw new Error( + 'Negotiation fields must be SingleNegotiationFields or DisjointNegotiationFields', + ); + } + } + public abstract type: number; public abstract toJSON(): @@ -99,6 +113,16 @@ export class SingleNegotiationFields return instance; } + public static toPre163( + negotiationFields: SingleNegotiationFields, + ): NegotiationFieldsV1Pre163 { + const instance = new NegotiationFieldsV1Pre163(); + + instance.roundingIntervals = negotiationFields.roundingIntervals; + + return instance; + } + /** * The type for negotiation_fields_v1 message. negotiation_fields_v1 = 55336 */ @@ -177,6 +201,18 @@ export class DisjointNegotiationFields return instance; } + public static toPre163( + negotiationFields: DisjointNegotiationFields, + ): NegotiationFieldsV2Pre163 { + const instance = new NegotiationFieldsV2Pre163(); + + instance.negotiationFieldsList = negotiationFields.negotiationFieldsList.map( + NegotiationFields.toPre163, + ); + + return instance; + } + /** * The type for negotiation_fields_v2 message. negotiation_fields_v2 = 55346 */ diff --git a/packages/messaging/lib/messages/OracleIdentifier.ts b/packages/messaging/lib/messages/OracleIdentifier.ts index dfcd6a35..03332f4d 100644 --- a/packages/messaging/lib/messages/OracleIdentifier.ts +++ b/packages/messaging/lib/messages/OracleIdentifier.ts @@ -3,6 +3,7 @@ import assert from 'assert'; import { MessageType } from '../MessageType'; import { IDlcMessage } from './DlcMessage'; +import { OracleIdentifierV0Pre163 } from './pre-163/OracleIdentifier'; export class OracleIdentifierV0 implements IDlcMessage { public static type = MessageType.OracleIdentifierV0; @@ -26,6 +27,28 @@ export class OracleIdentifierV0 implements IDlcMessage { return instance; } + public static fromPre163( + oracleId: OracleIdentifierV0Pre163, + ): OracleIdentifierV0 { + const instance = new OracleIdentifierV0(); + + instance.oracleName = oracleId.oracleName; + instance.oraclePubkey = oracleId.oraclePubkey; + + return instance; + } + + public static toPre163( + oracleId: OracleIdentifierV0, + ): OracleIdentifierV0Pre163 { + const instance = new OracleIdentifierV0Pre163(); + + instance.oracleName = oracleId.oracleName; + instance.oraclePubkey = oracleId.oraclePubkey; + + return instance; + } + /** * The type for oracle_identifier message. oracle_identifier = 61472 */ diff --git a/packages/messaging/lib/messages/OracleInfo.ts b/packages/messaging/lib/messages/OracleInfo.ts index aed09b04..b4813087 100644 --- a/packages/messaging/lib/messages/OracleInfo.ts +++ b/packages/messaging/lib/messages/OracleInfo.ts @@ -38,9 +38,17 @@ export abstract class OracleInfo implements IDlcMessage { public static fromPre163(oracleInfo: OracleInfoV0Pre163): OracleInfo { if (oracleInfo instanceof OracleInfoV0Pre163) { - return SingleOracleInfo.from163(oracleInfo); + return SingleOracleInfo.fromPre163(oracleInfo); } else { - throw new Error('fromPre163 only suports OracleInfoV0'); + throw new Error('fromPre163 only supports OracleInfoV0'); + } + } + + public static toPre163(oracleInfo: OracleInfo): OracleInfoV0Pre163 { + if (oracleInfo instanceof SingleOracleInfo) { + return SingleOracleInfo.toPre163(oracleInfo); + } else { + throw new Error('toPre163 only supports SingleOracleInfo'); } } @@ -80,7 +88,7 @@ export class SingleOracleInfo extends OracleInfo implements IDlcMessage { return instance; } - public static from163(oracleInfo: OracleInfoV0Pre163): SingleOracleInfo { + public static fromPre163(oracleInfo: OracleInfoV0Pre163): SingleOracleInfo { const instance = new SingleOracleInfo(); instance.announcement = oracleInfo.announcement; @@ -88,6 +96,14 @@ export class SingleOracleInfo extends OracleInfo implements IDlcMessage { return instance; } + public static toPre163(oracleInfo: SingleOracleInfo): OracleInfoV0Pre163 { + const instance = new OracleInfoV0Pre163(); + + instance.announcement = oracleInfo.announcement; + + return instance; + } + /** * The type for oracle_info_v0 message. oracle_info_v0 = 42770 */ diff --git a/packages/messaging/lib/messages/OrderAccept.ts b/packages/messaging/lib/messages/OrderAccept.ts index be14370b..0f3b7465 100644 --- a/packages/messaging/lib/messages/OrderAccept.ts +++ b/packages/messaging/lib/messages/OrderAccept.ts @@ -9,6 +9,7 @@ import { } from './OrderNegotiationFields'; import { getTlv } from "../serialize/getTlv"; import { deserializeTlv, ITlv, serializeTlv } from "../serialize/deserializeTlv"; +import { OrderAcceptV0Pre163 } from './pre-163/OrderAccept'; export abstract class OrderAccept { public static deserialize(reader: Buffer | BufferReader): OrderAccept { @@ -70,6 +71,33 @@ export class OrderAcceptV0 extends OrderAccept implements IDlcMessage { return instance; } + public static fromPre163(accept: OrderAcceptV0Pre163): OrderAcceptV0 { + const instance = new OrderAcceptV0(); + + instance.protocolVersion = 1; + instance.tempOrderId = accept.tempOrderId; + instance.negotiationFields = OrderNegotiationFields.fromPre163( + accept.negotiationFields, + ); + + return instance; + } + + public static toPre163( + accept: OrderAcceptV0, + chainHash: string, + ): OrderAcceptV0Pre163 { + const instance = new OrderAcceptV0Pre163(); + + instance.tempOrderId = accept.tempOrderId; + instance.negotiationFields = OrderNegotiationFields.toPre163( + accept.negotiationFields, + chainHash, + ); + + return instance; + } + /** * The type for order_accept_v0 message. order_accept_v0 = 62772 */ diff --git a/packages/messaging/lib/messages/OrderIrcInfo.ts b/packages/messaging/lib/messages/OrderIrcInfo.ts index 3f701a93..7a72c9d3 100644 --- a/packages/messaging/lib/messages/OrderIrcInfo.ts +++ b/packages/messaging/lib/messages/OrderIrcInfo.ts @@ -3,6 +3,7 @@ import assert from 'assert'; import { MessageType } from '../MessageType'; import { IDlcMessage } from './DlcMessage'; +import { OrderIrcInfoV0Pre163 } from './pre-163/OrderIrcInfo'; export abstract class OrderIrcInfo { public static deserialize(reader: Buffer | BufferReader): OrderIrcInfo { @@ -56,6 +57,24 @@ export class OrderIrcInfoV0 extends OrderIrcInfo implements IDlcMessage { return instance; } + public static fromPre163(ircInfo: OrderIrcInfoV0Pre163): OrderIrcInfoV0 { + const instance = new OrderIrcInfoV0(); + + instance.nick = ircInfo.nick; + instance.pubKey = ircInfo.pubKey; + + return instance; + } + + public static toPre163(ircInfo: OrderIrcInfoV0): OrderIrcInfoV0Pre163 { + const instance = new OrderIrcInfoV0Pre163(); + + instance.nick = ircInfo.nick; + instance.pubKey = ircInfo.pubKey; + + return instance; + } + /** * The type for order_metadata_v0 message. order_metadata_v0 = 62774 */ diff --git a/packages/messaging/lib/messages/OrderMetadata.ts b/packages/messaging/lib/messages/OrderMetadata.ts index 8f4ce89e..2d7d1cde 100644 --- a/packages/messaging/lib/messages/OrderMetadata.ts +++ b/packages/messaging/lib/messages/OrderMetadata.ts @@ -3,6 +3,7 @@ import assert from 'assert'; import { MessageType } from '../MessageType'; import { IDlcMessage } from './DlcMessage'; +import { OrderMetadataV0Pre163 } from "./pre-163/OrderMetadata"; export abstract class OrderMetadata { public static deserialize(reader: Buffer | BufferReader): OrderMetadata { @@ -59,6 +60,26 @@ export class OrderMetadataV0 extends OrderMetadata implements IDlcMessage { return instance; } + public static fromPre163(metadata: OrderMetadataV0Pre163): OrderMetadataV0 { + const instance = new OrderMetadataV0(); + + instance.offerId = metadata.offerId; + instance.createdAt = metadata.createdAt; + instance.goodTill = metadata.goodTill; + + return instance; + } + + public static toPre163(metadata: OrderMetadataV0): OrderMetadataV0Pre163 { + const instance = new OrderMetadataV0Pre163(); + + instance.offerId = metadata.offerId; + instance.createdAt = metadata.createdAt; + instance.goodTill = metadata.goodTill; + + return instance; + } + /** * The type for order_metadata_v0 message. order_metadata_v0 = 62774 */ diff --git a/packages/messaging/lib/messages/OrderNegotiationFields.ts b/packages/messaging/lib/messages/OrderNegotiationFields.ts index 9ebac2ea..1aa38908 100644 --- a/packages/messaging/lib/messages/OrderNegotiationFields.ts +++ b/packages/messaging/lib/messages/OrderNegotiationFields.ts @@ -6,6 +6,9 @@ import { ISingleContractInfoJSON, } from './ContractInfo'; import { IDlcMessage } from './DlcMessage'; +import { OrderNegotiationFieldsPre163, OrderNegotiationFieldsV1Pre163 } from "./pre-163/OrderNegotiationFields"; +import { MessageType } from '../MessageType'; +import { OrderOfferV0Pre163 } from "./pre-163/OrderOffer"; /** * OrderNegotiationFields V1 contains preferences of the acceptor of an order @@ -32,6 +35,55 @@ export class OrderNegotiationFields implements IDlcMessage { return instance; } + public static fromPre163( + orderNegociationFields: OrderNegotiationFieldsPre163, + ): OrderNegotiationFields { + const instance = new OrderNegotiationFields(); + switch (orderNegociationFields.type) { + case MessageType.OrderNegotiationFieldsV1: + instance.contractInfo = ContractInfo.fromPre163( + ((orderNegociationFields as OrderNegotiationFieldsV1Pre163) + .orderOffer as OrderOfferV0Pre163).contractInfo, + ); + instance.offerCollateral = ((orderNegociationFields as OrderNegotiationFieldsV1Pre163) + .orderOffer as OrderOfferV0Pre163).offerCollateralSatoshis; + instance.feeRatePerVb = ((orderNegociationFields as OrderNegotiationFieldsV1Pre163) + .orderOffer as OrderOfferV0Pre163).feeRatePerVb; + instance.cetLocktime = ((orderNegociationFields as OrderNegotiationFieldsV1Pre163) + .orderOffer as OrderOfferV0Pre163).cetLocktime; + instance.refundLocktime = ((orderNegociationFields as OrderNegotiationFieldsV1Pre163) + .orderOffer as OrderOfferV0Pre163).refundLocktime; + break; + default: + throw new Error( + `OrderNegotiationFields type must be OrderNegotiationFieldsV1`, + ); + } + + return instance; + } + + public static toPre163( + orderNegociationFields: OrderNegotiationFields, + chainHash: string, + ): OrderNegotiationFieldsV1Pre163 { + const instance = new OrderNegotiationFieldsV1Pre163(); + + const orderOffer = new OrderOfferV0Pre163(); + orderOffer.chainHash = Buffer.from(chainHash, 'hex'); + orderOffer.contractInfo = ContractInfo.toPre163( + orderNegociationFields.contractInfo, + ); + orderOffer.offerCollateralSatoshis = orderNegociationFields.offerCollateral; + orderOffer.feeRatePerVb = orderNegociationFields.feeRatePerVb; + orderOffer.cetLocktime = orderNegociationFields.cetLocktime; + orderOffer.refundLocktime = orderNegociationFields.refundLocktime; + + instance.orderOffer = orderOffer; + + return instance; + } + public contractInfo: ContractInfo; public offerCollateral: bigint; diff --git a/packages/messaging/lib/messages/OrderOffer.ts b/packages/messaging/lib/messages/OrderOffer.ts index 0b58ab6c..8a456473 100644 --- a/packages/messaging/lib/messages/OrderOffer.ts +++ b/packages/messaging/lib/messages/OrderOffer.ts @@ -3,7 +3,11 @@ import assert from 'assert'; import { IOrderMetadataJSON } from '..'; import { MessageType } from '../MessageType'; -import { deserializeTlv, ITlv, serializeTlv } from "../serialize/deserializeTlv"; +import { + deserializeTlv, + ITlv, + serializeTlv, +} from '../serialize/deserializeTlv'; import { getTlv } from '../serialize/getTlv'; import { validateBigInt, @@ -22,6 +26,9 @@ import { OrderIrcInfoV0, } from './OrderIrcInfo'; import { OrderMetadata, OrderMetadataV0 } from './OrderMetadata'; +import { OrderIrcInfoV0Pre163 } from './pre-163/OrderIrcInfo'; +import { OrderMetadataV0Pre163 } from './pre-163/OrderMetadata'; +import { OrderOfferV0Pre163 } from './pre-163/OrderOffer'; const LOCKTIME_THRESHOLD = 500000000; export abstract class OrderOffer { @@ -99,6 +106,47 @@ export class OrderOfferV0 extends OrderOffer implements IDlcMessage { return instance; } + public static fromPre163( + offer: OrderOfferV0Pre163, + contractFlags: number, + ): OrderOfferV0 { + const instance = new OrderOfferV0(); + instance.protocolVersion = 1; + instance.contractFlags = contractFlags; + instance.chainHash = offer.chainHash; + instance.contractInfo = ContractInfo.fromPre163(offer.contractInfo); + instance.offerCollateralSatoshis = offer.offerCollateralSatoshis; + instance.feeRatePerVb = offer.feeRatePerVb; + instance.cetLocktime = offer.cetLocktime; + instance.refundLocktime = offer.refundLocktime; + instance.metadata = OrderMetadataV0.fromPre163( + offer.metadata as OrderMetadataV0Pre163, + ); + instance.ircInfo = OrderIrcInfoV0.fromPre163( + offer.ircInfo as OrderIrcInfoV0Pre163, + ); + + return instance; + } + + public static toPre163(offer: OrderOfferV0): OrderOfferV0Pre163 { + const instance = new OrderOfferV0Pre163(); + instance.chainHash = offer.chainHash; + instance.contractInfo = ContractInfo.toPre163(offer.contractInfo); + instance.offerCollateralSatoshis = offer.offerCollateralSatoshis; + instance.feeRatePerVb = offer.feeRatePerVb; + instance.cetLocktime = offer.cetLocktime; + instance.refundLocktime = offer.refundLocktime; + instance.metadata = OrderMetadataV0.toPre163( + offer.metadata as OrderMetadataV0Pre163, + ); + instance.ircInfo = OrderIrcInfoV0.toPre163( + offer.ircInfo as OrderIrcInfoV0Pre163, + ); + + return instance; + } + /** * The type for order_offer_v0 message. order_offer_v0 = 62770 */ diff --git a/packages/messaging/lib/messages/PayoutCurvePiece.ts b/packages/messaging/lib/messages/PayoutCurvePiece.ts index 4d717d25..431154cc 100644 --- a/packages/messaging/lib/messages/PayoutCurvePiece.ts +++ b/packages/messaging/lib/messages/PayoutCurvePiece.ts @@ -1,6 +1,6 @@ import { BufferReader, BufferWriter } from '@node-lightning/bufio'; -import BigNumber from 'bignumber.js'; import assert from 'assert'; +import BigNumber from 'bignumber.js'; import { MessageType } from '../MessageType'; import { @@ -49,6 +49,20 @@ export abstract class PayoutCurvePiece { return PolynomialPayoutCurvePiece.fromPre163(payoutCurvePiece); } else if (payoutCurvePiece instanceof HyperbolaPayoutCurvePiecePre163) { return HyperbolaPayoutCurvePiece.fromPre163(payoutCurvePiece); + } else { + throw new Error( + 'Payout Curve Piece must be PolynomialPayoutCurvePiecePre163 or HyperbolaPayoutCurvePiecePre163', + ); + } + } + + public static toPre163( + payoutCurvePiece: PayoutCurvePiece, + ): PolynomialPayoutCurvePiecePre163 | HyperbolaPayoutCurvePiecePre163 { + if (payoutCurvePiece instanceof PolynomialPayoutCurvePiece) { + return PolynomialPayoutCurvePiece.toPre163(payoutCurvePiece); + } else if (payoutCurvePiece instanceof HyperbolaPayoutCurvePiece) { + return HyperbolaPayoutCurvePiece.toPre163(payoutCurvePiece); } else { throw new Error( 'Payout Curve Piece must be PolynomialPayoutCurvePiece or HyperbolaPayoutCurvePiece', @@ -123,6 +137,22 @@ export class PolynomialPayoutCurvePiece return instance; } + public static toPre163( + polynomialPayoutCurvePiece: PolynomialPayoutCurvePiece, + ): PolynomialPayoutCurvePiecePre163 { + const instance = new PolynomialPayoutCurvePiecePre163(); + + instance.points = polynomialPayoutCurvePiece.points.map((point) => { + return { + eventOutcome: point.eventOutcome, + outcomePayout: point.outcomePayout, + extraPrecision: point.extraPrecision, + }; + }); + + return instance; + } + /** * The type for polynomial_payout_curve_piece message. polynomial_payout_curve_piece = ??? */ @@ -180,6 +210,7 @@ export class HyperbolaPayoutCurvePiece extends PayoutCurvePiece implements IDlcMessage { public static type = PayoutCurvePieceType.HyperbolaPayoutCurvePiece; + public static points = [ 'translateOutcome', 'translatePayout', @@ -234,7 +265,6 @@ export class HyperbolaPayoutCurvePiece for (let i = 0; i < points.length; i++) { const point = points[i]; - const sign: boolean = hyperbolaPayoutCurvePiece[`${point}Sign`]; const value: bigint = hyperbolaPayoutCurvePiece[point]; const precision: number = @@ -246,6 +276,31 @@ export class HyperbolaPayoutCurvePiece return instance; } + public static toPre163( + hyperbolaPayoutCurvePiece: HyperbolaPayoutCurvePiece, + ): HyperbolaPayoutCurvePiecePre163 { + const instance = new HyperbolaPayoutCurvePiecePre163(); + + instance.usePositivePiece = hyperbolaPayoutCurvePiece.usePositivePiece; + + const points = HyperbolaPayoutCurvePiece.points; + + for (let i = 0; i < points.length; i++) { + const point = points[i]; + instance[`${point}Sign`] = hyperbolaPayoutCurvePiece[point].gt( + new BigNumber(0), + ); + instance[point] = BigInt( + hyperbolaPayoutCurvePiece[point].integerValue().toString(), + ); + instance[`${point}ExtraPrecision`] = getPrecision( + hyperbolaPayoutCurvePiece[point], + ); + } + + return instance; + } + /** * The type for hyperbola_payout_curve_piece message. hyperbola_payout_curve_piece = ??? */ diff --git a/packages/messaging/lib/messages/PayoutFunction.ts b/packages/messaging/lib/messages/PayoutFunction.ts index 6ebfb81c..a66f9302 100644 --- a/packages/messaging/lib/messages/PayoutFunction.ts +++ b/packages/messaging/lib/messages/PayoutFunction.ts @@ -6,8 +6,8 @@ import { MessageType } from '../MessageType'; import { IDlcMessage } from './DlcMessage'; import { IHyperbolaPayoutCurvePieceJSON, - PayoutCurvePiece, IPolynomialPayoutCurvePieceJSON, + PayoutCurvePiece, } from './PayoutCurvePiece'; import { PayoutFunctionV0Pre163 } from './pre-163/PayoutFunction'; @@ -50,7 +50,9 @@ export class PayoutFunction implements IDlcMessage { return instance; } - public static fromPre163(payoutFunction: PayoutFunctionV0Pre163): PayoutFunction { + public static fromPre163( + payoutFunction: PayoutFunctionV0Pre163, + ): PayoutFunction { const instance = new PayoutFunction(); const pieces = payoutFunction.pieces; @@ -90,6 +92,44 @@ export class PayoutFunction implements IDlcMessage { return instance; } + public static toPre163( + payoutFunction: PayoutFunction, + ): PayoutFunctionV0Pre163 { + const instance = new PayoutFunctionV0Pre163(); + + const pieces = payoutFunction.pieces; + + for (let i = 0; i < pieces.length; i++) { + if (i === 0) { + instance.endpoint0 = pieces[i].endPoint.eventOutcome; + instance.endpointPayout0 = pieces[i].endPoint.outcomePayout.sats; + instance.extraPrecision0 = pieces[i].endPoint.extraPrecision; + } else { + instance.pieces.push({ + payoutCurvePiece: PayoutCurvePiece.toPre163( + pieces[i - 1].payoutCurvePiece, + ), + endpoint: pieces[i].endPoint.eventOutcome, + endpointPayout: pieces[i].endPoint.outcomePayout.sats, + extraPrecision: pieces[i].endPoint.extraPrecision, + }); + } + } + + const lastPiece = pieces[pieces.length - 1]; + + instance.pieces.push({ + payoutCurvePiece: PayoutCurvePiece.toPre163( + lastPiece.payoutCurvePiece, + ), + endpoint: payoutFunction.lastEndpoint.eventOutcome, + endpointPayout: payoutFunction.lastEndpoint.outcomePayout.sats, + extraPrecision: payoutFunction.lastEndpoint.extraPrecision, + }); + + return instance; + } + /** * The type for payout_function_v0 message. payout_function_v0 = 42790 */ diff --git a/packages/messaging/lib/messages/RoundingIntervals.ts b/packages/messaging/lib/messages/RoundingIntervals.ts index 5eb31203..e0d6a3bd 100644 --- a/packages/messaging/lib/messages/RoundingIntervals.ts +++ b/packages/messaging/lib/messages/RoundingIntervals.ts @@ -27,7 +27,7 @@ export class RoundingIntervals implements IDlcMessage { return instance; } - public static from163( + public static fromPre163( roundingIntervals: RoundingIntervalsV0Pre163, ): RoundingIntervals { const instance = new RoundingIntervals(); @@ -37,6 +37,16 @@ export class RoundingIntervals implements IDlcMessage { return instance; } + public static toPre163( + roundingIntervals: RoundingIntervals, + ): RoundingIntervalsV0Pre163 { + const instance = new RoundingIntervalsV0Pre163(); + + instance.intervals = roundingIntervals.intervals; + + return instance; + } + /** * The type for rounding_intervals_v0 tlv. rounding_intervals_v0 = 42788 */ diff --git a/packages/messaging/lib/messages/ScriptWitness.ts b/packages/messaging/lib/messages/ScriptWitness.ts index 020a7549..31f48c42 100644 --- a/packages/messaging/lib/messages/ScriptWitness.ts +++ b/packages/messaging/lib/messages/ScriptWitness.ts @@ -1,5 +1,7 @@ import { BufferReader, BufferWriter } from '@node-lightning/bufio'; +import { ScriptWitnessV0Pre163 } from './pre-163/ScriptWitness'; + /** * ScriptWitness is the data for a witness element in a witness stack. * An empty witness_stack is an error, as every input must be Segwit. @@ -21,6 +23,22 @@ export class ScriptWitness { return instance; } + public static fromPre163(witness: ScriptWitnessV0Pre163): ScriptWitness { + const instance = new ScriptWitness(); + + instance.witness = witness.witness; + + return instance; + } + + public static toPre163(witness: ScriptWitness): ScriptWitnessV0Pre163 { + const instance = new ScriptWitnessV0Pre163(); + + instance.witness = witness.witness; + + return instance; + } + public static getWitness(reader: BufferReader): Buffer { const length = reader.readBigSize(); const body = reader.readBytes(Number(length)); diff --git a/packages/messaging/lib/messages/pre-163/NegotiationFields.ts b/packages/messaging/lib/messages/pre-163/NegotiationFields.ts index 13273468..e5c94e81 100644 --- a/packages/messaging/lib/messages/pre-163/NegotiationFields.ts +++ b/packages/messaging/lib/messages/pre-163/NegotiationFields.ts @@ -135,7 +135,7 @@ export class NegotiationFieldsV1Pre163 public length: bigint; - public roundingIntervals: RoundingIntervalsV0Pre163; + public roundingIntervals: RoundingIntervals; /** * Converts negotiation_fields_v1 to JSON diff --git a/packages/messaging/lib/messages/pre-163/OrderOffer.ts b/packages/messaging/lib/messages/pre-163/OrderOffer.ts index dcec4ac7..1e7cf590 100644 --- a/packages/messaging/lib/messages/pre-163/OrderOffer.ts +++ b/packages/messaging/lib/messages/pre-163/OrderOffer.ts @@ -22,7 +22,6 @@ import { } from './OrderIrcInfo'; import { IOrderMetadataV0Pre163JSON} from './OrderMetadata'; import { OrderMetadataPre163, OrderMetadataV0Pre163 } from './OrderMetadata'; -import {OrderNegotiationFieldsPre163} from "./OrderNegotiationFields"; const LOCKTIME_THRESHOLD = 500000000; export abstract class OrderOfferPre163 {