- let feeest_1 = Arc::new(test_utils::TestFeeEstimator { sat_per_vbyte: 1 });
- let chain_monitor_1 = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
- let chan_monitor_1 = Arc::new(test_utils::TestChannelMonitor{});
- let tx_broadcaster_1 = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
- let node_id_1 = {
- let mut key_slice = [0; 32];
- rng.fill_bytes(&mut key_slice);
- SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
- };
- let node_1 = ChannelManager::new(node_id_1.clone(), 0, true, Network::Testnet, feeest_1.clone(), chan_monitor_1.clone(), chain_monitor_1.clone(), tx_broadcaster_1.clone()).unwrap();
- let router_1 = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id_1).unwrap());
-
- let feeest_2 = Arc::new(test_utils::TestFeeEstimator { sat_per_vbyte: 1 });
- let chain_monitor_2 = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
- let chan_monitor_2 = Arc::new(test_utils::TestChannelMonitor{});
- let tx_broadcaster_2 = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
- let node_id_2 = {
- let mut key_slice = [0; 32];
- rng.fill_bytes(&mut key_slice);
- SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
- };
- let node_2 = ChannelManager::new(node_id_2.clone(), 0, true, Network::Testnet, feeest_2.clone(), chan_monitor_2.clone(), chain_monitor_2.clone(), tx_broadcaster_2.clone()).unwrap();
- let router_2 = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id_2).unwrap());
-
- let feeest_3 = Arc::new(test_utils::TestFeeEstimator { sat_per_vbyte: 1 });
- let chain_monitor_3 = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
- let chan_monitor_3 = Arc::new(test_utils::TestChannelMonitor{});
- let tx_broadcaster_3 = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
- let node_id_3 = {
- let mut key_slice = [0; 32];
- rng.fill_bytes(&mut key_slice);
- SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
- };
- let node_3 = ChannelManager::new(node_id_3.clone(), 0, true, Network::Testnet, feeest_3.clone(), chan_monitor_3.clone(), chain_monitor_3.clone(), tx_broadcaster_3.clone()).unwrap();
- let router_3 = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id_3).unwrap());
-
- let feeest_4 = Arc::new(test_utils::TestFeeEstimator { sat_per_vbyte: 1 });
- let chain_monitor_4 = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
- let chan_monitor_4 = Arc::new(test_utils::TestChannelMonitor{});
- let tx_broadcaster_4 = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
- let node_id_4 = {
- let mut key_slice = [0; 32];
- rng.fill_bytes(&mut key_slice);
- SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
- };
- let node_4 = ChannelManager::new(node_id_4.clone(), 0, true, Network::Testnet, feeest_4.clone(), chan_monitor_4.clone(), chain_monitor_4.clone(), tx_broadcaster_4.clone()).unwrap();
- let router_4 = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id_4).unwrap());
-
- // Create some initial channels
- let chan_announcement_1 = create_chan_between_nodes(&node_1, &chain_monitor_1, &node_2, &chain_monitor_2);
- for router in vec!(&router_1, &router_2, &router_3, &router_4) {
- assert!(router.handle_channel_announcement(&chan_announcement_1.0).unwrap());
- router.handle_channel_update(&chan_announcement_1.1).unwrap();
- router.handle_channel_update(&chan_announcement_1.2).unwrap();
- }
- let chan_announcement_2 = create_chan_between_nodes(&node_2, &chain_monitor_2, &node_3, &chain_monitor_3);
- for router in vec!(&router_1, &router_2, &router_3, &router_4) {
- assert!(router.handle_channel_announcement(&chan_announcement_2.0).unwrap());
- router.handle_channel_update(&chan_announcement_2.1).unwrap();
- router.handle_channel_update(&chan_announcement_2.2).unwrap();
- }
- let chan_announcement_3 = create_chan_between_nodes(&node_3, &chain_monitor_3, &node_4, &chain_monitor_4);
- for router in vec!(&router_1, &router_2, &router_3, &router_4) {
- assert!(router.handle_channel_announcement(&chan_announcement_3.0).unwrap());
- router.handle_channel_update(&chan_announcement_3.1).unwrap();
- router.handle_channel_update(&chan_announcement_3.2).unwrap();
- }
-
- // Rebalance the network a bit by relaying one payment through all the channels...
- send_payment(&node_1, &router_1, &vec!(&*node_2, &*node_3, &*node_4)[..], 8000000);
- send_payment(&node_1, &router_1, &vec!(&*node_2, &*node_3, &*node_4)[..], 8000000);
- send_payment(&node_1, &router_1, &vec!(&*node_2, &*node_3, &*node_4)[..], 8000000);
- send_payment(&node_1, &router_1, &vec!(&*node_2, &*node_3, &*node_4)[..], 8000000);
- send_payment(&node_1, &router_1, &vec!(&*node_2, &*node_3, &*node_4)[..], 8000000);
-
- // Send some more payments
- send_payment(&node_2, &router_2, &vec!(&*node_3, &*node_4)[..], 1000000);
- send_payment(&node_4, &router_4, &vec!(&*node_3, &*node_2, &*node_1)[..], 1000000);
- send_payment(&node_4, &router_4, &vec!(&*node_3, &*node_2)[..], 1000000);
-
- // Test failure packets
- send_failed_payment(&node_1, &router_1, &vec!(&*node_2, &*node_3, &*node_4)[..]);
-
- // Add a new channel that skips 3
- let chan_announcement_4 = create_chan_between_nodes(&node_2, &chain_monitor_2, &node_4, &chain_monitor_4);
- for router in vec!(&router_1, &router_2, &router_3, &router_4) {
- assert!(router.handle_channel_announcement(&chan_announcement_4.0).unwrap());
- router.handle_channel_update(&chan_announcement_4.1).unwrap();
- router.handle_channel_update(&chan_announcement_4.2).unwrap();
- }
-
- send_payment(&node_1, &router_1, &vec!(&*node_2, &*node_4)[..], 1000000);
- send_payment(&node_3, &router_3, &vec!(&*node_4)[..], 1000000);
- send_payment(&node_2, &router_2, &vec!(&*node_4)[..], 8000000);
- send_payment(&node_2, &router_2, &vec!(&*node_4)[..], 8000000);
- send_payment(&node_2, &router_2, &vec!(&*node_4)[..], 8000000);
- send_payment(&node_2, &router_2, &vec!(&*node_4)[..], 8000000);
- send_payment(&node_2, &router_2, &vec!(&*node_4)[..], 8000000);
-
- // Do some rebalance loop payments, simultaneously
- let mut hops = Vec::with_capacity(3);
- hops.push(RouteHop {
- pubkey: node_3.get_our_node_id(),
- short_channel_id: chan_announcement_2.1.contents.short_channel_id,
- fee_msat: 0,
- cltv_expiry_delta: chan_announcement_3.1.contents.cltv_expiry_delta as u32
- });
- hops.push(RouteHop {
- pubkey: node_4.get_our_node_id(),
- short_channel_id: chan_announcement_3.1.contents.short_channel_id,
- fee_msat: 0,
- cltv_expiry_delta: chan_announcement_4.2.contents.cltv_expiry_delta as u32
- });
- hops.push(RouteHop {
- pubkey: node_2.get_our_node_id(),
- short_channel_id: chan_announcement_4.1.contents.short_channel_id,
- fee_msat: 1000000,
- cltv_expiry_delta: 142,
- });
- hops[1].fee_msat = chan_announcement_4.2.contents.fee_base_msat as u64 + chan_announcement_4.2.contents.fee_proportional_millionths as u64 * hops[2].fee_msat as u64 / 1000000;
- hops[0].fee_msat = chan_announcement_3.1.contents.fee_base_msat as u64 + chan_announcement_3.1.contents.fee_proportional_millionths as u64 * hops[1].fee_msat as u64 / 1000000;
- let payment_preimage_1 = send_along_route(&node_2, Route { hops }, &vec!(&*node_3, &*node_4, &*node_2)[..], 1000000).0;
-
- let mut hops = Vec::with_capacity(3);
- hops.push(RouteHop {
- pubkey: node_4.get_our_node_id(),
- short_channel_id: chan_announcement_4.1.contents.short_channel_id,
- fee_msat: 0,
- cltv_expiry_delta: chan_announcement_3.2.contents.cltv_expiry_delta as u32
- });
- hops.push(RouteHop {
- pubkey: node_3.get_our_node_id(),
- short_channel_id: chan_announcement_3.1.contents.short_channel_id,
- fee_msat: 0,
- cltv_expiry_delta: chan_announcement_2.2.contents.cltv_expiry_delta as u32
- });
- hops.push(RouteHop {
- pubkey: node_2.get_our_node_id(),
- short_channel_id: chan_announcement_2.1.contents.short_channel_id,
- fee_msat: 1000000,
- cltv_expiry_delta: 142,
- });
- hops[1].fee_msat = chan_announcement_2.2.contents.fee_base_msat as u64 + chan_announcement_2.2.contents.fee_proportional_millionths as u64 * hops[2].fee_msat as u64 / 1000000;
- hops[0].fee_msat = chan_announcement_3.2.contents.fee_base_msat as u64 + chan_announcement_3.2.contents.fee_proportional_millionths as u64 * hops[1].fee_msat as u64 / 1000000;
- let payment_preimage_2 = send_along_route(&node_2, Route { hops }, &vec!(&*node_4, &*node_3, &*node_2)[..], 1000000).0;