Skip to content

Commit

Permalink
feat: add dlc msg containers (#212)
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewjablack authored Apr 4, 2024
1 parent cf3c935 commit 3376e17
Show file tree
Hide file tree
Showing 10 changed files with 408 additions and 9 deletions.
26 changes: 24 additions & 2 deletions packages/messaging/__tests__/messages/DlcAcceptV0.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import { BitcoinNetworks } from 'bitcoin-networks';
import { expect } from 'chai';

import { CetAdaptorSignaturesV0 } from '../../lib/messages/CetAdaptorSignaturesV0';
import { DlcAccept, DlcAcceptV0 } from '../../lib/messages/DlcAccept';
import {
DlcAccept,
DlcAcceptContainer,
DlcAcceptV0,
} from '../../lib/messages/DlcAccept';
import { FundingInputV0 } from '../../lib/messages/FundingInput';
import { NegotiationFields } from '../../lib/messages/NegotiationFields';
import { MessageType } from '../../lib/MessageType';
Expand Down Expand Up @@ -114,7 +118,7 @@ describe('DlcAccept', () => {

describe('deserialize', () => {
it('should throw if incorrect type', () => {
instance.type = 0x123;
instance.type = 0x123 as MessageType;
expect(function () {
DlcAccept.deserialize(instance.serialize());
}).to.throw(Error);
Expand Down Expand Up @@ -287,4 +291,22 @@ describe('DlcAccept', () => {
});
});
});

describe('DlcAcceptContainer', () => {
it('should serialize and deserialize', () => {
const dlcAccept = DlcAcceptV0.deserialize(dlcAcceptHex);
// swap payout and change spk to differentiate between dlcaccepts
const dlcAccept2 = DlcAcceptV0.deserialize(dlcAcceptHex);
dlcAccept2.payoutSPK = dlcAccept.changeSPK;
dlcAccept2.changeSPK = dlcAccept.payoutSPK;

const container = new DlcAcceptContainer();
container.addAccept(dlcAccept);
container.addAccept(dlcAccept2);

const instance = DlcAcceptContainer.deserialize(container.serialize());

expect(container.serialize()).to.deep.equal(instance.serialize());
});
});
});
21 changes: 20 additions & 1 deletion packages/messaging/__tests__/messages/DlcOfferV0.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { OrderPositionInfoV0 } from '../../lib';
import { ContractInfo } from '../../lib/messages/ContractInfo';
import {
DlcOffer,
DlcOfferContainer,
DlcOfferV0,
LOCKTIME_THRESHOLD,
} from '../../lib/messages/DlcOffer';
Expand Down Expand Up @@ -139,7 +140,7 @@ describe('DlcOffer', () => {

describe('deserialize', () => {
it('should throw if incorrect type', () => {
instance.type = 0x123;
instance.type = 0x123 as MessageType;
expect(function () {
DlcOffer.deserialize(instance.serialize());
}).to.throw(Error);
Expand Down Expand Up @@ -411,4 +412,22 @@ describe('DlcOffer', () => {
});
});
});

describe('DlcOfferContainer', () => {
it('should serialize and deserialize', () => {
const dlcOffer = DlcOfferV0.deserialize(dlcOfferHex);
// swap payout and change spk to differentiate between dlcoffers
const dlcOffer2 = DlcOfferV0.deserialize(dlcOfferHex);
dlcOffer2.payoutSPK = dlcOffer.changeSPK;
dlcOffer2.changeSPK = dlcOffer.payoutSPK;

const container = new DlcOfferContainer();
container.addOffer(dlcOffer);
container.addOffer(dlcOffer2);

const instance = DlcOfferContainer.deserialize(container.serialize());

expect(container.serialize()).to.deep.equal(instance.serialize());
});
});
});
37 changes: 32 additions & 5 deletions packages/messaging/__tests__/messages/DlcSignV0.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { expect } from 'chai';

import { MessageType } from '../../lib';
import { CetAdaptorSignaturesV0 } from '../../lib/messages/CetAdaptorSignaturesV0';
import { DlcSign, DlcSignV0 } from '../../lib/messages/DlcSign';
import {
DlcSign,
DlcSignContainer,
DlcSignV0,
} from '../../lib/messages/DlcSign';
import { FundingSignaturesV0 } from '../../lib/messages/FundingSignaturesV0';

describe('DlcSign', () => {
Expand All @@ -14,6 +19,11 @@ describe('DlcSign', () => {
'hex',
);

const contractId2 = Buffer.from(
'4946fe172de3778fa660b9858d0624044f4494667757f50388abe6fe523376e8',
'hex',
);

const cetAdaptorSignaturesV0 = Buffer.from(
'fda716' + // type cet_adaptor_signatures_v0
'fd01e7' + // length
Expand Down Expand Up @@ -44,7 +54,7 @@ describe('DlcSign', () => {
'hex',
);

const dlcAcceptHex = Buffer.concat([
const dlcSignHex = Buffer.concat([
type,
contractId,
cetAdaptorSignaturesV0,
Expand All @@ -67,7 +77,7 @@ describe('DlcSign', () => {

describe('deserialize', () => {
it('should throw if incorrect type', () => {
instance.type = 0x123;
instance.type = 0x123 as MessageType;
expect(function () {
DlcSign.deserialize(instance.serialize());
}).to.throw(Error);
Expand All @@ -84,14 +94,14 @@ describe('DlcSign', () => {
describe('serialize', () => {
it('serializes', () => {
expect(instance.serialize().toString('hex')).to.equal(
dlcAcceptHex.toString('hex'),
dlcSignHex.toString('hex'),
);
});
});

describe('deserialize', () => {
it('deserializes', () => {
const instance = DlcSignV0.deserialize(dlcAcceptHex);
const instance = DlcSignV0.deserialize(dlcSignHex);
expect(instance.contractId).to.deep.equal(contractId);
expect(instance.cetSignatures.serialize().toString('hex')).to.equal(
cetAdaptorSignaturesV0.toString('hex'),
Expand All @@ -111,4 +121,21 @@ describe('DlcSign', () => {
});
});
});

describe('DlcSignContainer', () => {
it('should serialize and deserialize', () => {
const dlcSign = DlcSignV0.deserialize(dlcSignHex);
// swap payout and change spk to differentiate between dlcaccepts
const dlcSign2 = DlcSignV0.deserialize(dlcSignHex);
dlcSign2.contractId = contractId2;

const container = new DlcSignContainer();
container.addSign(dlcSign);
container.addSign(dlcSign2);

const instance = DlcSignContainer.deserialize(container.serialize());

expect(container.serialize()).to.deep.equal(instance.serialize());
});
});
});
33 changes: 32 additions & 1 deletion packages/messaging/__tests__/messages/OrderAccept.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { expect } from 'chai';

import { OrderAcceptV0 } from '../../lib/messages/OrderAccept';
import {
OrderAcceptContainer,
OrderAcceptV0,
} from '../../lib/messages/OrderAccept';
import { OrderNegotiationFieldsV0 } from '../../lib/messages/OrderNegotiationFields';

describe('OrderAccept', () => {
Expand All @@ -9,6 +12,11 @@ describe('OrderAccept', () => {
'hex',
);

const tempOrderId2 = Buffer.from(
'0ef55fca0e3d0a95609ddce833d2f8ba6c2ee37bbe8583bc2068256c51a32914',
'hex',
);

describe('serialize', () => {
it('serializes', () => {
const instance = new OrderAcceptV0();
Expand Down Expand Up @@ -43,4 +51,27 @@ describe('OrderAccept', () => {
);
});
});

describe('OrderAcceptContainer', () => {
it('should serialize and deserialize', () => {
const orderAccept = new OrderAcceptV0();

orderAccept.tempOrderId = tempOrderId;
orderAccept.negotiationFields = OrderNegotiationFieldsV0.deserialize(
Buffer.from('fdff3600', 'hex'),
);

// swap payout and change spk to differentiate between dlcoffers
const orderAccept2 = OrderAcceptV0.deserialize(orderAccept.serialize());
orderAccept2.tempOrderId = tempOrderId2;

const container = new OrderAcceptContainer();
container.addAccept(orderAccept);
container.addAccept(orderAccept2);

const instance = OrderAcceptContainer.deserialize(container.serialize());

expect(container.serialize()).to.deep.equal(instance.serialize());
});
});
});
18 changes: 18 additions & 0 deletions packages/messaging/__tests__/messages/OrderOffer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { expect } from 'chai';
import {
LOCKTIME_THRESHOLD,
MessageType,
OrderOfferContainer,
OrderPositionInfoV0,
} from '../../lib';
import { ContractInfo } from '../../lib/messages/ContractInfo';
Expand Down Expand Up @@ -526,4 +527,21 @@ describe('OrderOffer', () => {
}).to.throw(Error);
});
});

describe('OrderOfferContainer', () => {
it('should serialize and deserialize', () => {
const orderOffer = OrderOfferV0.deserialize(buf);
// swap payout and change spk to differentiate between dlcoffers
const orderOffer2 = OrderOfferV0.deserialize(buf);
orderOffer2.refundLocktime = 300;

const container = new OrderOfferContainer();
container.addOffer(orderOffer);
container.addOffer(orderOffer2);

const instance = OrderOfferContainer.deserialize(container.serialize());

expect(container.serialize()).to.deep.equal(instance.serialize());
});
});
});
56 changes: 56 additions & 0 deletions packages/messaging/lib/messages/DlcAccept.ts
Original file line number Diff line number Diff line change
Expand Up @@ -330,3 +330,59 @@ export interface IDlcAcceptV0Addresses {
changeAddress: string;
payoutAddress: string;
}

export class DlcAcceptContainer {
private accepts: DlcAccept[] = [];

/**
* Adds a DlcAccept to the container.
* @param accept The DlcAccept to add.
*/
public addAccept(accept: DlcAccept): void {
this.accepts.push(accept);
}

/**
* Returns all DlcAccepts in the container.
* @returns An array of DlcAccept instances.
*/
public getAccepts(): DlcAccept[] {
return this.accepts;
}

/**
* Serializes all DlcAccepts in the container to a Buffer.
* @returns A Buffer containing the serialized DlcAccepts.
*/
public serialize(): Buffer {
const writer = new BufferWriter();
// Write the number of accepts in the container first.
writer.writeUInt16BE(this.accepts.length);
// Serialize each accept and write it.
this.accepts.forEach((accept) => {
const serializedAccept = accept.serialize();
// Optionally, write the length of the serialized accept for easier deserialization.
writer.writeUInt16BE(serializedAccept.length);
writer.writeBytes(serializedAccept);
});
return writer.toBuffer();
}

/**
* Deserializes a Buffer into a DlcAcceptContainer with DlcAccepts.
* @param buf The Buffer to deserialize.
* @returns A DlcAcceptContainer instance.
*/
public static deserialize(buf: Buffer, parseCets = true): DlcAcceptContainer {
const reader = new BufferReader(buf);
const container = new DlcAcceptContainer();
const acceptsCount = reader.readUInt16BE();
for (let i = 0; i < acceptsCount; i++) {
const acceptLength = reader.readUInt16BE();
const acceptBuf = reader.readBytes(acceptLength);
const accept = DlcAccept.deserialize(acceptBuf, parseCets); // Adjust based on actual implementation.
container.addAccept(accept);
}
return container;
}
}
57 changes: 57 additions & 0 deletions packages/messaging/lib/messages/DlcOffer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -397,3 +397,60 @@ export interface IDlcOfferV0Addresses {
changeAddress: string;
payoutAddress: string;
}

export class DlcOfferContainer {
private offers: DlcOffer[] = [];

/**
* Adds a DlcOffer to the container.
* @param offer The DlcOffer to add.
*/
public addOffer(offer: DlcOffer): void {
this.offers.push(offer);
}

/**
* Returns all DlcOffers in the container.
* @returns An array of DlcOffer instances.
*/
public getOffers(): DlcOffer[] {
return this.offers;
}

/**
* Serializes all DlcOffers in the container to a Buffer.
* @returns A Buffer containing the serialized DlcOffers.
*/
public serialize(): Buffer {
const writer = new BufferWriter();
// Write the number of offers in the container first.
writer.writeUInt16BE(this.offers.length);
// Serialize each offer and write it.
this.offers.forEach((offer) => {
const serializedOffer = offer.serialize();
// Optionally, write the length of the serialized offer for easier deserialization.
writer.writeUInt16BE(serializedOffer.length);
writer.writeBytes(serializedOffer);
});
return writer.toBuffer();
}

/**
* Deserializes a Buffer into a DlcOfferContainer with DlcOffers.
* @param buf The Buffer to deserialize.
* @returns A DlcOfferContainer instance.
*/
public static deserialize(buf: Buffer): DlcOfferContainer {
const reader = new BufferReader(buf);
const container = new DlcOfferContainer();
const offersCount = reader.readUInt16BE();
for (let i = 0; i < offersCount; i++) {
// Optionally, read the length of the serialized offer if it was written during serialization.
const offerLength = reader.readUInt16BE();
const offerBuf = reader.readBytes(offerLength);
const offer = DlcOffer.deserialize(offerBuf); // This needs to be adjusted based on actual implementation.
container.addOffer(offer);
}
return container;
}
}
Loading

0 comments on commit 3376e17

Please sign in to comment.