@@ -23,7 +23,8 @@ use ldk_node::lightning::offers::offer::Offer;
2323use ldk_node:: lightning_invoice:: Bolt11Invoice ;
2424use ldk_server_client:: client:: EventStream ;
2525use ldk_server_client:: ldk_server_grpc:: api:: {
26- Bolt11ReceiveRequest , Bolt12ReceiveRequest , OnchainReceiveRequest , OpenChannelRequest ,
26+ Bolt11ReceiveRequest , Bolt12ReceiveRequest , GetBalancesRequest , OnchainReceiveRequest ,
27+ OpenChannelRequest ,
2728} ;
2829use ldk_server_client:: ldk_server_grpc:: events:: event_envelope:: Event ;
2930use ldk_server_client:: ldk_server_grpc:: events:: {
@@ -360,6 +361,45 @@ async fn test_cli_onchain_send() {
360361 assert ! ( !output[ "txid" ] . as_str( ) . unwrap( ) . is_empty( ) ) ;
361362}
362363
364+ #[ tokio:: test]
365+ async fn test_cli_onchain_send_all_retains_anchor_reserve ( ) {
366+ let bitcoind = TestBitcoind :: new ( ) ;
367+ let server_a = LdkServerHandle :: start ( & bitcoind) . await ;
368+ let server_b = LdkServerHandle :: start ( & bitcoind) . await ;
369+
370+ setup_funded_channel ( & bitcoind, & server_a, & server_b, 100_000 ) . await ;
371+
372+ let balances_before = server_a. client ( ) . get_balances ( GetBalancesRequest { } ) . await . unwrap ( ) ;
373+ let reserve_sats = balances_before. total_anchor_channels_reserve_sats ;
374+ assert ! ( reserve_sats > 0 ) ;
375+
376+ let address =
377+ server_b. client ( ) . onchain_receive ( OnchainReceiveRequest { } ) . await . unwrap ( ) . address ;
378+ let output = run_cli ( & server_a, & [ "onchain-send" , & address, "--send-all" , "true" ] ) ;
379+ assert ! ( !output[ "txid" ] . as_str( ) . unwrap( ) . is_empty( ) ) ;
380+
381+ mine_and_sync ( & bitcoind, & [ & server_a, & server_b] , 6 ) . await ;
382+
383+ let timeout = Duration :: from_secs ( 30 ) ;
384+ let start = std:: time:: Instant :: now ( ) ;
385+ loop {
386+ let balances = server_a. client ( ) . get_balances ( GetBalancesRequest { } ) . await . unwrap ( ) ;
387+ if balances. spendable_onchain_balance_sats == 0
388+ && balances. total_onchain_balance_sats == reserve_sats
389+ {
390+ assert_eq ! ( balances. total_anchor_channels_reserve_sats, reserve_sats) ;
391+ break ;
392+ }
393+ if start. elapsed ( ) > timeout {
394+ panic ! (
395+ "Timed out waiting for send-all to retain the {} sat Anchor reserve. Current balances: {:?}" ,
396+ reserve_sats, balances
397+ ) ;
398+ }
399+ tokio:: time:: sleep ( Duration :: from_millis ( 500 ) ) . await ;
400+ }
401+ }
402+
363403#[ tokio:: test]
364404async fn test_cli_connect_peer ( ) {
365405 let bitcoind = TestBitcoind :: new ( ) ;
0 commit comments