Skip to content

Commit 56c3a2a

Browse files
committed
Use real feature bits list for ldk-server
Previously it was hardcoded to be empty, now we explicitly ask for feature bits when we initialize ldk-server simulation node.
1 parent cdcf244 commit 56c3a2a

1 file changed

Lines changed: 17 additions & 4 deletions

File tree

simln-lib/src/ldk_server.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
268281
fn 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

Comments
 (0)