@@ -19,8 +19,8 @@ use common::{
1919use ldk_node:: config:: EsploraSyncConfig ;
2020use ldk_node:: liquidity:: LSPS2ServiceConfig ;
2121use ldk_node:: payment:: {
22- ConfirmationStatus , PaymentDirection , PaymentKind , PaymentStatus , QrPaymentResult ,
23- SendingParameters ,
22+ ConfirmationStatus , PaymentDetails , PaymentDirection , PaymentKind , PaymentStatus ,
23+ QrPaymentResult , SendingParameters ,
2424} ;
2525use ldk_node:: { Builder , Event , NodeError } ;
2626
@@ -29,8 +29,10 @@ use lightning::routing::gossip::{NodeAlias, NodeId};
2929use lightning:: util:: persist:: KVStore ;
3030
3131use lightning_invoice:: { Bolt11InvoiceDescription , Description } ;
32+ use lightning_types:: payment:: PaymentPreimage ;
3233
3334use bitcoin:: address:: NetworkUnchecked ;
35+ use bitcoin:: hashes:: sha256:: Hash as Sha256Hash ;
3436use bitcoin:: hashes:: Hash ;
3537use bitcoin:: Address ;
3638use bitcoin:: Amount ;
@@ -1389,3 +1391,69 @@ fn facade_logging() {
13891391 validate_log_entry ( entry) ;
13901392 }
13911393}
1394+
1395+ #[ test]
1396+ fn spontaneous_send_with_custom_preimage ( ) {
1397+ let ( bitcoind, electrsd) = setup_bitcoind_and_electrsd ( ) ;
1398+ let chain_source = TestChainSource :: Esplora ( & electrsd) ;
1399+ let ( node_a, node_b) = setup_two_nodes ( & chain_source, false , true , false ) ;
1400+
1401+ let address_a = node_a. onchain_payment ( ) . new_address ( ) . unwrap ( ) ;
1402+ let premine_sat = 1_000_000 ;
1403+ premine_and_distribute_funds (
1404+ & bitcoind. client ,
1405+ & electrsd. client ,
1406+ vec ! [ address_a] ,
1407+ Amount :: from_sat ( premine_sat) ,
1408+ ) ;
1409+ node_a. sync_wallets ( ) . unwrap ( ) ;
1410+ node_b. sync_wallets ( ) . unwrap ( ) ;
1411+ open_channel ( & node_a, & node_b, 500_000 , true , & electrsd) ;
1412+ generate_blocks_and_wait ( & bitcoind. client , & electrsd. client , 6 ) ;
1413+ node_a. sync_wallets ( ) . unwrap ( ) ;
1414+ node_b. sync_wallets ( ) . unwrap ( ) ;
1415+ expect_channel_ready_event ! ( node_a, node_b. node_id( ) ) ;
1416+ expect_channel_ready_event ! ( node_b, node_a. node_id( ) ) ;
1417+
1418+ let seed = b"test_payment_preimage" ;
1419+ let bytes: Sha256Hash = Sha256Hash :: hash ( seed) ;
1420+ let custom_bytes = bytes. to_byte_array ( ) ;
1421+ let custom_preimage = PaymentPreimage ( custom_bytes) ;
1422+
1423+ let amount_msat = 100_000 ;
1424+ let payment_id = node_a
1425+ . spontaneous_payment ( )
1426+ . send_with_preimage ( amount_msat, node_b. node_id ( ) , custom_preimage, None )
1427+ . unwrap ( ) ;
1428+
1429+ // check payment status and verify stored preimage
1430+ expect_payment_successful_event ! ( node_a, Some ( payment_id) , None ) ;
1431+ let details: PaymentDetails =
1432+ node_a. list_payments_with_filter ( |p| p. id == payment_id) . first ( ) . unwrap ( ) . clone ( ) ;
1433+ assert_eq ! ( details. status, PaymentStatus :: Succeeded ) ;
1434+ if let PaymentKind :: Spontaneous { preimage : Some ( pi) , .. } = details. kind {
1435+ assert_eq ! ( pi. 0 , custom_bytes) ;
1436+ } else {
1437+ panic ! ( "Expected a spontaneous PaymentKind with a preimage" ) ;
1438+ }
1439+
1440+ // Verify receiver side (node_b)
1441+ expect_payment_received_event ! ( node_b, amount_msat) ;
1442+ let receiver_payments: Vec < PaymentDetails > = node_b. list_payments_with_filter ( |p| {
1443+ p. direction == PaymentDirection :: Inbound
1444+ && matches ! ( p. kind, PaymentKind :: Spontaneous { .. } )
1445+ } ) ;
1446+
1447+ assert_eq ! ( receiver_payments. len( ) , 1 ) ;
1448+ let receiver_details = & receiver_payments[ 0 ] ;
1449+ assert_eq ! ( receiver_details. status, PaymentStatus :: Succeeded ) ;
1450+ assert_eq ! ( receiver_details. amount_msat, Some ( amount_msat) ) ;
1451+ assert_eq ! ( receiver_details. direction, PaymentDirection :: Inbound ) ;
1452+
1453+ // Verify receiver also has the same preimage
1454+ if let PaymentKind :: Spontaneous { preimage : Some ( pi) , .. } = & receiver_details. kind {
1455+ assert_eq ! ( pi. 0 , custom_bytes) ;
1456+ } else {
1457+ panic ! ( "Expected receiver to have spontaneous PaymentKind with preimage" ) ;
1458+ }
1459+ }
0 commit comments