@@ -15,13 +15,13 @@ enum InvalidSerializedDataError: Error {
1515public class ChannelManagerConstructor {
1616
1717 public let channelManager : ChannelManager
18-
18+
1919 /**
2020 * The latest block has the channel manager saw. If this is non-null it is a 32-byte block hash.
2121 * You should sync the blockchain starting with the block that builds on this block.
2222 */
2323 public let channel_manager_latest_block_hash : [ UInt8 ] ?
24-
24+
2525 /**
2626 * A list of ChannelMonitors and the last block they each saw. You should sync the blockchain on each individually
2727 * starting with the block that builds on the hash given.
@@ -46,8 +46,10 @@ public class ChannelManagerConstructor {
4646 var b : LDKChannelMonitor = value. result!. pointee. b
4747 b. is_owned = false
4848 let currentChannelMonitor = ChannelMonitor ( pointer: b)
49- monitors. append ( b)
50- self . channel_monitors. append ( ( currentChannelMonitor, Bindings . LDKThirtyTwoBytes_to_array ( nativeType: a) ) )
49+ var clonedChannelMonitor = currentChannelMonitor. clone ( orig: currentChannelMonitor)
50+ clonedChannelMonitor. cOpaqueStruct? . is_owned = false
51+ monitors. append ( clonedChannelMonitor. cOpaqueStruct!)
52+ self . channel_monitors. append ( ( clonedChannelMonitor, Bindings . LDKThirtyTwoBytes_to_array ( nativeType: a) ) )
5153 }
5254
5355 let res = UtilMethods . constructor_BlockHashChannelManagerZ_read ( ser: channel_manager_serialized, arg_keys_manager: keys_interface, arg_fee_estimator: fee_estimator, arg_chain_monitor: chain_monitor. as_Watch ( ) , arg_tx_broadcaster: tx_broadcaster, arg_logger: logger, arg_default_config: UserConfig ( ) , arg_channel_monitors: monitors)
@@ -80,10 +82,10 @@ public class ChannelManagerConstructor {
8082 let chainParameters = ChainParameters ( network_arg: network, best_block_arg: block)
8183 self . channelManager = ChannelManager ( fee_est: fee_estimator, chain_monitor: chain_monitor. as_Watch ( ) , tx_broadcaster: tx_broadcaster, logger: logger, keys_manager: keys_interface, config: config, params: chainParameters)
8284 }
83-
85+
8486 var persisterWorkItem : DispatchWorkItem ?
8587 var shutdown = false
86-
88+
8789 /**
8890 * Utility which adds all of the deserialized ChannelMonitors to the chain watch so that further updates from the
8991 * ChannelManager are processed as normal.
@@ -95,65 +97,68 @@ public class ChannelManagerConstructor {
9597 if self . persisterWorkItem != nil {
9698 return
9799 }
98-
100+
99101 for (currentChannelMonitor, _) in self . channel_monitors {
100102 let chainMonitorWatch = self . chain_monitor. as_Watch ( )
101- let fundingTxo = currentChannelMonitor. get_funding_txo ( )
103+ let monitorClone = currentChannelMonitor. clone ( orig: currentChannelMonitor)
104+ let fundingTxo = monitorClone. get_funding_txo ( )
102105 let outPoint = OutPoint ( pointer: fundingTxo. cOpaqueStruct!. a)
103-
104- chainMonitorWatch. cOpaqueStruct!. watch_channel ( chainMonitorWatch. cOpaqueStruct!. this_arg, outPoint. cOpaqueStruct!, currentChannelMonitor. cOpaqueStruct!)
105- // chainMonitorWatch.watch_channel(funding_txo: outPoint, monitor: currentChannelMonitor)
106+
107+ let monitorWatchResult = chainMonitorWatch. watch_channel ( funding_txo: outPoint, monitor: monitorClone)
108+ if !monitorWatchResult. isOk ( ) {
109+ print ( " Some error occurred with a chainMonitorWatch.watch_channel call " )
110+ }
106111 }
107-
112+
108113 self . persisterWorkItem = DispatchWorkItem {
109114 var lastTimerTick = NSDate ( ) . timeIntervalSince1970
110115 while !self . shutdown {
111116 var needsPersist = self . channelManager. await_persistable_update_timeout ( max_wait: 1 )
112-
113- let nativeManagerEventsProvider = self . channelManager. as_EventsProvider ( ) . cOpaqueStruct!
114- let rawManagerEvents = Bindings . LDKCVec_EventZ_to_array ( nativeType : nativeManagerEventsProvider . get_and_clear_pending_events ( nativeManagerEventsProvider . this_arg ) )
115-
117+
118+ let managerEventsProvider = self . channelManager. as_EventsProvider ( )
119+ let rawManagerEvents = managerEventsProvider . get_and_clear_pending_events ( )
120+
116121 let managerEvents = rawManagerEvents. map { ( e: LDKEvent ) -> Event in
117122 Event ( pointer: e)
118123 }
119124 if managerEvents. count != 0 {
120125 persister. handle_events ( events: managerEvents)
121126 needsPersist = true
122127 }
123-
124- let nativeMonitorEventsProvider = self . chain_monitor. as_EventsProvider ( ) . cOpaqueStruct!
125- let rawMonitorEvents = Bindings . LDKCVec_EventZ_to_array ( nativeType : nativeMonitorEventsProvider . get_and_clear_pending_events ( nativeMonitorEventsProvider . this_arg ) )
126-
128+
129+ let monitorEventsProvider = self . chain_monitor. as_EventsProvider ( )
130+ let rawMonitorEvents = monitorEventsProvider . get_and_clear_pending_events ( )
131+
127132 let monitorEvents = rawMonitorEvents. map { ( e: LDKEvent ) -> Event in
128133 Event ( pointer: e)
129134 }
130135 if monitorEvents. count != 0 {
131136 persister. handle_events ( events: monitorEvents)
132137 needsPersist = true
133138 }
134-
139+
135140 if needsPersist {
136141 persister. persist_manager ( channel_manager_bytes: self . channelManager. write ( obj: self . channelManager) )
137142 }
138-
143+
139144 if self . shutdown {
140145 return
141146 }
142-
147+
143148 let currentTimerTick = NSDate ( ) . timeIntervalSince1970
144149 if lastTimerTick < ( currentTimerTick- 60 ) { // more than 60 seconds have passed since the last timer tick
145150 self . channelManager. timer_tick_occurred ( )
146151 lastTimerTick = currentTimerTick
147152 }
148-
153+
149154 Thread . sleep ( forTimeInterval: 1 ) // this should hopefully not suspend the main application
150155 }
151156 }
152-
157+
153158 let backgroundQueue = DispatchQueue ( label: " org.ldk.ChannelManagerConstructor.persisterThread " , qos: . background)
154159 backgroundQueue. async ( execute: self . persisterWorkItem!)
155160 }
156-
161+
157162 public func interrupt( ) {
158163 self . shutdown = true
159164 if let workItem = self . persisterWorkItem {
0 commit comments