@@ -63,10 +63,7 @@ impl LdkServerNode {
6363 let alias = info. node_alias . unwrap_or_default ( ) ;
6464 let network = network_from_proto ( info. network ) ?;
6565
66- // ldk-server doesn't expose feature bits, but it always supports keysend
67- // via `spontaneous_send`, so advertise it so sim-ln's keysend checks pass.
68- let mut features = NodeFeatures :: empty ( ) ;
69- features. set_keysend_optional ( ) ;
66+ let features = parse_node_features ( info. features . keys ( ) . copied ( ) ) ;
7067
7168 Ok ( Self {
7269 client,
@@ -265,6 +262,22 @@ fn network_from_proto(value: i32) -> Result<Network, LightningError> {
265262 }
266263}
267264
265+ /// Convert the BOLT feature bits advertised by ldk-server (keyed by feature bit number) into LDK's
266+ /// NodeFeatures by setting the corresponding bit for each advertised feature.
267+ fn parse_node_features ( bits : impl IntoIterator < Item = u32 > ) -> NodeFeatures {
268+ let mut flags = Vec :: new ( ) ;
269+
270+ for bit in bits {
271+ let byte_offset = ( bit / 8 ) as usize ;
272+ if flags. len ( ) <= byte_offset {
273+ flags. resize ( byte_offset + 1 , 0u8 ) ;
274+ }
275+ flags[ byte_offset] |= 1 << ( bit % 8 ) ;
276+ }
277+
278+ NodeFeatures :: from_le_bytes ( flags)
279+ }
280+
268281fn string_to_payment_hash ( hash : & str ) -> Result < PaymentHash , LightningError > {
269282 let bytes = hex:: decode ( hash) . map_err ( |_| LightningError :: InvalidPaymentHash ) ?;
270283 let slice: [ u8 ; 32 ] = bytes
0 commit comments