mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 23:08:36 +01:00
Merge pull request #1707 from TheBlueMatt/2022-09-no-global-features
Move supported-feature-set logic into the supporting modules
This commit is contained in:
commit
48d21bad7b
30 changed files with 894 additions and 1041 deletions
|
@ -38,9 +38,8 @@ use lightning::chain::transaction::OutPoint;
|
|||
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
|
||||
use lightning::chain::keysinterface::{KeyMaterial, KeysInterface, InMemorySigner, Recipient};
|
||||
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
|
||||
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs};
|
||||
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs};
|
||||
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
|
||||
use lightning::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
|
||||
use lightning::ln::msgs::{CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
|
||||
use lightning::ln::script::ShutdownScript;
|
||||
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
|
||||
|
@ -315,9 +314,9 @@ fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, p
|
|||
if let Err(err) = source.send_payment(&Route {
|
||||
paths: vec![vec![RouteHop {
|
||||
pubkey: dest.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: dest_chan_id,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: amt,
|
||||
cltv_expiry_delta: 200,
|
||||
}]],
|
||||
|
@ -334,16 +333,16 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
|
|||
if let Err(err) = source.send_payment(&Route {
|
||||
paths: vec![vec![RouteHop {
|
||||
pubkey: middle.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: middle_chan_id,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 50000,
|
||||
cltv_expiry_delta: 100,
|
||||
},RouteHop {
|
||||
pubkey: dest.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: dest_chan_id,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: amt,
|
||||
cltv_expiry_delta: 200,
|
||||
}]],
|
||||
|
@ -422,8 +421,8 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
let mut channel_txn = Vec::new();
|
||||
macro_rules! make_channel {
|
||||
($source: expr, $dest: expr, $chan_id: expr) => { {
|
||||
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
|
||||
$source.create_channel($dest.get_our_node_id(), 100_000, 42, 0, None).unwrap();
|
||||
let open_channel = {
|
||||
|
@ -434,7 +433,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
} else { panic!("Wrong event type"); }
|
||||
};
|
||||
|
||||
$dest.handle_open_channel(&$source.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
$dest.handle_open_channel(&$source.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let accept_channel = {
|
||||
let events = $dest.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -443,7 +442,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
} else { panic!("Wrong event type"); }
|
||||
};
|
||||
|
||||
$source.handle_accept_channel(&$dest.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
$source.handle_accept_channel(&$dest.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
let funding_output;
|
||||
{
|
||||
let events = $source.get_and_clear_pending_events();
|
||||
|
@ -940,15 +939,15 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
},
|
||||
0x0e => {
|
||||
if chan_a_disconnected {
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
chan_a_disconnected = false;
|
||||
}
|
||||
},
|
||||
0x0f => {
|
||||
if chan_b_disconnected {
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
chan_b_disconnected = false;
|
||||
}
|
||||
},
|
||||
|
@ -1143,13 +1142,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
|
||||
// Next, make sure peers are all connected to each other
|
||||
if chan_a_disconnected {
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
chan_a_disconnected = false;
|
||||
}
|
||||
if chan_b_disconnected {
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
chan_b_disconnected = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,8 +13,7 @@ use bitcoin::hash_types::BlockHash;
|
|||
|
||||
use lightning::chain;
|
||||
use lightning::chain::transaction::OutPoint;
|
||||
use lightning::ln::channelmanager::{ChannelDetails, ChannelCounterparty};
|
||||
use lightning::ln::features::InitFeatures;
|
||||
use lightning::ln::channelmanager::{self, ChannelDetails, ChannelCounterparty};
|
||||
use lightning::ln::msgs;
|
||||
use lightning::routing::gossip::{NetworkGraph, RoutingFees};
|
||||
use lightning::routing::router::{find_route, PaymentParameters, RouteHint, RouteHintHop, RouteParameters};
|
||||
|
@ -211,7 +210,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
|
|||
channel_id: [0; 32],
|
||||
counterparty: ChannelCounterparty {
|
||||
node_id: *rnid,
|
||||
features: InitFeatures::known(),
|
||||
features: channelmanager::provided_init_features(),
|
||||
unspendable_punishment_reserve: 0,
|
||||
forwarding_info: None,
|
||||
outbound_htlc_minimum_msat: None,
|
||||
|
|
|
@ -581,8 +581,8 @@ mod tests {
|
|||
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeysInterface, KeysManager};
|
||||
use lightning::chain::transaction::OutPoint;
|
||||
use lightning::get_event_msg;
|
||||
use lightning::ln::channelmanager::{BREAKDOWN_TIMEOUT, ChainParameters, ChannelManager, SimpleArcChannelManager};
|
||||
use lightning::ln::features::{ChannelFeatures, InitFeatures};
|
||||
use lightning::ln::channelmanager::{self, BREAKDOWN_TIMEOUT, ChainParameters, ChannelManager, SimpleArcChannelManager};
|
||||
use lightning::ln::features::ChannelFeatures;
|
||||
use lightning::ln::msgs::{ChannelMessageHandler, Init};
|
||||
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
|
||||
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
|
||||
|
@ -754,8 +754,8 @@ mod tests {
|
|||
|
||||
for i in 0..num_nodes {
|
||||
for j in (i+1)..num_nodes {
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -776,8 +776,8 @@ mod tests {
|
|||
macro_rules! begin_open_channel {
|
||||
($node_a: expr, $node_b: expr, $channel_value: expr) => {{
|
||||
$node_a.node.create_channel($node_b.node.get_our_node_id(), $channel_value, 100, 42, None).unwrap();
|
||||
$node_b.node.handle_open_channel(&$node_a.node.get_our_node_id(), InitFeatures::known(), &get_event_msg!($node_a, MessageSendEvent::SendOpenChannel, $node_b.node.get_our_node_id()));
|
||||
$node_a.node.handle_accept_channel(&$node_b.node.get_our_node_id(), InitFeatures::known(), &get_event_msg!($node_b, MessageSendEvent::SendAcceptChannel, $node_a.node.get_our_node_id()));
|
||||
$node_b.node.handle_open_channel(&$node_a.node.get_our_node_id(), channelmanager::provided_init_features(), &get_event_msg!($node_a, MessageSendEvent::SendOpenChannel, $node_b.node.get_our_node_id()));
|
||||
$node_a.node.handle_accept_channel(&$node_b.node.get_our_node_id(), channelmanager::provided_init_features(), &get_event_msg!($node_b, MessageSendEvent::SendAcceptChannel, $node_a.node.get_our_node_id()));
|
||||
}}
|
||||
}
|
||||
|
||||
|
|
|
@ -1712,11 +1712,14 @@ mod test {
|
|||
}.unwrap();
|
||||
assert_eq!(Invoice::from_signed(invoice), Err(SemanticError::InvalidFeatures));
|
||||
|
||||
let mut payment_secret_features = InvoiceFeatures::empty();
|
||||
payment_secret_features.set_payment_secret_required();
|
||||
|
||||
// Including payment secret and feature bits
|
||||
let invoice = {
|
||||
let mut invoice = invoice_template.clone();
|
||||
invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
|
||||
invoice.data.tagged_fields.push(Features(InvoiceFeatures::known()).into());
|
||||
invoice.data.tagged_fields.push(Features(payment_secret_features.clone()).into());
|
||||
invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
|
||||
}.unwrap();
|
||||
assert!(Invoice::from_signed(invoice).is_ok());
|
||||
|
@ -1739,7 +1742,7 @@ mod test {
|
|||
// Missing payment secret
|
||||
let invoice = {
|
||||
let mut invoice = invoice_template.clone();
|
||||
invoice.data.tagged_fields.push(Features(InvoiceFeatures::known()).into());
|
||||
invoice.data.tagged_fields.push(Features(payment_secret_features).into());
|
||||
invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
|
||||
}.unwrap();
|
||||
assert_eq!(Invoice::from_signed(invoice), Err(SemanticError::NoPaymentSecret));
|
||||
|
@ -1944,7 +1947,12 @@ mod test {
|
|||
);
|
||||
assert_eq!(invoice.payment_hash(), &sha256::Hash::from_slice(&[21;32][..]).unwrap());
|
||||
assert_eq!(invoice.payment_secret(), &PaymentSecret([42; 32]));
|
||||
assert_eq!(invoice.features(), Some(&InvoiceFeatures::known()));
|
||||
|
||||
let mut expected_features = InvoiceFeatures::empty();
|
||||
expected_features.set_variable_length_onion_required();
|
||||
expected_features.set_payment_secret_required();
|
||||
expected_features.set_basic_mpp_optional();
|
||||
assert_eq!(invoice.features(), Some(&expected_features));
|
||||
|
||||
let raw_invoice = builder.build_raw().unwrap();
|
||||
assert_eq!(raw_invoice, *invoice.into_signed_raw().raw_invoice())
|
||||
|
|
|
@ -780,7 +780,8 @@ mod tests {
|
|||
use utils::create_invoice_from_channelmanager_and_duration_since_epoch;
|
||||
use bitcoin_hashes::sha256::Hash as Sha256;
|
||||
use lightning::ln::PaymentPreimage;
|
||||
use lightning::ln::features::{ChannelFeatures, NodeFeatures, InitFeatures};
|
||||
use lightning::ln::channelmanager;
|
||||
use lightning::ln::features::{ChannelFeatures, NodeFeatures};
|
||||
use lightning::ln::functional_test_utils::*;
|
||||
use lightning::ln::msgs::{ChannelMessageHandler, ErrorAction, LightningError};
|
||||
use lightning::routing::gossip::{EffectiveCapacity, NodeId};
|
||||
|
@ -2160,24 +2161,24 @@ mod tests {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chans = nodes[0].node.list_usable_channels();
|
||||
let mut route = Route {
|
||||
paths: vec![
|
||||
vec![RouteHop {
|
||||
pubkey: nodes[1].node.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: chans[0].short_channel_id.unwrap(),
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 10_000,
|
||||
cltv_expiry_delta: 100,
|
||||
}],
|
||||
vec![RouteHop {
|
||||
pubkey: nodes[1].node.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: chans[1].short_channel_id.unwrap(),
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 100_000_001, // Our default max-HTLC-value is 10% of the channel value, which this is one more than
|
||||
cltv_expiry_delta: 100,
|
||||
}],
|
||||
|
@ -2212,16 +2213,16 @@ mod tests {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chans = nodes[0].node.list_usable_channels();
|
||||
let mut route = Route {
|
||||
paths: vec![
|
||||
vec![RouteHop {
|
||||
pubkey: nodes[1].node.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: chans[0].short_channel_id.unwrap(),
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 100_000_001, // Our default max-HTLC-value is 10% of the channel value, which this is one more than
|
||||
cltv_expiry_delta: 100,
|
||||
}],
|
||||
|
@ -2271,38 +2272,38 @@ mod tests {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_1_scid = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 0, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_2_scid = create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 10_000_000, 0, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_1_scid = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_2_scid = create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 10_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
|
||||
let mut route = Route {
|
||||
paths: vec![
|
||||
vec![RouteHop {
|
||||
pubkey: nodes[1].node.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: chan_1_scid,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 0,
|
||||
cltv_expiry_delta: 100,
|
||||
}, RouteHop {
|
||||
pubkey: nodes[2].node.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: chan_2_scid,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 100_000_000,
|
||||
cltv_expiry_delta: 100,
|
||||
}],
|
||||
vec![RouteHop {
|
||||
pubkey: nodes[1].node.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: chan_1_scid,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 0,
|
||||
cltv_expiry_delta: 100,
|
||||
}, RouteHop {
|
||||
pubkey: nodes[2].node.get_our_node_id(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: chan_2_scid,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 100_000_000,
|
||||
cltv_expiry_delta: 100,
|
||||
}]
|
||||
|
|
|
@ -518,9 +518,8 @@ mod test {
|
|||
use bitcoin_hashes::sha256::Hash as Sha256;
|
||||
use lightning::chain::keysinterface::PhantomKeysManager;
|
||||
use lightning::ln::{PaymentPreimage, PaymentHash};
|
||||
use lightning::ln::channelmanager::{PhantomRouteHints, MIN_FINAL_CLTV_EXPIRY};
|
||||
use lightning::ln::channelmanager::{self, PhantomRouteHints, MIN_FINAL_CLTV_EXPIRY};
|
||||
use lightning::ln::functional_test_utils::*;
|
||||
use lightning::ln::features::InitFeatures;
|
||||
use lightning::ln::msgs::ChannelMessageHandler;
|
||||
use lightning::routing::router::{PaymentParameters, RouteParameters, find_route};
|
||||
use lightning::util::enforcing_trait_impls::EnforcingSigner;
|
||||
|
@ -537,7 +536,7 @@ mod test {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let non_default_invoice_expiry_secs = 4200;
|
||||
let invoice = create_invoice_from_channelmanager_and_duration_since_epoch(
|
||||
&nodes[1].node, nodes[1].keys_manager, Currency::BitcoinTestnet, Some(10_000), "test".to_string(),
|
||||
|
@ -620,8 +619,8 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let mut scid_aliases = HashSet::new();
|
||||
scid_aliases.insert(chan_1_0.0.short_channel_id_alias.unwrap());
|
||||
|
@ -636,9 +635,9 @@ mod test {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let _chan_1_0_low_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1_0_high_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 10_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_1_0_medium_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_1_0_low_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_1_0_high_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 10_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let _chan_1_0_medium_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let mut scid_aliases = HashSet::new();
|
||||
scid_aliases.insert(chan_1_0_high_inbound_capacity.0.short_channel_id_alias.unwrap());
|
||||
|
@ -652,7 +651,7 @@ mod test {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Create an unannonced channel between `nodes[2]` and `nodes[0]`, for which the
|
||||
// `msgs::ChannelUpdate` is never handled for the node(s). As the `msgs::ChannelUpdate`
|
||||
|
@ -661,9 +660,9 @@ mod test {
|
|||
private_chan_cfg.channel_handshake_config.announced_channel = false;
|
||||
let temporary_channel_id = nodes[2].node.create_channel(nodes[0].node.get_our_node_id(), 1_000_000, 500_000_000, 42, Some(private_chan_cfg)).unwrap();
|
||||
let open_channel = get_event_msg!(nodes[2], MessageSendEvent::SendOpenChannel, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_open_channel(&nodes[2].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[0].node.handle_open_channel(&nodes[2].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let accept_channel = get_event_msg!(nodes[0], MessageSendEvent::SendAcceptChannel, nodes[2].node.get_our_node_id());
|
||||
nodes[2].node.handle_accept_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
nodes[2].node.handle_accept_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
|
||||
let tx = sign_funding_transaction(&nodes[2], &nodes[0], 1_000_000, temporary_channel_id);
|
||||
|
||||
|
@ -692,9 +691,9 @@ mod test {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let _chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let chan_2_0 = create_announced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2_0 = create_announced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[2].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &chan_2_0.1);
|
||||
nodes[0].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan_2_0.0);
|
||||
|
||||
|
@ -710,11 +709,11 @@ mod test {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1_0 = create_announced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1_0 = create_announced_chan_between_nodes_with_value(&nodes, 1, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[0].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &chan_1_0.0);
|
||||
nodes[1].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &chan_1_0.1);
|
||||
|
||||
let chan_2_0 = create_announced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2_0 = create_announced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[2].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &chan_2_0.1);
|
||||
nodes[0].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan_2_0.0);
|
||||
|
||||
|
@ -728,8 +727,8 @@ mod test {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 2, 0, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 0, 100_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2_0 = create_unannounced_chan_between_nodes_with_value(&nodes, 2, 0, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// As the invoice amt is 1 msat above chan_1_0's inbound capacity, it shouldn't be included
|
||||
let mut scid_aliases_99_000_001_msat = HashSet::new();
|
||||
|
@ -794,10 +793,10 @@ mod test {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_0_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[0].node.handle_channel_update(&nodes[1].node.get_our_node_id(), &chan_0_1.1);
|
||||
nodes[1].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &chan_0_1.0);
|
||||
let chan_0_2 = create_announced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_2 = create_announced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[0].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan_0_2.1);
|
||||
nodes[2].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &chan_0_2.0);
|
||||
|
||||
|
@ -915,8 +914,8 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let payment_amt = 20_000;
|
||||
let (payment_hash, _payment_secret) = nodes[1].node.create_inbound_payment(Some(payment_amt), 3600).unwrap();
|
||||
|
@ -978,8 +977,8 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_0_1 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_1 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let mut scid_aliases = HashSet::new();
|
||||
scid_aliases.insert(chan_0_1.0.short_channel_id_alias.unwrap());
|
||||
|
@ -1007,9 +1006,9 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 1000000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 3, 3_000_000, 10005, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 1000000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_1_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 3, 3_000_000, 10005, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let mut scid_aliases = HashSet::new();
|
||||
scid_aliases.insert(chan_0_2.0.short_channel_id_alias.unwrap());
|
||||
|
@ -1038,8 +1037,8 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 1000000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 1000000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Create an unannonced channel between `nodes[1]` and `nodes[3]`, for which the
|
||||
// `msgs::ChannelUpdate` is never handled for the node(s). As the `msgs::ChannelUpdate`
|
||||
|
@ -1048,9 +1047,9 @@ mod test {
|
|||
private_chan_cfg.channel_handshake_config.announced_channel = false;
|
||||
let temporary_channel_id = nodes[1].node.create_channel(nodes[3].node.get_our_node_id(), 1_000_000, 500_000_000, 42, Some(private_chan_cfg)).unwrap();
|
||||
let open_channel = get_event_msg!(nodes[1], MessageSendEvent::SendOpenChannel, nodes[3].node.get_our_node_id());
|
||||
nodes[3].node.handle_open_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[3].node.handle_open_channel(&nodes[1].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let accept_channel = get_event_msg!(nodes[3], MessageSendEvent::SendAcceptChannel, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_accept_channel(&nodes[3].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
nodes[1].node.handle_accept_channel(&nodes[3].node.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
|
||||
let tx = sign_funding_transaction(&nodes[1], &nodes[3], 1_000_000, temporary_channel_id);
|
||||
|
||||
|
@ -1094,9 +1093,9 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_0_1 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_1 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let chan_2_0 = create_announced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2_0 = create_announced_chan_between_nodes_with_value(&nodes, 2, 0, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[2].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &chan_2_0.1);
|
||||
nodes[0].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan_2_0.0);
|
||||
|
||||
|
@ -1127,12 +1126,12 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_0_2 = create_announced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_2 = create_announced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[0].node.handle_channel_update(&nodes[2].node.get_our_node_id(), &chan_0_2.1);
|
||||
nodes[2].node.handle_channel_update(&nodes[0].node.get_our_node_id(), &chan_0_2.0);
|
||||
let _chan_1_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_1_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Hints should include `chan_0_3` from as `nodes[3]` only have private channels, and no
|
||||
// channels for `nodes[2]` as it contains a mix of public and private channels.
|
||||
|
@ -1161,10 +1160,10 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let _chan_0_1_low_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_1_high_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_0_1_medium_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_0_1_low_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_0_1_high_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let _chan_0_1_medium_inbound_capacity = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let mut scid_aliases = HashSet::new();
|
||||
scid_aliases.insert(chan_0_1_high_inbound_capacity.0.short_channel_id_alias.unwrap());
|
||||
|
@ -1192,9 +1191,9 @@ mod test {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 100_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 3, 200_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_0_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 2, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_0_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 0, 3, 100_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_1_3 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 3, 200_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Since the invoice 1 msat above chan_0_3's inbound capacity, it should be filtered out.
|
||||
let mut scid_aliases_99_000_001_msat = HashSet::new();
|
||||
|
|
|
@ -582,8 +582,8 @@ mod tests {
|
|||
fn handle_reply_short_channel_ids_end(&self, _their_node_id: &PublicKey, _msg: ReplyShortChannelIdsEnd) -> Result<(), LightningError> { Ok(()) }
|
||||
fn handle_query_channel_range(&self, _their_node_id: &PublicKey, _msg: QueryChannelRange) -> Result<(), LightningError> { Ok(()) }
|
||||
fn handle_query_short_channel_ids(&self, _their_node_id: &PublicKey, _msg: QueryShortChannelIds) -> Result<(), LightningError> { Ok(()) }
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::known() }
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::known() }
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::empty() }
|
||||
}
|
||||
impl ChannelMessageHandler for MsgHandler {
|
||||
fn handle_open_channel(&self, _their_node_id: &PublicKey, _their_features: InitFeatures, _msg: &OpenChannel) {}
|
||||
|
@ -616,8 +616,8 @@ mod tests {
|
|||
}
|
||||
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &ChannelReestablish) {}
|
||||
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &ErrorMessage) {}
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::known() }
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::known() }
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::empty() }
|
||||
}
|
||||
impl MessageSendEventsProvider for MsgHandler {
|
||||
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> {
|
||||
|
|
|
@ -142,7 +142,7 @@ mod tests {
|
|||
use lightning::chain::chainmonitor::Persist;
|
||||
use lightning::chain::transaction::OutPoint;
|
||||
use lightning::{check_closed_broadcast, check_closed_event, check_added_monitors};
|
||||
use lightning::ln::features::InitFeatures;
|
||||
use lightning::ln::channelmanager;
|
||||
use lightning::ln::functional_test_utils::*;
|
||||
use lightning::util::events::{ClosureReason, MessageSendEventsProvider};
|
||||
use lightning::util::test_utils;
|
||||
|
@ -206,7 +206,7 @@ mod tests {
|
|||
}
|
||||
|
||||
// Create some initial channel and check that a channel was persisted.
|
||||
let _ = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let _ = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
check_persisted_data!(0);
|
||||
|
||||
// Send a few payments and make sure the monitors are updated to the latest.
|
||||
|
@ -250,7 +250,7 @@ mod tests {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[1].node.force_close_broadcasting_latest_txn(&chan.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
||||
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
|
||||
|
@ -289,7 +289,7 @@ mod tests {
|
|||
let mut node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[1].node.force_close_broadcasting_latest_txn(&chan.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
||||
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
|
||||
|
|
|
@ -725,8 +725,7 @@ mod tests {
|
|||
use ::{get_htlc_update_msgs, get_local_commitment_txn, get_revoke_commit_msgs, get_route_and_payment_hash, unwrap_send_err};
|
||||
use chain::{ChannelMonitorUpdateErr, Confirm, Watch};
|
||||
use chain::channelmonitor::LATENCY_GRACE_PERIOD_BLOCKS;
|
||||
use ln::channelmanager::PaymentSendFailure;
|
||||
use ln::features::InitFeatures;
|
||||
use ln::channelmanager::{self, PaymentSendFailure};
|
||||
use ln::functional_test_utils::*;
|
||||
use ln::msgs::ChannelMessageHandler;
|
||||
use util::errors::APIError;
|
||||
|
@ -741,7 +740,7 @@ mod tests {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Route two payments to be claimed at the same time.
|
||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||
|
@ -818,7 +817,7 @@ mod tests {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel = create_announced_chan_between_nodes(
|
||||
&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get a route for later and rebalance the channel somewhat
|
||||
send_payment(&nodes[0], &[&nodes[1]], 10_000_000);
|
||||
|
@ -894,7 +893,7 @@ mod tests {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
chanmon_cfgs[0].persister.chain_sync_monitor_persistences.lock().unwrap().clear();
|
||||
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::PermanentFailure));
|
||||
|
|
|
@ -3767,8 +3767,7 @@ mod tests {
|
|||
use ln::{PaymentPreimage, PaymentHash};
|
||||
use ln::chan_utils;
|
||||
use ln::chan_utils::{HTLCOutputInCommitment, ChannelPublicKeys, ChannelTransactionParameters, HolderCommitmentTransaction, CounterpartyChannelTransactionParameters};
|
||||
use ln::channelmanager::PaymentSendFailure;
|
||||
use ln::features::InitFeatures;
|
||||
use ln::channelmanager::{self, PaymentSendFailure};
|
||||
use ln::functional_test_utils::*;
|
||||
use ln::script::ShutdownScript;
|
||||
use util::errors::APIError;
|
||||
|
@ -3797,9 +3796,9 @@ mod tests {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let channel = create_announced_chan_between_nodes(
|
||||
&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(
|
||||
&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Rebalance somewhat
|
||||
send_payment(&nodes[0], &[&nodes[1]], 10_000_000);
|
||||
|
|
|
@ -19,9 +19,8 @@ use bitcoin::network::constants::Network;
|
|||
use chain::channelmonitor::{ANTI_REORG_DELAY, ChannelMonitor};
|
||||
use chain::transaction::OutPoint;
|
||||
use chain::{ChannelMonitorUpdateErr, Listen, Watch};
|
||||
use ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure};
|
||||
use ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure};
|
||||
use ln::channel::AnnouncementSigsState;
|
||||
use ln::features::InitFeatures;
|
||||
use ln::msgs;
|
||||
use ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
|
||||
use util::config::UserConfig;
|
||||
|
@ -48,7 +47,7 @@ fn test_simple_monitor_permanent_update_fail() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, payment_hash_1, _, payment_secret_1) = get_route_and_payment_hash!(&nodes[0], nodes[1], 1000000);
|
||||
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::PermanentFailure));
|
||||
|
@ -84,7 +83,7 @@ fn test_monitor_and_persister_update_fail() {
|
|||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
// Create some initial channel
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let outpoint = OutPoint { txid: chan.3.txid(), index: 0 };
|
||||
|
||||
// Rebalance the network to generate htlc in the two directions
|
||||
|
@ -162,7 +161,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(&nodes[0], nodes[1], 1000000);
|
||||
|
||||
|
@ -276,7 +275,7 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||
|
||||
|
@ -347,10 +346,10 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -369,10 +368,10 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -619,7 +618,7 @@ fn test_monitor_update_fail_cs() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
let (route, our_payment_hash, payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
|
@ -711,7 +710,7 @@ fn test_monitor_update_fail_no_rebroadcast() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
let (route, our_payment_hash, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
{
|
||||
|
@ -758,7 +757,7 @@ fn test_monitor_update_raa_while_paused() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
send_payment(&nodes[0], &[&nodes[1]], 5000000);
|
||||
let (route, our_payment_hash_1, payment_preimage_1, our_payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
|
@ -830,8 +829,8 @@ fn do_test_monitor_update_fail_raa(test_ignore_second_cs: bool) {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Rebalance a bit so that we can send backwards from 2 to 1.
|
||||
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
|
||||
|
@ -1098,8 +1097,8 @@ fn test_monitor_update_fail_reestablish() {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
|
||||
|
||||
|
@ -1123,8 +1122,8 @@ fn test_monitor_update_fail_reestablish() {
|
|||
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
|
||||
|
||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
|
||||
let as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
@ -1142,8 +1141,8 @@ fn test_monitor_update_fail_reestablish() {
|
|||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
|
||||
assert_eq!(get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap(), as_reestablish);
|
||||
assert_eq!(get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap(), bs_reestablish);
|
||||
|
@ -1185,7 +1184,7 @@ fn raa_no_response_awaiting_raa_state() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
let (payment_preimage_2, payment_hash_2, payment_secret_2) = get_payment_preimage_hash!(nodes[1]);
|
||||
|
@ -1304,7 +1303,7 @@ fn claim_while_disconnected_monitor_update_fail() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
// Forward a payment for B to claim
|
||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||
|
@ -1316,8 +1315,8 @@ fn claim_while_disconnected_monitor_update_fail() {
|
|||
check_added_monitors!(nodes[1], 1);
|
||||
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
|
||||
let as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reconnect = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
@ -1418,7 +1417,7 @@ fn monitor_failed_no_reestablish_response() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
{
|
||||
let mut lock;
|
||||
get_channel_ref!(nodes[0], lock, channel_id).announcement_sigs_state = AnnouncementSigsState::PeerReceived;
|
||||
|
@ -1448,8 +1447,8 @@ fn monitor_failed_no_reestablish_response() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
|
||||
let as_reconnect = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reconnect = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
@ -1496,7 +1495,7 @@ fn first_message_on_recv_ordering() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
// Route the first payment outbound, holding the last RAA for B until we are set up so that we
|
||||
// can deliver it and fail the monitor update.
|
||||
|
@ -1588,8 +1587,8 @@ fn test_monitor_update_fail_claim() {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Rebalance a bit so that we can send backwards from 3 to 2.
|
||||
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
|
||||
|
@ -1698,8 +1697,8 @@ fn test_monitor_update_on_pending_forwards() {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Rebalance a bit so that we can send backwards from 3 to 1.
|
||||
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
|
||||
|
@ -1768,7 +1767,7 @@ fn monitor_update_claim_fail_no_response() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
// Forward a payment for B to claim
|
||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||
|
@ -1825,8 +1824,8 @@ fn do_during_funding_monitor_fail(confirm_a_first: bool, restore_b_before_conf:
|
|||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 43, None).unwrap();
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id()));
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id()));
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id()));
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), channelmanager::provided_init_features(), &get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id()));
|
||||
|
||||
let (temporary_channel_id, funding_tx, funding_output) = create_funding_transaction(&nodes[0], &nodes[1].node.get_our_node_id(), 100000, 43);
|
||||
|
||||
|
@ -1938,10 +1937,10 @@ fn test_path_paused_mpp() {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_1_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let (chan_2_ann, _, chan_2_id, _) = create_announced_chan_between_nodes(&nodes, 0, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_3_id = create_announced_chan_between_nodes(&nodes, 1, 3, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_4_id = create_announced_chan_between_nodes(&nodes, 2, 3, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_1_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let (chan_2_ann, _, chan_2_id, _) = create_announced_chan_between_nodes(&nodes, 0, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_3_id = create_announced_chan_between_nodes(&nodes, 1, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_4_id = create_announced_chan_between_nodes(&nodes, 2, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
|
||||
let (mut route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(&nodes[0], nodes[3], 100000);
|
||||
|
||||
|
@ -2004,7 +2003,7 @@ fn test_pending_update_fee_ack_on_reconnect() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
send_payment(&nodes[0], &[&nodes[1]], 100_000_00);
|
||||
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(&nodes[1], nodes[0], 1_000_000);
|
||||
|
@ -2031,9 +2030,9 @@ fn test_pending_update_fee_ack_on_reconnect() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let as_connect_msg = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let bs_connect_msg = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_connect_msg);
|
||||
|
@ -2092,8 +2091,8 @@ fn test_fail_htlc_on_broadcast_after_claim() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 2000);
|
||||
|
||||
|
@ -2132,7 +2131,7 @@ fn do_update_fee_resend_test(deliver_update: bool, parallel_updates: bool) {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
send_payment(&nodes[0], &[&nodes[1]], 1000);
|
||||
|
||||
{
|
||||
|
@ -2159,9 +2158,9 @@ fn do_update_fee_resend_test(deliver_update: bool, parallel_updates: bool) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let as_connect_msg = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let bs_connect_msg = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_connect_msg);
|
||||
|
@ -2233,7 +2232,7 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
|||
let nodes_0_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 15_000_000, 7_000_000_000, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let chan_id = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 15_000_000, 7_000_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(&nodes[0], nodes[1], 100000);
|
||||
let (payment_preimage_2, payment_hash_2, payment_secret_2) = get_payment_preimage_hash!(&nodes[1]);
|
||||
|
||||
|
@ -2324,10 +2323,10 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
|||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
// Now reconnect the two
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -2444,8 +2443,8 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
|
||||
|
||||
|
@ -2557,16 +2556,16 @@ fn test_temporary_error_during_shutdown() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[Some(config), Some(config)]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, channel_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let (_, _, channel_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||
|
||||
nodes[0].node.close_channel(&channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id()));
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id()));
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id()));
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id()));
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -2612,7 +2611,7 @@ fn test_permanent_error_during_sending_shutdown() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[Some(config), None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::PermanentFailure));
|
||||
|
||||
assert!(nodes[0].node.close_channel(&channel_id, &nodes[1].node.get_our_node_id()).is_ok());
|
||||
|
@ -2633,12 +2632,12 @@ fn test_permanent_error_during_handling_shutdown() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, Some(config)]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::PermanentFailure));
|
||||
|
||||
assert!(nodes[0].node.close_channel(&channel_id, &nodes[1].node.get_our_node_id()).is_ok());
|
||||
let shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &shutdown);
|
||||
check_closed_broadcast!(nodes[1], true);
|
||||
check_added_monitors!(nodes[1], 2);
|
||||
check_closed_event!(nodes[1], 1, ClosureReason::ProcessingError { err: "ChannelMonitor storage failure".to_string() });
|
||||
|
@ -2652,7 +2651,7 @@ fn double_temp_error() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, channel_id, _) = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let (_, _, channel_id, _) = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||
let (payment_preimage_2, payment_hash_2, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||
|
|
|
@ -23,11 +23,11 @@ use bitcoin::secp256k1::{Secp256k1,ecdsa::Signature};
|
|||
use bitcoin::secp256k1;
|
||||
|
||||
use ln::{PaymentPreimage, PaymentHash};
|
||||
use ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures};
|
||||
use ln::features::{ChannelTypeFeatures, InitFeatures};
|
||||
use ln::msgs;
|
||||
use ln::msgs::{DecodeError, OptionalField, DataLossProtect};
|
||||
use ln::script::{self, ShutdownScript};
|
||||
use ln::channelmanager::{CounterpartyForwardingInfo, PendingHTLCStatus, HTLCSource, HTLCFailReason, HTLCFailureMsg, PendingHTLCInfo, RAACommitmentOrder, BREAKDOWN_TIMEOUT, MIN_CLTV_EXPIRY_DELTA, MAX_LOCAL_BREAKDOWN_TIMEOUT};
|
||||
use ln::channelmanager::{self, CounterpartyForwardingInfo, PendingHTLCStatus, HTLCSource, HTLCFailReason, HTLCFailureMsg, PendingHTLCInfo, RAACommitmentOrder, BREAKDOWN_TIMEOUT, MIN_CLTV_EXPIRY_DELTA, MAX_LOCAL_BREAKDOWN_TIMEOUT};
|
||||
use ln::chan_utils::{CounterpartyCommitmentSecrets, TxCreationKeys, HTLCOutputInCommitment, htlc_success_tx_weight, htlc_timeout_tx_weight, make_funding_redeemscript, ChannelPublicKeys, CommitmentTransaction, HolderCommitmentTransaction, ChannelTransactionParameters, CounterpartyChannelTransactionParameters, MAX_HTLCS, get_commitment_transaction_number_obscure_factor, ClosingTransaction};
|
||||
use ln::chan_utils;
|
||||
use chain::BestBlock;
|
||||
|
@ -5254,7 +5254,7 @@ impl<Signer: Sign> Channel<Signer> {
|
|||
let were_node_one = node_id.serialize()[..] < self.counterparty_node_id.serialize()[..];
|
||||
|
||||
let msg = msgs::UnsignedChannelAnnouncement {
|
||||
features: ChannelFeatures::known(),
|
||||
features: channelmanager::provided_channel_features(),
|
||||
chain_hash,
|
||||
short_channel_id: self.get_short_channel_id().unwrap(),
|
||||
node_id_1: if were_node_one { node_id } else { self.get_counterparty_node_id() },
|
||||
|
@ -6645,10 +6645,10 @@ mod tests {
|
|||
use bitcoin::network::constants::Network;
|
||||
use hex;
|
||||
use ln::PaymentHash;
|
||||
use ln::channelmanager::{HTLCSource, PaymentId};
|
||||
use ln::channelmanager::{self, HTLCSource, PaymentId};
|
||||
use ln::channel::{Channel, InboundHTLCOutput, OutboundHTLCOutput, InboundHTLCState, OutboundHTLCState, HTLCCandidate, HTLCInitiator};
|
||||
use ln::channel::{MAX_FUNDING_SATOSHIS_NO_WUMBO, TOTAL_BITCOIN_SUPPLY_SATOSHIS, MIN_THEIR_CHAN_RESERVE_SATOSHIS};
|
||||
use ln::features::{InitFeatures, ChannelTypeFeatures};
|
||||
use ln::features::ChannelTypeFeatures;
|
||||
use ln::msgs::{ChannelUpdate, DataLossProtect, DecodeError, OptionalField, UnsignedChannelUpdate, MAX_VALUE_MSAT};
|
||||
use ln::script::ShutdownScript;
|
||||
use ln::chan_utils;
|
||||
|
@ -6737,7 +6737,7 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn upfront_shutdown_script_incompatibility() {
|
||||
let features = InitFeatures::known().clear_shutdown_anysegwit();
|
||||
let features = channelmanager::provided_init_features().clear_shutdown_anysegwit();
|
||||
let non_v0_segwit_shutdown_script =
|
||||
ShutdownScript::new_witness_program(WitnessVersion::V16, &[0, 40]).unwrap();
|
||||
|
||||
|
@ -6774,7 +6774,7 @@ mod tests {
|
|||
|
||||
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
|
||||
let config = UserConfig::default();
|
||||
let node_a_chan = Channel::<EnforcingSigner>::new_outbound(&bounded_fee_estimator, &&keys_provider, node_a_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
let node_a_chan = Channel::<EnforcingSigner>::new_outbound(&bounded_fee_estimator, &&keys_provider, node_a_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
|
||||
// Now change the fee so we can check that the fee in the open_channel message is the
|
||||
// same as the old fee.
|
||||
|
@ -6800,18 +6800,18 @@ mod tests {
|
|||
// Create Node A's channel pointing to Node B's pubkey
|
||||
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
|
||||
let config = UserConfig::default();
|
||||
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, node_b_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
|
||||
// Create Node B's channel by receiving Node A's open_channel message
|
||||
// Make sure A's dust limit is as we expect.
|
||||
let open_channel_msg = node_a_chan.get_open_channel(genesis_block(network).header.block_hash());
|
||||
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
|
||||
let mut node_b_chan = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), &open_channel_msg, 7, &config, 0, &&logger, 42).unwrap();
|
||||
let mut node_b_chan = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, node_b_node_id, &channelmanager::provided_init_features(), &open_channel_msg, 7, &config, 0, &&logger, 42).unwrap();
|
||||
|
||||
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
|
||||
let mut accept_channel_msg = node_b_chan.accept_inbound_channel(0);
|
||||
accept_channel_msg.dust_limit_satoshis = 546;
|
||||
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &InitFeatures::known()).unwrap();
|
||||
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features()).unwrap();
|
||||
node_a_chan.holder_dust_limit_satoshis = 1560;
|
||||
|
||||
// Put some inbound and outbound HTLCs in A's channel.
|
||||
|
@ -6870,7 +6870,7 @@ mod tests {
|
|||
|
||||
let node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
|
||||
let config = UserConfig::default();
|
||||
let mut chan = Channel::<EnforcingSigner>::new_outbound(&fee_est, &&keys_provider, node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
let mut chan = Channel::<EnforcingSigner>::new_outbound(&fee_est, &&keys_provider, node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
|
||||
let commitment_tx_fee_0_htlcs = Channel::<EnforcingSigner>::commit_tx_fee_msat(chan.feerate_per_kw, 0, chan.opt_anchors());
|
||||
let commitment_tx_fee_1_htlc = Channel::<EnforcingSigner>::commit_tx_fee_msat(chan.feerate_per_kw, 1, chan.opt_anchors());
|
||||
|
@ -6919,16 +6919,16 @@ mod tests {
|
|||
// Create Node A's channel pointing to Node B's pubkey
|
||||
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
|
||||
let config = UserConfig::default();
|
||||
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, node_b_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
|
||||
// Create Node B's channel by receiving Node A's open_channel message
|
||||
let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
|
||||
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
|
||||
let mut node_b_chan = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), &open_channel_msg, 7, &config, 0, &&logger, 42).unwrap();
|
||||
let mut node_b_chan = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, node_b_node_id, &channelmanager::provided_init_features(), &open_channel_msg, 7, &config, 0, &&logger, 42).unwrap();
|
||||
|
||||
// Node B --> Node A: accept channel
|
||||
let accept_channel_msg = node_b_chan.accept_inbound_channel(0);
|
||||
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &InitFeatures::known()).unwrap();
|
||||
node_a_chan.accept_channel(&accept_channel_msg, &config.channel_handshake_limits, &channelmanager::provided_init_features()).unwrap();
|
||||
|
||||
// Node A --> Node B: funding created
|
||||
let output_script = node_a_chan.get_funding_redeemscript();
|
||||
|
@ -6992,12 +6992,12 @@ mod tests {
|
|||
// Test that `new_outbound` creates a channel with the correct value for
|
||||
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
|
||||
// which is set to the lower bound + 1 (2%) of the `channel_value`.
|
||||
let chan_1 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config_2_percent, 0, 42).unwrap();
|
||||
let chan_1 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config_2_percent, 0, 42).unwrap();
|
||||
let chan_1_value_msat = chan_1.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_1.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
|
||||
|
||||
// Test with the upper bound - 1 of valid values (99%).
|
||||
let chan_2 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config_99_percent, 0, 42).unwrap();
|
||||
let chan_2 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config_99_percent, 0, 42).unwrap();
|
||||
let chan_2_value_msat = chan_2.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_2.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
|
||||
|
||||
|
@ -7006,38 +7006,38 @@ mod tests {
|
|||
// Test that `new_from_req` creates a channel with the correct value for
|
||||
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
|
||||
// which is set to the lower bound - 1 (2%) of the `channel_value`.
|
||||
let chan_3 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &InitFeatures::known(), &chan_1_open_channel_msg, 7, &config_2_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_3 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &channelmanager::provided_init_features(), &chan_1_open_channel_msg, 7, &config_2_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_3_value_msat = chan_3.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_3.holder_max_htlc_value_in_flight_msat, (chan_3_value_msat as f64 * 0.02) as u64);
|
||||
|
||||
// Test with the upper bound - 1 of valid values (99%).
|
||||
let chan_4 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &InitFeatures::known(), &chan_1_open_channel_msg, 7, &config_99_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_4 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &channelmanager::provided_init_features(), &chan_1_open_channel_msg, 7, &config_99_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_4_value_msat = chan_4.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_4.holder_max_htlc_value_in_flight_msat, (chan_4_value_msat as f64 * 0.99) as u64);
|
||||
|
||||
// Test that `new_outbound` uses the lower bound of the configurable percentage values (1%)
|
||||
// if `max_inbound_htlc_value_in_flight_percent_of_channel` is set to a value less than 1.
|
||||
let chan_5 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config_0_percent, 0, 42).unwrap();
|
||||
let chan_5 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config_0_percent, 0, 42).unwrap();
|
||||
let chan_5_value_msat = chan_5.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_5.holder_max_htlc_value_in_flight_msat, (chan_5_value_msat as f64 * 0.01) as u64);
|
||||
|
||||
// Test that `new_outbound` uses the upper bound of the configurable percentage values
|
||||
// (100%) if `max_inbound_htlc_value_in_flight_percent_of_channel` is set to a larger value
|
||||
// than 100.
|
||||
let chan_6 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config_101_percent, 0, 42).unwrap();
|
||||
let chan_6 = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config_101_percent, 0, 42).unwrap();
|
||||
let chan_6_value_msat = chan_6.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_6.holder_max_htlc_value_in_flight_msat, chan_6_value_msat);
|
||||
|
||||
// Test that `new_from_req` uses the lower bound of the configurable percentage values (1%)
|
||||
// if `max_inbound_htlc_value_in_flight_percent_of_channel` is set to a value less than 1.
|
||||
let chan_7 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &InitFeatures::known(), &chan_1_open_channel_msg, 7, &config_0_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_7 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &channelmanager::provided_init_features(), &chan_1_open_channel_msg, 7, &config_0_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_7_value_msat = chan_7.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_7.holder_max_htlc_value_in_flight_msat, (chan_7_value_msat as f64 * 0.01) as u64);
|
||||
|
||||
// Test that `new_from_req` uses the upper bound of the configurable percentage values
|
||||
// (100%) if `max_inbound_htlc_value_in_flight_percent_of_channel` is set to a larger value
|
||||
// than 100.
|
||||
let chan_8 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &InitFeatures::known(), &chan_1_open_channel_msg, 7, &config_101_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_8 = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider, inbound_node_id, &channelmanager::provided_init_features(), &chan_1_open_channel_msg, 7, &config_101_percent, 0, &&logger, 42).unwrap();
|
||||
let chan_8_value_msat = chan_8.channel_value_satoshis * 1000;
|
||||
assert_eq!(chan_8.holder_max_htlc_value_in_flight_msat, chan_8_value_msat);
|
||||
}
|
||||
|
@ -7077,7 +7077,7 @@ mod tests {
|
|||
|
||||
let mut outbound_node_config = UserConfig::default();
|
||||
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
|
||||
let chan = Channel::<EnforcingSigner>::new_outbound(&&fee_est, &&keys_provider, outbound_node_id, &InitFeatures::known(), channel_value_satoshis, 100_000, 42, &outbound_node_config, 0, 42).unwrap();
|
||||
let chan = Channel::<EnforcingSigner>::new_outbound(&&fee_est, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(), channel_value_satoshis, 100_000, 42, &outbound_node_config, 0, 42).unwrap();
|
||||
|
||||
let expected_outbound_selected_chan_reserve = cmp::max(MIN_THEIR_CHAN_RESERVE_SATOSHIS, (chan.channel_value_satoshis as f64 * outbound_selected_channel_reserve_perc) as u64);
|
||||
assert_eq!(chan.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
|
||||
|
@ -7087,7 +7087,7 @@ mod tests {
|
|||
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
|
||||
|
||||
if outbound_selected_channel_reserve_perc + inbound_selected_channel_reserve_perc < 1.0 {
|
||||
let chan_inbound_node = Channel::<EnforcingSigner>::new_from_req(&&fee_est, &&keys_provider, inbound_node_id, &InitFeatures::known(), &chan_open_channel_msg, 7, &inbound_node_config, 0, &&logger, 42).unwrap();
|
||||
let chan_inbound_node = Channel::<EnforcingSigner>::new_from_req(&&fee_est, &&keys_provider, inbound_node_id, &channelmanager::provided_init_features(), &chan_open_channel_msg, 7, &inbound_node_config, 0, &&logger, 42).unwrap();
|
||||
|
||||
let expected_inbound_selected_chan_reserve = cmp::max(MIN_THEIR_CHAN_RESERVE_SATOSHIS, (chan.channel_value_satoshis as f64 * inbound_selected_channel_reserve_perc) as u64);
|
||||
|
||||
|
@ -7095,7 +7095,7 @@ mod tests {
|
|||
assert_eq!(chan_inbound_node.counterparty_selected_channel_reserve_satoshis.unwrap(), expected_outbound_selected_chan_reserve);
|
||||
} else {
|
||||
// Channel Negotiations failed
|
||||
let result = Channel::<EnforcingSigner>::new_from_req(&&fee_est, &&keys_provider, inbound_node_id, &InitFeatures::known(), &chan_open_channel_msg, 7, &inbound_node_config, 0, &&logger, 42);
|
||||
let result = Channel::<EnforcingSigner>::new_from_req(&&fee_est, &&keys_provider, inbound_node_id, &channelmanager::provided_init_features(), &chan_open_channel_msg, 7, &inbound_node_config, 0, &&logger, 42);
|
||||
assert!(result.is_err());
|
||||
}
|
||||
}
|
||||
|
@ -7112,7 +7112,7 @@ mod tests {
|
|||
// Create a channel.
|
||||
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
|
||||
let config = UserConfig::default();
|
||||
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider, node_b_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
assert!(node_a_chan.counterparty_forwarding_info.is_none());
|
||||
assert_eq!(node_a_chan.holder_htlc_minimum_msat, 1); // the default
|
||||
assert!(node_a_chan.counterparty_forwarding_info().is_none());
|
||||
|
@ -7191,7 +7191,7 @@ mod tests {
|
|||
let counterparty_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
|
||||
let mut config = UserConfig::default();
|
||||
config.channel_handshake_config.announced_channel = false;
|
||||
let mut chan = Channel::<InMemorySigner>::new_outbound(&LowerBoundedFeeEstimator::new(&feeest), &&keys_provider, counterparty_node_id, &InitFeatures::known(), 10_000_000, 100000, 42, &config, 0, 42).unwrap(); // Nothing uses their network key in this test
|
||||
let mut chan = Channel::<InMemorySigner>::new_outbound(&LowerBoundedFeeEstimator::new(&feeest), &&keys_provider, counterparty_node_id, &channelmanager::provided_init_features(), 10_000_000, 100000, 42, &config, 0, 42).unwrap(); // Nothing uses their network key in this test
|
||||
chan.holder_dust_limit_satoshis = 546;
|
||||
chan.counterparty_selected_channel_reserve_satoshis = Some(0); // Filled in in accept_channel
|
||||
|
||||
|
@ -7906,7 +7906,7 @@ mod tests {
|
|||
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
|
||||
let config = UserConfig::default();
|
||||
let node_a_chan = Channel::<EnforcingSigner>::new_outbound(&feeest, &&keys_provider,
|
||||
node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
node_b_node_id, &channelmanager::provided_init_features(), 10000000, 100000, 42, &config, 0, 42).unwrap();
|
||||
|
||||
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
|
||||
channel_type_features.set_zero_conf_required();
|
||||
|
@ -7915,7 +7915,7 @@ mod tests {
|
|||
open_channel_msg.channel_type = Some(channel_type_features);
|
||||
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
|
||||
let res = Channel::<EnforcingSigner>::new_from_req(&feeest, &&keys_provider,
|
||||
node_b_node_id, &InitFeatures::known(), &open_channel_msg, 7, &config, 0, &&logger, 42);
|
||||
node_b_node_id, &channelmanager::provided_init_features(), &open_channel_msg, 7, &config, 0, &&logger, 42);
|
||||
assert!(res.is_ok());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,7 +43,9 @@ use chain::transaction::{OutPoint, TransactionData};
|
|||
// construct one themselves.
|
||||
use ln::{inbound_payment, PaymentHash, PaymentPreimage, PaymentSecret};
|
||||
use ln::channel::{Channel, ChannelError, ChannelUpdateStatus, UpdateFulfillCommitFetch};
|
||||
use ln::features::{ChannelTypeFeatures, InitFeatures, NodeFeatures};
|
||||
use ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
|
||||
#[cfg(any(feature = "_test_utils", test))]
|
||||
use ln::features::InvoiceFeatures;
|
||||
use routing::router::{PaymentParameters, Route, RouteHop, RoutePath, RouteParameters};
|
||||
use ln::msgs;
|
||||
use ln::onion_utils;
|
||||
|
@ -6127,14 +6129,57 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
|
|||
}
|
||||
|
||||
fn provided_node_features(&self) -> NodeFeatures {
|
||||
NodeFeatures::known_channel_features()
|
||||
provided_node_features()
|
||||
}
|
||||
|
||||
fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures {
|
||||
InitFeatures::known_channel_features()
|
||||
provided_init_features()
|
||||
}
|
||||
}
|
||||
|
||||
/// Fetches the set of [`NodeFeatures`] flags which are provided by or required by
|
||||
/// [`ChannelManager`].
|
||||
pub fn provided_node_features() -> NodeFeatures {
|
||||
provided_init_features().to_context()
|
||||
}
|
||||
|
||||
/// Fetches the set of [`InvoiceFeatures`] flags which are provided by or required by
|
||||
/// [`ChannelManager`].
|
||||
///
|
||||
/// Note that the invoice feature flags can vary depending on if the invoice is a "phantom invoice"
|
||||
/// or not. Thus, this method is not public.
|
||||
#[cfg(any(feature = "_test_utils", test))]
|
||||
pub fn provided_invoice_features() -> InvoiceFeatures {
|
||||
provided_init_features().to_context()
|
||||
}
|
||||
|
||||
/// Fetches the set of [`ChannelFeatures`] flags which are provided by or required by
|
||||
/// [`ChannelManager`].
|
||||
pub fn provided_channel_features() -> ChannelFeatures {
|
||||
provided_init_features().to_context()
|
||||
}
|
||||
|
||||
/// Fetches the set of [`InitFeatures`] flags which are provided by or required by
|
||||
/// [`ChannelManager`].
|
||||
pub fn provided_init_features() -> InitFeatures {
|
||||
// Note that if new features are added here which other peers may (eventually) require, we
|
||||
// should also add the corresponding (optional) bit to the ChannelMessageHandler impl for
|
||||
// ErroringMessageHandler.
|
||||
let mut features = InitFeatures::empty();
|
||||
features.set_data_loss_protect_optional();
|
||||
features.set_upfront_shutdown_script_optional();
|
||||
features.set_variable_length_onion_required();
|
||||
features.set_static_remote_key_required();
|
||||
features.set_payment_secret_required();
|
||||
features.set_basic_mpp_optional();
|
||||
features.set_wumbo_optional();
|
||||
features.set_shutdown_any_segwit_optional();
|
||||
features.set_channel_type_optional();
|
||||
features.set_scid_privacy_optional();
|
||||
features.set_zero_conf_optional();
|
||||
features
|
||||
}
|
||||
|
||||
const SERIALIZATION_VERSION: u8 = 1;
|
||||
const MIN_SERIALIZATION_VERSION: u8 = 1;
|
||||
|
||||
|
@ -7172,9 +7217,7 @@ mod tests {
|
|||
use core::time::Duration;
|
||||
use core::sync::atomic::Ordering;
|
||||
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
|
||||
use ln::channelmanager::{PaymentId, PaymentSendFailure};
|
||||
use ln::channelmanager::inbound_payment;
|
||||
use ln::features::InitFeatures;
|
||||
use ln::channelmanager::{self, inbound_payment, PaymentId, PaymentSendFailure};
|
||||
use ln::functional_test_utils::*;
|
||||
use ln::msgs;
|
||||
use ln::msgs::ChannelMessageHandler;
|
||||
|
@ -7199,7 +7242,7 @@ mod tests {
|
|||
assert!(nodes[1].node.await_persistable_update_timeout(Duration::from_millis(1)));
|
||||
assert!(nodes[2].node.await_persistable_update_timeout(Duration::from_millis(1)));
|
||||
|
||||
let mut chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let mut chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// We check that the channel info nodes have doesn't change too early, even though we try
|
||||
// to connect messages with new values
|
||||
|
@ -7270,7 +7313,7 @@ mod tests {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// First, send a partial MPP payment.
|
||||
let (route, our_payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(&nodes[0], nodes[1], 100_000);
|
||||
|
@ -7388,7 +7431,7 @@ mod tests {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
|
||||
|
||||
|
@ -7486,10 +7529,10 @@ mod tests {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let route_params = RouteParameters {
|
||||
payment_params: PaymentParameters::for_keysend(payee_pubkey),
|
||||
final_value_msat: 10000,
|
||||
|
@ -7530,10 +7573,10 @@ mod tests {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let route_params = RouteParameters {
|
||||
payment_params: PaymentParameters::for_keysend(payee_pubkey),
|
||||
final_value_msat: 10000,
|
||||
|
@ -7572,10 +7615,10 @@ mod tests {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_1_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_2_id = create_announced_chan_between_nodes(&nodes, 0, 2, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_3_id = create_announced_chan_between_nodes(&nodes, 1, 3, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_4_id = create_announced_chan_between_nodes(&nodes, 2, 3, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_1_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_2_id = create_announced_chan_between_nodes(&nodes, 0, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_3_id = create_announced_chan_between_nodes(&nodes, 1, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_4_id = create_announced_chan_between_nodes(&nodes, 2, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
|
||||
// Marshall an MPP route.
|
||||
let (mut route, payment_hash, _, _) = get_route_and_payment_hash!(&nodes[0], nodes[3], 100000);
|
||||
|
@ -7636,9 +7679,9 @@ mod tests {
|
|||
|
||||
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 1_000_000, 500_000_000, 42, None).unwrap();
|
||||
let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
|
||||
let (temporary_channel_id, tx, _funding_output) = create_funding_transaction(&nodes[0], &nodes[1].node.get_our_node_id(), 1_000_000, 42);
|
||||
let channel_id = &tx.txid().into_inner();
|
||||
|
@ -7683,9 +7726,9 @@ mod tests {
|
|||
update_nodes_with_chan_announce(&nodes, 0, 1, &announcement, &nodes_0_update, &nodes_1_update);
|
||||
|
||||
nodes[0].node.close_channel(channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id()));
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id()));
|
||||
let nodes_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &nodes_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &nodes_1_shutdown);
|
||||
|
||||
let closing_signed_node_0 = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &closing_signed_node_0);
|
||||
|
@ -7743,7 +7786,7 @@ pub mod bench {
|
|||
use chain::Listen;
|
||||
use chain::chainmonitor::{ChainMonitor, Persist};
|
||||
use chain::keysinterface::{KeysManager, KeysInterface, InMemorySigner};
|
||||
use ln::channelmanager::{BestBlock, ChainParameters, ChannelManager, PaymentHash, PaymentPreimage};
|
||||
use ln::channelmanager::{self, BestBlock, ChainParameters, ChannelManager, PaymentHash, PaymentPreimage};
|
||||
use ln::features::{InitFeatures, InvoiceFeatures};
|
||||
use ln::functional_test_utils::*;
|
||||
use ln::msgs::{ChannelMessageHandler, Init};
|
||||
|
@ -7809,11 +7852,11 @@ pub mod bench {
|
|||
});
|
||||
let node_b_holder = NodeHolder { node: &node_b };
|
||||
|
||||
node_a.peer_connected(&node_b.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
node_b.peer_connected(&node_a.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
node_a.peer_connected(&node_b.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
node_b.peer_connected(&node_a.get_our_node_id(), &Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
node_a.create_channel(node_b.get_our_node_id(), 8_000_000, 100_000_000, 42, None).unwrap();
|
||||
node_b.handle_open_channel(&node_a.get_our_node_id(), InitFeatures::known(), &get_event_msg!(node_a_holder, MessageSendEvent::SendOpenChannel, node_b.get_our_node_id()));
|
||||
node_a.handle_accept_channel(&node_b.get_our_node_id(), InitFeatures::known(), &get_event_msg!(node_b_holder, MessageSendEvent::SendAcceptChannel, node_a.get_our_node_id()));
|
||||
node_b.handle_open_channel(&node_a.get_our_node_id(), channelmanager::provided_init_features(), &get_event_msg!(node_a_holder, MessageSendEvent::SendOpenChannel, node_b.get_our_node_id()));
|
||||
node_a.handle_accept_channel(&node_b.get_our_node_id(), channelmanager::provided_init_features(), &get_event_msg!(node_b_holder, MessageSendEvent::SendAcceptChannel, node_a.get_our_node_id()));
|
||||
|
||||
let tx;
|
||||
if let Event::FundingGenerationReady { temporary_channel_id, output_script, .. } = get_event!(node_a_holder, Event::FundingGenerationReady) {
|
||||
|
@ -7857,7 +7900,7 @@ pub mod bench {
|
|||
($node_a: expr, $node_b: expr) => {
|
||||
let usable_channels = $node_a.list_usable_channels();
|
||||
let payment_params = PaymentParameters::from_node_id($node_b.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known());
|
||||
.with_features(channelmanager::provided_invoice_features());
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let seed = [3u8; 32];
|
||||
let keys_manager = KeysManager::new(&seed, 42, 42);
|
||||
|
|
|
@ -71,15 +71,11 @@ mod sealed {
|
|||
use prelude::*;
|
||||
use ln::features::Features;
|
||||
|
||||
/// The context in which [`Features`] are applicable. Defines which features are required and
|
||||
/// which are optional for the context.
|
||||
/// The context in which [`Features`] are applicable. Defines which features are known to the
|
||||
/// implementation, though specification of them as required or optional is up to the code
|
||||
/// constructing a features object.
|
||||
pub trait Context {
|
||||
/// Features that are known to the implementation, where a required feature is indicated by
|
||||
/// its even bit and an optional feature is indicated by its odd bit.
|
||||
const KNOWN_FEATURE_FLAGS: &'static [u8];
|
||||
|
||||
/// Bitmask for selecting features that are known to the implementation, regardless of
|
||||
/// whether each feature is required or optional.
|
||||
/// Bitmask for selecting features that are known to the implementation.
|
||||
const KNOWN_FEATURE_MASK: &'static [u8];
|
||||
}
|
||||
|
||||
|
@ -87,41 +83,16 @@ mod sealed {
|
|||
/// are specified as a comma-separated list of bytes where each byte is a pipe-delimited list of
|
||||
/// feature identifiers.
|
||||
macro_rules! define_context {
|
||||
($context: ident {
|
||||
required_features: [$( $( $required_feature: ident )|*, )*],
|
||||
optional_features: [$( $( $optional_feature: ident )|*, )*],
|
||||
}) => {
|
||||
($context: ident, [$( $( $known_feature: ident )|*, )*]) => {
|
||||
#[derive(Eq, PartialEq)]
|
||||
pub struct $context {}
|
||||
|
||||
impl Context for $context {
|
||||
const KNOWN_FEATURE_FLAGS: &'static [u8] = &[
|
||||
// For each byte, use bitwise-OR to compute the applicable flags for known
|
||||
// required features `r_i` and optional features `o_j` for all `i` and `j` such
|
||||
// that the following slice is formed:
|
||||
//
|
||||
// [
|
||||
// `r_0` | `r_1` | ... | `o_0` | `o_1` | ...,
|
||||
// ...,
|
||||
// ]
|
||||
$(
|
||||
0b00_00_00_00 $(|
|
||||
<Self as $required_feature>::REQUIRED_MASK)*
|
||||
$(|
|
||||
<Self as $optional_feature>::OPTIONAL_MASK)*,
|
||||
)*
|
||||
];
|
||||
|
||||
const KNOWN_FEATURE_MASK: &'static [u8] = &[
|
||||
// Similar as above, but set both flags for each feature regardless of whether
|
||||
// the feature is required or optional.
|
||||
$(
|
||||
0b00_00_00_00 $(|
|
||||
<Self as $required_feature>::REQUIRED_MASK |
|
||||
<Self as $required_feature>::OPTIONAL_MASK)*
|
||||
$(|
|
||||
<Self as $optional_feature>::REQUIRED_MASK |
|
||||
<Self as $optional_feature>::OPTIONAL_MASK)*,
|
||||
<Self as $known_feature>::REQUIRED_MASK |
|
||||
<Self as $known_feature>::OPTIONAL_MASK)*,
|
||||
)*
|
||||
];
|
||||
}
|
||||
|
@ -130,17 +101,12 @@ mod sealed {
|
|||
fn fmt(&self, fmt: &mut alloc::fmt::Formatter) -> Result<(), alloc::fmt::Error> {
|
||||
$(
|
||||
$(
|
||||
fmt.write_fmt(format_args!("{}: {}, ", stringify!($required_feature),
|
||||
if <$context as $required_feature>::requires_feature(&self.flags) { "required" }
|
||||
else if <$context as $required_feature>::supports_feature(&self.flags) { "supported" }
|
||||
else { "not supported" }))?;
|
||||
)*
|
||||
$(
|
||||
fmt.write_fmt(format_args!("{}: {}, ", stringify!($optional_feature),
|
||||
if <$context as $optional_feature>::requires_feature(&self.flags) { "required" }
|
||||
else if <$context as $optional_feature>::supports_feature(&self.flags) { "supported" }
|
||||
fmt.write_fmt(format_args!("{}: {}, ", stringify!($known_feature),
|
||||
if <$context as $known_feature>::requires_feature(&self.flags) { "required" }
|
||||
else if <$context as $known_feature>::supports_feature(&self.flags) { "supported" }
|
||||
else { "not supported" }))?;
|
||||
)*
|
||||
{} // Rust gets mad if we only have a $()* block here, so add a dummy {}
|
||||
)*
|
||||
fmt.write_fmt(format_args!("unknown flags: {}",
|
||||
if self.requires_unknown_bits() { "required" }
|
||||
|
@ -150,135 +116,65 @@ mod sealed {
|
|||
};
|
||||
}
|
||||
|
||||
define_context!(InitContext {
|
||||
required_features: [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
VariableLengthOnion | StaticRemoteKey | PaymentSecret,
|
||||
// Byte 2
|
||||
,
|
||||
// Byte 3
|
||||
,
|
||||
// Byte 4
|
||||
,
|
||||
// Byte 5
|
||||
,
|
||||
// Byte 6
|
||||
,
|
||||
],
|
||||
optional_features: [
|
||||
// Note that if new "non-channel-related" flags are added here they should be
|
||||
// explicitly cleared in InitFeatures::known_channel_features and
|
||||
// NodeFeatures::known_channel_features.
|
||||
// Byte 0
|
||||
DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries,
|
||||
// Byte 1
|
||||
,
|
||||
// Byte 2
|
||||
BasicMPP | Wumbo,
|
||||
// Byte 3
|
||||
ShutdownAnySegwit,
|
||||
// Byte 4
|
||||
OnionMessages,
|
||||
// Byte 5
|
||||
ChannelType | SCIDPrivacy,
|
||||
// Byte 6
|
||||
ZeroConf,
|
||||
],
|
||||
});
|
||||
define_context!(NodeContext {
|
||||
required_features: [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
VariableLengthOnion | StaticRemoteKey | PaymentSecret,
|
||||
// Byte 2
|
||||
,
|
||||
// Byte 3
|
||||
,
|
||||
// Byte 4
|
||||
,
|
||||
// Byte 5
|
||||
,
|
||||
// Byte 6
|
||||
,
|
||||
],
|
||||
optional_features: [
|
||||
// Byte 0
|
||||
DataLossProtect | UpfrontShutdownScript | GossipQueries,
|
||||
// Byte 1
|
||||
,
|
||||
// Byte 2
|
||||
BasicMPP | Wumbo,
|
||||
// Byte 3
|
||||
ShutdownAnySegwit,
|
||||
// Byte 4
|
||||
OnionMessages,
|
||||
// Byte 5
|
||||
ChannelType | SCIDPrivacy,
|
||||
// Byte 6
|
||||
ZeroConf | Keysend,
|
||||
],
|
||||
});
|
||||
define_context!(ChannelContext {
|
||||
required_features: [],
|
||||
optional_features: [],
|
||||
});
|
||||
define_context!(InvoiceContext {
|
||||
required_features: [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
VariableLengthOnion | PaymentSecret,
|
||||
// Byte 2
|
||||
,
|
||||
],
|
||||
optional_features: [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
,
|
||||
// Byte 2
|
||||
BasicMPP,
|
||||
],
|
||||
});
|
||||
define_context!(InitContext, [
|
||||
// Byte 0
|
||||
DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries,
|
||||
// Byte 1
|
||||
VariableLengthOnion | StaticRemoteKey | PaymentSecret,
|
||||
// Byte 2
|
||||
BasicMPP | Wumbo,
|
||||
// Byte 3
|
||||
ShutdownAnySegwit,
|
||||
// Byte 4
|
||||
OnionMessages,
|
||||
// Byte 5
|
||||
ChannelType | SCIDPrivacy,
|
||||
// Byte 6
|
||||
ZeroConf,
|
||||
]);
|
||||
define_context!(NodeContext, [
|
||||
// Byte 0
|
||||
DataLossProtect | UpfrontShutdownScript | GossipQueries,
|
||||
// Byte 1
|
||||
VariableLengthOnion | StaticRemoteKey | PaymentSecret,
|
||||
// Byte 2
|
||||
BasicMPP | Wumbo,
|
||||
// Byte 3
|
||||
ShutdownAnySegwit,
|
||||
// Byte 4
|
||||
OnionMessages,
|
||||
// Byte 5
|
||||
ChannelType | SCIDPrivacy,
|
||||
// Byte 6
|
||||
ZeroConf | Keysend,
|
||||
]);
|
||||
define_context!(ChannelContext, []);
|
||||
define_context!(InvoiceContext, [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
VariableLengthOnion | PaymentSecret,
|
||||
// Byte 2
|
||||
BasicMPP,
|
||||
]);
|
||||
// This isn't a "real" feature context, and is only used in the channel_type field in an
|
||||
// `OpenChannel` message.
|
||||
define_context!(ChannelTypeContext {
|
||||
required_features: [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
StaticRemoteKey,
|
||||
// Byte 2
|
||||
,
|
||||
// Byte 3
|
||||
,
|
||||
// Byte 4
|
||||
,
|
||||
// Byte 5
|
||||
SCIDPrivacy,
|
||||
// Byte 6
|
||||
ZeroConf,
|
||||
],
|
||||
optional_features: [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
,
|
||||
// Byte 2
|
||||
,
|
||||
// Byte 3
|
||||
,
|
||||
// Byte 4
|
||||
,
|
||||
// Byte 5
|
||||
,
|
||||
// Byte 6
|
||||
,
|
||||
],
|
||||
});
|
||||
define_context!(ChannelTypeContext, [
|
||||
// Byte 0
|
||||
,
|
||||
// Byte 1
|
||||
StaticRemoteKey,
|
||||
// Byte 2
|
||||
,
|
||||
// Byte 3
|
||||
,
|
||||
// Byte 4
|
||||
,
|
||||
// Byte 5
|
||||
SCIDPrivacy,
|
||||
// Byte 6
|
||||
ZeroConf,
|
||||
]);
|
||||
|
||||
/// Defines a feature with the given bits for the specified [`Context`]s. The generated trait is
|
||||
/// useful for manipulating feature flags.
|
||||
|
@ -307,6 +203,12 @@ mod sealed {
|
|||
/// [`ODD_BIT`]: #associatedconstant.ODD_BIT
|
||||
const ASSERT_ODD_BIT_PARITY: usize;
|
||||
|
||||
/// Assertion that the bits are set in the context's [`KNOWN_FEATURE_MASK`].
|
||||
///
|
||||
/// [`KNOWN_FEATURE_MASK`]: Context::KNOWN_FEATURE_MASK
|
||||
#[cfg(not(test))] // We violate this constraint with `UnknownFeature`
|
||||
const ASSERT_BITS_IN_MASK: u8;
|
||||
|
||||
/// The byte where the feature is set.
|
||||
const BYTE_OFFSET: usize = Self::EVEN_BIT / 8;
|
||||
|
||||
|
@ -393,6 +295,12 @@ mod sealed {
|
|||
|
||||
// ODD_BIT % 2 == 1
|
||||
const ASSERT_ODD_BIT_PARITY: usize = (<Self as $feature>::ODD_BIT % 2) - 1;
|
||||
|
||||
// (byte & (REQUIRED_MASK | OPTIONAL_MASK)) >> (EVEN_BIT % 8) == 3
|
||||
#[cfg(not(test))] // We violate this constraint with `UnknownFeature`
|
||||
const ASSERT_BITS_IN_MASK: u8 =
|
||||
((<$context>::KNOWN_FEATURE_MASK[<Self as $feature>::BYTE_OFFSET] & (<Self as $feature>::REQUIRED_MASK | <Self as $feature>::OPTIONAL_MASK))
|
||||
>> (<Self as $feature>::EVEN_BIT % 8)) - 3;
|
||||
}
|
||||
)*
|
||||
};
|
||||
|
@ -552,24 +460,6 @@ impl InitFeatures {
|
|||
pub(crate) fn to_context<C: sealed::Context>(&self) -> Features<C> {
|
||||
self.to_context_internal()
|
||||
}
|
||||
|
||||
/// Returns the set of known init features that are related to channels. At least some of
|
||||
/// these features are likely required for peers to talk to us.
|
||||
pub fn known_channel_features() -> InitFeatures {
|
||||
Self::known()
|
||||
.clear_initial_routing_sync()
|
||||
.clear_gossip_queries()
|
||||
.clear_onion_messages()
|
||||
}
|
||||
}
|
||||
|
||||
impl NodeFeatures {
|
||||
/// Returns the set of known node features that are related to channels.
|
||||
pub fn known_channel_features() -> NodeFeatures {
|
||||
Self::known()
|
||||
.clear_gossip_queries()
|
||||
.clear_onion_messages()
|
||||
}
|
||||
}
|
||||
|
||||
impl InvoiceFeatures {
|
||||
|
@ -687,14 +577,6 @@ impl<T: sealed::Context> Features<T> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Creates a Features with the bits set which are known by the implementation
|
||||
pub fn known() -> Self {
|
||||
Self {
|
||||
flags: T::KNOWN_FEATURE_FLAGS.to_vec(),
|
||||
mark: PhantomData,
|
||||
}
|
||||
}
|
||||
|
||||
/// Converts `Features<T>` to `Features<C>`. Only known `T` features relevant to context `C` are
|
||||
/// included in the result.
|
||||
fn to_context_internal<C: sealed::Context>(&self) -> Features<C> {
|
||||
|
@ -786,29 +668,6 @@ impl<T: sealed::UpfrontShutdownScript> Features<T> {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
impl<T: sealed::GossipQueries> Features<T> {
|
||||
pub(crate) fn clear_gossip_queries(mut self) -> Self {
|
||||
<T as sealed::GossipQueries>::clear_bits(&mut self.flags);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: sealed::InitialRoutingSync> Features<T> {
|
||||
// Note that initial_routing_sync is ignored if gossip_queries is set.
|
||||
pub(crate) fn clear_initial_routing_sync(mut self) -> Self {
|
||||
<T as sealed::InitialRoutingSync>::clear_bits(&mut self.flags);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: sealed::OnionMessages> Features<T> {
|
||||
pub(crate) fn clear_onion_messages(mut self) -> Self {
|
||||
<T as sealed::OnionMessages>::clear_bits(&mut self.flags);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: sealed::ShutdownAnySegwit> Features<T> {
|
||||
#[cfg(test)]
|
||||
pub(crate) fn clear_shutdown_anysegwit(mut self) -> Self {
|
||||
|
@ -862,97 +721,9 @@ impl Readable for ChannelTypeFeatures {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
|
||||
use super::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, InvoiceFeatures, NodeFeatures, sealed};
|
||||
use bitcoin::bech32::{Base32Len, FromBase32, ToBase32, u5};
|
||||
|
||||
#[test]
|
||||
fn sanity_test_known_features() {
|
||||
assert!(!ChannelFeatures::known().requires_unknown_bits());
|
||||
assert!(!ChannelFeatures::known().supports_unknown_bits());
|
||||
assert!(!InitFeatures::known().requires_unknown_bits());
|
||||
assert!(!InitFeatures::known().supports_unknown_bits());
|
||||
assert!(!NodeFeatures::known().requires_unknown_bits());
|
||||
assert!(!NodeFeatures::known().supports_unknown_bits());
|
||||
|
||||
assert!(InitFeatures::known().supports_upfront_shutdown_script());
|
||||
assert!(NodeFeatures::known().supports_upfront_shutdown_script());
|
||||
assert!(!InitFeatures::known().requires_upfront_shutdown_script());
|
||||
assert!(!NodeFeatures::known().requires_upfront_shutdown_script());
|
||||
|
||||
assert!(InitFeatures::known().supports_gossip_queries());
|
||||
assert!(NodeFeatures::known().supports_gossip_queries());
|
||||
assert!(!InitFeatures::known().requires_gossip_queries());
|
||||
assert!(!NodeFeatures::known().requires_gossip_queries());
|
||||
|
||||
assert!(InitFeatures::known().supports_data_loss_protect());
|
||||
assert!(NodeFeatures::known().supports_data_loss_protect());
|
||||
assert!(!InitFeatures::known().requires_data_loss_protect());
|
||||
assert!(!NodeFeatures::known().requires_data_loss_protect());
|
||||
|
||||
assert!(InitFeatures::known().supports_variable_length_onion());
|
||||
assert!(NodeFeatures::known().supports_variable_length_onion());
|
||||
assert!(InvoiceFeatures::known().supports_variable_length_onion());
|
||||
assert!(InitFeatures::known().requires_variable_length_onion());
|
||||
assert!(NodeFeatures::known().requires_variable_length_onion());
|
||||
assert!(InvoiceFeatures::known().requires_variable_length_onion());
|
||||
|
||||
assert!(InitFeatures::known().supports_static_remote_key());
|
||||
assert!(NodeFeatures::known().supports_static_remote_key());
|
||||
assert!(InitFeatures::known().requires_static_remote_key());
|
||||
assert!(NodeFeatures::known().requires_static_remote_key());
|
||||
|
||||
assert!(InitFeatures::known().supports_payment_secret());
|
||||
assert!(NodeFeatures::known().supports_payment_secret());
|
||||
assert!(InvoiceFeatures::known().supports_payment_secret());
|
||||
assert!(InitFeatures::known().requires_payment_secret());
|
||||
assert!(NodeFeatures::known().requires_payment_secret());
|
||||
assert!(InvoiceFeatures::known().requires_payment_secret());
|
||||
|
||||
assert!(InitFeatures::known().supports_basic_mpp());
|
||||
assert!(NodeFeatures::known().supports_basic_mpp());
|
||||
assert!(InvoiceFeatures::known().supports_basic_mpp());
|
||||
assert!(!InitFeatures::known().requires_basic_mpp());
|
||||
assert!(!NodeFeatures::known().requires_basic_mpp());
|
||||
assert!(!InvoiceFeatures::known().requires_basic_mpp());
|
||||
|
||||
assert!(InitFeatures::known().supports_channel_type());
|
||||
assert!(NodeFeatures::known().supports_channel_type());
|
||||
assert!(!InitFeatures::known().requires_channel_type());
|
||||
assert!(!NodeFeatures::known().requires_channel_type());
|
||||
|
||||
assert!(InitFeatures::known().supports_shutdown_anysegwit());
|
||||
assert!(NodeFeatures::known().supports_shutdown_anysegwit());
|
||||
|
||||
assert!(InitFeatures::known().supports_scid_privacy());
|
||||
assert!(NodeFeatures::known().supports_scid_privacy());
|
||||
assert!(ChannelTypeFeatures::known().supports_scid_privacy());
|
||||
assert!(!InitFeatures::known().requires_scid_privacy());
|
||||
assert!(!NodeFeatures::known().requires_scid_privacy());
|
||||
assert!(ChannelTypeFeatures::known().requires_scid_privacy());
|
||||
|
||||
assert!(InitFeatures::known().supports_wumbo());
|
||||
assert!(NodeFeatures::known().supports_wumbo());
|
||||
assert!(!InitFeatures::known().requires_wumbo());
|
||||
assert!(!NodeFeatures::known().requires_wumbo());
|
||||
|
||||
assert!(InitFeatures::known().supports_onion_messages());
|
||||
assert!(NodeFeatures::known().supports_onion_messages());
|
||||
assert!(!InitFeatures::known().requires_onion_messages());
|
||||
assert!(!NodeFeatures::known().requires_onion_messages());
|
||||
|
||||
assert!(InitFeatures::known().supports_zero_conf());
|
||||
assert!(!InitFeatures::known().requires_zero_conf());
|
||||
assert!(NodeFeatures::known().supports_zero_conf());
|
||||
assert!(!NodeFeatures::known().requires_zero_conf());
|
||||
assert!(ChannelTypeFeatures::known().supports_zero_conf());
|
||||
assert!(ChannelTypeFeatures::known().requires_zero_conf());
|
||||
|
||||
let mut init_features = InitFeatures::known();
|
||||
assert!(init_features.initial_routing_sync());
|
||||
init_features = init_features.clear_initial_routing_sync();
|
||||
assert!(!init_features.initial_routing_sync());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sanity_test_unknown_bits() {
|
||||
let features = ChannelFeatures::empty();
|
||||
|
@ -972,7 +743,22 @@ mod tests {
|
|||
|
||||
#[test]
|
||||
fn convert_to_context_with_relevant_flags() {
|
||||
let init_features = InitFeatures::known().clear_upfront_shutdown_script().clear_gossip_queries();
|
||||
let mut init_features = InitFeatures::empty();
|
||||
// Set a bunch of features we use, plus initial_routing_sync_required (which shouldn't get
|
||||
// converted as it's only relevant in an init context).
|
||||
init_features.set_initial_routing_sync_required();
|
||||
init_features.set_data_loss_protect_optional();
|
||||
init_features.set_variable_length_onion_required();
|
||||
init_features.set_static_remote_key_required();
|
||||
init_features.set_payment_secret_required();
|
||||
init_features.set_basic_mpp_optional();
|
||||
init_features.set_wumbo_optional();
|
||||
init_features.set_shutdown_any_segwit_optional();
|
||||
init_features.set_onion_messages_optional();
|
||||
init_features.set_channel_type_optional();
|
||||
init_features.set_scid_privacy_optional();
|
||||
init_features.set_zero_conf_optional();
|
||||
|
||||
assert!(init_features.initial_routing_sync());
|
||||
assert!(!init_features.supports_upfront_shutdown_script());
|
||||
assert!(!init_features.supports_gossip_queries());
|
||||
|
@ -1010,8 +796,9 @@ mod tests {
|
|||
#[test]
|
||||
fn convert_to_context_with_unknown_flags() {
|
||||
// Ensure the `from` context has fewer known feature bytes than the `to` context.
|
||||
assert!(InvoiceFeatures::known().flags.len() < NodeFeatures::known().flags.len());
|
||||
let mut invoice_features = InvoiceFeatures::known();
|
||||
assert!(<sealed::InvoiceContext as sealed::Context>::KNOWN_FEATURE_MASK.len() <
|
||||
<sealed::NodeContext as sealed::Context>::KNOWN_FEATURE_MASK.len());
|
||||
let mut invoice_features = InvoiceFeatures::empty();
|
||||
invoice_features.set_unknown_feature_optional();
|
||||
assert!(invoice_features.supports_unknown_bits());
|
||||
let node_features: NodeFeatures = invoice_features.to_context();
|
||||
|
|
|
@ -14,10 +14,10 @@ use chain::{BestBlock, Confirm, Listen, Watch, keysinterface::KeysInterface};
|
|||
use chain::channelmonitor::ChannelMonitor;
|
||||
use chain::transaction::OutPoint;
|
||||
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
|
||||
use ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, PaymentId, MIN_CLTV_EXPIRY_DELTA};
|
||||
use ln::channelmanager::{self, ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, PaymentId, MIN_CLTV_EXPIRY_DELTA};
|
||||
use routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate};
|
||||
use routing::router::{PaymentParameters, Route, get_route};
|
||||
use ln::features::{InitFeatures, InvoiceFeatures};
|
||||
use ln::features::InitFeatures;
|
||||
use ln::msgs;
|
||||
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
|
||||
use util::enforcing_trait_impls::EnforcingSigner;
|
||||
|
@ -686,7 +686,7 @@ pub fn open_zero_conf_channel<'a, 'b, 'c, 'd>(initiator: &'a Node<'b, 'c, 'd>, r
|
|||
initiator.node.create_channel(receiver.node.get_our_node_id(), 100_000, 10_001, 42, initiator_config).unwrap();
|
||||
let open_channel = get_event_msg!(initiator, MessageSendEvent::SendOpenChannel, receiver.node.get_our_node_id());
|
||||
|
||||
receiver.node.handle_open_channel(&initiator.node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
receiver.node.handle_open_channel(&initiator.node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let events = receiver.node.get_and_clear_pending_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match events[0] {
|
||||
|
@ -698,7 +698,7 @@ pub fn open_zero_conf_channel<'a, 'b, 'c, 'd>(initiator: &'a Node<'b, 'c, 'd>, r
|
|||
|
||||
let accept_channel = get_event_msg!(receiver, MessageSendEvent::SendAcceptChannel, initiator.node.get_our_node_id());
|
||||
assert_eq!(accept_channel.minimum_depth, 0);
|
||||
initiator.node.handle_accept_channel(&receiver.node.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
initiator.node.handle_accept_channel(&receiver.node.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
|
||||
let (temporary_channel_id, tx, _) = create_funding_transaction(&initiator, &receiver.node.get_our_node_id(), 100_000, 42);
|
||||
initiator.node.funding_transaction_generated(&temporary_channel_id, &receiver.node.get_our_node_id(), tx.clone()).unwrap();
|
||||
|
@ -1051,7 +1051,7 @@ pub fn close_channel<'a, 'b, 'c>(outbound_node: &Node<'a, 'b, 'c>, inbound_node:
|
|||
let (tx_a, tx_b);
|
||||
|
||||
node_a.close_channel(channel_id, &node_b.get_our_node_id()).unwrap();
|
||||
node_b.handle_shutdown(&node_a.get_our_node_id(), &InitFeatures::known(), &get_event_msg!(struct_a, MessageSendEvent::SendShutdown, node_b.get_our_node_id()));
|
||||
node_b.handle_shutdown(&node_a.get_our_node_id(), &channelmanager::provided_init_features(), &get_event_msg!(struct_a, MessageSendEvent::SendShutdown, node_b.get_our_node_id()));
|
||||
|
||||
let events_1 = node_b.get_and_clear_pending_msg_events();
|
||||
assert!(events_1.len() >= 1);
|
||||
|
@ -1076,7 +1076,7 @@ pub fn close_channel<'a, 'b, 'c>(outbound_node: &Node<'a, 'b, 'c>, inbound_node:
|
|||
})
|
||||
};
|
||||
|
||||
node_a.handle_shutdown(&node_b.get_our_node_id(), &InitFeatures::known(), &shutdown_b);
|
||||
node_a.handle_shutdown(&node_b.get_our_node_id(), &channelmanager::provided_init_features(), &shutdown_b);
|
||||
let (as_update, bs_update) = if close_inbound_first {
|
||||
assert!(node_a.get_and_clear_pending_msg_events().is_empty());
|
||||
node_a.handle_closing_signed(&node_b.get_our_node_id(), &closing_signed_b.unwrap());
|
||||
|
@ -1269,7 +1269,7 @@ macro_rules! get_route {
|
|||
macro_rules! get_route_and_payment_hash {
|
||||
($send_node: expr, $recv_node: expr, $recv_value: expr) => {{
|
||||
let payment_params = $crate::routing::router::PaymentParameters::from_node_id($recv_node.node.get_our_node_id())
|
||||
.with_features($crate::ln::features::InvoiceFeatures::known());
|
||||
.with_features($crate::ln::channelmanager::provided_invoice_features());
|
||||
$crate::get_route_and_payment_hash!($send_node, $recv_node, payment_params, $recv_value, TEST_FINAL_CLTV)
|
||||
}};
|
||||
($send_node: expr, $recv_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => {{
|
||||
|
@ -1853,7 +1853,7 @@ pub const TEST_FINAL_CLTV: u32 = 70;
|
|||
|
||||
pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
|
||||
let payment_params = PaymentParameters::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known());
|
||||
.with_features(channelmanager::provided_invoice_features());
|
||||
let route = get_route!(origin_node, payment_params, recv_value, TEST_FINAL_CLTV).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].len(), expected_route.len());
|
||||
|
@ -1867,7 +1867,7 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
|
|||
|
||||
pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) {
|
||||
let payment_params = PaymentParameters::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known());
|
||||
.with_features(channelmanager::provided_invoice_features());
|
||||
let network_graph = origin_node.network_graph.read_only();
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let seed = [0u8; 32];
|
||||
|
@ -2047,7 +2047,7 @@ pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMon
|
|||
chain_monitor,
|
||||
keys_manager: &chanmon_cfgs[i].keys_manager,
|
||||
node_seed: seed,
|
||||
features: InitFeatures::known(),
|
||||
features: channelmanager::provided_init_features(),
|
||||
network_graph: NetworkGraph::new(chanmon_cfgs[i].chain_source.genesis_hash, &chanmon_cfgs[i].logger),
|
||||
});
|
||||
}
|
||||
|
@ -2382,9 +2382,9 @@ macro_rules! handle_chan_reestablish_msgs {
|
|||
/// pending_htlc_adds includes both the holding cell and in-flight update_add_htlcs, whereas
|
||||
/// for claims/fails they are separated out.
|
||||
pub fn reconnect_nodes<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b: &Node<'a, 'b, 'c>, send_channel_ready: (bool, bool), pending_htlc_adds: (i64, i64), pending_htlc_claims: (usize, usize), pending_htlc_fails: (usize, usize), pending_cell_htlc_claims: (usize, usize), pending_cell_htlc_fails: (usize, usize), pending_raa: (bool, bool)) {
|
||||
node_a.node.peer_connected(&node_b.node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
node_a.node.peer_connected(&node_b.node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(node_a, node_b);
|
||||
node_b.node.peer_connected(&node_a.node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
node_b.node.peer_connected(&node_a.node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(node_b, node_a);
|
||||
|
||||
if send_channel_ready.0 {
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -13,8 +13,7 @@ use chain::channelmonitor::{ANTI_REORG_DELAY, Balance};
|
|||
use chain::transaction::OutPoint;
|
||||
use chain::chaininterface::LowerBoundedFeeEstimator;
|
||||
use ln::channel;
|
||||
use ln::channelmanager::BREAKDOWN_TIMEOUT;
|
||||
use ln::features::InitFeatures;
|
||||
use ln::channelmanager::{self, BREAKDOWN_TIMEOUT};
|
||||
use ln::msgs::ChannelMessageHandler;
|
||||
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider, ClosureReason, HTLCDestination};
|
||||
|
||||
|
@ -49,8 +48,8 @@ fn chanmon_fail_from_stale_commitment() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let (update_a, _, chan_id_2, _) = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (update_a, _, chan_id_2, _) = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1_000_000);
|
||||
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||
|
@ -106,7 +105,7 @@ fn revoked_output_htlc_resolution_timing() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let payment_hash_1 = route_payment(&nodes[1], &[&nodes[0]], 1_000_000).1;
|
||||
|
||||
|
@ -156,7 +155,7 @@ fn chanmon_claim_value_coop_close() {
|
|||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, chan_id, funding_tx) =
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 1_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 1_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
||||
|
||||
|
@ -172,9 +171,9 @@ fn chanmon_claim_value_coop_close() {
|
|||
|
||||
nodes[0].node.close_channel(&chan_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
|
||||
let node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
|
||||
|
@ -257,7 +256,7 @@ fn do_test_claim_value_force_close(prev_commitment_tx: bool) {
|
|||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, chan_id, funding_tx) =
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 1_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 1_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
||||
|
||||
|
@ -594,7 +593,7 @@ fn test_balances_on_local_commitment_htlcs() {
|
|||
|
||||
// Create a single channel with two pending HTLCs from nodes[0] to nodes[1], one which nodes[1]
|
||||
// knows the preimage for, one which it does not.
|
||||
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 10_000_000);
|
||||
|
@ -762,7 +761,7 @@ fn test_no_preimage_inbound_htlc_balances() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
|
||||
// Send two HTLCs, one from A to B, and one from B to A.
|
||||
|
@ -1007,7 +1006,7 @@ fn do_test_revoked_counterparty_commitment_balances(confirm_htlc_spend_first: bo
|
|||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, chan_id, funding_tx) =
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 100_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 100_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
||||
|
||||
|
@ -1251,7 +1250,7 @@ fn test_revoked_counterparty_htlc_tx_balances() {
|
|||
|
||||
// Create some initial channels
|
||||
let (_, _, chan_id, funding_tx) =
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 11_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 11_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
||||
|
||||
|
@ -1455,7 +1454,7 @@ fn test_revoked_counterparty_aggregated_claims() {
|
|||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, chan_id, funding_tx) =
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 100_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 100_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
||||
|
||||
|
|
|
@ -2063,7 +2063,7 @@ mod tests {
|
|||
let sig_2 = get_sig_on!(privkey_2, secp_ctx, String::from("01010101010101010101010101010101"));
|
||||
let sig_3 = get_sig_on!(privkey_3, secp_ctx, String::from("01010101010101010101010101010101"));
|
||||
let sig_4 = get_sig_on!(privkey_4, secp_ctx, String::from("01010101010101010101010101010101"));
|
||||
let mut features = ChannelFeatures::known();
|
||||
let mut features = ChannelFeatures::empty();
|
||||
if unknown_features_bits {
|
||||
features = ChannelFeatures::from_le_bytes(vec![0xFF, 0xFF]);
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ use chain::channelmonitor::{ChannelMonitor, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PER
|
|||
use chain::keysinterface::{KeysInterface, Recipient};
|
||||
use ln::{PaymentHash, PaymentSecret};
|
||||
use ln::channel::EXPIRE_PREV_CONFIG_TICKS;
|
||||
use ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, HTLCForwardInfo, CLTV_FAR_FAR_AWAY, MIN_CLTV_EXPIRY_DELTA, PendingHTLCInfo, PendingHTLCRouting};
|
||||
use ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, HTLCForwardInfo, CLTV_FAR_FAR_AWAY, MIN_CLTV_EXPIRY_DELTA, PendingHTLCInfo, PendingHTLCRouting};
|
||||
use ln::onion_utils;
|
||||
use routing::gossip::{NetworkUpdate, RoutingFees, NodeId};
|
||||
use routing::router::{get_route, PaymentParameters, Route, RouteHint, RouteHintHop};
|
||||
|
@ -270,7 +270,7 @@ fn test_fee_failures() {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[Some(config), Some(config), Some(config)]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let channels = [create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()), create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known())];
|
||||
let channels = [create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()), create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features())];
|
||||
|
||||
// positive case
|
||||
let (route, payment_hash_success, payment_preimage_success, payment_secret_success) = get_route_and_payment_hash!(nodes[0], nodes[2], 40_000);
|
||||
|
@ -322,7 +322,7 @@ fn test_onion_failure() {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[Some(config), Some(config), Some(node_2_cfg)]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let channels = [create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()), create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known())];
|
||||
let channels = [create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()), create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features())];
|
||||
for node in nodes.iter() {
|
||||
*node.keys_manager.override_random_bytes.lock().unwrap() = Some([3; 32]);
|
||||
}
|
||||
|
@ -607,16 +607,16 @@ fn do_test_onion_failure_stale_channel_update(announced_channel: bool) {
|
|||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let other_channel = create_chan_between_nodes(
|
||||
&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known(),
|
||||
&nodes[0], &nodes[1], channelmanager::provided_init_features(), channelmanager::provided_init_features(),
|
||||
);
|
||||
let channel_to_update = if announced_channel {
|
||||
let channel = create_announced_chan_between_nodes(
|
||||
&nodes, 1, 2, InitFeatures::known(), InitFeatures::known(),
|
||||
&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features(),
|
||||
);
|
||||
(channel.2, channel.0.contents.short_channel_id)
|
||||
} else {
|
||||
let channel = create_unannounced_chan_between_nodes_with_value(
|
||||
&nodes, 1, 2, 100000, 10001, InitFeatures::known(), InitFeatures::known(),
|
||||
&nodes, 1, 2, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features(),
|
||||
);
|
||||
(channel.0.channel_id, channel.0.short_channel_id_alias.unwrap())
|
||||
};
|
||||
|
@ -641,7 +641,7 @@ fn do_test_onion_failure_stale_channel_update(announced_channel: bool) {
|
|||
htlc_minimum_msat: None,
|
||||
}])];
|
||||
let payment_params = PaymentParameters::from_node_id(*channel_to_update_counterparty)
|
||||
.with_features(InvoiceFeatures::known())
|
||||
.with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, PAYMENT_AMT, TEST_FINAL_CLTV)
|
||||
};
|
||||
|
@ -802,10 +802,10 @@ fn test_default_to_onion_payload_tlv_format() {
|
|||
let node_chanmgrs = create_node_chanmgrs(5, &node_cfgs, &[None, None, None, None, Some(priv_channels_conf)]);
|
||||
let mut nodes = create_network(5, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 2, 3, InitFeatures::known(), InitFeatures::known());
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 3, 4, 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 2, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_unannounced_chan_between_nodes_with_value(&nodes, 3, 4, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3].node.get_our_node_id());
|
||||
let origin_node = &nodes[0];
|
||||
|
@ -830,7 +830,7 @@ fn test_default_to_onion_payload_tlv_format() {
|
|||
// supports variable length onions, as the `InitFeatures` exchanged in the init message
|
||||
// between the nodes will be used when creating the route. We therefore do not default to
|
||||
// supporting variable length onions for that hop, as the `InitFeatures` in this case are
|
||||
// `InitFeatures::known()`.
|
||||
// `channelmanager::provided_init_features()`.
|
||||
|
||||
let unannounced_chan = &nodes[4].node.list_usable_channels()[0];
|
||||
|
||||
|
@ -897,9 +897,9 @@ fn test_do_not_default_to_onion_payload_tlv_format_when_unsupported() {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 2, 3, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 2, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3].node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::empty());
|
||||
|
@ -961,7 +961,7 @@ macro_rules! get_phantom_route {
|
|||
let phantom_pubkey = PublicKey::from_secret_key(&secp_ctx, &phantom_secret);
|
||||
let phantom_route_hint = $nodes[1].node.get_phantom_route_hints();
|
||||
let payment_params = PaymentParameters::from_node_id(phantom_pubkey)
|
||||
.with_features(InvoiceFeatures::known())
|
||||
.with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(vec![RouteHint(vec![
|
||||
RouteHintHop {
|
||||
src_node_id: $nodes[0].node.get_our_node_id(),
|
||||
|
@ -1003,7 +1003,7 @@ fn test_phantom_onion_hmac_failure() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the route.
|
||||
let recv_value_msat = 10_000;
|
||||
|
@ -1062,7 +1062,7 @@ fn test_phantom_invalid_onion_payload() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the route.
|
||||
let recv_value_msat = 10_000;
|
||||
|
@ -1135,7 +1135,7 @@ fn test_phantom_final_incorrect_cltv_expiry() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the route.
|
||||
let recv_value_msat = 10_000;
|
||||
|
@ -1191,7 +1191,7 @@ fn test_phantom_failure_too_low_cltv() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the route.
|
||||
let recv_value_msat = 10_000;
|
||||
|
@ -1236,7 +1236,7 @@ fn test_phantom_failure_too_low_recv_amt() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the route with a too-low amount.
|
||||
let recv_amt_msat = 10_000;
|
||||
|
@ -1290,7 +1290,7 @@ fn test_phantom_dust_exposure_failure() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, Some(receiver_config)]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the route with an amount exceeding the dust exposure threshold of nodes[1].
|
||||
let (_, payment_hash, payment_secret) = get_payment_preimage_hash!(nodes[1], Some(max_dust_exposure + 1));
|
||||
|
@ -1332,7 +1332,7 @@ fn test_phantom_failure_reject_payment() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let channel = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the route with a too-low amount.
|
||||
let recv_amt_msat = 10_000;
|
||||
|
|
|
@ -16,8 +16,7 @@ use chain::channelmonitor::{ANTI_REORG_DELAY, ChannelMonitor, LATENCY_GRACE_PERI
|
|||
use chain::transaction::OutPoint;
|
||||
use chain::keysinterface::KeysInterface;
|
||||
use ln::channel::EXPIRE_PREV_CONFIG_TICKS;
|
||||
use ln::channelmanager::{BREAKDOWN_TIMEOUT, ChannelManager, ChannelManagerReadArgs, MPP_TIMEOUT_TICKS, MIN_CLTV_EXPIRY_DELTA, PaymentId, PaymentSendFailure};
|
||||
use ln::features::{InitFeatures, InvoiceFeatures};
|
||||
use ln::channelmanager::{self, BREAKDOWN_TIMEOUT, ChannelManager, ChannelManagerReadArgs, MPP_TIMEOUT_TICKS, MIN_CLTV_EXPIRY_DELTA, PaymentId, PaymentSendFailure};
|
||||
use ln::msgs;
|
||||
use ln::msgs::ChannelMessageHandler;
|
||||
use routing::router::{PaymentParameters, get_route};
|
||||
|
@ -43,8 +42,8 @@ fn retry_single_path_payment() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let _chan_0 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 2, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_0 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 2, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
// Rebalance to find a route
|
||||
send_payment(&nodes[2], &vec!(&nodes[1])[..], 3_000_000);
|
||||
|
||||
|
@ -96,10 +95,10 @@ fn mpp_failure() {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_1_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_2_id = create_announced_chan_between_nodes(&nodes, 0, 2, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_3_id = create_announced_chan_between_nodes(&nodes, 1, 3, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_4_id = create_announced_chan_between_nodes(&nodes, 2, 3, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
|
||||
let chan_1_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_2_id = create_announced_chan_between_nodes(&nodes, 0, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_3_id = create_announced_chan_between_nodes(&nodes, 1, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
let chan_4_id = create_announced_chan_between_nodes(&nodes, 2, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.contents.short_channel_id;
|
||||
|
||||
let (mut route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(&nodes[0], nodes[3], 100000);
|
||||
let path = route.paths[0].clone();
|
||||
|
@ -121,10 +120,10 @@ fn mpp_retry() {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (chan_1_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_2_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_3_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 1, 3, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_4_update, _, chan_4_id, _) = create_announced_chan_between_nodes(&nodes, 3, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_1_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (chan_2_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (chan_3_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 1, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (chan_4_update, _, chan_4_id, _) = create_announced_chan_between_nodes(&nodes, 3, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
// Rebalance
|
||||
send_payment(&nodes[3], &vec!(&nodes[2])[..], 1_500_000);
|
||||
|
||||
|
@ -207,10 +206,10 @@ fn do_mpp_receive_timeout(send_partial_mpp: bool) {
|
|||
let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (chan_1_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_2_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_3_update, _, chan_3_id, _) = create_announced_chan_between_nodes(&nodes, 1, 3, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_4_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 2, 3, InitFeatures::known(), InitFeatures::known());
|
||||
let (chan_1_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (chan_2_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 0, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (chan_3_update, _, chan_3_id, _) = create_announced_chan_between_nodes(&nodes, 1, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (chan_4_update, _, _, _) = create_announced_chan_between_nodes(&nodes, 2, 3, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (mut route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[3], 100_000);
|
||||
let path = route.paths[0].clone();
|
||||
|
@ -280,8 +279,8 @@ fn retry_expired_payment() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let _chan_0 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 2, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let _chan_0 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 2, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
// Rebalance to find a route
|
||||
send_payment(&nodes[2], &vec!(&nodes[1])[..], 3_000_000);
|
||||
|
||||
|
@ -335,7 +334,7 @@ fn no_pending_leak_on_initial_send_failure() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
|
||||
|
||||
|
@ -369,8 +368,8 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
let nodes_0_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let (_, _, chan_id_2, _) = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
let (_, _, chan_id_2, _) = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Serialize the ChannelManager prior to sending payments
|
||||
let nodes_0_serialized = nodes[0].node.encode();
|
||||
|
@ -451,12 +450,12 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
assert_eq!(as_broadcasted_txn[0], as_commitment_tx);
|
||||
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
// Now nodes[1] should send a channel reestablish, which nodes[0] will respond to with an
|
||||
// error, as the channel has hit the chain.
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
let as_err = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -492,7 +491,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
// Create a new channel on which to retry the payment before we fail the payment via the
|
||||
// HTLC-Timeout transaction. This avoids ChannelManager timing out the payment due to us
|
||||
// connecting several blocks while creating the channel (implying time has passed).
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
assert_eq!(nodes[0].node.list_usable_channels().len(), 1);
|
||||
|
||||
mine_transaction(&nodes[1], &as_commitment_tx);
|
||||
|
@ -591,7 +590,7 @@ fn do_test_completed_payment_not_retryable_on_reload(use_dust: bool) {
|
|||
// Ignore the announcement_signatures messages
|
||||
nodes[0].node.get_and_clear_pending_msg_events();
|
||||
nodes[1].node.get_and_clear_pending_msg_events();
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
// Serialize the ChannelManager prior to sending payments
|
||||
let mut nodes_0_serialized = nodes[0].node.encode();
|
||||
|
@ -665,12 +664,12 @@ fn do_test_completed_payment_not_retryable_on_reload(use_dust: bool) {
|
|||
assert!(nodes[0].node.has_pending_payments());
|
||||
assert_eq!(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0).len(), 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
// Now nodes[1] should send a channel reestablish, which nodes[0] will respond to with an
|
||||
// error, as the channel has hit the chain.
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
let as_err = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
@ -800,7 +799,7 @@ fn do_test_dup_htlc_onchain_fails_on_reload(persist_manager_post_event: bool, co
|
|||
let nodes_0_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Route a payment, but force-close the channel before the HTLC fulfill message arrives at
|
||||
// nodes[0].
|
||||
|
@ -972,7 +971,7 @@ fn test_fulfill_restart_failure() {
|
|||
let nodes_1_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 100_000);
|
||||
|
||||
// The simplest way to get a failure after a fulfill is to reload nodes[1] from a state
|
||||
|
@ -1041,14 +1040,14 @@ fn get_ldk_payment_preimage() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let amt_msat = 60_000;
|
||||
let expiry_secs = 60 * 60;
|
||||
let (payment_hash, payment_secret) = nodes[1].node.create_inbound_payment(Some(amt_msat), expiry_secs).unwrap();
|
||||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known());
|
||||
.with_features(channelmanager::provided_invoice_features());
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
|
@ -1074,8 +1073,8 @@ fn sent_probe_is_probe_of_sending_node() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// First check we refuse to build a single-hop probe
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(&nodes[0], nodes[1], 100_000);
|
||||
|
@ -1104,8 +1103,8 @@ fn successful_probe_yields_event() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(&nodes[0], nodes[2], 100_000);
|
||||
|
||||
|
@ -1158,8 +1157,8 @@ fn failed_probe_yields_event() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 100000, 90000000, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 100000, 90000000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id());
|
||||
|
||||
|
@ -1205,8 +1204,8 @@ fn onchain_failed_probe_yields_event() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id());
|
||||
|
||||
|
|
|
@ -213,9 +213,22 @@ impl ChannelMessageHandler for ErroringMessageHandler {
|
|||
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
|
||||
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
|
||||
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
|
||||
// Use our known channel feature set as peers may otherwise not be willing to talk to us at
|
||||
// all.
|
||||
InitFeatures::known_channel_features()
|
||||
// Set a number of features which various nodes may require to talk to us. It's totally
|
||||
// reasonable to indicate we "support" all kinds of channel features...we just reject all
|
||||
// channels.
|
||||
let mut features = InitFeatures::empty();
|
||||
features.set_data_loss_protect_optional();
|
||||
features.set_upfront_shutdown_script_optional();
|
||||
features.set_variable_length_onion_optional();
|
||||
features.set_static_remote_key_optional();
|
||||
features.set_payment_secret_optional();
|
||||
features.set_basic_mpp_optional();
|
||||
features.set_wumbo_optional();
|
||||
features.set_shutdown_any_segwit_optional();
|
||||
features.set_channel_type_optional();
|
||||
features.set_scid_privacy_optional();
|
||||
features.set_zero_conf_optional();
|
||||
features
|
||||
}
|
||||
}
|
||||
impl Deref for ErroringMessageHandler {
|
||||
|
|
|
@ -14,10 +14,10 @@
|
|||
use chain::{ChannelMonitorUpdateErr, Watch};
|
||||
use chain::channelmonitor::ChannelMonitor;
|
||||
use chain::keysinterface::{Recipient, KeysInterface};
|
||||
use ln::channelmanager::{ChannelManager, ChannelManagerReadArgs, MIN_CLTV_EXPIRY_DELTA};
|
||||
use ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs, MIN_CLTV_EXPIRY_DELTA};
|
||||
use routing::gossip::RoutingFees;
|
||||
use routing::router::{PaymentParameters, RouteHint, RouteHintHop};
|
||||
use ln::features::{InitFeatures, InvoiceFeatures, ChannelTypeFeatures};
|
||||
use ln::features::ChannelTypeFeatures;
|
||||
use ln::msgs;
|
||||
use ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, ChannelUpdate, ErrorAction};
|
||||
use ln::wire::Encode;
|
||||
|
@ -54,8 +54,8 @@ fn test_priv_forwarding_rejection() {
|
|||
let nodes_1_deserialized: ChannelManager<EnforcingSigner, &test_utils::TestChainMonitor, &test_utils::TestBroadcaster, &test_utils::TestKeysInterface, &test_utils::TestFeeEstimator, &test_utils::TestLogger>;
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan_id_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let chan_id_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known()).0.channel_id;
|
||||
let chan_id_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
let chan_id_2 = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0.channel_id;
|
||||
|
||||
// We should always be able to forward through nodes[1] as long as its out through a public
|
||||
// channel:
|
||||
|
@ -73,7 +73,7 @@ fn test_priv_forwarding_rejection() {
|
|||
}]);
|
||||
let last_hops = vec![route_hint];
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known())
|
||||
.with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(last_hops);
|
||||
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 10_000, TEST_FINAL_CLTV);
|
||||
|
||||
|
@ -142,8 +142,8 @@ fn test_priv_forwarding_rejection() {
|
|||
check_added_monitors!(nodes[1], 2);
|
||||
nodes[1].node = &nodes_1_deserialized;
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let as_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_reestablish);
|
||||
|
@ -151,8 +151,8 @@ fn test_priv_forwarding_rejection() {
|
|||
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
|
||||
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[2].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
nodes[2].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let bs_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[2]).pop().unwrap();
|
||||
let cs_reestablish = get_chan_reestablish_msgs!(nodes[2], nodes[1]).pop().unwrap();
|
||||
nodes[2].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
|
@ -183,7 +183,7 @@ fn do_test_1_conf_open(connect_style: ConnectStyle) {
|
|||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
*nodes[0].connect_style.borrow_mut() = connect_style;
|
||||
|
||||
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001, InitFeatures::known(), InitFeatures::known());
|
||||
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
mine_transaction(&nodes[1], &tx);
|
||||
nodes[0].node.handle_channel_ready(&nodes[1].node.get_our_node_id(), &get_event_msg!(nodes[1], MessageSendEvent::SendChannelReady, nodes[0].node.get_our_node_id()));
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -258,8 +258,8 @@ fn test_routed_scid_alias() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, Some(no_announce_cfg), None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let mut as_channel_ready = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known()).0;
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
let mut as_channel_ready = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features()).0;
|
||||
|
||||
let last_hop = nodes[2].node.list_usable_channels();
|
||||
let hop_hints = vec![RouteHint(vec![RouteHintHop {
|
||||
|
@ -274,7 +274,7 @@ fn test_routed_scid_alias() {
|
|||
htlc_minimum_msat: None,
|
||||
}])];
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known())
|
||||
.with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000, 42);
|
||||
assert_eq!(route.paths[0][1].short_channel_id, last_hop[0].inbound_scid_alias.unwrap());
|
||||
|
@ -317,7 +317,7 @@ fn test_scid_privacy_on_pub_channel() {
|
|||
open_channel.channel_type.as_mut().unwrap().set_scid_privacy_required();
|
||||
assert_eq!(open_channel.channel_flags & 1, 1); // The `announce_channel` bit is set.
|
||||
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let err = get_err_msg!(nodes[1], nodes[0].node.get_our_node_id());
|
||||
assert_eq!(err.data, "SCID Alias/Privacy Channel Type cannot be set on a public channel");
|
||||
}
|
||||
|
@ -350,8 +350,8 @@ fn test_scid_privacy_negotiation() {
|
|||
|
||||
let second_open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
|
||||
assert!(!second_open_channel.channel_type.as_ref().unwrap().supports_scid_privacy());
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &second_open_channel);
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id()));
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &second_open_channel);
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), channelmanager::provided_init_features(), &get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id()));
|
||||
|
||||
let events = nodes[0].node.get_and_clear_pending_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -375,7 +375,7 @@ fn test_inbound_scid_privacy() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, Some(accept_forward_cfg), None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let mut no_announce_cfg = test_default_channel_config();
|
||||
no_announce_cfg.channel_handshake_config.announced_channel = false;
|
||||
|
@ -385,9 +385,9 @@ fn test_inbound_scid_privacy() {
|
|||
|
||||
assert!(open_channel.channel_type.as_ref().unwrap().requires_scid_privacy());
|
||||
|
||||
nodes[2].node.handle_open_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[2].node.handle_open_channel(&nodes[1].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let accept_channel = get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_accept_channel(&nodes[2].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
nodes[1].node.handle_accept_channel(&nodes[2].node.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
|
||||
let (temporary_channel_id, tx, _) = create_funding_transaction(&nodes[1], &nodes[2].node.get_our_node_id(), 100_000, 42);
|
||||
nodes[1].node.funding_transaction_generated(&temporary_channel_id, &nodes[2].node.get_our_node_id(), tx.clone()).unwrap();
|
||||
|
@ -427,7 +427,7 @@ fn test_inbound_scid_privacy() {
|
|||
htlc_minimum_msat: None,
|
||||
}])];
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known())
|
||||
.with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(hop_hints.clone());
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000, 42);
|
||||
assert_eq!(route.paths[0][1].short_channel_id, last_hop[0].inbound_scid_alias.unwrap());
|
||||
|
@ -442,7 +442,7 @@ fn test_inbound_scid_privacy() {
|
|||
hop_hints[0].0[0].short_channel_id = last_hop[0].short_channel_id.unwrap();
|
||||
|
||||
let payment_params_2 = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known())
|
||||
.with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
let (route_2, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params_2, 100_000, 42);
|
||||
assert_eq!(route_2.paths[0][1].short_channel_id, last_hop[0].short_channel_id.unwrap());
|
||||
|
@ -477,8 +477,8 @@ fn test_scid_alias_returned() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, Some(accept_forward_cfg), None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 10_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan = create_unannounced_chan_between_nodes_with_value(&nodes, 1, 2, 10_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let last_hop = nodes[2].node.list_usable_channels();
|
||||
let mut hop_hints = vec![RouteHint(vec![RouteHintHop {
|
||||
|
@ -493,7 +493,7 @@ fn test_scid_alias_returned() {
|
|||
htlc_minimum_msat: None,
|
||||
}])];
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id())
|
||||
.with_features(InvoiceFeatures::known())
|
||||
.with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
let (mut route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 10_000, 42);
|
||||
assert_eq!(route.paths[0][1].short_channel_id, nodes[2].node.list_usable_channels()[0].inbound_scid_alias.unwrap());
|
||||
|
@ -600,13 +600,13 @@ fn test_0conf_channel_with_async_monitor() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, Some(chan_config), None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
chan_config.channel_handshake_config.announced_channel = false;
|
||||
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, Some(chan_config)).unwrap();
|
||||
let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let events = nodes[1].node.get_and_clear_pending_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match events[0] {
|
||||
|
@ -618,7 +618,7 @@ fn test_0conf_channel_with_async_monitor() {
|
|||
|
||||
let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
|
||||
assert_eq!(accept_channel.minimum_depth, 0);
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
|
||||
let (temporary_channel_id, tx, funding_output) = create_funding_transaction(&nodes[0], &nodes[1].node.get_our_node_id(), 100000, 42);
|
||||
nodes[0].node.funding_transaction_generated(&temporary_channel_id, &nodes[1].node.get_our_node_id(), tx.clone()).unwrap();
|
||||
|
@ -876,7 +876,7 @@ fn test_zero_conf_accept_reject() {
|
|||
|
||||
open_channel_msg.channel_type = Some(channel_type_features.clone());
|
||||
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel_msg);
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel_msg);
|
||||
|
||||
let msg_events = nodes[1].node.get_and_clear_pending_msg_events();
|
||||
match msg_events[0] {
|
||||
|
@ -904,7 +904,7 @@ fn test_zero_conf_accept_reject() {
|
|||
|
||||
open_channel_msg.channel_type = Some(channel_type_features.clone());
|
||||
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(),
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(),
|
||||
&open_channel_msg);
|
||||
|
||||
// Assert that `nodes[1]` has no `MessageSendEvent::SendAcceptChannel` in the `msg_events`.
|
||||
|
@ -937,7 +937,7 @@ fn test_zero_conf_accept_reject() {
|
|||
|
||||
open_channel_msg.channel_type = Some(channel_type_features);
|
||||
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(),
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(),
|
||||
&open_channel_msg);
|
||||
|
||||
let events = nodes[1].node.get_and_clear_pending_events();
|
||||
|
@ -976,7 +976,7 @@ fn test_connect_before_funding() {
|
|||
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100_000, 10_001, 42, None).unwrap();
|
||||
let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let events = nodes[1].node.get_and_clear_pending_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match events[0] {
|
||||
|
@ -988,7 +988,7 @@ fn test_connect_before_funding() {
|
|||
|
||||
let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
|
||||
assert_eq!(accept_channel.minimum_depth, 0);
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), channelmanager::provided_init_features(), &accept_channel);
|
||||
|
||||
let events = nodes[0].node.get_and_clear_pending_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
|
|
@ -12,8 +12,7 @@
|
|||
use chain::channelmonitor::{ANTI_REORG_DELAY, ChannelMonitor};
|
||||
use chain::transaction::OutPoint;
|
||||
use chain::{Confirm, Watch};
|
||||
use ln::channelmanager::{ChannelManager, ChannelManagerReadArgs};
|
||||
use ln::features::InitFeatures;
|
||||
use ln::channelmanager::{self, ChannelManager, ChannelManagerReadArgs};
|
||||
use ln::msgs::ChannelMessageHandler;
|
||||
use util::enforcing_trait_impls::EnforcingSigner;
|
||||
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider, ClosureReason, HTLCDestination};
|
||||
|
@ -54,8 +53,8 @@ fn do_test_onchain_htlc_reorg(local_commitment: bool, claim: bool) {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Make sure all nodes are at the same starting height
|
||||
connect_blocks(&nodes[0], 2*CHAN_CONFIRM_DEPTH + 1 - nodes[0].best_block_info().1);
|
||||
|
@ -199,7 +198,7 @@ fn test_counterparty_revoked_reorg() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 500_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
// Get the initial commitment transaction for broadcast, before any HTLCs are added at all.
|
||||
let revoked_local_txn = get_local_commitment_txn!(nodes[0], chan.2);
|
||||
|
@ -272,7 +271,7 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
|
|||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
*nodes[0].connect_style.borrow_mut() = connect_style;
|
||||
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let channel_state = nodes[0].node.channel_state.lock().unwrap();
|
||||
assert_eq!(channel_state.by_id.len(), 1);
|
||||
|
@ -379,7 +378,7 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
|
|||
nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().clear();
|
||||
|
||||
// Now check that we can create a new channel
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
send_payment(&nodes[0], &[&nodes[1]], 8000000);
|
||||
}
|
||||
|
||||
|
@ -432,7 +431,7 @@ fn test_set_outpoints_partial_claiming() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[1], &[&nodes[0]], 3_000_000);
|
||||
let (payment_preimage_2, payment_hash_2, _) = route_payment(&nodes[1], &[&nodes[0]], 3_000_000);
|
||||
|
||||
|
@ -537,7 +536,7 @@ fn do_test_to_remote_after_local_detection(style: ConnectStyle) {
|
|||
*nodes[1].connect_style.borrow_mut() = style;
|
||||
|
||||
let (_, _, chan_id, funding_tx) =
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 100_000_000, InitFeatures::known(), InitFeatures::known());
|
||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 100_000_000, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let funding_outpoint = OutPoint { txid: funding_tx.txid(), index: 0 };
|
||||
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ use bitcoin::hash_types::{WPubkeyHash, WScriptHash};
|
|||
use bitcoin::secp256k1::PublicKey;
|
||||
use bitcoin::util::address::WitnessVersion;
|
||||
|
||||
use ln::channelmanager;
|
||||
use ln::features::InitFeatures;
|
||||
use ln::msgs::DecodeError;
|
||||
use util::ser::{Readable, Writeable, Writer};
|
||||
|
@ -134,7 +135,7 @@ impl TryFrom<Script> for ShutdownScript {
|
|||
type Error = InvalidShutdownScript;
|
||||
|
||||
fn try_from(script: Script) -> Result<Self, Self::Error> {
|
||||
Self::try_from((script, &InitFeatures::known()))
|
||||
Self::try_from((script, &channelmanager::provided_init_features()))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -199,6 +200,12 @@ mod shutdown_script_tests {
|
|||
.into_script()
|
||||
}
|
||||
|
||||
fn any_segwit_features() -> InitFeatures {
|
||||
let mut features = InitFeatures::empty();
|
||||
features.set_shutdown_any_segwit_optional();
|
||||
features
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generates_p2wpkh_from_pubkey() {
|
||||
let pubkey = pubkey();
|
||||
|
@ -206,8 +213,8 @@ mod shutdown_script_tests {
|
|||
let p2wpkh_script = Script::new_v0_p2wpkh(&pubkey_hash);
|
||||
|
||||
let shutdown_script = ShutdownScript::new_p2wpkh_from_pubkey(pubkey.inner);
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::known()));
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::known().clear_shutdown_anysegwit()));
|
||||
assert!(shutdown_script.is_compatible(&any_segwit_features()));
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::empty()));
|
||||
assert_eq!(shutdown_script.into_inner(), p2wpkh_script);
|
||||
}
|
||||
|
||||
|
@ -217,8 +224,8 @@ mod shutdown_script_tests {
|
|||
let p2wpkh_script = Script::new_v0_p2wpkh(&pubkey_hash);
|
||||
|
||||
let shutdown_script = ShutdownScript::new_p2wpkh(&pubkey_hash);
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::known()));
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::known().clear_shutdown_anysegwit()));
|
||||
assert!(shutdown_script.is_compatible(&any_segwit_features()));
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::empty()));
|
||||
assert_eq!(shutdown_script.into_inner(), p2wpkh_script);
|
||||
assert!(ShutdownScript::try_from(p2wpkh_script).is_ok());
|
||||
}
|
||||
|
@ -229,8 +236,8 @@ mod shutdown_script_tests {
|
|||
let p2wsh_script = Script::new_v0_p2wsh(&script_hash);
|
||||
|
||||
let shutdown_script = ShutdownScript::new_p2wsh(&script_hash);
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::known()));
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::known().clear_shutdown_anysegwit()));
|
||||
assert!(shutdown_script.is_compatible(&any_segwit_features()));
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::empty()));
|
||||
assert_eq!(shutdown_script.into_inner(), p2wsh_script);
|
||||
assert!(ShutdownScript::try_from(p2wsh_script).is_ok());
|
||||
}
|
||||
|
@ -239,8 +246,8 @@ mod shutdown_script_tests {
|
|||
fn generates_segwit_from_non_v0_witness_program() {
|
||||
let witness_program = Script::new_witness_program(WitnessVersion::V16, &[0; 40]);
|
||||
let shutdown_script = ShutdownScript::new_witness_program(WitnessVersion::V16, &[0; 40]).unwrap();
|
||||
assert!(shutdown_script.is_compatible(&InitFeatures::known()));
|
||||
assert!(!shutdown_script.is_compatible(&InitFeatures::known().clear_shutdown_anysegwit()));
|
||||
assert!(shutdown_script.is_compatible(&any_segwit_features()));
|
||||
assert!(!shutdown_script.is_compatible(&InitFeatures::empty()));
|
||||
assert_eq!(shutdown_script.into_inner(), witness_program);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,9 +11,8 @@
|
|||
|
||||
use chain::keysinterface::KeysInterface;
|
||||
use chain::transaction::OutPoint;
|
||||
use ln::channelmanager::PaymentSendFailure;
|
||||
use ln::channelmanager::{self, PaymentSendFailure};
|
||||
use routing::router::{PaymentParameters, get_route};
|
||||
use ln::features::{InitFeatures, InvoiceFeatures};
|
||||
use ln::msgs;
|
||||
use ln::msgs::{ChannelMessageHandler, ErrorAction};
|
||||
use ln::script::ShutdownScript;
|
||||
|
@ -42,15 +41,15 @@ fn pre_funding_lock_shutdown_test() {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 8000000, 0, InitFeatures::known(), InitFeatures::known());
|
||||
let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 8000000, 0, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
mine_transaction(&nodes[0], &tx);
|
||||
mine_transaction(&nodes[1], &tx);
|
||||
|
||||
nodes[0].node.close_channel(&OutPoint { txid: tx.txid(), index: 0 }.to_channel_id(), &nodes[1].node.get_our_node_id()).unwrap();
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
|
||||
let node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
|
||||
|
@ -74,8 +73,8 @@ fn updates_shutdown_wait() {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let logger = test_utils::TestLogger::new();
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
|
@ -85,18 +84,18 @@ fn updates_shutdown_wait() {
|
|||
|
||||
nodes[0].node.close_channel(&chan_1.2, &nodes[1].node.get_our_node_id()).unwrap();
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
let (_, payment_hash, payment_secret) = get_payment_preimage_hash!(nodes[0]);
|
||||
|
||||
let payment_params_1 = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
|
||||
let payment_params_1 = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id()).with_features(channelmanager::provided_invoice_features());
|
||||
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, &nodes[0].network_graph.read_only(), None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let payment_params_2 = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known());
|
||||
let payment_params_2 = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id()).with_features(channelmanager::provided_invoice_features());
|
||||
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, &nodes[1].network_graph.read_only(), None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
||||
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
||||
|
@ -155,8 +154,8 @@ fn htlc_fail_async_shutdown() {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 100000);
|
||||
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
|
||||
|
@ -170,13 +169,13 @@ fn htlc_fail_async_shutdown() {
|
|||
|
||||
nodes[1].node.close_channel(&chan_1.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
|
||||
nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &updates.commitment_signed);
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
commitment_signed_dance!(nodes[1], nodes[0], (), false, true, false);
|
||||
|
||||
let updates_2 = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||
|
@ -229,27 +228,27 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
|
||||
|
||||
nodes[1].node.close_channel(&chan_1.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
if recv_count > 0 {
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
if recv_count > 1 {
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
}
|
||||
}
|
||||
|
||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let node_0_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let node_1_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &node_0_reestablish);
|
||||
|
@ -259,15 +258,15 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &node_1_reestablish);
|
||||
let node_0_2nd_shutdown = if recv_count > 0 {
|
||||
let node_0_2nd_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_2nd_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_2nd_shutdown);
|
||||
node_0_2nd_shutdown
|
||||
} else {
|
||||
let node_0_chan_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
|
||||
assert_eq!(node_0_chan_update.contents.flags & 2, 0); // "disabled" flag must not be set as we just reconnected.
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_2nd_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_2nd_shutdown);
|
||||
get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id())
|
||||
};
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_2nd_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_2nd_shutdown);
|
||||
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
@ -309,9 +308,9 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
let node_1_2nd_reestablish = get_chan_reestablish_msgs!(nodes[1], nodes[0]).pop().unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None }).unwrap();
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: channelmanager::provided_init_features(), remote_network_address: None }).unwrap();
|
||||
if recv_count == 0 {
|
||||
// If all closing_signeds weren't delivered we can just resume where we left off...
|
||||
let node_0_2nd_reestablish = get_chan_reestablish_msgs!(nodes[0], nodes[1]).pop().unwrap();
|
||||
|
@ -340,10 +339,10 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
let node_1_3rd_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
assert!(node_1_3rd_shutdown == node_1_2nd_shutdown);
|
||||
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_3rd_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_3rd_shutdown);
|
||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_3rd_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_3rd_shutdown);
|
||||
|
||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_2nd_closing_signed);
|
||||
let node_1_closing_signed = get_event_msg!(nodes[1], MessageSendEvent::SendClosingSigned, nodes[0].node.get_our_node_id());
|
||||
|
@ -419,7 +418,7 @@ fn test_upfront_shutdown_script() {
|
|||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
// We test that in case of peer committing upfront to a script, if it changes at closing, we refuse to sign
|
||||
let flags = InitFeatures::known();
|
||||
let flags = channelmanager::provided_init_features();
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 2, 1000000, 1000000, flags.clone(), flags.clone());
|
||||
nodes[0].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[2].node.get_our_node_id()).unwrap();
|
||||
let node_0_orig_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[2].node.get_our_node_id());
|
||||
|
@ -427,11 +426,11 @@ fn test_upfront_shutdown_script() {
|
|||
node_0_shutdown.scriptpubkey = Builder::new().push_opcode(opcodes::all::OP_RETURN).into_script().to_p2sh();
|
||||
// Test we enforce upfront_scriptpbukey if by providing a different one at closing that we warn
|
||||
// the peer and ignore the message.
|
||||
nodes[2].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[2].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
assert!(regex::Regex::new(r"Got shutdown request with a scriptpubkey \([A-Fa-f0-9]+\) which did not match their previous scriptpubkey.")
|
||||
.unwrap().is_match(&check_warn_msg!(nodes[2], nodes[0].node.get_our_node_id(), chan.2)));
|
||||
// This allows nodes[2] to retry the shutdown message, which should get a response:
|
||||
nodes[2].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_orig_shutdown);
|
||||
nodes[2].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_orig_shutdown);
|
||||
get_event_msg!(nodes[2], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
|
||||
// We test that in case of peer committing upfront to a script, if it doesn't change at closing, we sign
|
||||
|
@ -439,7 +438,7 @@ fn test_upfront_shutdown_script() {
|
|||
nodes[0].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[2].node.get_our_node_id()).unwrap();
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[2].node.get_our_node_id());
|
||||
// We test that in case of peer committing upfront to a script, if it oesn't change at closing, we sign
|
||||
nodes[2].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[2].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let events = nodes[2].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match events[0] {
|
||||
|
@ -448,11 +447,11 @@ fn test_upfront_shutdown_script() {
|
|||
}
|
||||
|
||||
// We test that if case of peer non-signaling we don't enforce committed script at channel opening
|
||||
let flags_no = InitFeatures::known().clear_upfront_shutdown_script();
|
||||
let flags_no = channelmanager::provided_init_features().clear_upfront_shutdown_script();
|
||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, flags_no, flags.clone());
|
||||
nodes[0].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[1].node.get_our_node_id()).unwrap();
|
||||
let node_1_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
let events = nodes[1].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -467,7 +466,7 @@ fn test_upfront_shutdown_script() {
|
|||
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[0].node.get_our_node_id()).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
let node_0_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match events[0] {
|
||||
|
@ -481,7 +480,7 @@ fn test_upfront_shutdown_script() {
|
|||
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[0].node.get_our_node_id()).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
let node_0_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 2);
|
||||
match events[0] {
|
||||
|
@ -502,7 +501,7 @@ fn test_unsupported_anysegwit_upfront_shutdown_script() {
|
|||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
// Use a non-v0 segwit script supported by option_shutdown_anysegwit
|
||||
let node_features = InitFeatures::known().clear_shutdown_anysegwit();
|
||||
let node_features = channelmanager::provided_init_features().clear_shutdown_anysegwit();
|
||||
let anysegwit_shutdown_script = Builder::new()
|
||||
.push_int(16)
|
||||
.push_slice(&[0, 40])
|
||||
|
@ -527,7 +526,7 @@ fn test_unsupported_anysegwit_upfront_shutdown_script() {
|
|||
// Check script when handling an accept_channel message
|
||||
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, None).unwrap();
|
||||
let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
|
||||
accept_channel.shutdown_scriptpubkey = Present(anysegwit_shutdown_script.clone());
|
||||
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), node_features, &accept_channel);
|
||||
|
@ -558,7 +557,7 @@ fn test_invalid_upfront_shutdown_script() {
|
|||
open_channel.shutdown_scriptpubkey = Present(Builder::new().push_int(0)
|
||||
.push_slice(&[0, 0])
|
||||
.into_script());
|
||||
nodes[0].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
|
||||
nodes[0].node.handle_open_channel(&nodes[0].node.get_our_node_id(), channelmanager::provided_init_features(), &open_channel);
|
||||
|
||||
let events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -583,7 +582,7 @@ fn test_segwit_v0_shutdown_script() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[0].node.get_our_node_id()).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
|
@ -592,7 +591,7 @@ fn test_segwit_v0_shutdown_script() {
|
|||
node_0_shutdown.scriptpubkey = Builder::new().push_int(0)
|
||||
.push_slice(&[0; 20])
|
||||
.into_script();
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
|
||||
let events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 2);
|
||||
|
@ -618,7 +617,7 @@ fn test_anysegwit_shutdown_script() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[0].node.get_our_node_id()).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
|
@ -627,7 +626,7 @@ fn test_anysegwit_shutdown_script() {
|
|||
node_0_shutdown.scriptpubkey = Builder::new().push_int(16)
|
||||
.push_slice(&[0, 0])
|
||||
.into_script();
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
|
||||
let events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 2);
|
||||
|
@ -650,8 +649,8 @@ fn test_unsupported_anysegwit_shutdown_script() {
|
|||
let user_cfgs = [None, Some(config), None];
|
||||
let chanmon_cfgs = create_chanmon_cfgs(3);
|
||||
let mut node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
|
||||
node_cfgs[0].features = InitFeatures::known().clear_shutdown_anysegwit();
|
||||
node_cfgs[1].features = InitFeatures::known().clear_shutdown_anysegwit();
|
||||
node_cfgs[0].features = channelmanager::provided_init_features().clear_shutdown_anysegwit();
|
||||
node_cfgs[1].features = channelmanager::provided_init_features().clear_shutdown_anysegwit();
|
||||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
|
@ -695,7 +694,7 @@ fn test_invalid_shutdown_script() {
|
|||
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
|
||||
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
nodes[1].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[0].node.get_our_node_id()).unwrap();
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
|
@ -704,7 +703,7 @@ fn test_invalid_shutdown_script() {
|
|||
node_0_shutdown.scriptpubkey = Builder::new().push_int(0)
|
||||
.push_slice(&[0, 0])
|
||||
.into_script();
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
|
||||
assert_eq!(&check_warn_msg!(nodes[0], nodes[1].node.get_our_node_id(), chan.2),
|
||||
"Got a nonstandard scriptpubkey (00020000) from remote peer");
|
||||
|
@ -730,15 +729,15 @@ fn do_test_closing_signed_reinit_timeout(timeout_step: TimeoutStep) {
|
|||
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
|
||||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||
let chan_id = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2;
|
||||
|
||||
send_payment(&nodes[0], &[&nodes[1]], 8_000_000);
|
||||
|
||||
nodes[0].node.close_channel(&chan_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
|
||||
{
|
||||
// Now we set nodes[1] to require a relatively high feerate for closing. This should result
|
||||
|
@ -826,7 +825,7 @@ fn do_simple_legacy_shutdown_test(high_initiator_fee: bool) {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
|
||||
if high_initiator_fee {
|
||||
// If high_initiator_fee is set, set nodes[0]'s feerate significantly higher. This
|
||||
|
@ -837,9 +836,9 @@ fn do_simple_legacy_shutdown_test(high_initiator_fee: bool) {
|
|||
|
||||
nodes[0].node.close_channel(&OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id(), &nodes[1].node.get_our_node_id()).unwrap();
|
||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
|
||||
let mut node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
|
||||
node_0_closing_signed.fee_range = None;
|
||||
|
@ -874,7 +873,7 @@ fn simple_target_feerate_shutdown() {
|
|||
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
|
||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
|
||||
let chan_id = OutPoint { txid: chan.3.txid(), index: 0 }.to_channel_id();
|
||||
|
||||
nodes[0].node.close_channel_with_target_feerate(&chan_id, &nodes[1].node.get_our_node_id(), 253 * 10).unwrap();
|
||||
|
@ -882,8 +881,8 @@ fn simple_target_feerate_shutdown() {
|
|||
nodes[1].node.close_channel_with_target_feerate(&chan_id, &nodes[0].node.get_our_node_id(), 253 * 5).unwrap();
|
||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &InitFeatures::known(), &node_0_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_shutdown);
|
||||
nodes[1].node.handle_shutdown(&nodes[0].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_0_shutdown);
|
||||
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &channelmanager::provided_init_features(), &node_1_shutdown);
|
||||
|
||||
let node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
|
||||
|
|
|
@ -48,7 +48,7 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
|
|||
}
|
||||
for idx in 0..num_messengers - 1 {
|
||||
let i = idx as usize;
|
||||
let mut features = InitFeatures::known();
|
||||
let mut features = InitFeatures::empty();
|
||||
features.set_onion_messages_optional();
|
||||
let init_msg = msgs::Init { features, remote_network_address: None };
|
||||
nodes[i].messenger.peer_connected(&nodes[i + 1].get_node_pk(), &init_msg.clone()).unwrap();
|
||||
|
|
|
@ -1869,9 +1869,10 @@ impl ReadOnlyNetworkGraph<'_> {
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use chain;
|
||||
use ln::channelmanager;
|
||||
use ln::chan_utils::make_funding_redeemscript;
|
||||
use ln::PaymentHash;
|
||||
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
|
||||
use ln::features::InitFeatures;
|
||||
use routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate, NodeAlias, MAX_EXCESS_BYTES_FOR_RELAY, NodeId, RoutingFees, ChannelUpdateInfo, ChannelInfo, NodeAnnouncementInfo, NodeInfo};
|
||||
use ln::msgs::{RoutingMessageHandler, UnsignedNodeAnnouncement, NodeAnnouncement,
|
||||
UnsignedChannelAnnouncement, ChannelAnnouncement, UnsignedChannelUpdate, ChannelUpdate,
|
||||
|
@ -1934,7 +1935,7 @@ mod tests {
|
|||
fn get_signed_node_announcement<F: Fn(&mut UnsignedNodeAnnouncement)>(f: F, node_key: &SecretKey, secp_ctx: &Secp256k1<secp256k1::All>) -> NodeAnnouncement {
|
||||
let node_id = PublicKey::from_secret_key(&secp_ctx, node_key);
|
||||
let mut unsigned_announcement = UnsignedNodeAnnouncement {
|
||||
features: NodeFeatures::known(),
|
||||
features: channelmanager::provided_node_features(),
|
||||
timestamp: 100,
|
||||
node_id: node_id,
|
||||
rgb: [0; 3],
|
||||
|
@ -1958,7 +1959,7 @@ mod tests {
|
|||
let node_2_btckey = &SecretKey::from_slice(&[39; 32]).unwrap();
|
||||
|
||||
let mut unsigned_announcement = UnsignedChannelAnnouncement {
|
||||
features: ChannelFeatures::known(),
|
||||
features: channelmanager::provided_channel_features(),
|
||||
chain_hash: genesis_block(Network::Testnet).header.block_hash(),
|
||||
short_channel_id: 0,
|
||||
node_id_1,
|
||||
|
@ -2616,7 +2617,7 @@ mod tests {
|
|||
|
||||
// It should ignore if gossip_queries feature is not enabled
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known().clear_gossip_queries(), remote_network_address: None };
|
||||
let init_msg = Init { features: InitFeatures::empty(), remote_network_address: None };
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg).unwrap();
|
||||
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 0);
|
||||
|
@ -2624,7 +2625,9 @@ mod tests {
|
|||
|
||||
// It should send a gossip_timestamp_filter with the correct information
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known(), remote_network_address: None };
|
||||
let mut features = InitFeatures::empty();
|
||||
features.set_gossip_queries_optional();
|
||||
let init_msg = Init { features, remote_network_address: None };
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg).unwrap();
|
||||
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
|
@ -3014,7 +3017,7 @@ mod tests {
|
|||
// 2. Test encoding/decoding of ChannelInfo
|
||||
// Check we can encode/decode ChannelInfo without ChannelUpdateInfo fields present.
|
||||
let chan_info_none_updates = ChannelInfo {
|
||||
features: ChannelFeatures::known(),
|
||||
features: channelmanager::provided_channel_features(),
|
||||
node_one: NodeId::from_pubkey(&nodes[0].node.get_our_node_id()),
|
||||
one_to_two: None,
|
||||
node_two: NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
|
||||
|
@ -3032,7 +3035,7 @@ mod tests {
|
|||
|
||||
// Check we can encode/decode ChannelInfo with ChannelUpdateInfo fields present.
|
||||
let chan_info_some_updates = ChannelInfo {
|
||||
features: ChannelFeatures::known(),
|
||||
features: channelmanager::provided_channel_features(),
|
||||
node_one: NodeId::from_pubkey(&nodes[0].node.get_our_node_id()),
|
||||
one_to_two: Some(chan_update_info.clone()),
|
||||
node_two: NodeId::from_pubkey(&nodes[1].node.get_our_node_id()),
|
||||
|
@ -3074,7 +3077,7 @@ mod tests {
|
|||
// 1. Check we can read a valid NodeAnnouncementInfo and fail on an invalid one
|
||||
let valid_netaddr = ::ln::msgs::NetAddress::Hostname { hostname: ::util::ser::Hostname::try_from("A".to_string()).unwrap(), port: 1234 };
|
||||
let valid_node_ann_info = NodeAnnouncementInfo {
|
||||
features: NodeFeatures::known(),
|
||||
features: channelmanager::provided_node_features(),
|
||||
last_update: 0,
|
||||
rgb: [0u8; 3],
|
||||
alias: NodeAlias([0u8; 32]),
|
||||
|
|
|
@ -1939,7 +1939,7 @@ mod tests {
|
|||
use routing::scoring::{ChannelUsage, Score, ProbabilisticScorer, ProbabilisticScoringParameters};
|
||||
use chain::transaction::OutPoint;
|
||||
use chain::keysinterface::KeysInterface;
|
||||
use ln::features::{ChannelFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
|
||||
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
|
||||
use ln::msgs::{ErrorAction, LightningError, UnsignedChannelAnnouncement, ChannelAnnouncement, RoutingMessageHandler,
|
||||
NodeAnnouncement, UnsignedNodeAnnouncement, ChannelUpdate, UnsignedChannelUpdate, MAX_VALUE_MSAT};
|
||||
use ln::channelmanager;
|
||||
|
@ -2656,7 +2656,7 @@ mod tests {
|
|||
fn htlc_minimum_overpay_test() {
|
||||
let (secp_ctx, network_graph, gossip_sync, _, logger) = build_graph();
|
||||
let (our_privkey, our_id, privkeys, nodes) = get_nodes(&secp_ctx);
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(channelmanager::provided_invoice_features());
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
|
@ -2860,7 +2860,7 @@ mod tests {
|
|||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
|
||||
// Disable nodes 1, 2, and 8 by requiring unknown feature bits
|
||||
let mut unknown_features = NodeFeatures::known();
|
||||
let mut unknown_features = NodeFeatures::empty();
|
||||
unknown_features.set_unknown_feature_required();
|
||||
add_or_update_node(&gossip_sync, &secp_ctx, &privkeys[0], unknown_features.clone(), 1);
|
||||
add_or_update_node(&gossip_sync, &secp_ctx, &privkeys[1], unknown_features.clone(), 1);
|
||||
|
@ -3629,7 +3629,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(channelmanager::provided_invoice_features());
|
||||
|
||||
// We will use a simple single-path route from
|
||||
// our node to node2 via node0: channels {1, 3}.
|
||||
|
@ -3903,7 +3903,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(channelmanager::provided_invoice_features());
|
||||
|
||||
// Path via {node7, node2, node4} is channels {12, 13, 6, 11}.
|
||||
// {12, 13, 11} have the capacities of 100, {6} has a capacity of 50.
|
||||
|
@ -4077,7 +4077,7 @@ mod tests {
|
|||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2])
|
||||
.with_features(InvoiceFeatures::known());
|
||||
.with_features(channelmanager::provided_invoice_features());
|
||||
|
||||
// We need a route consisting of 3 paths:
|
||||
// From our node to node2 via node0, node7, node1 (three paths one hop each).
|
||||
|
@ -4235,7 +4235,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(channelmanager::provided_invoice_features());
|
||||
|
||||
// We need a route consisting of 3 paths:
|
||||
// From our node to node3 via {node0, node2}, {node7, node2, node4} and {node7, node2}.
|
||||
|
@ -4399,7 +4399,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(channelmanager::provided_invoice_features());
|
||||
|
||||
// This test checks that if we have two cheaper paths and one more expensive path,
|
||||
// so that liquidity-wise any 2 of 3 combination is sufficient,
|
||||
|
@ -4568,7 +4568,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3]).with_features(channelmanager::provided_invoice_features());
|
||||
|
||||
// We need a route consisting of 2 paths:
|
||||
// From our node to node3 via {node0, node2} and {node7, node2, node4}.
|
||||
|
@ -4749,7 +4749,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(PublicKey::from_slice(&[02; 33]).unwrap()).with_features(InvoiceFeatures::known())
|
||||
let payment_params = PaymentParameters::from_node_id(PublicKey::from_slice(&[02; 33]).unwrap()).with_features(channelmanager::provided_invoice_features())
|
||||
.with_route_hints(vec![RouteHint(vec![RouteHintHop {
|
||||
src_node_id: nodes[2],
|
||||
short_channel_id: 42,
|
||||
|
@ -4840,7 +4840,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(InvoiceFeatures::known())
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(channelmanager::provided_invoice_features())
|
||||
.with_max_channel_saturation_power_of_half(0);
|
||||
|
||||
// We need a route consisting of 3 paths:
|
||||
|
@ -5196,7 +5196,7 @@ mod tests {
|
|||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(channelmanager::provided_invoice_features());
|
||||
|
||||
// We modify the graph to set the htlc_minimum of channel 2 and 4 as needed - channel 2
|
||||
// gets an htlc_maximum_msat of 80_000 and channel 4 an htlc_minimum_msat of 90_000. We
|
||||
|
@ -5245,7 +5245,7 @@ mod tests {
|
|||
assert_eq!(route.paths[0][1].short_channel_id, 13);
|
||||
assert_eq!(route.paths[0][1].fee_msat, 90_000);
|
||||
assert_eq!(route.paths[0][1].cltv_expiry_delta, 42);
|
||||
assert_eq!(route.paths[0][1].node_features.le_flags(), InvoiceFeatures::known().le_flags());
|
||||
assert_eq!(route.paths[0][1].node_features.le_flags(), channelmanager::provided_invoice_features().le_flags());
|
||||
assert_eq!(route.paths[0][1].channel_features.le_flags(), &id_to_feature_flags(13));
|
||||
}
|
||||
}
|
||||
|
@ -5264,14 +5264,14 @@ mod tests {
|
|||
let logger = Arc::new(test_utils::TestLogger::new());
|
||||
let network_graph = NetworkGraph::new(genesis_hash, Arc::clone(&logger));
|
||||
let scorer = test_utils::TestScorer::with_penalty(0);
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[0]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[0]).with_features(channelmanager::provided_invoice_features());
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
|
||||
{
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&[
|
||||
&get_channel_details(Some(3), nodes[0], InitFeatures::known(), 200_000),
|
||||
&get_channel_details(Some(2), nodes[0], InitFeatures::known(), 10_000),
|
||||
&get_channel_details(Some(3), nodes[0], channelmanager::provided_init_features(), 200_000),
|
||||
&get_channel_details(Some(2), nodes[0], channelmanager::provided_init_features(), 10_000),
|
||||
]), 100_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].len(), 1);
|
||||
|
@ -5282,8 +5282,8 @@ mod tests {
|
|||
}
|
||||
{
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&[
|
||||
&get_channel_details(Some(3), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(2), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(3), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
&get_channel_details(Some(2), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
]), 100_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
assert_eq!(route.paths[0].len(), 1);
|
||||
|
@ -5308,14 +5308,14 @@ mod tests {
|
|||
// smallest of them, avoiding further fragmenting our available outbound balance to
|
||||
// this node.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&[
|
||||
&get_channel_details(Some(2), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(3), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(5), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(6), nodes[0], InitFeatures::known(), 300_000),
|
||||
&get_channel_details(Some(7), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(8), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(9), nodes[0], InitFeatures::known(), 50_000),
|
||||
&get_channel_details(Some(4), nodes[0], InitFeatures::known(), 1_000_000),
|
||||
&get_channel_details(Some(2), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
&get_channel_details(Some(3), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
&get_channel_details(Some(5), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
&get_channel_details(Some(6), nodes[0], channelmanager::provided_init_features(), 300_000),
|
||||
&get_channel_details(Some(7), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
&get_channel_details(Some(8), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
&get_channel_details(Some(9), nodes[0], channelmanager::provided_init_features(), 50_000),
|
||||
&get_channel_details(Some(4), nodes[0], channelmanager::provided_init_features(), 1_000_000),
|
||||
]), 100_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].len(), 1);
|
||||
|
@ -5759,7 +5759,7 @@ mod tests {
|
|||
excess_data: Vec::new()
|
||||
});
|
||||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2]).with_features(channelmanager::provided_invoice_features());
|
||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
// 100,000 sats is less than the available liquidity on each channel, set above.
|
||||
|
@ -5843,7 +5843,7 @@ mod tests {
|
|||
let src = &PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap();
|
||||
seed = seed.overflowing_mul(0xdeadbeef).0;
|
||||
let dst = PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap();
|
||||
let payment_params = PaymentParameters::from_node_id(dst).with_features(InvoiceFeatures::known());
|
||||
let payment_params = PaymentParameters::from_node_id(dst).with_features(channelmanager::provided_invoice_features());
|
||||
let amt = seed as u64 % 200_000_000;
|
||||
let params = ProbabilisticScoringParameters::default();
|
||||
let scorer = ProbabilisticScorer::new(params, &graph, &logger);
|
||||
|
@ -5926,7 +5926,7 @@ mod benches {
|
|||
use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
|
||||
use chain::transaction::OutPoint;
|
||||
use chain::keysinterface::{KeysManager,KeysInterface};
|
||||
use ln::channelmanager::{ChannelCounterparty, ChannelDetails};
|
||||
use ln::channelmanager::{self, ChannelCounterparty, ChannelDetails};
|
||||
use ln::features::{InitFeatures, InvoiceFeatures};
|
||||
use routing::gossip::NetworkGraph;
|
||||
use routing::scoring::{FixedPenaltyScorer, ProbabilisticScorer, ProbabilisticScoringParameters};
|
||||
|
@ -5955,7 +5955,7 @@ mod benches {
|
|||
ChannelDetails {
|
||||
channel_id: [0; 32],
|
||||
counterparty: ChannelCounterparty {
|
||||
features: InitFeatures::known(),
|
||||
features: channelmanager::provided_init_features(),
|
||||
node_id,
|
||||
unspendable_punishment_reserve: 0,
|
||||
forwarding_info: None,
|
||||
|
@ -6001,7 +6001,7 @@ mod benches {
|
|||
let logger = DummyLogger {};
|
||||
let network_graph = read_network_graph(&logger);
|
||||
let scorer = FixedPenaltyScorer::with_penalty(0);
|
||||
generate_routes(bench, &network_graph, scorer, InvoiceFeatures::known());
|
||||
generate_routes(bench, &network_graph, scorer, channelmanager::provided_invoice_features());
|
||||
}
|
||||
|
||||
#[bench]
|
||||
|
@ -6019,7 +6019,7 @@ mod benches {
|
|||
let network_graph = read_network_graph(&logger);
|
||||
let params = ProbabilisticScoringParameters::default();
|
||||
let scorer = ProbabilisticScorer::new(params, &network_graph, &logger);
|
||||
generate_routes(bench, &network_graph, scorer, InvoiceFeatures::known());
|
||||
generate_routes(bench, &network_graph, scorer, channelmanager::provided_invoice_features());
|
||||
}
|
||||
|
||||
fn generate_routes<S: Score>(
|
||||
|
|
|
@ -1281,7 +1281,7 @@ mod tests {
|
|||
use util::time::Time;
|
||||
use util::time::tests::SinceEpoch;
|
||||
|
||||
use ln::features::{ChannelFeatures, NodeFeatures};
|
||||
use ln::channelmanager;
|
||||
use ln::msgs::{ChannelAnnouncement, ChannelUpdate, UnsignedChannelAnnouncement, UnsignedChannelUpdate};
|
||||
use routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
|
||||
use routing::router::RouteHop;
|
||||
|
@ -1372,7 +1372,7 @@ mod tests {
|
|||
let node_2_secret = &SecretKey::from_slice(&[40; 32]).unwrap();
|
||||
let secp_ctx = Secp256k1::new();
|
||||
let unsigned_announcement = UnsignedChannelAnnouncement {
|
||||
features: ChannelFeatures::known(),
|
||||
features: channelmanager::provided_channel_features(),
|
||||
chain_hash: genesis_hash,
|
||||
short_channel_id,
|
||||
node_id_1: PublicKey::from_secret_key(&secp_ctx, &node_1_key),
|
||||
|
@ -1426,25 +1426,25 @@ mod tests {
|
|||
vec![
|
||||
RouteHop {
|
||||
pubkey: source_pubkey(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: 41,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 1,
|
||||
cltv_expiry_delta: 18,
|
||||
},
|
||||
RouteHop {
|
||||
pubkey: target_pubkey(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: 42,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: 2,
|
||||
cltv_expiry_delta: 18,
|
||||
},
|
||||
RouteHop {
|
||||
pubkey: recipient_pubkey(),
|
||||
node_features: NodeFeatures::known(),
|
||||
node_features: channelmanager::provided_node_features(),
|
||||
short_channel_id: 43,
|
||||
channel_features: ChannelFeatures::known(),
|
||||
channel_features: channelmanager::provided_channel_features(),
|
||||
fee_msat: amount_msat,
|
||||
cltv_expiry_delta: 18,
|
||||
},
|
||||
|
|
|
@ -17,6 +17,7 @@ use chain::channelmonitor;
|
|||
use chain::channelmonitor::MonitorEvent;
|
||||
use chain::transaction::OutPoint;
|
||||
use chain::keysinterface;
|
||||
use ln::channelmanager;
|
||||
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
|
||||
use ln::{msgs, wire};
|
||||
use ln::script::ShutdownScript;
|
||||
|
@ -359,10 +360,10 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
|
|||
self.received_msg(wire::Message::Error(msg.clone()));
|
||||
}
|
||||
fn provided_node_features(&self) -> NodeFeatures {
|
||||
NodeFeatures::known_channel_features()
|
||||
channelmanager::provided_node_features()
|
||||
}
|
||||
fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures {
|
||||
InitFeatures::known_channel_features()
|
||||
channelmanager::provided_init_features()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -384,7 +385,7 @@ fn get_dummy_channel_announcement(short_chan_id: u64) -> msgs::ChannelAnnounceme
|
|||
let node_1_btckey = SecretKey::from_slice(&[40; 32]).unwrap();
|
||||
let node_2_btckey = SecretKey::from_slice(&[39; 32]).unwrap();
|
||||
let unsigned_ann = msgs::UnsignedChannelAnnouncement {
|
||||
features: ChannelFeatures::known(),
|
||||
features: ChannelFeatures::empty(),
|
||||
chain_hash: genesis_block(network).header.block_hash(),
|
||||
short_channel_id: short_chan_id,
|
||||
node_id_1: PublicKey::from_secret_key(&secp_ctx, &node_1_privkey),
|
||||
|
|
Loading…
Add table
Reference in a new issue