diff --git a/ldk-server-cli/src/main.rs b/ldk-server-cli/src/main.rs index 7385c9d6..f9efe39f 100644 --- a/ldk-server-cli/src/main.rs +++ b/ldk-server-cli/src/main.rs @@ -8,7 +8,7 @@ use ldk_server_client::ldk_server_protos::api::{ Bolt11ReceiveRequest, Bolt11SendRequest, Bolt12ReceiveRequest, Bolt12SendRequest, CloseChannelRequest, ForceCloseChannelRequest, GetBalancesRequest, GetNodeInfoRequest, ListChannelsRequest, ListPaymentsRequest, OnchainReceiveRequest, OnchainSendRequest, - OpenChannelRequest, SpliceInRequest, SpliceOutRequest, + OpenChannelRequest, SpliceInRequest, SpliceOutRequest, UpdateChannelConfigRequest, }; use ldk_server_client::ldk_server_protos::types::RouteParametersConfig; use ldk_server_client::ldk_server_protos::types::{ @@ -169,6 +169,27 @@ enum Commands { )] number_of_payments: Option, }, + UpdateChannelConfig { + #[arg(short, long)] + user_channel_id: String, + #[arg(short, long)] + counterparty_node_id: String, + #[arg( + long, + help = "Amount (in millionths of a satoshi) charged per satoshi for payments forwarded outbound over the channel. This can be updated by using update-channel-config." + )] + forwarding_fee_proportional_millionths: Option, + #[arg( + long, + help = "Amount (in milli-satoshi) charged for payments forwarded outbound over the channel, in excess of forwarding_fee_proportional_millionths. This can be updated by using update-channel-config." + )] + forwarding_fee_base_msat: Option, + #[arg( + long, + help = "The difference in the CLTV value between incoming HTLCs and an outbound HTLC forwarded over the channel." + )] + cltv_expiry_delta: Option, + }, } #[tokio::main] @@ -374,6 +395,32 @@ async fn main() { Commands::ListPayments { number_of_payments } => { handle_response_result(list_n_payments(client, number_of_payments).await); }, + Commands::UpdateChannelConfig { + user_channel_id, + counterparty_node_id, + forwarding_fee_proportional_millionths, + forwarding_fee_base_msat, + cltv_expiry_delta, + } => { + let channel_config = ChannelConfig { + forwarding_fee_proportional_millionths, + forwarding_fee_base_msat, + cltv_expiry_delta, + force_close_avoidance_max_fee_satoshis: None, + accept_underpaying_htlcs: None, + max_dust_htlc_exposure: None, + }; + + handle_response_result( + client + .update_channel_config(UpdateChannelConfigRequest { + user_channel_id, + counterparty_node_id, + channel_config: Some(channel_config), + }) + .await, + ); + }, } } diff --git a/ldk-server-client/src/client.rs b/ldk-server-client/src/client.rs index 237264b8..7fbe5dfa 100644 --- a/ldk-server-client/src/client.rs +++ b/ldk-server-client/src/client.rs @@ -12,13 +12,13 @@ use ldk_server_protos::api::{ ListChannelsRequest, ListChannelsResponse, ListPaymentsRequest, ListPaymentsResponse, OnchainReceiveRequest, OnchainReceiveResponse, OnchainSendRequest, OnchainSendResponse, OpenChannelRequest, OpenChannelResponse, SpliceInRequest, SpliceInResponse, SpliceOutRequest, - SpliceOutResponse, + SpliceOutResponse, UpdateChannelConfigRequest, UpdateChannelConfigResponse, }; use ldk_server_protos::endpoints::{ BOLT11_RECEIVE_PATH, BOLT11_SEND_PATH, BOLT12_RECEIVE_PATH, BOLT12_SEND_PATH, CLOSE_CHANNEL_PATH, FORCE_CLOSE_CHANNEL_PATH, GET_BALANCES_PATH, GET_NODE_INFO_PATH, LIST_CHANNELS_PATH, LIST_PAYMENTS_PATH, ONCHAIN_RECEIVE_PATH, ONCHAIN_SEND_PATH, - OPEN_CHANNEL_PATH, SPLICE_IN_PATH, SPLICE_OUT_PATH, + OPEN_CHANNEL_PATH, SPLICE_IN_PATH, SPLICE_OUT_PATH, UPDATE_CHANNEL_CONFIG_PATH, }; use ldk_server_protos::error::{ErrorCode, ErrorResponse}; use reqwest::header::CONTENT_TYPE; @@ -174,6 +174,15 @@ impl LdkServerClient { self.post_request(&request, &url).await } + /// Updates the config for a previously opened channel. + /// For API contract/usage, refer to docs for [`UpdateChannelConfigRequest`] and [`UpdateChannelConfigResponse`]. + pub async fn update_channel_config( + &self, request: UpdateChannelConfigRequest, + ) -> Result { + let url = format!("http://{}/{UPDATE_CHANNEL_CONFIG_PATH}", self.base_url); + self.post_request(&request, &url).await + } + async fn post_request( &self, request: &Rq, url: &str, ) -> Result {