@@ -52,7 +52,7 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
5252 " payment_secret " : Data ( paymentSecret ?? [ ] ) . hexEncodedString ( ) ,
5353 " spontaneous_payment_preimage " : Data ( spontaneousPayment ?? [ ] ) . hexEncodedString ( ) ,
5454 " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970) ,
55- " confirmed " : false
55+ " state " : " pending "
5656 ]
5757
5858 LdkEventEmitter . shared. send (
@@ -68,15 +68,22 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
6868 return handleEventError ( event)
6969 }
7070
71+ let body : [ String : Encodable ] = [
72+ " payment_id " : Data ( paymentSent. getPaymentId ( ) ) . hexEncodedString ( ) ,
73+ " payment_preimage " : Data ( paymentSent. getPaymentPreimage ( ) ) . hexEncodedString ( ) ,
74+ " payment_hash " : Data ( paymentSent. getPaymentHash ( ) ) . hexEncodedString ( ) ,
75+ " fee_paid_sat " : ( paymentSent. getFeePaidMsat ( ) ?? 0 ) / 1000 ,
76+ " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970) ,
77+ " state " : " successful "
78+ ]
79+
7180 LdkEventEmitter . shared. send (
7281 withEvent: . channel_manager_payment_sent,
73- body: [
74- " payment_id " : Data ( paymentSent. getPaymentId ( ) ) . hexEncodedString ( ) ,
75- " payment_preimage " : Data ( paymentSent. getPaymentPreimage ( ) ) . hexEncodedString ( ) ,
76- " payment_hash " : Data ( paymentSent. getPaymentHash ( ) ) . hexEncodedString ( ) ,
77- " fee_paid_sat " : ( paymentSent. getFeePaidMsat ( ) ?? 0 ) / 1000 ,
78- ]
82+ body: body
7983 )
84+
85+ //Save to disk for tx history
86+ persistPaymentSent ( body)
8087 return
8188 case . OpenChannelRequest:
8289 //Use if we ever manually accept inbound channels. Setting in initConfig.
@@ -99,11 +106,14 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
99106 return handleEventError ( event)
100107 }
101108
109+ let paymentId = Data ( paymentPathSuccessful. getPaymentId ( ) ) . hexEncodedString ( )
110+ let paymentHash = Data ( paymentPathSuccessful. getPaymentHash ( ) ) . hexEncodedString ( )
111+
102112 LdkEventEmitter . shared. send (
103113 withEvent: . channel_manager_payment_path_successful,
104114 body: [
105- " payment_id " : Data ( paymentPathSuccessful . getPaymentId ( ) ) . hexEncodedString ( ) ,
106- " payment_hash " : Data ( paymentPathSuccessful . getPaymentHash ( ) ) . hexEncodedString ( ) ,
115+ " payment_id " : paymentId ,
116+ " payment_hash " : paymentHash ,
107117 " path_hops " : paymentPathSuccessful. getPath ( ) . getHops ( ) . map { $0. asJson } ,
108118 ]
109119 )
@@ -113,27 +123,53 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
113123 return handleEventError ( event)
114124 }
115125
126+ let paymentId = Data ( paymentPathFailed. getPaymentId ( ) ) . hexEncodedString ( )
127+ let paymentHash = Data ( paymentPathFailed. getPaymentHash ( ) ) . hexEncodedString ( )
128+
116129 LdkEventEmitter . shared. send (
117130 withEvent: . channel_manager_payment_path_failed,
118131 body: [
119- " payment_id " : Data ( paymentPathFailed . getPaymentId ( ) ) . hexEncodedString ( ) ,
120- " payment_hash " : Data ( paymentPathFailed . getPaymentHash ( ) ) . hexEncodedString ( ) ,
132+ " payment_id " : paymentId ,
133+ " payment_hash " : paymentHash ,
121134 " payment_failed_permanently " : paymentPathFailed. getPaymentFailedPermanently ( ) ,
122135 " short_channel_id " : String ( paymentPathFailed. getShortChannelId ( ) ?? 0 ) ,
123136 " path_hops " : paymentPathFailed. getPath ( ) . getHops ( ) . map { $0. asJson }
124137 ]
125138 )
139+
140+ persistPaymentSent (
141+ [
142+ " payment_id " : paymentId,
143+ " payment_hash " : paymentHash,
144+ " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970) ,
145+ " state " : paymentPathFailed. getPaymentFailedPermanently ( ) ? " failed " : " pending "
146+ ]
147+ )
126148 return
127149 case . PaymentFailed:
128150 guard let paymentFailed = event. getValueAsPaymentFailed ( ) else {
129151 return handleEventError ( event)
130152 }
131153
154+ let paymentId = Data ( paymentFailed. getPaymentId ( ) ) . hexEncodedString ( )
155+ let paymentHash = Data ( paymentFailed. getPaymentHash ( ) ) . hexEncodedString ( )
156+
132157 LdkEventEmitter . shared. send (
133158 withEvent: . channel_manager_payment_failed,
134159 body: [
135- " payment_id " : Data ( paymentFailed. getPaymentId ( ) ) . hexEncodedString ( ) ,
136- " payment_hash " : Data ( paymentFailed. getPaymentHash ( ) ) . hexEncodedString ( ) ,
160+ " payment_id " : paymentId,
161+ " payment_hash " : paymentHash,
162+ ]
163+ )
164+
165+ //MARK: Mark as failed
166+
167+ persistPaymentSent (
168+ [
169+ " payment_id " : paymentId,
170+ " payment_hash " : paymentHash,
171+ " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970) ,
172+ " state " : " failed "
137173 ]
138174 )
139175 return
@@ -208,7 +244,7 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
208244 " payment_secret " : Data ( paymentSecret ?? [ ] ) . hexEncodedString ( ) ,
209245 " spontaneous_payment_preimage " : Data ( spontaneousPayment ?? [ ] ) . hexEncodedString ( ) ,
210246 " unix_timestamp " : Int ( Date ( ) . timeIntervalSince1970) ,
211- " confirmed " : true
247+ " state " : " successful "
212248 ]
213249
214250 LdkEventEmitter . shared. send (
@@ -271,7 +307,9 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
271307 return Result_NoneErrorZ . initWithErr ( e: . Other)
272308 }
273309 }
274-
310+
311+ /// Saves claiming/claimed payment to disk. If payment hash exists already then the payment values are merged into the existing entry as an update
312+ /// - Parameter payment: payment obj
275313 private func persistPaymentClaimed( _ payment: [ String : Any ] ) {
276314 guard let claimedPaymentsStorage = Ldk . accountStoragePath? . appendingPathComponent ( LdkFileNames . paymentsClaimed. rawValue) else {
277315 LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error. Failed to persist claimed payment to disk (No set storage) " )
@@ -296,7 +334,7 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
296334 for (index, existingPayment) in payments. enumerated ( ) {
297335 if let existingPaymentHash = existingPayment [ " payment_hash " ] as? String , let newPaymentHash = payment [ " payment_hash " ] as? String {
298336 if existingPaymentHash == newPaymentHash {
299- payments [ index] = payment
337+ payments [ index] = mergeObj ( payments [ index ] , payment) //Merges update into orginal entry
300338 paymentReplaced = true
301339 }
302340 }
@@ -321,4 +359,56 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
321359 LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error writing payment claimed to file: \( error) " )
322360 }
323361 }
362+
363+ /// Saves sending/sent payment to disk. If payment ID exists already then the payment values are merged into the existing entry as an update
364+ /// - Parameter payment: payment obj
365+ func persistPaymentSent( _ payment: [ String : Any ] ) {
366+ guard let sentPaymentsStorage = Ldk . accountStoragePath? . appendingPathComponent ( LdkFileNames . paymentsSent. rawValue) else {
367+ LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error. Failed to persist sent payment to disk (No set storage) " )
368+ return
369+ }
370+
371+ var payments : [ [ String : Any ] ] = [ ]
372+
373+ do {
374+ if FileManager . default. fileExists ( atPath: sentPaymentsStorage. path) {
375+ let data = try Data ( contentsOf: URL ( fileURLWithPath: sentPaymentsStorage. path) , options: . mappedIfSafe)
376+
377+ if let existingContent = try JSONSerialization . jsonObject ( with: data, options: [ ] ) as? [ [ String : Any ] ] {
378+ payments = existingContent
379+ } else {
380+ LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error could not read existing sent payments " )
381+ }
382+ }
383+
384+ //Replace entry if payment hash exists (Confirmed payment replacing pending)
385+ var paymentReplaced = false
386+ for (index, existingPayment) in payments. enumerated ( ) {
387+ if let existingPaymentId = existingPayment [ " payment_id " ] as? String , let newPaymentId = payment [ " payment_id " ] as? String {
388+ if existingPaymentId == newPaymentId {
389+ payments [ index] = mergeObj ( payments [ index] , payment) //Merges update into orginal entry
390+ paymentReplaced = true
391+ }
392+ }
393+ }
394+
395+ //No existing payment found, append as new payment
396+ if !paymentReplaced {
397+ payments. append ( payment)
398+ }
399+
400+ guard let jsonData = try ? JSONSerialization . data ( withJSONObject: payments, options: [ ] ) else {
401+ LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error could not serialize sent payments " )
402+ return
403+ }
404+
405+ guard let jsonString = String ( data: jsonData, encoding: . utf8) else {
406+ return
407+ }
408+
409+ try jsonString. write ( to: sentPaymentsStorage, atomically: true , encoding: . utf8)
410+ } catch {
411+ LdkEventEmitter . shared. send ( withEvent: . native_log, body: " Error writing payment sent to file: \( error) " )
412+ }
413+ }
324414}
0 commit comments