@node-lightning/wire
Version:
Lightning Network Wire Protocol
117 lines • 5.13 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OpenChannelMessage = void 0;
const bufio_1 = require("@node-lightning/bufio");
const core_1 = require("@node-lightning/core");
const OpenChannelFlags_1 = require("../flags/OpenChannelFlags");
const MessageType_1 = require("../MessageType");
const readTlvs_1 = require("../serialize/readTlvs");
/**
* OpenChannelMessage represents the open_channel message defined in
* BOLT #2 of the Lightning Specification. This message is used to
* initiate a channel with a connected peer. The channel initiator acts
* as the funding node for the channel and specifies the amount and
* parameters to be used in the channel. The remote peer can accept the
* channel using the accept_channel message.
*/
class OpenChannelMessage {
/**
* Constructs a new OpenChannelMessage instance
*/
constructor() {
/**
* The type for open_channel message. open_channel = 32
*/
this.type = OpenChannelMessage.type;
this.channelFlags = new core_1.BitField();
}
/**
* Deserializes an open_channel message
* @param buf
*/
static deserialize(buf) {
const instance = new OpenChannelMessage();
const reader = new bufio_1.BufferReader(buf);
reader.readUInt16BE(); // read type
instance.chainHash = reader.readBytes(32);
instance.temporaryChannelId = reader.readBytes(32);
instance.fundingSatoshis = core_1.Value.fromSats(reader.readUInt64BE());
instance.pushMsat = core_1.Value.fromMilliSats(reader.readUInt64BE());
instance.dustLimitSatoshis = core_1.Value.fromSats(reader.readUInt64BE());
instance.maxHtlcValueInFlightMsat = core_1.Value.fromMilliSats(reader.readUInt64BE());
instance.channelReserveSatoshis = core_1.Value.fromSats(reader.readUInt64BE());
instance.htlcMinimumMsat = core_1.Value.fromMilliSats(reader.readUInt64BE());
instance.feeRatePerKw = core_1.Value.fromSats(reader.readUInt32BE());
instance.toSelfDelay = reader.readUInt16BE();
instance.maxAcceptedHtlcs = reader.readUInt16BE();
instance.fundingPubKey = reader.readBytes(33);
instance.revocationBasePoint = reader.readBytes(33);
instance.paymentBasePoint = reader.readBytes(33);
instance.delayedPaymentBasePoint = reader.readBytes(33);
instance.htlcBasePoint = reader.readBytes(33);
instance.firstPerCommitmentPoint = reader.readBytes(33);
instance.channelFlags = new core_1.BitField(BigInt(reader.readUInt8()));
// Parse the TLVs
readTlvs_1.readTlvs(reader, (type, valueReader) => {
switch (type) {
case BigInt(0): {
instance.upfrontShutdownScript = valueReader.readBytes();
return true;
}
default:
return false;
}
});
return instance;
}
/**
* Gets or sets whether the channel will be publicly announced once
* the channel becomes live.
*/
get announceChannel() {
return this.channelFlags.isSet(OpenChannelFlags_1.OpenChannelFlags.AnnounceChannel);
}
set announceChannel(val) {
if (val) {
this.channelFlags.set(OpenChannelFlags_1.OpenChannelFlags.AnnounceChannel);
}
else {
this.channelFlags.unset(OpenChannelFlags_1.OpenChannelFlags.AnnounceChannel);
}
}
/**
* Serializes the open_channel message into a Buffer
*/
serialize() {
const writer = new bufio_1.BufferWriter();
writer.writeUInt16BE(this.type);
writer.writeBytes(this.chainHash);
writer.writeBytes(this.temporaryChannelId);
writer.writeUInt64BE(this.fundingSatoshis.sats);
writer.writeUInt64BE(this.pushMsat.msats);
writer.writeUInt64BE(this.dustLimitSatoshis.sats);
writer.writeUInt64BE(this.maxHtlcValueInFlightMsat.msats);
writer.writeUInt64BE(this.channelReserveSatoshis.sats);
writer.writeUInt64BE(this.htlcMinimumMsat.msats);
writer.writeUInt32BE(Number(this.feeRatePerKw.sats));
writer.writeUInt16BE(this.toSelfDelay);
writer.writeUInt16BE(this.maxAcceptedHtlcs);
writer.writeBytes(this.fundingPubKey);
writer.writeBytes(this.revocationBasePoint);
writer.writeBytes(this.paymentBasePoint);
writer.writeBytes(this.delayedPaymentBasePoint);
writer.writeBytes(this.htlcBasePoint);
writer.writeBytes(this.firstPerCommitmentPoint);
writer.writeUInt8(this.announceChannel ? 0x01 : 0x00);
// upfront_shutdown_script TLV
if (this.upfrontShutdownScript) {
writer.writeBigSize(0);
writer.writeBigSize(this.upfrontShutdownScript.length);
writer.writeBytes(this.upfrontShutdownScript);
}
return writer.toBuffer();
}
}
exports.OpenChannelMessage = OpenChannelMessage;
OpenChannelMessage.type = MessageType_1.MessageType.OpenChannel;
//# sourceMappingURL=OpenChannelMessage.js.map