@@ -848,9 +848,72 @@ impl Node {
848
848
) {
849
849
Ok ( _payment_id) => {
850
850
let payee_pubkey = invoice. recover_payee_pub_key ( ) ;
851
- // TODO: is this unwrap safe? Would a payment to an invoice with None amount ever
852
- // succeed? Should we allow to set the amount in the interface or via a dedicated
853
- // method?
851
+ let amt_msat = invoice. amount_milli_satoshis ( ) . unwrap ( ) ;
852
+ log_info ! ( self . logger, "Initiated sending {} msats to {}" , amt_msat, payee_pubkey) ;
853
+
854
+ outbound_payments_lock. insert (
855
+ payment_hash,
856
+ PaymentInfo {
857
+ preimage : None ,
858
+ secret : payment_secret,
859
+ status : PaymentStatus :: Pending ,
860
+ amount_msat : invoice. amount_milli_satoshis ( ) ,
861
+ } ,
862
+ ) ;
863
+
864
+ Ok ( payment_hash)
865
+ }
866
+ Err ( payment:: PaymentError :: Invoice ( e) ) => {
867
+ log_error ! ( self . logger, "Failed to send payment due to invalid invoice: {}" , e) ;
868
+ Err ( Error :: InvalidInvoice )
869
+ }
870
+ Err ( payment:: PaymentError :: Sending ( e) ) => {
871
+ log_error ! ( self . logger, "Failed to send payment: {:?}" , e) ;
872
+
873
+ outbound_payments_lock. insert (
874
+ payment_hash,
875
+ PaymentInfo {
876
+ preimage : None ,
877
+ secret : payment_secret,
878
+ status : PaymentStatus :: Failed ,
879
+ amount_msat : invoice. amount_milli_satoshis ( ) ,
880
+ } ,
881
+ ) ;
882
+ Err ( Error :: PaymentFailed )
883
+ }
884
+ }
885
+ }
886
+
887
+ /// Send a payement given a so-called "zero amount" invoice, i.e., an invoice that leaves the
888
+ /// amount paid to be determined by the user.
889
+ pub fn send_adjustable_value_payment (
890
+ & self , invoice : Invoice , amount_msat : u64 ,
891
+ ) -> Result < PaymentHash , Error > {
892
+ if self . running . read ( ) . unwrap ( ) . is_none ( ) {
893
+ return Err ( Error :: NotRunning ) ;
894
+ }
895
+
896
+ let mut outbound_payments_lock = self . outbound_payments . lock ( ) . unwrap ( ) ;
897
+
898
+ let payment_hash = PaymentHash ( ( * invoice. payment_hash ( ) ) . into_inner ( ) ) ;
899
+ let payment_secret = Some ( * invoice. payment_secret ( ) ) ;
900
+
901
+ if invoice. amount_milli_satoshis ( ) . is_some ( ) {
902
+ log_error ! (
903
+ self . logger,
904
+ "Failed to pay the given invoice: expected \" zero-amount\" invoice, please use send_payment."
905
+ ) ;
906
+ return Err ( Error :: InvalidInvoice ) ;
907
+ }
908
+
909
+ match lightning_invoice:: payment:: pay_zero_value_invoice (
910
+ & invoice,
911
+ amount_msat,
912
+ Retry :: Timeout ( LDK_PAYMENT_RETRY_TIMEOUT ) ,
913
+ self . channel_manager . as_ref ( ) ,
914
+ ) {
915
+ Ok ( _payment_id) => {
916
+ let payee_pubkey = invoice. recover_payee_pub_key ( ) ;
854
917
let amt_msat = invoice. amount_milli_satoshis ( ) . unwrap ( ) ;
855
918
log_info ! ( self . logger, "Initiated sending {} msats to {}" , amt_msat, payee_pubkey) ;
856
919
0 commit comments