1use crate::io;
16use crate::ln::msgs;
17use crate::util::ser::{LengthLimitedRead, LengthReadable, Readable, Writeable, Writer};
18
19pub trait CustomMessageReader {
22 type CustomMessage: Type;
24 fn read<R: LengthLimitedRead>(
29 &self, message_type: u16, buffer: &mut R,
30 ) -> Result<Option<Self::CustomMessage>, msgs::DecodeError>;
31}
32
33#[cfg(test)]
37pub trait TestEq: PartialEq {}
38#[cfg(test)]
39impl<T: PartialEq> TestEq for T {}
40
41#[cfg(not(test))]
42pub(crate) trait TestEq {}
43#[cfg(not(test))]
44impl<T> TestEq for T {}
45
46#[allow(missing_docs)]
49#[derive(Debug)]
50#[cfg_attr(any(test, feature = "_test_utils"), derive(PartialEq))]
51pub(crate) enum Message<T: core::fmt::Debug + Type + TestEq> {
52 Init(msgs::Init),
53 Error(msgs::ErrorMessage),
54 Warning(msgs::WarningMessage),
55 Ping(msgs::Ping),
56 Pong(msgs::Pong),
57 PeerStorage(msgs::PeerStorage),
58 PeerStorageRetrieval(msgs::PeerStorageRetrieval),
59 OpenChannel(msgs::OpenChannel),
60 OpenChannelV2(msgs::OpenChannelV2),
61 AcceptChannel(msgs::AcceptChannel),
62 AcceptChannelV2(msgs::AcceptChannelV2),
63 FundingCreated(msgs::FundingCreated),
64 FundingSigned(msgs::FundingSigned),
65 Stfu(msgs::Stfu),
66 SpliceInit(msgs::SpliceInit),
67 SpliceAck(msgs::SpliceAck),
68 SpliceLocked(msgs::SpliceLocked),
69 TxAddInput(msgs::TxAddInput),
70 TxAddOutput(msgs::TxAddOutput),
71 TxRemoveInput(msgs::TxRemoveInput),
72 TxRemoveOutput(msgs::TxRemoveOutput),
73 TxComplete(msgs::TxComplete),
74 TxSignatures(msgs::TxSignatures),
75 TxInitRbf(msgs::TxInitRbf),
76 TxAckRbf(msgs::TxAckRbf),
77 TxAbort(msgs::TxAbort),
78 ChannelReady(msgs::ChannelReady),
79 Shutdown(msgs::Shutdown),
80 ClosingSigned(msgs::ClosingSigned),
81 #[cfg(simple_close)]
82 ClosingComplete(msgs::ClosingComplete),
83 #[cfg(simple_close)]
84 ClosingSig(msgs::ClosingSig),
85 OnionMessage(msgs::OnionMessage),
86 StartBatch(msgs::StartBatch),
87 UpdateAddHTLC(msgs::UpdateAddHTLC),
88 UpdateFulfillHTLC(msgs::UpdateFulfillHTLC),
89 UpdateFailHTLC(msgs::UpdateFailHTLC),
90 UpdateFailMalformedHTLC(msgs::UpdateFailMalformedHTLC),
91 CommitmentSigned(msgs::CommitmentSigned),
92 RevokeAndACK(msgs::RevokeAndACK),
93 UpdateFee(msgs::UpdateFee),
94 ChannelReestablish(msgs::ChannelReestablish),
95 AnnouncementSignatures(msgs::AnnouncementSignatures),
96 ChannelAnnouncement(msgs::ChannelAnnouncement),
97 NodeAnnouncement(msgs::NodeAnnouncement),
98 ChannelUpdate(msgs::ChannelUpdate),
99 QueryShortChannelIds(msgs::QueryShortChannelIds),
100 ReplyShortChannelIdsEnd(msgs::ReplyShortChannelIdsEnd),
101 QueryChannelRange(msgs::QueryChannelRange),
102 ReplyChannelRange(msgs::ReplyChannelRange),
103 GossipTimestampFilter(msgs::GossipTimestampFilter),
104 Unknown(u16),
106 Custom(T),
109}
110
111impl<T: core::fmt::Debug + Type + TestEq> Writeable for Message<T> {
112 fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
113 match self {
114 &Message::Init(ref msg) => msg.write(writer),
115 &Message::Error(ref msg) => msg.write(writer),
116 &Message::Warning(ref msg) => msg.write(writer),
117 &Message::Ping(ref msg) => msg.write(writer),
118 &Message::Pong(ref msg) => msg.write(writer),
119 &Message::PeerStorage(ref msg) => msg.write(writer),
120 &Message::PeerStorageRetrieval(ref msg) => msg.write(writer),
121 &Message::OpenChannel(ref msg) => msg.write(writer),
122 &Message::OpenChannelV2(ref msg) => msg.write(writer),
123 &Message::AcceptChannel(ref msg) => msg.write(writer),
124 &Message::AcceptChannelV2(ref msg) => msg.write(writer),
125 &Message::FundingCreated(ref msg) => msg.write(writer),
126 &Message::FundingSigned(ref msg) => msg.write(writer),
127 &Message::Stfu(ref msg) => msg.write(writer),
128 &Message::SpliceInit(ref msg) => msg.write(writer),
129 &Message::SpliceAck(ref msg) => msg.write(writer),
130 &Message::SpliceLocked(ref msg) => msg.write(writer),
131 &Message::TxAddInput(ref msg) => msg.write(writer),
132 &Message::TxAddOutput(ref msg) => msg.write(writer),
133 &Message::TxRemoveInput(ref msg) => msg.write(writer),
134 &Message::TxRemoveOutput(ref msg) => msg.write(writer),
135 &Message::TxComplete(ref msg) => msg.write(writer),
136 &Message::TxSignatures(ref msg) => msg.write(writer),
137 &Message::TxInitRbf(ref msg) => msg.write(writer),
138 &Message::TxAckRbf(ref msg) => msg.write(writer),
139 &Message::TxAbort(ref msg) => msg.write(writer),
140 &Message::ChannelReady(ref msg) => msg.write(writer),
141 &Message::Shutdown(ref msg) => msg.write(writer),
142 &Message::ClosingSigned(ref msg) => msg.write(writer),
143 #[cfg(simple_close)]
144 &Message::ClosingComplete(ref msg) => msg.write(writer),
145 #[cfg(simple_close)]
146 &Message::ClosingSig(ref msg) => msg.write(writer),
147 &Message::OnionMessage(ref msg) => msg.write(writer),
148 &Message::StartBatch(ref msg) => msg.write(writer),
149 &Message::UpdateAddHTLC(ref msg) => msg.write(writer),
150 &Message::UpdateFulfillHTLC(ref msg) => msg.write(writer),
151 &Message::UpdateFailHTLC(ref msg) => msg.write(writer),
152 &Message::UpdateFailMalformedHTLC(ref msg) => msg.write(writer),
153 &Message::CommitmentSigned(ref msg) => msg.write(writer),
154 &Message::RevokeAndACK(ref msg) => msg.write(writer),
155 &Message::UpdateFee(ref msg) => msg.write(writer),
156 &Message::ChannelReestablish(ref msg) => msg.write(writer),
157 &Message::AnnouncementSignatures(ref msg) => msg.write(writer),
158 &Message::ChannelAnnouncement(ref msg) => msg.write(writer),
159 &Message::NodeAnnouncement(ref msg) => msg.write(writer),
160 &Message::ChannelUpdate(ref msg) => msg.write(writer),
161 &Message::QueryShortChannelIds(ref msg) => msg.write(writer),
162 &Message::ReplyShortChannelIdsEnd(ref msg) => msg.write(writer),
163 &Message::QueryChannelRange(ref msg) => msg.write(writer),
164 &Message::ReplyChannelRange(ref msg) => msg.write(writer),
165 &Message::GossipTimestampFilter(ref msg) => msg.write(writer),
166 &Message::Unknown(_) => Ok(()),
167 &Message::Custom(ref msg) => msg.write(writer),
168 }
169 }
170}
171
172impl<T: core::fmt::Debug + Type + TestEq> Type for Message<T> {
173 fn type_id(&self) -> u16 {
175 match self {
176 &Message::Init(ref msg) => msg.type_id(),
177 &Message::Error(ref msg) => msg.type_id(),
178 &Message::Warning(ref msg) => msg.type_id(),
179 &Message::Ping(ref msg) => msg.type_id(),
180 &Message::Pong(ref msg) => msg.type_id(),
181 &Message::PeerStorage(ref msg) => msg.type_id(),
182 &Message::PeerStorageRetrieval(ref msg) => msg.type_id(),
183 &Message::OpenChannel(ref msg) => msg.type_id(),
184 &Message::OpenChannelV2(ref msg) => msg.type_id(),
185 &Message::AcceptChannel(ref msg) => msg.type_id(),
186 &Message::AcceptChannelV2(ref msg) => msg.type_id(),
187 &Message::FundingCreated(ref msg) => msg.type_id(),
188 &Message::FundingSigned(ref msg) => msg.type_id(),
189 &Message::Stfu(ref msg) => msg.type_id(),
190 &Message::SpliceInit(ref msg) => msg.type_id(),
191 &Message::SpliceAck(ref msg) => msg.type_id(),
192 &Message::SpliceLocked(ref msg) => msg.type_id(),
193 &Message::TxAddInput(ref msg) => msg.type_id(),
194 &Message::TxAddOutput(ref msg) => msg.type_id(),
195 &Message::TxRemoveInput(ref msg) => msg.type_id(),
196 &Message::TxRemoveOutput(ref msg) => msg.type_id(),
197 &Message::TxComplete(ref msg) => msg.type_id(),
198 &Message::TxSignatures(ref msg) => msg.type_id(),
199 &Message::TxInitRbf(ref msg) => msg.type_id(),
200 &Message::TxAckRbf(ref msg) => msg.type_id(),
201 &Message::TxAbort(ref msg) => msg.type_id(),
202 &Message::ChannelReady(ref msg) => msg.type_id(),
203 &Message::Shutdown(ref msg) => msg.type_id(),
204 &Message::ClosingSigned(ref msg) => msg.type_id(),
205 #[cfg(simple_close)]
206 &Message::ClosingComplete(ref msg) => msg.type_id(),
207 #[cfg(simple_close)]
208 &Message::ClosingSig(ref msg) => msg.type_id(),
209 &Message::OnionMessage(ref msg) => msg.type_id(),
210 &Message::StartBatch(ref msg) => msg.type_id(),
211 &Message::UpdateAddHTLC(ref msg) => msg.type_id(),
212 &Message::UpdateFulfillHTLC(ref msg) => msg.type_id(),
213 &Message::UpdateFailHTLC(ref msg) => msg.type_id(),
214 &Message::UpdateFailMalformedHTLC(ref msg) => msg.type_id(),
215 &Message::CommitmentSigned(ref msg) => msg.type_id(),
216 &Message::RevokeAndACK(ref msg) => msg.type_id(),
217 &Message::UpdateFee(ref msg) => msg.type_id(),
218 &Message::ChannelReestablish(ref msg) => msg.type_id(),
219 &Message::AnnouncementSignatures(ref msg) => msg.type_id(),
220 &Message::ChannelAnnouncement(ref msg) => msg.type_id(),
221 &Message::NodeAnnouncement(ref msg) => msg.type_id(),
222 &Message::ChannelUpdate(ref msg) => msg.type_id(),
223 &Message::QueryShortChannelIds(ref msg) => msg.type_id(),
224 &Message::ReplyShortChannelIdsEnd(ref msg) => msg.type_id(),
225 &Message::QueryChannelRange(ref msg) => msg.type_id(),
226 &Message::ReplyChannelRange(ref msg) => msg.type_id(),
227 &Message::GossipTimestampFilter(ref msg) => msg.type_id(),
228 &Message::Unknown(type_id) => type_id,
229 &Message::Custom(ref msg) => msg.type_id(),
230 }
231 }
232}
233
234impl<T: core::fmt::Debug + Type + TestEq> Message<T> {
235 pub fn is_even(&self) -> bool {
237 (self.type_id() & 1) == 0
238 }
239}
240
241pub(crate) fn read<R: LengthLimitedRead, T, H: core::ops::Deref>(
248 buffer: &mut R, custom_reader: H,
249) -> Result<Message<T>, (msgs::DecodeError, Option<u16>)>
250where
251 T: core::fmt::Debug + Type + Writeable,
252 H::Target: CustomMessageReader<CustomMessage = T>,
253{
254 let message_type = <u16 as Readable>::read(buffer).map_err(|e| (e, None))?;
255 do_read(buffer, message_type, custom_reader).map_err(|e| (e, Some(message_type)))
256}
257
258fn do_read<R: LengthLimitedRead, T, H: core::ops::Deref>(
259 buffer: &mut R, message_type: u16, custom_reader: H,
260) -> Result<Message<T>, msgs::DecodeError>
261where
262 T: core::fmt::Debug + Type + Writeable,
263 H::Target: CustomMessageReader<CustomMessage = T>,
264{
265 match message_type {
266 msgs::Init::TYPE => {
267 Ok(Message::Init(LengthReadable::read_from_fixed_length_buffer(buffer)?))
268 },
269 msgs::ErrorMessage::TYPE => {
270 Ok(Message::Error(LengthReadable::read_from_fixed_length_buffer(buffer)?))
271 },
272 msgs::WarningMessage::TYPE => {
273 Ok(Message::Warning(LengthReadable::read_from_fixed_length_buffer(buffer)?))
274 },
275 msgs::Ping::TYPE => {
276 Ok(Message::Ping(LengthReadable::read_from_fixed_length_buffer(buffer)?))
277 },
278 msgs::Pong::TYPE => {
279 Ok(Message::Pong(LengthReadable::read_from_fixed_length_buffer(buffer)?))
280 },
281 msgs::PeerStorage::TYPE => {
282 Ok(Message::PeerStorage(LengthReadable::read_from_fixed_length_buffer(buffer)?))
283 },
284 msgs::PeerStorageRetrieval::TYPE => Ok(Message::PeerStorageRetrieval(
285 LengthReadable::read_from_fixed_length_buffer(buffer)?,
286 )),
287 msgs::OpenChannel::TYPE => {
288 Ok(Message::OpenChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
289 },
290 msgs::OpenChannelV2::TYPE => {
291 Ok(Message::OpenChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
292 },
293 msgs::AcceptChannel::TYPE => {
294 Ok(Message::AcceptChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
295 },
296 msgs::AcceptChannelV2::TYPE => {
297 Ok(Message::AcceptChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
298 },
299 msgs::FundingCreated::TYPE => {
300 Ok(Message::FundingCreated(LengthReadable::read_from_fixed_length_buffer(buffer)?))
301 },
302 msgs::FundingSigned::TYPE => {
303 Ok(Message::FundingSigned(LengthReadable::read_from_fixed_length_buffer(buffer)?))
304 },
305 msgs::SpliceInit::TYPE => {
306 Ok(Message::SpliceInit(LengthReadable::read_from_fixed_length_buffer(buffer)?))
307 },
308 msgs::Stfu::TYPE => {
309 Ok(Message::Stfu(LengthReadable::read_from_fixed_length_buffer(buffer)?))
310 },
311 msgs::SpliceAck::TYPE => {
312 Ok(Message::SpliceAck(LengthReadable::read_from_fixed_length_buffer(buffer)?))
313 },
314 msgs::SpliceLocked::TYPE => {
315 Ok(Message::SpliceLocked(LengthReadable::read_from_fixed_length_buffer(buffer)?))
316 },
317 msgs::TxAddInput::TYPE => {
318 Ok(Message::TxAddInput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
319 },
320 msgs::TxAddOutput::TYPE => {
321 Ok(Message::TxAddOutput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
322 },
323 msgs::TxRemoveInput::TYPE => {
324 Ok(Message::TxRemoveInput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
325 },
326 msgs::TxRemoveOutput::TYPE => {
327 Ok(Message::TxRemoveOutput(LengthReadable::read_from_fixed_length_buffer(buffer)?))
328 },
329 msgs::TxComplete::TYPE => {
330 Ok(Message::TxComplete(LengthReadable::read_from_fixed_length_buffer(buffer)?))
331 },
332 msgs::TxSignatures::TYPE => {
333 Ok(Message::TxSignatures(LengthReadable::read_from_fixed_length_buffer(buffer)?))
334 },
335 msgs::TxInitRbf::TYPE => {
336 Ok(Message::TxInitRbf(LengthReadable::read_from_fixed_length_buffer(buffer)?))
337 },
338 msgs::TxAckRbf::TYPE => {
339 Ok(Message::TxAckRbf(LengthReadable::read_from_fixed_length_buffer(buffer)?))
340 },
341 msgs::TxAbort::TYPE => {
342 Ok(Message::TxAbort(LengthReadable::read_from_fixed_length_buffer(buffer)?))
343 },
344 msgs::ChannelReady::TYPE => {
345 Ok(Message::ChannelReady(LengthReadable::read_from_fixed_length_buffer(buffer)?))
346 },
347 msgs::Shutdown::TYPE => {
348 Ok(Message::Shutdown(LengthReadable::read_from_fixed_length_buffer(buffer)?))
349 },
350 msgs::ClosingSigned::TYPE => {
351 Ok(Message::ClosingSigned(LengthReadable::read_from_fixed_length_buffer(buffer)?))
352 },
353 #[cfg(simple_close)]
354 msgs::ClosingComplete::TYPE => {
355 Ok(Message::ClosingComplete(LengthReadable::read_from_fixed_length_buffer(buffer)?))
356 },
357 #[cfg(simple_close)]
358 msgs::ClosingSig::TYPE => {
359 Ok(Message::ClosingSig(LengthReadable::read_from_fixed_length_buffer(buffer)?))
360 },
361 msgs::OnionMessage::TYPE => {
362 Ok(Message::OnionMessage(LengthReadable::read_from_fixed_length_buffer(buffer)?))
363 },
364 msgs::StartBatch::TYPE => {
365 Ok(Message::StartBatch(LengthReadable::read_from_fixed_length_buffer(buffer)?))
366 },
367 msgs::UpdateAddHTLC::TYPE => {
368 Ok(Message::UpdateAddHTLC(LengthReadable::read_from_fixed_length_buffer(buffer)?))
369 },
370 msgs::UpdateFulfillHTLC::TYPE => {
371 Ok(Message::UpdateFulfillHTLC(LengthReadable::read_from_fixed_length_buffer(buffer)?))
372 },
373 msgs::UpdateFailHTLC::TYPE => {
374 Ok(Message::UpdateFailHTLC(LengthReadable::read_from_fixed_length_buffer(buffer)?))
375 },
376 msgs::UpdateFailMalformedHTLC::TYPE => Ok(Message::UpdateFailMalformedHTLC(
377 LengthReadable::read_from_fixed_length_buffer(buffer)?,
378 )),
379 msgs::CommitmentSigned::TYPE => {
380 Ok(Message::CommitmentSigned(LengthReadable::read_from_fixed_length_buffer(buffer)?))
381 },
382 msgs::RevokeAndACK::TYPE => {
383 Ok(Message::RevokeAndACK(LengthReadable::read_from_fixed_length_buffer(buffer)?))
384 },
385 msgs::UpdateFee::TYPE => {
386 Ok(Message::UpdateFee(LengthReadable::read_from_fixed_length_buffer(buffer)?))
387 },
388 msgs::ChannelReestablish::TYPE => {
389 Ok(Message::ChannelReestablish(LengthReadable::read_from_fixed_length_buffer(buffer)?))
390 },
391 msgs::AnnouncementSignatures::TYPE => Ok(Message::AnnouncementSignatures(
392 LengthReadable::read_from_fixed_length_buffer(buffer)?,
393 )),
394 msgs::ChannelAnnouncement::TYPE => {
395 Ok(Message::ChannelAnnouncement(LengthReadable::read_from_fixed_length_buffer(buffer)?))
396 },
397 msgs::NodeAnnouncement::TYPE => {
398 Ok(Message::NodeAnnouncement(LengthReadable::read_from_fixed_length_buffer(buffer)?))
399 },
400 msgs::ChannelUpdate::TYPE => {
401 Ok(Message::ChannelUpdate(LengthReadable::read_from_fixed_length_buffer(buffer)?))
402 },
403 msgs::QueryShortChannelIds::TYPE => Ok(Message::QueryShortChannelIds(
404 LengthReadable::read_from_fixed_length_buffer(buffer)?,
405 )),
406 msgs::ReplyShortChannelIdsEnd::TYPE => Ok(Message::ReplyShortChannelIdsEnd(
407 LengthReadable::read_from_fixed_length_buffer(buffer)?,
408 )),
409 msgs::QueryChannelRange::TYPE => {
410 Ok(Message::QueryChannelRange(LengthReadable::read_from_fixed_length_buffer(buffer)?))
411 },
412 msgs::ReplyChannelRange::TYPE => {
413 Ok(Message::ReplyChannelRange(LengthReadable::read_from_fixed_length_buffer(buffer)?))
414 },
415 msgs::GossipTimestampFilter::TYPE => Ok(Message::GossipTimestampFilter(
416 LengthReadable::read_from_fixed_length_buffer(buffer)?,
417 )),
418 _ => {
419 if let Some(custom) = custom_reader.read(message_type, buffer)? {
420 Ok(Message::Custom(custom))
421 } else {
422 Ok(Message::Unknown(message_type))
423 }
424 },
425 }
426}
427
428pub(crate) fn write<M: Type + Writeable, W: Writer>(
435 message: &M, buffer: &mut W,
436) -> Result<(), io::Error> {
437 message.type_id().write(buffer)?;
438 message.write(buffer)
439}
440
441mod encode {
442 pub trait Encode {
444 const TYPE: u16;
446 }
447}
448
449pub(crate) use self::encode::Encode;
450
451#[cfg(not(test))]
452pub trait Type: core::fmt::Debug + Writeable {
456 fn type_id(&self) -> u16;
458}
459
460#[cfg(test)]
461pub trait Type: core::fmt::Debug + Writeable + PartialEq {
462 fn type_id(&self) -> u16;
463}
464
465#[cfg(any(feature = "_test_utils", fuzzing, test))]
466impl Type for () {
467 fn type_id(&self) -> u16 {
468 unreachable!();
469 }
470}
471
472#[cfg(test)]
473impl<T: Encode + Writeable + core::fmt::Debug + PartialEq> Type for T {
474 fn type_id(&self) -> u16 {
475 T::TYPE
476 }
477}
478
479#[cfg(not(test))]
480impl<T: Encode + core::fmt::Debug + Writeable> Type for T {
481 fn type_id(&self) -> u16 {
482 T::TYPE
483 }
484}
485
486impl Encode for msgs::Stfu {
487 const TYPE: u16 = 2;
488}
489
490impl Encode for msgs::PeerStorage {
491 const TYPE: u16 = 7;
492}
493
494impl Encode for msgs::PeerStorageRetrieval {
495 const TYPE: u16 = 9;
496}
497
498impl Encode for msgs::Init {
499 const TYPE: u16 = 16;
500}
501
502impl Encode for msgs::ErrorMessage {
503 const TYPE: u16 = 17;
504}
505
506impl Encode for msgs::WarningMessage {
507 const TYPE: u16 = 1;
508}
509
510impl Encode for msgs::Ping {
511 const TYPE: u16 = 18;
512}
513
514impl Encode for msgs::Pong {
515 const TYPE: u16 = 19;
516}
517
518impl Encode for msgs::OpenChannel {
519 const TYPE: u16 = 32;
520}
521
522impl Encode for msgs::AcceptChannel {
523 const TYPE: u16 = 33;
524}
525
526impl Encode for msgs::FundingCreated {
527 const TYPE: u16 = 34;
528}
529
530impl Encode for msgs::FundingSigned {
531 const TYPE: u16 = 35;
532}
533
534impl Encode for msgs::ChannelReady {
535 const TYPE: u16 = 36;
536}
537
538impl Encode for msgs::Shutdown {
539 const TYPE: u16 = 38;
540}
541
542impl Encode for msgs::ClosingSigned {
543 const TYPE: u16 = 39;
544}
545
546impl Encode for msgs::ClosingComplete {
547 const TYPE: u16 = 40;
548}
549
550impl Encode for msgs::ClosingSig {
551 const TYPE: u16 = 41;
552}
553
554impl Encode for msgs::OpenChannelV2 {
555 const TYPE: u16 = 64;
556}
557
558impl Encode for msgs::AcceptChannelV2 {
559 const TYPE: u16 = 65;
560}
561
562impl Encode for msgs::SpliceInit {
563 const TYPE: u16 = 80;
565}
566
567impl Encode for msgs::SpliceAck {
568 const TYPE: u16 = 81;
569}
570
571impl Encode for msgs::SpliceLocked {
572 const TYPE: u16 = 77;
573}
574
575impl Encode for msgs::TxAddInput {
576 const TYPE: u16 = 66;
577}
578
579impl Encode for msgs::TxAddOutput {
580 const TYPE: u16 = 67;
581}
582
583impl Encode for msgs::TxRemoveInput {
584 const TYPE: u16 = 68;
585}
586
587impl Encode for msgs::TxRemoveOutput {
588 const TYPE: u16 = 69;
589}
590
591impl Encode for msgs::TxComplete {
592 const TYPE: u16 = 70;
593}
594
595impl Encode for msgs::TxSignatures {
596 const TYPE: u16 = 71;
597}
598
599impl Encode for msgs::TxInitRbf {
600 const TYPE: u16 = 72;
601}
602
603impl Encode for msgs::TxAckRbf {
604 const TYPE: u16 = 73;
605}
606
607impl Encode for msgs::TxAbort {
608 const TYPE: u16 = 74;
609}
610
611impl Encode for msgs::OnionMessage {
612 const TYPE: u16 = 513;
613}
614
615impl Encode for msgs::StartBatch {
616 const TYPE: u16 = 127;
617}
618
619impl Encode for msgs::UpdateAddHTLC {
620 const TYPE: u16 = 128;
621}
622
623impl Encode for msgs::UpdateFulfillHTLC {
624 const TYPE: u16 = 130;
625}
626
627impl Encode for msgs::UpdateFailHTLC {
628 const TYPE: u16 = 131;
629}
630
631impl Encode for msgs::UpdateFailMalformedHTLC {
632 const TYPE: u16 = 135;
633}
634
635impl Encode for msgs::CommitmentSigned {
636 const TYPE: u16 = 132;
637}
638
639impl Encode for msgs::RevokeAndACK {
640 const TYPE: u16 = 133;
641}
642
643impl Encode for msgs::UpdateFee {
644 const TYPE: u16 = 134;
645}
646
647impl Encode for msgs::ChannelReestablish {
648 const TYPE: u16 = 136;
649}
650
651impl Encode for msgs::AnnouncementSignatures {
652 const TYPE: u16 = 259;
653}
654
655impl Encode for msgs::ChannelAnnouncement {
656 const TYPE: u16 = 256;
657}
658
659impl Encode for msgs::NodeAnnouncement {
660 const TYPE: u16 = 257;
661}
662
663impl Encode for msgs::ChannelUpdate {
664 const TYPE: u16 = 258;
665}
666
667impl Encode for msgs::QueryShortChannelIds {
668 const TYPE: u16 = 261;
669}
670
671impl Encode for msgs::ReplyShortChannelIdsEnd {
672 const TYPE: u16 = 262;
673}
674
675impl Encode for msgs::QueryChannelRange {
676 const TYPE: u16 = 263;
677}
678
679impl Encode for msgs::ReplyChannelRange {
680 const TYPE: u16 = 264;
681}
682
683impl Encode for msgs::GossipTimestampFilter {
684 const TYPE: u16 = 265;
685}
686
687#[cfg(test)]
688mod tests {
689 use super::*;
690 use crate::ln::peer_handler::IgnoringMessageHandler;
691 use crate::prelude::*;
692
693 const ENCODED_PONG: [u8; 6] = [0u8, 19u8, 0u8, 2u8, 0u8, 0u8];
695
696 #[test]
697 fn read_empty_buffer() {
698 let buffer = [];
699 assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
700 }
701
702 #[test]
703 fn read_incomplete_type() {
704 let buffer = &ENCODED_PONG[..1];
705 assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
706 }
707
708 #[test]
709 fn read_empty_payload() {
710 let buffer = &ENCODED_PONG[..2];
711 assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
712 }
713
714 #[test]
715 fn read_invalid_message() {
716 let buffer = &ENCODED_PONG[..4];
717 assert!(read(&mut &buffer[..], &IgnoringMessageHandler {}).is_err());
718 }
719
720 #[test]
721 fn read_known_message() {
722 let buffer = &ENCODED_PONG[..];
723 let message = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
724 match message {
725 Message::Pong(_) => (),
726 _ => panic!("Expected pong message; found message type: {}", message.type_id()),
727 }
728 }
729
730 #[test]
731 fn read_unknown_message() {
732 let buffer = &::core::u16::MAX.to_be_bytes();
733 let message = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
734 match message {
735 Message::Unknown(::core::u16::MAX) => (),
736 _ => panic!("Expected message type {}; found: {}", ::core::u16::MAX, message.type_id()),
737 }
738 }
739
740 #[test]
741 fn write_message_with_type() {
742 let message = msgs::Pong { byteslen: 2u16 };
743 let mut buffer = Vec::new();
744 assert!(write(&message, &mut buffer).is_ok());
745
746 let type_length = ::core::mem::size_of::<u16>();
747 let (type_bytes, payload_bytes) = buffer.split_at(type_length);
748 assert_eq!(u16::from_be_bytes(type_bytes.try_into().unwrap()), msgs::Pong::TYPE);
749 assert_eq!(payload_bytes, &ENCODED_PONG[type_length..]);
750 }
751
752 #[test]
753 fn read_message_encoded_with_write() {
754 let message = msgs::Pong { byteslen: 2u16 };
755 let mut buffer = Vec::new();
756 assert!(write(&message, &mut buffer).is_ok());
757
758 let decoded_message = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
759 match decoded_message {
760 Message::Pong(msgs::Pong { byteslen: 2u16 }) => (),
761 Message::Pong(msgs::Pong { byteslen }) => {
762 panic!("Expected byteslen {}; found: {}", message.byteslen, byteslen);
763 },
764 _ => panic!("Expected pong message; found message type: {}", decoded_message.type_id()),
765 }
766 }
767
768 #[test]
769 fn is_even_message_type() {
770 let message = Message::<()>::Unknown(42);
771 assert!(message.is_even());
772 }
773
774 #[test]
775 fn is_odd_message_type() {
776 let message = Message::<()>::Unknown(43);
777 assert!(!message.is_even());
778 }
779
780 #[test]
781 fn read_lnd_init_msg() {
782 let buffer = vec![0, 16, 0, 2, 34, 0, 0, 3, 2, 162, 161];
784 check_init_msg(buffer, false);
785 }
786
787 #[test]
788 fn read_clightning_init_msg() {
789 let buffer = vec![
791 0, 16, 0, 2, 34, 0, 0, 3, 2, 170, 162, 1, 32, 6, 34, 110, 70, 17, 26, 11, 89, 202, 175,
792 18, 96, 67, 235, 91, 191, 40, 195, 79, 58, 94, 51, 42, 31, 199, 178, 183, 60, 241, 136,
793 145, 15,
794 ];
795 check_init_msg(buffer, true);
796 }
797
798 fn check_init_msg(buffer: Vec<u8>, expect_unknown: bool) {
799 let decoded_msg = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
800 match decoded_msg {
801 Message::Init(msgs::Init { features, .. }) => {
802 assert!(features.supports_variable_length_onion());
803 assert!(features.supports_upfront_shutdown_script());
804 assert!(features.supports_gossip_queries());
805 assert_eq!(expect_unknown, features.supports_unknown_bits());
806 assert!(!features.requires_unknown_bits());
807 assert!(!features.initial_routing_sync());
808 },
809 _ => panic!("Expected init message, found message type: {}", decoded_msg.type_id()),
810 }
811 }
812
813 #[test]
814 fn read_lnd_node_announcement() {
815 let buffer = [
817 1, 1, 91, 164, 146, 213, 213, 165, 21, 227, 102, 33, 105, 179, 214, 21, 221, 175, 228,
818 93, 57, 177, 191, 127, 107, 229, 31, 50, 21, 81, 179, 71, 39, 18, 35, 2, 89, 224, 110,
819 123, 66, 39, 148, 246, 177, 85, 12, 19, 70, 226, 173, 132, 156, 26, 122, 146, 71, 213,
820 247, 48, 93, 190, 185, 177, 12, 172, 0, 3, 2, 162, 161, 94, 103, 195, 37, 2, 37, 242,
821 97, 140, 2, 111, 69, 85, 39, 118, 30, 221, 99, 254, 120, 49, 103, 22, 170, 227, 111,
822 172, 164, 160, 49, 68, 138, 116, 16, 22, 206, 107, 51, 153, 255, 97, 108, 105, 99, 101,
823 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
824 1, 172, 21, 0, 2, 38, 7,
825 ];
826 let decoded_msg = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
827 match decoded_msg {
828 Message::NodeAnnouncement(msgs::NodeAnnouncement {
829 contents: msgs::UnsignedNodeAnnouncement { features, .. },
830 ..
831 }) => {
832 assert!(features.supports_variable_length_onion());
833 assert!(features.supports_upfront_shutdown_script());
834 assert!(features.supports_gossip_queries());
835 assert!(!features.requires_unknown_bits());
836 },
837 _ => {
838 panic!("Expected node announcement, found message type: {}", decoded_msg.type_id())
839 },
840 }
841 }
842
843 #[test]
844 fn read_lnd_chan_announcement() {
845 let buffer = vec![
847 1, 0, 82, 238, 153, 33, 128, 87, 215, 2, 28, 241, 140, 250, 98, 255, 56, 5, 79, 240,
848 214, 231, 172, 35, 240, 171, 44, 9, 78, 91, 8, 193, 102, 5, 17, 178, 142, 106, 180,
849 183, 46, 38, 217, 212, 25, 236, 69, 47, 92, 217, 181, 221, 161, 205, 121, 201, 99, 38,
850 158, 216, 186, 193, 230, 86, 222, 6, 206, 67, 22, 255, 137, 212, 141, 161, 62, 134, 76,
851 48, 241, 54, 50, 167, 187, 247, 73, 27, 74, 1, 129, 185, 197, 153, 38, 90, 255, 138,
852 39, 161, 102, 172, 213, 74, 107, 88, 150, 90, 0, 49, 104, 7, 182, 184, 194, 219, 181,
853 172, 8, 245, 65, 226, 19, 228, 101, 145, 25, 159, 52, 31, 58, 93, 53, 59, 218, 91, 37,
854 84, 103, 17, 74, 133, 33, 35, 2, 203, 101, 73, 19, 94, 175, 122, 46, 224, 47, 168, 128,
855 128, 25, 26, 25, 214, 52, 247, 43, 241, 117, 52, 206, 94, 135, 156, 52, 164, 143, 234,
856 58, 185, 50, 185, 140, 198, 174, 71, 65, 18, 105, 70, 131, 172, 137, 0, 164, 51, 215,
857 143, 117, 119, 217, 241, 197, 177, 227, 227, 170, 199, 114, 7, 218, 12, 107, 30, 191,
858 236, 203, 21, 61, 242, 48, 192, 90, 233, 200, 199, 111, 162, 68, 234, 54, 219, 1, 233,
859 66, 5, 82, 74, 84, 211, 95, 199, 245, 202, 89, 223, 102, 124, 62, 166, 253, 253, 90,
860 180, 118, 21, 61, 110, 37, 5, 96, 167, 0, 0, 6, 34, 110, 70, 17, 26, 11, 89, 202, 175,
861 18, 96, 67, 235, 91, 191, 40, 195, 79, 58, 94, 51, 42, 31, 199, 178, 183, 60, 241, 136,
862 145, 15, 0, 2, 65, 0, 0, 1, 0, 0, 2, 37, 242, 97, 140, 2, 111, 69, 85, 39, 118, 30,
863 221, 99, 254, 120, 49, 103, 22, 170, 227, 111, 172, 164, 160, 49, 68, 138, 116, 16, 22,
864 206, 107, 3, 54, 61, 144, 88, 171, 247, 136, 208, 99, 9, 135, 37, 201, 178, 253, 136,
865 0, 185, 235, 68, 160, 106, 110, 12, 46, 21, 125, 204, 18, 75, 234, 16, 3, 42, 171, 28,
866 52, 224, 11, 30, 30, 253, 156, 148, 175, 203, 121, 250, 111, 122, 195, 84, 122, 77,
867 183, 56, 135, 101, 88, 41, 60, 191, 99, 232, 85, 2, 36, 17, 156, 11, 8, 12, 189, 177,
868 68, 88, 28, 15, 207, 21, 179, 151, 56, 226, 158, 148, 3, 120, 113, 177, 243, 184, 17,
869 173, 37, 46, 222, 16,
870 ];
871 let decoded_msg = read(&mut &buffer[..], &IgnoringMessageHandler {}).unwrap();
872 match decoded_msg {
873 Message::ChannelAnnouncement(msgs::ChannelAnnouncement {
874 contents: msgs::UnsignedChannelAnnouncement { features, .. },
875 ..
876 }) => {
877 assert!(!features.requires_unknown_bits());
878 },
879 _ => {
880 panic!("Expected node announcement, found message type: {}", decoded_msg.type_id())
881 },
882 }
883 }
884
885 #[derive(Eq, PartialEq, Debug)]
886 struct TestCustomMessage {}
887
888 const CUSTOM_MESSAGE_TYPE: u16 = 9000;
889
890 impl Type for TestCustomMessage {
891 fn type_id(&self) -> u16 {
892 CUSTOM_MESSAGE_TYPE
893 }
894 }
895
896 impl Writeable for TestCustomMessage {
897 fn write<W: Writer>(&self, _: &mut W) -> Result<(), io::Error> {
898 Ok(())
899 }
900 }
901
902 struct TestCustomMessageReader {}
903
904 impl CustomMessageReader for TestCustomMessageReader {
905 type CustomMessage = TestCustomMessage;
906 fn read<R: io::Read>(
907 &self, message_type: u16, _: &mut R,
908 ) -> Result<Option<Self::CustomMessage>, msgs::DecodeError> {
909 if message_type == CUSTOM_MESSAGE_TYPE {
910 return Ok(Some(TestCustomMessage {}));
911 }
912
913 Ok(None)
914 }
915 }
916
917 #[test]
918 fn read_custom_message() {
919 let buffer = [35, 40];
920 let decoded_msg = read(&mut &buffer[..], &TestCustomMessageReader {}).unwrap();
921 match decoded_msg {
922 Message::Custom(custom) => {
923 assert_eq!(custom.type_id(), CUSTOM_MESSAGE_TYPE);
924 assert_eq!(custom, TestCustomMessage {});
925 },
926 _ => panic!("Expected custom message, found message type: {}", decoded_msg.type_id()),
927 }
928 }
929
930 #[test]
931 fn read_with_custom_reader_unknown_message_type() {
932 let buffer = [35, 42];
933 let decoded_msg = read(&mut &buffer[..], &TestCustomMessageReader {}).unwrap();
934 match decoded_msg {
935 Message::Unknown(_) => {},
936 _ => panic!("Expected unknown message, found message type: {}", decoded_msg.type_id()),
937 }
938 }
939
940 #[test]
941 fn custom_reader_unknown_message_type() {
942 let buffer = Vec::new();
943 let res =
944 TestCustomMessageReader {}.read(CUSTOM_MESSAGE_TYPE + 1, &mut &buffer[..]).unwrap();
945 assert!(res.is_none());
946 }
947}