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