@@ -642,11 +642,48 @@ impl_writeable_tlv_based_enum!(HTLCFailReasonRepr,
642
642
643
643
impl HTLCFailReason {
644
644
pub ( super ) fn reason ( failure_code : u16 , data : Vec < u8 > ) -> Self {
645
+ const BADONION : u16 = 0x8000 ;
646
+ const PERM : u16 = 0x4000 ;
647
+ const NODE : u16 = 0x2000 ;
648
+ const UPDATE : u16 = 0x1000 ;
649
+
650
+ if failure_code == 1 | PERM { debug_assert ! ( data. is_empty( ) ) }
651
+ else if failure_code == 2 | NODE { debug_assert ! ( data. is_empty( ) ) }
652
+ else if failure_code == 3 | PERM | NODE { debug_assert ! ( data. is_empty( ) ) }
653
+ else if failure_code == 4 | BADONION | PERM { debug_assert_eq ! ( data. len( ) , 32 ) }
654
+ else if failure_code == 5 | BADONION | PERM { debug_assert_eq ! ( data. len( ) , 32 ) }
655
+ else if failure_code == 6 | BADONION | PERM { debug_assert_eq ! ( data. len( ) , 32 ) }
656
+ else if failure_code == 7 | UPDATE {
657
+ debug_assert_eq ! ( data. len( ) - 2 , u16 :: from_be_bytes( data[ 0 ..2 ] . try_into( ) . unwrap( ) ) as usize ) }
658
+ else if failure_code == 8 | PERM { debug_assert ! ( data. is_empty( ) ) }
659
+ else if failure_code == 9 | PERM { debug_assert ! ( data. is_empty( ) ) }
660
+ else if failure_code == 10 | PERM { debug_assert ! ( data. is_empty( ) ) }
661
+ else if failure_code == 11 | UPDATE {
662
+ debug_assert_eq ! ( data. len( ) - 2 , u16 :: from_be_bytes( data[ 8 ..10 ] . try_into( ) . unwrap( ) ) as usize ) }
663
+ else if failure_code == 12 | UPDATE {
664
+ debug_assert_eq ! ( data. len( ) - 2 , u16 :: from_be_bytes( data[ 8 ..10 ] . try_into( ) . unwrap( ) ) as usize ) }
665
+ else if failure_code == 13 | UPDATE {
666
+ debug_assert_eq ! ( data. len( ) - 2 , u16 :: from_be_bytes( data[ 4 ..6 ] . try_into( ) . unwrap( ) ) as usize ) }
667
+ else if failure_code == 14 | UPDATE {
668
+ debug_assert_eq ! ( data. len( ) - 2 , u16 :: from_be_bytes( data[ 0 ..2 ] . try_into( ) . unwrap( ) ) as usize ) }
669
+ else if failure_code == 15 | PERM { debug_assert_eq ! ( data. len( ) , 12 ) }
670
+ else if failure_code == 18 { debug_assert_eq ! ( data. len( ) , 4 ) }
671
+ else if failure_code == 19 { debug_assert_eq ! ( data. len( ) , 8 ) }
672
+ else if failure_code == 20 | UPDATE {
673
+ debug_assert_eq ! ( data. len( ) - 2 , u16 :: from_be_bytes( data[ 2 ..4 ] . try_into( ) . unwrap( ) ) as usize ) }
674
+ else if failure_code == 21 { debug_assert ! ( data. is_empty( ) ) }
675
+ else if failure_code == 22 | PERM { debug_assert ! ( data. len( ) <= 11 ) }
676
+ else if failure_code == 23 { debug_assert ! ( data. is_empty( ) ) }
677
+ else if failure_code & BADONION != 0 {
678
+ // We set some bogus BADONION failure codes in test, so ignore unknown ones.
679
+ }
680
+ else { debug_assert ! ( false , "Unknown failure code: {}" , failure_code) }
681
+
645
682
Self ( HTLCFailReasonRepr :: Reason { failure_code, data } )
646
683
}
647
684
648
685
pub ( super ) fn from_failure_code ( failure_code : u16 ) -> Self {
649
- Self ( HTLCFailReasonRepr :: Reason { failure_code, data : Vec :: new ( ) } )
686
+ Self :: reason ( failure_code, Vec :: new ( ) )
650
687
}
651
688
652
689
pub ( super ) fn from_msg ( msg : & msgs:: UpdateFailHTLC ) -> Self {
0 commit comments