diff --git a/e2e-tests/tests/e2e.rs b/e2e-tests/tests/e2e.rs index 093a7625..f5dd07dc 100644 --- a/e2e-tests/tests/e2e.rs +++ b/e2e-tests/tests/e2e.rs @@ -510,6 +510,8 @@ async fn test_subscribe_events_channel_state_lifecycle_pending_ready_closed() { assert!(pending_a.funding_txo.is_some()); assert!(pending_a.reason.is_none()); assert_eq!(pending_a.closure_initiator, ChannelClosureInitiator::Unspecified as i32); + assert!(pending_a.former_temporary_channel_id.as_deref().is_some_and(|id| !id.is_empty())); + assert_ne!(pending_a.former_temporary_channel_id.as_deref(), Some(pending_a.channel_id.as_str())); let pending_b = wait_for_event(&mut events_b, |e| { matches!( @@ -676,6 +678,8 @@ async fn test_subscribe_events_channel_state_lifecycle_pending_ready_force_close assert!(pending_a.funding_txo.is_some()); assert!(pending_a.reason.is_none()); assert_eq!(pending_a.closure_initiator, ChannelClosureInitiator::Unspecified as i32); + assert!(pending_a.former_temporary_channel_id.as_deref().is_some_and(|id| !id.is_empty())); + assert_ne!(pending_a.former_temporary_channel_id.as_deref(), Some(pending_a.channel_id.as_str())); let pending_b = wait_for_event(&mut events_b, |e| { matches!( diff --git a/ldk-server-grpc/src/api.rs b/ldk-server-grpc/src/api.rs index a2d44a10..a8a6b9f3 100644 --- a/ldk-server-grpc/src/api.rs +++ b/ldk-server-grpc/src/api.rs @@ -88,6 +88,13 @@ pub struct GetNodeInfoResponse { /// Features advertised by this node, keyed by the signaled BOLT feature bit. #[prost(btree_map = "uint32, message", tag = "14")] pub features: ::prost::alloc::collections::BTreeMap, + /// The timestamp, in seconds since start of the UNIX epoch, when we last successfully merged + /// external pathfinding scores. + /// + /// Will be `None` if background pathfinding score syncing isn't configured, or no scores have + /// been merged since the node was initialized. + #[prost(uint64, optional, tag = "15")] + pub latest_pathfinding_scores_sync_timestamp: ::core::option::Option, } /// Retrieve a new on-chain funding address. /// See more: diff --git a/ldk-server-grpc/src/events.rs b/ldk-server-grpc/src/events.rs index b4e54554..a53e808e 100644 --- a/ldk-server-grpc/src/events.rs +++ b/ldk-server-grpc/src/events.rs @@ -143,6 +143,11 @@ pub struct ChannelStateChanged { pub reason: ::core::option::Option, #[prost(enumeration = "ChannelClosureInitiator", tag = "7")] pub closure_initiator: i32, + /// The `temporary_channel_id` this channel used to be known by during channel establishment. + /// + /// Only set when `state` is `CHANNEL_STATE_PENDING`. + #[prost(string, optional, tag = "8")] + pub former_temporary_channel_id: ::core::option::Option<::prost::alloc::string::String>, } /// SpliceNegotiated indicates a channel splice has been negotiated and the funding /// transaction is pending confirmation on-chain. diff --git a/ldk-server-grpc/src/proto/api.proto b/ldk-server-grpc/src/proto/api.proto index ead1015b..dc1ef97a 100644 --- a/ldk-server-grpc/src/proto/api.proto +++ b/ldk-server-grpc/src/proto/api.proto @@ -76,6 +76,13 @@ message GetNodeInfoResponse { // Features advertised by this node, keyed by the signaled BOLT feature bit. map features = 14; + + // The timestamp, in seconds since start of the UNIX epoch, when we last successfully merged + // external pathfinding scores. + // + // Will be `None` if background pathfinding score syncing isn't configured, or no scores have + // been merged since the node was initialized. + optional uint64 latest_pathfinding_scores_sync_timestamp = 15; } // Retrieve a new on-chain funding address. diff --git a/ldk-server-grpc/src/proto/events.proto b/ldk-server-grpc/src/proto/events.proto index 1eec77b7..77812010 100644 --- a/ldk-server-grpc/src/proto/events.proto +++ b/ldk-server-grpc/src/proto/events.proto @@ -120,6 +120,10 @@ message ChannelStateChanged { optional string funding_txo = 5; optional ChannelStateChangeReason reason = 6; ChannelClosureInitiator closure_initiator = 7; + // The `temporary_channel_id` this channel used to be known by during channel establishment. + // + // Only set when `state` is `CHANNEL_STATE_PENDING`. + optional string former_temporary_channel_id = 8; } // SpliceNegotiated indicates a channel splice has been negotiated and the funding diff --git a/ldk-server/src/api/get_node_info.rs b/ldk-server/src/api/get_node_info.rs index 154cdb3f..99dbf1bf 100644 --- a/ldk-server/src/api/get_node_info.rs +++ b/ldk-server/src/api/get_node_info.rs @@ -72,6 +72,8 @@ pub(crate) async fn handle_get_node_info_request( node_uris, network, features, + latest_pathfinding_scores_sync_timestamp: node_status + .latest_pathfinding_scores_sync_timestamp, }; Ok(response) } diff --git a/ldk-server/src/main.rs b/ldk-server/src/main.rs index c284a61d..ca03b407 100644 --- a/ldk-server/src/main.rs +++ b/ldk-server/src/main.rs @@ -382,7 +382,7 @@ fn main() { user_channel_id, counterparty_node_id, funding_txo, - .. + former_temporary_channel_id, } => { info!( "CHANNEL_PENDING: {} from counterparty {}", @@ -398,6 +398,9 @@ fn main() { funding_txo: Some(funding_txo.to_string()), reason: None, closure_initiator: events::ChannelClosureInitiator::Unspecified.into(), + former_temporary_channel_id: Some( + former_temporary_channel_id.0.to_lower_hex_string(), + ), }), &event_sender, ); @@ -430,6 +433,7 @@ fn main() { funding_txo: funding_txo.map(|outpoint| outpoint.to_string()), reason: None, closure_initiator: events::ChannelClosureInitiator::Unspecified.into(), + former_temporary_channel_id: None, }), &event_sender, ); @@ -471,6 +475,7 @@ fn main() { funding_txo: None, reason: reason_ref.map(closure_reason_to_proto), closure_initiator: closure_initiator_from_reason(reason_ref).into(), + former_temporary_channel_id: None, }), &event_sender, );