@@ -32,6 +32,7 @@ use ldk_server_client::ldk_server_grpc::events::{
3232use ldk_server_client:: ldk_server_grpc:: types:: {
3333 bolt11_invoice_description, Bolt11InvoiceDescription ,
3434} ;
35+ use ldk_server_grpc:: types:: payment_kind;
3536
3637const EVENT_TIMEOUT : Duration = Duration :: from_secs ( 15 ) ;
3738
@@ -1462,3 +1463,40 @@ async fn test_metrics_endpoint_with_auth() {
14621463 assert ! ( metrics. contains( "ldk_server_total_anchor_channels_reserve_sats 0" ) ) ;
14631464 assert ! ( metrics. contains( "ldk_server_total_lightning_balance_sats 0" ) ) ;
14641465}
1466+
1467+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
1468+ async fn test_cli_spontaneous_send_with_preimage ( ) {
1469+ let bitcoind = TestBitcoind :: new ( ) ;
1470+ let server_a = LdkServerHandle :: start ( & bitcoind) . await ;
1471+ let server_b = LdkServerHandle :: start ( & bitcoind) . await ;
1472+
1473+ let mut events_b = server_b. client ( ) . subscribe_events ( ) . await . unwrap ( ) ;
1474+
1475+ setup_funded_channel ( & bitcoind, & server_a, & server_b, 100_000 ) . await ;
1476+
1477+ // Generate a known preimage and compute its payment hash
1478+ let preimage_bytes = [ 43u8 ; 32 ] ;
1479+ let preimage_hex = preimage_bytes. to_lower_hex_string ( ) ;
1480+ let payment_hash = sha256:: Hash :: hash ( & preimage_bytes) ;
1481+ let payment_hash_hex = payment_hash. to_byte_array ( ) . to_lower_hex_string ( ) ;
1482+
1483+ let output = run_cli (
1484+ & server_a,
1485+ & [ "spontaneous-send" , server_b. node_id ( ) , "10000sat" , "--preimage" , & preimage_hex] ,
1486+ ) ;
1487+
1488+ assert ! ( !output[ "payment_id" ] . as_str( ) . unwrap( ) . is_empty( ) ) ;
1489+
1490+ // The receiver must observe in PaymentReceived for checking on Spontaneous payment.
1491+ let event_b = wait_for_event ( & mut events_b, |e| matches ! ( e, Event :: PaymentReceived ( _) ) ) . await ;
1492+ let Some ( Event :: PaymentReceived ( pr) ) = event_b. event else {
1493+ panic ! ( "expected PaymentReceived" ) ;
1494+ } ;
1495+
1496+ let payment = pr. payment . unwrap ( ) ;
1497+
1498+ let Some ( payment_kind:: Kind :: Spontaneous ( spont) ) = payment. kind . unwrap ( ) . kind else {
1499+ panic ! ( "expected spontaneous kind" ) ;
1500+ } ;
1501+ assert_eq ! ( spont. hash, payment_hash_hex) ;
1502+ }
0 commit comments