@@ -112,6 +112,16 @@ pub(crate) fn poll_for_user_input(node: &LightningNode, log_file_path: &str) {
112
112
println ! ( "{}" , message. red( ) ) ;
113
113
}
114
114
}
115
+ "listfailedswaps" => {
116
+ if let Err ( message) = list_failed_swaps ( node) {
117
+ println ! ( "{}" , message. red( ) ) ;
118
+ }
119
+ }
120
+ "refundfailedswap" => {
121
+ if let Err ( message) = refund_failed_swap ( node, & mut words) {
122
+ println ! ( "{}" , message. red( ) ) ;
123
+ }
124
+ }
115
125
"registertopup" => {
116
126
if let Err ( message) = register_topup ( node, & mut words) {
117
127
println ! ( "{}" , message. red( ) ) ;
@@ -219,6 +229,12 @@ fn setup_editor(history_path: &Path) -> Editor<CommandHinter, DefaultHistory> {
219
229
"payopeninvoice " ,
220
230
) ) ;
221
231
232
+ hints. insert ( CommandHint :: new ( "listfailedswaps>" , "listfailedswaps " ) ) ;
233
+ hints. insert ( CommandHint :: new (
234
+ "refundfailedswap <swap address> <to address>" ,
235
+ "refundfailedswap " ,
236
+ ) ) ;
237
+
222
238
hints. insert ( CommandHint :: new (
223
239
"registertopup <IBAN> <currency> [email]" ,
224
240
"registertopup " ,
@@ -261,6 +277,9 @@ fn help() {
261
277
println ! ( " payinvoice <invoice>" ) ;
262
278
println ! ( " payopeninvoice <invoice> <amount in SAT>" ) ;
263
279
println ! ( ) ;
280
+ println ! ( " listfailedswaps" ) ;
281
+ println ! ( " refundfailedswap <swap address> <to address>" ) ;
282
+ println ! ( ) ;
264
283
println ! ( " registertopup <IBAN> <currency> [email]" ) ;
265
284
println ! ( " listoffers" ) ;
266
285
println ! ( ) ;
@@ -548,6 +567,52 @@ fn pay_open_invoice(
548
567
Ok ( ( ) )
549
568
}
550
569
570
+ fn list_failed_swaps ( node : & LightningNode ) -> Result < ( ) , String > {
571
+ let failed_swaps = match node. get_unresolved_failed_swaps ( ) {
572
+ Ok ( s) => s,
573
+ Err ( e) => return Err ( e. to_string ( ) ) ,
574
+ } ;
575
+
576
+ println ! (
577
+ "Total of {} failed swaps\n " ,
578
+ failed_swaps. len( ) . to_string( ) . bold( )
579
+ ) ;
580
+ for swap in failed_swaps {
581
+ let created_at: DateTime < Local > = swap. created_at . into ( ) ;
582
+ println ! ( "Failed swap created at {created_at}:" ) ;
583
+ println ! ( " Address {}" , swap. address) ;
584
+ println ! ( " Amount: {}" , amount_to_string( swap. amount) ) ;
585
+ }
586
+
587
+ Ok ( ( ) )
588
+ }
589
+
590
+ fn refund_failed_swap (
591
+ node : & LightningNode ,
592
+ words : & mut dyn Iterator < Item = & str > ,
593
+ ) -> Result < ( ) , String > {
594
+ let swap_address = words
595
+ . next ( )
596
+ . ok_or_else ( || "swap address is required" . to_string ( ) ) ?;
597
+ let to_address = words
598
+ . next ( )
599
+ . ok_or_else ( || "to address is required" . to_string ( ) ) ?;
600
+
601
+ let fee_rate = match node. query_onchain_fee ( ) {
602
+ Ok ( r) => r,
603
+ Err ( e) => return Err ( e. to_string ( ) ) ,
604
+ } ;
605
+
606
+ match node. refund_failed_swap ( swap_address. into ( ) , to_address. into ( ) , fee_rate) {
607
+ Ok ( txid) => {
608
+ println ! ( "Successfully broadcasted refund transaction - txid: {txid}" )
609
+ }
610
+ Err ( e) => return Err ( e. to_string ( ) ) ,
611
+ }
612
+
613
+ Ok ( ( ) )
614
+ }
615
+
551
616
fn register_topup (
552
617
node : & LightningNode ,
553
618
words : & mut dyn Iterator < Item = & str > ,
0 commit comments