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