@@ -45,16 +45,23 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
4545 let paymentSecret = paymentClaimable. getPurpose ( ) . getValueAsInvoicePayment ( ) ? . getPaymentSecret ( )
4646 let spontaneousPayment = paymentClaimable. getPurpose ( ) . getValueAsSpontaneousPayment ( )
4747
48+ let body : [ String : Encodable ] = [
49+ " payment_hash " : Data ( paymentClaimable. getPaymentHash ( ) ) . hexEncodedString ( ) ,
50+ " amount_sat " : paymentClaimable. getAmountMsat ( ) / 1000 ,
51+ " payment_preimage " : Data ( paymentPreimage ?? [ ] ) . hexEncodedString ( ) ,
52+ " payment_secret " : Data ( paymentSecret ?? [ ] ) . hexEncodedString ( ) ,
53+ " spontaneous_payment_preimage " : Data ( spontaneousPayment ?? [ ] ) . hexEncodedString ( ) ,
54+ " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970) ,
55+ " confirmed " : false
56+ ]
57+
4858 LdkEventEmitter . shared. send (
4959 withEvent: . channel_manager_payment_claimable,
50- body: [
51- " payment_hash " : Data ( paymentClaimable. getPaymentHash ( ) ) . hexEncodedString ( ) ,
52- " amount_sat " : paymentClaimable. getAmountMsat ( ) / 1000 ,
53- " payment_preimage " : Data ( paymentPreimage ?? [ ] ) . hexEncodedString ( ) ,
54- " payment_secret " : Data ( paymentSecret ?? [ ] ) . hexEncodedString ( ) ,
55- " spontaneous_payment_preimage " : Data ( spontaneousPayment ?? [ ] ) . hexEncodedString ( ) ,
56- ]
60+ body: body
5761 )
62+
63+ //Save to disk for TX history
64+ persistPaymentClaimed ( body)
5865 return
5966 case . PaymentSent:
6067 guard let paymentSent = event. getValueAsPaymentSent ( ) else {
@@ -200,7 +207,8 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
200207 " payment_preimage " : Data ( paymentPreimage ?? [ ] ) . hexEncodedString ( ) ,
201208 " payment_secret " : Data ( paymentSecret ?? [ ] ) . hexEncodedString ( ) ,
202209 " spontaneous_payment_preimage " : Data ( spontaneousPayment ?? [ ] ) . hexEncodedString ( ) ,
203- " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970)
210+ " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970) ,
211+ " confirmed " : true
204212 ]
205213
206214 LdkEventEmitter . shared. send (
@@ -270,21 +278,36 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
270278 return
271279 }
272280
273- var newContent : [ [ String : Any ] ] = [ ]
281+ var payments : [ [ String : Any ] ] = [ ]
274282
275283 do {
276284 if FileManager . default. fileExists ( atPath: claimedPaymentsStorage. path) {
277285 let data = try Data ( contentsOf: URL ( fileURLWithPath: claimedPaymentsStorage. path) , options: . mappedIfSafe)
278286
279287 if let existingContent = try JSONSerialization . jsonObject ( with: data, options: [ ] ) as? [ [ String : Any ] ] {
280- newContent = existingContent
288+ payments = existingContent
281289 } else {
282290 LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error could not read existing claimed payments " )
283291 }
284292 }
285293
286- newContent. append ( payment)
287- guard let jsonData = try ? JSONSerialization . data ( withJSONObject: newContent, options: [ ] ) else {
294+ //Replace entry if payment hash exists (Confirmed payment replacing pending)
295+ var paymentReplaced = false
296+ for (index, existingPayment) in payments. enumerated ( ) {
297+ if let existingPaymentHash = existingPayment [ " payment_hash " ] as? String , let newPaymentHash = payment [ " payment_hash " ] as? String {
298+ if existingPaymentHash == newPaymentHash {
299+ payments [ index] = payment
300+ paymentReplaced = true
301+ }
302+ }
303+ }
304+
305+ //No existing payment found, append as new payment
306+ if !paymentReplaced {
307+ payments. append ( payment)
308+ }
309+
310+ guard let jsonData = try ? JSONSerialization . data ( withJSONObject: payments, options: [ ] ) else {
288311 LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error could not serialize claimed payments " )
289312 return
290313 }
0 commit comments