@@ -194,15 +194,21 @@ pub enum Event {
194194 /// The caveat described above the `total_fee_earned_msat` field applies here as well.
195195 outbound_amount_forwarded_msat : Option < u64 > ,
196196 } ,
197- /// A payment for a previously-registered payment hash has been received.
197+ /// A BOLT 11 payment with a user-provided payment hash has been received.
198198 ///
199199 /// This needs to be manually claimed by supplying the correct preimage to [`claim_for_hash`].
200200 ///
201+ /// This event is only emitted for unknown payments if
202+ /// [`Config::manually_claim_unknown_bolt11_payments`] is enabled. Enabling it may let any
203+ /// holder of a valid invoice generated by this node tie up inbound HTLC slots and grow the
204+ /// persisted event queue until the payment is claimed, failed, or times out.
205+ ///
201206 /// If the provided parameters don't match the expectations or the preimage can't be
202207 /// retrieved in time, should be failed-back via [`fail_for_hash`].
203208 ///
204209 /// Note claiming will necessarily fail after the `claim_deadline` has been reached.
205210 ///
211+ /// [`Config::manually_claim_unknown_bolt11_payments`]: crate::config::Config::manually_claim_unknown_bolt11_payments
206212 /// [`claim_for_hash`]: crate::payment::Bolt11Payment::claim_for_hash
207213 /// [`fail_for_hash`]: crate::payment::Bolt11Payment::fail_for_hash
208214 PaymentClaimable {
@@ -906,45 +912,99 @@ where
906912 }
907913 }
908914
909- if let Some ( info) = payment_info {
915+ let should_emit_payment_claimable = if let Some ( info) = payment_info. as_ref ( ) {
910916 // If this is known by the store but ChannelManager doesn't know the preimage,
911- // the payment has been registered via `_for_hash` variants and needs to be manually claimed via
912- // user interaction.
913- match info. kind {
914- PaymentKind :: Bolt11 { preimage, .. } => {
915- if purpose. preimage ( ) . is_none ( ) {
916- debug_assert ! (
917- preimage. is_none( ) ,
918- "We would have registered the preimage if we knew"
919- ) ;
917+ // the payment needs to be manually claimed via user interaction.
918+ match & info. kind {
919+ PaymentKind :: Bolt11 { preimage, .. } if purpose. preimage ( ) . is_none ( ) => {
920+ debug_assert ! (
921+ preimage. is_none( ) ,
922+ "We would have registered the preimage if we knew"
923+ ) ;
924+ true
925+ } ,
926+ _ => false ,
927+ }
928+ } else if let PaymentPurpose :: Bolt11InvoicePayment {
929+ payment_preimage : None ,
930+ payment_secret,
931+ ..
932+ } = & purpose
933+ {
934+ if !self . config . manually_claim_unknown_bolt11_payments {
935+ log_info ! (
936+ self . logger,
937+ "Refusing unknown BOLT11 payment with hash {} as manual claiming is disabled" ,
938+ hex_utils:: to_string( & payment_hash. 0 ) ,
939+ ) ;
940+ self . channel_manager . fail_htlc_backwards ( & payment_hash) ;
941+ return Ok ( ( ) ) ;
942+ }
920943
921- let custom_records = onion_fields
922- . map ( |cf| {
923- cf. custom_tlvs ( ) . into_iter ( ) . map ( |tlv| tlv. into ( ) ) . collect ( )
924- } )
925- . unwrap_or_default ( ) ;
926- let event = Event :: PaymentClaimable {
927- payment_id,
928- payment_hash,
929- claimable_amount_msat : amount_msat,
930- claim_deadline,
931- custom_records,
932- } ;
933- match self . event_queue . add_event ( event) . await {
934- Ok ( _) => return Ok ( ( ) ) ,
935- Err ( e) => {
936- log_error ! (
937- self . logger,
938- "Failed to push to event queue: {}" ,
939- e
940- ) ;
941- return Err ( ReplayEvent ( ) ) ;
942- } ,
943- } ;
944- }
944+ let invoice_amount_msat =
945+ amount_msat. saturating_add ( counterparty_skimmed_fee_msat) ;
946+ let kind = PaymentKind :: Bolt11 {
947+ hash : payment_hash,
948+ preimage : None ,
949+ secret : Some ( * payment_secret) ,
950+ counterparty_skimmed_fee_msat : if counterparty_skimmed_fee_msat > 0 {
951+ Some ( counterparty_skimmed_fee_msat)
952+ } else {
953+ None
954+ } ,
955+ } ;
956+
957+ let payment = PaymentDetails :: new (
958+ payment_id,
959+ kind,
960+ Some ( invoice_amount_msat) ,
961+ None ,
962+ PaymentDirection :: Inbound ,
963+ PaymentStatus :: Pending ,
964+ ) ;
965+
966+ match self . payment_store . insert ( payment) . await {
967+ Ok ( false ) => ( ) ,
968+ Ok ( true ) => {
969+ log_error ! (
970+ self . logger,
971+ "Bolt11InvoicePayment with ID {} was previously known" ,
972+ payment_id,
973+ ) ;
974+ debug_assert ! ( false ) ;
975+ } ,
976+ Err ( e) => {
977+ log_error ! (
978+ self . logger,
979+ "Failed to insert payment with ID {}: {}" ,
980+ payment_id,
981+ e
982+ ) ;
983+ return Err ( ReplayEvent ( ) ) ;
945984 } ,
946- _ => { } ,
947985 }
986+ true
987+ } else {
988+ false
989+ } ;
990+ if should_emit_payment_claimable {
991+ let custom_records = onion_fields
992+ . map ( |cf| cf. custom_tlvs ( ) . into_iter ( ) . map ( |tlv| tlv. into ( ) ) . collect ( ) )
993+ . unwrap_or_default ( ) ;
994+ let event = Event :: PaymentClaimable {
995+ payment_id,
996+ payment_hash,
997+ claimable_amount_msat : amount_msat,
998+ claim_deadline,
999+ custom_records,
1000+ } ;
1001+ match self . event_queue . add_event ( event) . await {
1002+ Ok ( _) => return Ok ( ( ) ) ,
1003+ Err ( e) => {
1004+ log_error ! ( self . logger, "Failed to push to event queue: {}" , e) ;
1005+ return Err ( ReplayEvent ( ) ) ;
1006+ } ,
1007+ } ;
9481008 }
9491009
9501010 log_info ! (
0 commit comments