Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions simln-lib/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ rand_distr = "0.4.3"
rand_chacha = "0.3.1"
reqwest = { version = "0.12", features = ["json", "multipart"] }
tokio-util = { version = "0.7.13", features = ["rt"] }
ldk-server-client = { git = "https://github.com/enigbe/ldk-server", rev = "refs/pull/1/head", package = "ldk-server-client"}

[dev-dependencies]
ntest = "0.9.0"
Expand Down
90 changes: 90 additions & 0 deletions simln-lib/src/ldk.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
use std::str::FromStr;

use async_trait::async_trait;
use bitcoin::Network;
use ldk_server_client::client::LdkServerClient;
use lightning::ln::features::NodeFeatures;

use crate::{LightningError, LightningNode, NodeInfo};

pub struct LdkServerConnection {
pub base_url: String,
pub api_key: String,
pub server_cert_pem: Vec<u8>,
}

pub struct LdkServer {
client: LdkServerClient,
info: NodeInfo,
network: Network,
}

impl LdkServer {
/// Creates a new instance that connects to a running `ldk-server` node (daemon).
pub async fn new(connection: LdkServerConnection) -> Result<Self, LightningError> {
let client = LdkServerClient::new(base_url, api_key, server_cert_pem)
.map_err(|e| LightningError::ConnectionError(e))?;

let node_info_res = client
.get_node_info(node_info_req)
.await
.map_err(|e| LightningError::GetNodeInfoError(e.to_string()))?;

let network = Network::from_str(node_info_res.network.as_str())
.map_err(|e| LightningError::GetNodeInfoError(e.to_string()))?;

let info = NodeInfo {
pubkey: node_info_res.node_id.into(),
alias: node_info_res.node_alias().to_string(),
features: match node_info_res.features {
Some(features) => NodeFeatures::from_be_bytes(features.node.to_vec()),
None => NodeFeatures::empty(),
},
};

Ok(Self {
client,
info,
network,
})
}
}

#[async_trait]
impl LightningNode for LdkServer {
fn get_info(&self) -> &NodeInfo {
todo!()
}

fn get_network(&self) -> Network {
todo!()
}

async fn send_payment(
&self,
dest: PublicKey,
amount_msat: u64,
) -> Result<PaymentHash, LightningError> {
todo!()
}

async fn track_payment(
&self,
hash: &PaymentHash,
shutdown: Listener,
) -> Result<PaymentResult, LightningError> {
todo!()
}

async fn get_node_info(&self, node_id: &PublicKey) -> Result<NodeInfo, LightningError> {
todo!()
}

async fn channel_capacities(&self) -> Result<u64, LightningError> {
todo!()
}

async fn get_graph(&self) -> Result<Graph, LightningError> {
todo!()
}
}
1 change: 1 addition & 0 deletions simln-lib/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ pub mod clock;
mod defined_activity;
pub mod eclair;
pub mod latency_interceptor;
pub mod ldk;
pub mod lnd;
mod random_activity;
pub mod serializers;
Expand Down
14 changes: 14 additions & 0 deletions simln-lib/tests/ldk_integration.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
use simln_lib::ldk::{LdkServer, LdkServerConnection};

#[test]
async fn connect_successfully_to_ldkserver() {
let conn = LdkServerConnection {
base_url: "127.0.0.1:3002".to_string(),
api_key: todo!(),
server_cert_pem: todo!(),
};
let client = LdkServer::new(conn)
.await
.expect("Failed to connect to LDK server.");
todo!()
}
Loading