@@ -43,7 +43,7 @@ use rand::{thread_rng, Rng};
43
43
use lightning:: chain;
44
44
use lightning:: chain:: chaininterface;
45
45
use lightning:: chain:: keysinterface:: { KeysInterface , KeysManager , SpendableOutputDescriptor , InMemoryChannelKeys } ;
46
- use lightning:: ln:: { peer_handler, router, channelmanager, channelmonitor} ;
46
+ use lightning:: ln:: { peer_handler, router, channelmanager, channelmonitor, msgs } ;
47
47
use lightning:: ln:: channelmonitor:: ManyChannelMonitor ;
48
48
use lightning:: ln:: channelmanager:: { PaymentHash , PaymentPreimage } ;
49
49
use lightning:: util:: events:: { Event , EventsProvider } ;
@@ -78,19 +78,21 @@ fn _check_usize_is_64() {
78
78
unsafe { mem:: transmute :: < * const usize , [ u8 ; 8 ] > ( panic ! ( ) ) ; }
79
79
}
80
80
81
+ type CM = channelmanager:: ChannelManager < InMemoryChannelKeys , Arc < ChannelMonitor > > ;
82
+
81
83
struct EventHandler {
82
84
network : constants:: Network ,
83
85
file_prefix : String ,
84
86
rpc_client : Arc < RPCClient > ,
85
- peer_manager : Arc < peer_handler:: PeerManager < SocketDescriptor > > ,
86
- channel_manager : Arc < channelmanager :: ChannelManager < InMemoryChannelKeys > > ,
87
+ peer_manager : Arc < peer_handler:: PeerManager < SocketDescriptor < CM > , Arc < CM > > > ,
88
+ channel_manager : Arc < CM > ,
87
89
monitor : Arc < channelmonitor:: SimpleManyChannelMonitor < chain:: transaction:: OutPoint > > ,
88
90
broadcaster : Arc < dyn chain:: chaininterface:: BroadcasterInterface > ,
89
91
txn_to_broadcast : Mutex < HashMap < chain:: transaction:: OutPoint , blockdata:: transaction:: Transaction > > ,
90
92
payment_preimages : Arc < Mutex < HashMap < PaymentHash , PaymentPreimage > > > ,
91
93
}
92
94
impl EventHandler {
93
- fn setup ( network : constants:: Network , file_prefix : String , rpc_client : Arc < RPCClient > , peer_manager : Arc < peer_handler:: PeerManager < SocketDescriptor > > , monitor : Arc < channelmonitor:: SimpleManyChannelMonitor < chain:: transaction:: OutPoint > > , channel_manager : Arc < channelmanager :: ChannelManager < InMemoryChannelKeys > > , broadcaster : Arc < dyn chain:: chaininterface:: BroadcasterInterface > , payment_preimages : Arc < Mutex < HashMap < PaymentHash , PaymentPreimage > > > ) -> mpsc:: Sender < ( ) > {
95
+ fn setup ( network : constants:: Network , file_prefix : String , rpc_client : Arc < RPCClient > , peer_manager : Arc < peer_handler:: PeerManager < SocketDescriptor < CM > , Arc < CM > > > , monitor : Arc < channelmonitor:: SimpleManyChannelMonitor < chain:: transaction:: OutPoint > > , channel_manager : Arc < CM > , broadcaster : Arc < dyn chain:: chaininterface:: BroadcasterInterface > , payment_preimages : Arc < Mutex < HashMap < PaymentHash , PaymentPreimage > > > ) -> mpsc:: Sender < ( ) > {
94
96
let us = Arc :: new ( Self { network, file_prefix, rpc_client, peer_manager, channel_manager, monitor, broadcaster, txn_to_broadcast : Mutex :: new ( HashMap :: new ( ) ) , payment_preimages } ) ;
95
97
let ( sender, receiver) = mpsc:: channel ( 2 ) ;
96
98
let self_sender = sender. clone ( ) ;
@@ -135,20 +137,20 @@ impl EventHandler {
135
137
us. broadcaster . broadcast_transaction ( & tx) ;
136
138
println ! ( "Broadcast funding tx {}!" , tx. txid( ) ) ;
137
139
} ,
138
- Event :: PaymentReceived { payment_hash, payment_secret , amt } => {
140
+ Event :: PaymentReceived { payment_hash, amt } => {
139
141
println ! ( "handling pr in 60 secs..." ) ;
140
142
let us = us. clone ( ) ;
141
143
let mut self_sender = self_sender. clone ( ) ;
142
144
tokio:: spawn ( tokio:: timer:: Delay :: new ( Instant :: now ( ) + Duration :: from_secs ( 60 ) ) . then ( move |_| {
143
145
let images = us. payment_preimages . lock ( ) . unwrap ( ) ;
144
146
if let Some ( payment_preimage) = images. get ( & payment_hash) {
145
- if us. channel_manager . claim_funds ( payment_preimage. clone ( ) , & payment_secret , amt) { // Cheating by using amt here!
147
+ if us. channel_manager . claim_funds ( payment_preimage. clone ( ) , amt) { // Cheating by using amt here!
146
148
println ! ( "Moneymoney! {} id {}" , amt, hex_str( & payment_hash. 0 ) ) ;
147
149
} else {
148
150
println ! ( "Failed to claim money we were told we had?" ) ;
149
151
}
150
152
} else {
151
- us. channel_manager . fail_htlc_backwards ( & payment_hash, & payment_secret ) ;
153
+ us. channel_manager . fail_htlc_backwards ( & payment_hash) ;
152
154
println ! ( "Received payment but we didn't know the preimage :(" ) ;
153
155
}
154
156
let _ = self_sender. try_send ( ( ) ) ;
@@ -183,22 +185,22 @@ impl EventHandler {
183
185
previous_output: outpoint,
184
186
script_sig: bitcoin:: Script :: new( ) ,
185
187
sequence: to_self_delay as u32 ,
186
- witness: vec![ witness_script . to_vec ( ) ] ,
188
+ witness: vec![ ] ,
187
189
} ] ,
188
190
lock_time : 0 ,
189
191
output : vec ! [ bitcoin:: TxOut {
190
- script_pubkey:
191
- value: output . value ,
192
+ script_pubkey: :: bitcoin :: Script :: new ( ) ,
193
+ value: 0 ,
192
194
} ] ,
193
195
version : 2 ,
194
196
} ;
195
197
//XXX: Sign!
196
198
} ,
197
199
SpendableOutputDescriptor :: DynamicOutputP2WPKH { outpoint, key, output } => {
198
200
println ! ( "Got on-chain output we should claim..." ) ;
199
- tokio:: spawn ( rpc_client. make_rpc_call ( "importprivkey" ,
200
- & [ & ( "\" " . to_string ( ) + & bitcoin:: util:: key:: PrivateKey { key : import_key_2, compressed : true , network} . to_wif ( ) + "\" " ) , "\" rust-lightning cooperative close\" " , "false" ] , false )
201
- . then ( |_| Ok ( ( ) ) ) ) ;
201
+ // tokio::spawn(rpc_client.make_rpc_call("importprivkey",
202
+ // &[&("\"".to_string() + &bitcoin::util::key::PrivateKey{ key: import_key_2, compressed: true, network}.to_wif() + "\""), "\"rust-lightning cooperative close\"", "false"], false)
203
+ // .then(|_| Ok(())));
202
204
//TODO: Send back to Bitcoin Core!
203
205
} ,
204
206
}
@@ -426,22 +428,22 @@ fn main() {
426
428
427
429
let mut monitors_loaded = ChannelMonitor :: load_from_disk ( & ( data_path. clone ( ) + "/monitors" ) ) ;
428
430
let monitor = Arc :: new ( ChannelMonitor {
429
- monitor : channelmonitor:: SimpleManyChannelMonitor :: new ( chain_monitor. clone ( ) , chain_monitor. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) ) ,
431
+ monitor : Arc :: new ( channelmonitor:: SimpleManyChannelMonitor :: new ( chain_monitor. clone ( ) , chain_monitor. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) ) ) ,
430
432
file_prefix : data_path. clone ( ) + "/monitors" ,
431
433
} ) ;
432
- block_notifier. register_listener ( Arc :: downgrade ( & ( monitor. monitor . clone ( ) as Arc < dyn chaininterface:: ChainListener > ) ) ) ;
434
+ block_notifier. register_listener ( Arc :: clone ( & ( monitor. monitor . clone ( ) as Arc < dyn chaininterface:: ChainListener > ) ) ) ;
433
435
434
436
let mut config: config:: UserConfig = Default :: default ( ) ;
435
437
config. channel_options . fee_proportional_millionths = FEE_PROPORTIONAL_MILLIONTHS ;
436
438
config. channel_options . announced_channel = ANNOUNCE_CHANNELS ;
437
439
438
- let channel_manager = if let Ok ( mut f) = fs:: File :: open ( data_path. clone ( ) + "/manager_data" ) {
440
+ let channel_manager = Arc :: new ( if let Ok ( mut f) = fs:: File :: open ( data_path. clone ( ) + "/manager_data" ) {
439
441
let ( last_block_hash, manager) = {
440
442
let mut monitors_refs = HashMap :: new ( ) ;
441
443
for ( outpoint, monitor) in monitors_loaded. iter_mut ( ) {
442
444
monitors_refs. insert ( * outpoint, monitor) ;
443
445
}
444
- <( Sha256dHash , channelmanager :: ChannelManager < InMemoryChannelKeys > ) >:: read ( & mut f, channelmanager:: ChannelManagerReadArgs {
446
+ <( Sha256dHash , CM ) >:: read ( & mut f, channelmanager:: ChannelManagerReadArgs {
445
447
keys_manager : keys. clone ( ) ,
446
448
fee_estimator : fee_estimator. clone ( ) ,
447
449
monitor : monitor. clone ( ) ,
@@ -454,15 +456,14 @@ fn main() {
454
456
} ;
455
457
monitor. load_from_vec ( monitors_loaded) ;
456
458
//TODO: Rescan
457
- let manager = Arc :: new ( manager) ;
458
459
manager
459
460
} else {
460
461
if !monitors_loaded. is_empty ( ) {
461
462
panic ! ( "Found some channel monitors but no channel state!" ) ;
462
463
}
463
464
channelmanager:: ChannelManager :: new ( network, fee_estimator. clone ( ) , monitor. clone ( ) , chain_monitor. clone ( ) , logger. clone ( ) , keys. clone ( ) , config, 0 ) . unwrap ( ) //TODO: Get blockchain height
464
- } ;
465
- block_notifier. register_listener ( Arc :: downgrade ( & ( channel_manager. clone ( ) as Arc < dyn chaininterface:: ChainListener > ) ) ) ;
465
+ } ) ;
466
+ block_notifier. register_listener ( Arc :: clone ( & ( channel_manager. clone ( ) as Arc < dyn chaininterface:: ChainListener > ) ) ) ;
466
467
let router = Arc :: new ( router:: Router :: new ( PublicKey :: from_secret_key ( & secp_ctx, & keys. get_node_secret ( ) ) , chain_monitor. clone ( ) , logger. clone ( ) ) ) ;
467
468
468
469
let mut ephemeral_data = [ 0 ; 32 ] ;
@@ -665,7 +666,7 @@ fn main() {
665
666
Ok ( route) => {
666
667
let mut payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
667
668
payment_hash. 0 . copy_from_slice ( & invoice. payment_hash ( ) [ ..] ) ;
668
- match channel_manager. send_payment ( route, payment_hash, None ) {
669
+ match channel_manager. send_payment ( route, payment_hash) {
669
670
Ok ( ( ) ) => {
670
671
println ! ( "Sending {} msat" , amt) ;
671
672
let _ = event_notify. try_send ( ( ) ) ;
0 commit comments