@node-dlc/messaging
Version:
DLC Messaging Protocol
159 lines • 6.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DigitDecompositionEventDescriptorV0 = exports.EnumEventDescriptorV0 = exports.EventDescriptor = void 0;
const bufio_1 = require("@node-dlc/bufio");
const MessageType_1 = require("../MessageType");
class EventDescriptor {
static deserialize(buf) {
const reader = new bufio_1.BufferReader(buf);
const type = Number(reader.readBigSize());
switch (type) {
case MessageType_1.MessageType.EnumEventDescriptorV0:
return EnumEventDescriptorV0.deserialize(buf);
case MessageType_1.MessageType.DigitDecompositionEventDescriptorV0:
return DigitDecompositionEventDescriptorV0.deserialize(buf);
default:
throw new Error(`Payout function TLV type must be EnumEventDescriptorV0 or DigitDecompositionEventDescriptorV0`);
}
}
}
exports.EventDescriptor = EventDescriptor;
/**
* EnumEventDescriptor V0 is a simple enumeration of outcomes
*/
class EnumEventDescriptorV0 extends EventDescriptor {
constructor() {
super(...arguments);
/**
* The type for enum_event_descriptor_v0 message. enum_event_descriptor_v0 = 55302
*/
this.type = EnumEventDescriptorV0.type;
this.outcomes = [];
}
/**
* Deserializes an enum_event_descriptor_v0 message
* @param buf
*/
static deserialize(buf) {
const instance = new EnumEventDescriptorV0();
const reader = new bufio_1.BufferReader(buf);
reader.readBigSize(); // read type
instance.length = reader.readBigSize(); // need to fix this
reader.readUInt16BE(); // num_outcomes
while (!reader.eof) {
const outcomeLen = reader.readBigSize();
const outcomeBuf = reader.readBytes(Number(outcomeLen));
instance.outcomes.push(outcomeBuf.toString());
}
return instance;
}
/**
* Converts enum_event_descriptor_v0 to JSON
*/
toJSON() {
return {
type: this.type,
outcomes: this.outcomes,
};
}
/**
* Serializes the enum_event_descriptor_v0 message into a Buffer
*/
serialize() {
const writer = new bufio_1.BufferWriter();
writer.writeBigSize(this.type);
const dataWriter = new bufio_1.BufferWriter();
dataWriter.writeUInt16BE(this.outcomes.length);
for (const outcome of this.outcomes) {
dataWriter.writeBigSize(outcome.length);
dataWriter.writeBytes(Buffer.from(outcome));
}
writer.writeBigSize(dataWriter.size);
writer.writeBytes(dataWriter.toBuffer());
return writer.toBuffer();
}
}
exports.EnumEventDescriptorV0 = EnumEventDescriptorV0;
EnumEventDescriptorV0.type = MessageType_1.MessageType.EnumEventDescriptorV0;
/**
* DigitDecompositionEventDescriptorV0 V0 is a simple enumeration of outcomes
*/
class DigitDecompositionEventDescriptorV0 extends EventDescriptor {
constructor() {
super(...arguments);
/**
* The type for digit_decomposition_event_descriptor_v0 message. digit_decomposition_event_descriptor_v0 = 55302
*/
this.type = DigitDecompositionEventDescriptorV0.type;
}
/**
* Deserializes an digit_decomposition_event_descriptor_v0 message
* @param buf
*/
static deserialize(buf) {
const instance = new DigitDecompositionEventDescriptorV0();
const reader = new bufio_1.BufferReader(buf);
reader.readBigSize(); // read type
instance.length = reader.readBigSize(); // need to fix this
/**
* NOTE: BASE IS INCORRECT FORMAT FOR DLC SPEC (SHOULD BE BIGSIZE)
* Will be fixed in oracle_announcement_v1
* https://github.com/discreetlogcontracts/dlcspecs/blob/master/Oracle.md#version-0-digit_decomposition_event_descriptor
*/
instance.base = reader.readUInt16BE();
instance.isSigned = reader.readUInt8() === 1;
const unitLen = reader.readBigSize();
const unitBuf = reader.readBytes(Number(unitLen));
instance.unit = unitBuf.toString();
instance.precision = reader.readUInt32BE();
instance.nbDigits = reader.readUInt16BE();
return instance;
}
/**
* Validates correctness of all fields in the message
* https://github.com/discreetlogcontracts/dlcspecs/blob/master/Oracle.md
* @throws Will throw an error if validation fails
*/
validate() {
if (this.base <= 0) {
throw new Error('base must be greater than 0');
}
// TODO: support isSigned according to specifications
if (this.isSigned) {
throw new Error('node-dlc does not support isSigned');
}
}
/**
* Converts digit_decomposition_event_descriptor_v0 to JSON
*/
toJSON() {
return {
type: this.type,
base: this.base,
isSigned: this.isSigned,
unit: this.unit,
precision: this.precision,
nbDigits: this.nbDigits,
};
}
/**
* Serializes the digit_decomposition_event_descriptor_v0 message into a Buffer
*/
serialize() {
const writer = new bufio_1.BufferWriter();
writer.writeBigSize(this.type);
const dataWriter = new bufio_1.BufferWriter();
dataWriter.writeUInt16BE(this.base); // Switch to BigSize in oracle_announcement_v1
dataWriter.writeUInt8(this.isSigned ? 1 : 0);
dataWriter.writeBigSize(this.unit.length);
dataWriter.writeBytes(Buffer.from(this.unit));
dataWriter.writeUInt32BE(this.precision);
dataWriter.writeUInt16BE(this.nbDigits);
writer.writeBigSize(dataWriter.size);
writer.writeBytes(dataWriter.toBuffer());
return writer.toBuffer();
}
}
exports.DigitDecompositionEventDescriptorV0 = DigitDecompositionEventDescriptorV0;
DigitDecompositionEventDescriptorV0.type = MessageType_1.MessageType.DigitDecompositionEventDescriptorV0;
//# sourceMappingURL=EventDescriptor.js.map