@@ -642,11 +642,48 @@ impl_writeable_tlv_based_enum!(HTLCFailReasonRepr,
642642
643643impl HTLCFailReason {
644644 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+
645682 Self ( HTLCFailReasonRepr :: Reason { failure_code, data } )
646683 }
647684
648685 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 ( ) )
650687 }
651688
652689 pub ( super ) fn from_msg ( msg : & msgs:: UpdateFailHTLC ) -> Self {
0 commit comments