Skip to content

Commit fc70ab8

Browse files
author
Antoine Riard
committed
Add getter for Minimum Relay Fee in FeeEstimator
We need to ensure that we respect minrelayfee when computing RBF bumped fee.
1 parent e65e03f commit fc70ab8

File tree

7 files changed

+34
-12
lines changed

7 files changed

+34
-12
lines changed

fuzz/fuzz_targets/chanmon_fail_consistency.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ impl FeeEstimator for FuzzEstimator {
6262
fn get_est_sat_per_1000_weight(&self, _: ConfirmationTarget) -> u64 {
6363
253
6464
}
65+
fn get_min_relay_sat_per_1000_weight(&self) -> u64 {
66+
0
67+
}
6568
}
6669

6770
pub struct TestBroadcaster {}

fuzz/fuzz_targets/full_stack_target.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ impl FeeEstimator for FuzzEstimator {
111111
None => 0
112112
}
113113
}
114+
fn get_min_relay_sat_per_1000_weight(&self) -> u64 {
115+
match self.input.get_slice(2) {
116+
Some(slice) => cmp::max(slice_to_be16(slice) as u64, 20),
117+
None => 0
118+
}
119+
}
114120
}
115121

116122
struct TestBroadcaster {}

src/chain/chaininterface.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ pub trait FeeEstimator: Sync + Send {
109109
/// * satoshis-per-byte * 250
110110
/// * ceil(satoshis-per-kbyte / 4)
111111
fn get_est_sat_per_1000_weight(&self, confirmation_target: ConfirmationTarget) -> u64;
112+
/// Gets satoshis of minimum relay fee required per 1000 Weight-Units.
113+
///
114+
/// Give us back the minimum relay fee setup by node mempool. It's should be accounted in generic fee
115+
/// computation but in case of RBF we need more granularity on fee composition.
116+
fn get_min_relay_sat_per_1000_weight(&self) -> u64;
112117
}
113118

114119
/// Utility for tracking registered txn/outpoints and checking for matches

src/ln/channel.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4083,12 +4083,16 @@ mod tests {
40834083
use std::sync::Arc;
40844084

40854085
struct TestFeeEstimator {
4086-
fee_est: u64
4086+
fee_est: u64,
4087+
minrelayfee: u64
40874088
}
40884089
impl FeeEstimator for TestFeeEstimator {
40894090
fn get_est_sat_per_1000_weight(&self, _: ConfirmationTarget) -> u64 {
40904091
self.fee_est
40914092
}
4093+
fn get_min_relay_sat_per_1000_weight(&self) -> u64 {
4094+
self.minrelayfee
4095+
}
40924096
}
40934097

40944098
#[test]
@@ -4123,7 +4127,7 @@ mod tests {
41234127
#[test]
41244128
fn outbound_commitment_test() {
41254129
// Test vectors from BOLT 3 Appendix C:
4126-
let feeest = TestFeeEstimator{fee_est: 15000};
4130+
let feeest = TestFeeEstimator{fee_est: 15000, minrelayfee: 0};
41274131
let logger : Arc<Logger> = Arc::new(test_utils::TestLogger::new());
41284132
let secp_ctx = Secp256k1::new();
41294133

src/ln/functional_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ pub fn create_network(node_count: usize, node_config: &[Option<UserConfig>]) ->
833833

834834
for i in 0..node_count {
835835
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i)));
836-
let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 });
836+
let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0});
837837
let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new(Network::Testnet, Arc::clone(&logger)));
838838
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
839839
let mut seed = [0; 32];

src/ln/functional_tests.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3226,7 +3226,7 @@ fn test_no_txn_manager_serialize_deserialize() {
32263226
let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
32273227
nodes[0].chan_monitor.simple_monitor.monitors.lock().unwrap().iter().next().unwrap().1.write_for_disk(&mut chan_0_monitor_serialized).unwrap();
32283228

3229-
nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 })));
3229+
nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0})));
32303230
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
32313231
let (_, chan_0_monitor) = <(Sha256dHash, ChannelMonitor)>::read(&mut chan_0_monitor_read, Arc::new(test_utils::TestLogger::new())).unwrap();
32323232
assert!(chan_0_monitor_read.is_empty());
@@ -3240,7 +3240,7 @@ fn test_no_txn_manager_serialize_deserialize() {
32403240
<(Sha256dHash, ChannelManager)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
32413241
default_config: config,
32423242
keys_manager,
3243-
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
3243+
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0}),
32443244
monitor: nodes[0].chan_monitor.clone(),
32453245
chain_monitor: nodes[0].chain_monitor.clone(),
32463246
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
@@ -3292,7 +3292,7 @@ fn test_simple_manager_serialize_deserialize() {
32923292
let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
32933293
nodes[0].chan_monitor.simple_monitor.monitors.lock().unwrap().iter().next().unwrap().1.write_for_disk(&mut chan_0_monitor_serialized).unwrap();
32943294

3295-
nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 })));
3295+
nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0})));
32963296
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
32973297
let (_, chan_0_monitor) = <(Sha256dHash, ChannelMonitor)>::read(&mut chan_0_monitor_read, Arc::new(test_utils::TestLogger::new())).unwrap();
32983298
assert!(chan_0_monitor_read.is_empty());
@@ -3305,7 +3305,7 @@ fn test_simple_manager_serialize_deserialize() {
33053305
<(Sha256dHash, ChannelManager)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
33063306
default_config: UserConfig::new(),
33073307
keys_manager,
3308-
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
3308+
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0}),
33093309
monitor: nodes[0].chan_monitor.clone(),
33103310
chain_monitor: nodes[0].chain_monitor.clone(),
33113311
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
@@ -3352,7 +3352,7 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
33523352
node_0_monitors_serialized.push(writer.0);
33533353
}
33543354

3355-
nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 })));
3355+
nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0})));
33563356
let mut node_0_monitors = Vec::new();
33573357
for serialized in node_0_monitors_serialized.iter() {
33583358
let mut read = &serialized[..];
@@ -3366,7 +3366,7 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
33663366
let (_, nodes_0_deserialized) = <(Sha256dHash, ChannelManager)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
33673367
default_config: UserConfig::new(),
33683368
keys_manager,
3369-
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
3369+
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0}),
33703370
monitor: nodes[0].chan_monitor.clone(),
33713371
chain_monitor: nodes[0].chain_monitor.clone(),
33723372
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
@@ -5900,7 +5900,7 @@ fn test_user_configurable_csv_delay() {
59005900

59015901
// We test config.our_to_self > BREAKDOWN_TIMEOUT is enforced in Channel::new_outbound()
59025902
let keys_manager: Arc<KeysInterface> = Arc::new(KeysManager::new(&nodes[0].node_seed, Network::Testnet, Arc::new(test_utils::TestLogger::new()), 10, 20));
5903-
if let Err(error) = Channel::new_outbound(&test_utils::TestFeeEstimator { sat_per_kw: 253 }, &keys_manager, nodes[1].node.get_our_node_id(), 1000000, 1000000, 0, Arc::new(test_utils::TestLogger::new()), &low_our_to_self_config) {
5903+
if let Err(error) = Channel::new_outbound(&test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0 }, &keys_manager, nodes[1].node.get_our_node_id(), 1000000, 1000000, 0, Arc::new(test_utils::TestLogger::new()), &low_our_to_self_config) {
59045904
match error {
59055905
APIError::APIMisuseError { err } => { assert_eq!(err, "Configured with an unreasonable our_to_self_delay putting user funds at risks"); },
59065906
_ => panic!("Unexpected event"),
@@ -5911,7 +5911,7 @@ fn test_user_configurable_csv_delay() {
59115911
nodes[1].node.create_channel(nodes[0].node.get_our_node_id(), 1000000, 1000000, 42).unwrap();
59125912
let mut open_channel = get_event_msg!(nodes[1], MessageSendEvent::SendOpenChannel, nodes[0].node.get_our_node_id());
59135913
open_channel.to_self_delay = 200;
5914-
if let Err(error) = Channel::new_from_req(&test_utils::TestFeeEstimator { sat_per_kw: 253 }, &keys_manager, nodes[1].node.get_our_node_id(), LocalFeatures::new(), &open_channel, 0, Arc::new(test_utils::TestLogger::new()), &low_our_to_self_config) {
5914+
if let Err(error) = Channel::new_from_req(&test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0 }, &keys_manager, nodes[1].node.get_our_node_id(), LocalFeatures::new(), &open_channel, 0, Arc::new(test_utils::TestLogger::new()), &low_our_to_self_config) {
59155915
match error {
59165916
ChannelError::Close(err) => { assert_eq!(err, "Configured with an unreasonable our_to_self_delay putting user funds at risks"); },
59175917
_ => panic!("Unexpected event"),
@@ -5938,7 +5938,7 @@ fn test_user_configurable_csv_delay() {
59385938
nodes[1].node.create_channel(nodes[0].node.get_our_node_id(), 1000000, 1000000, 42).unwrap();
59395939
let mut open_channel = get_event_msg!(nodes[1], MessageSendEvent::SendOpenChannel, nodes[0].node.get_our_node_id());
59405940
open_channel.to_self_delay = 200;
5941-
if let Err(error) = Channel::new_from_req(&test_utils::TestFeeEstimator { sat_per_kw: 253 }, &keys_manager, nodes[1].node.get_our_node_id(), LocalFeatures::new(), &open_channel, 0, Arc::new(test_utils::TestLogger::new()), &high_their_to_self_config) {
5941+
if let Err(error) = Channel::new_from_req(&test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0 }, &keys_manager, nodes[1].node.get_our_node_id(), LocalFeatures::new(), &open_channel, 0, Arc::new(test_utils::TestLogger::new()), &high_their_to_self_config) {
59425942
match error {
59435943
ChannelError::Close(err) => { assert_eq!(err, "They wanted our payments to be delayed by a needlessly long period"); },
59445944
_ => panic!("Unexpected event"),

src/util/test_utils.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ impl Writer for TestVecWriter {
3535

3636
pub struct TestFeeEstimator {
3737
pub sat_per_kw: u64,
38+
pub min_relay_sat_per_kw: u64
3839
}
3940
impl chaininterface::FeeEstimator for TestFeeEstimator {
4041
fn get_est_sat_per_1000_weight(&self, _confirmation_target: ConfirmationTarget) -> u64 {
4142
self.sat_per_kw
4243
}
44+
fn get_min_relay_sat_per_1000_weight(&self) -> u64 {
45+
self.min_relay_sat_per_kw
46+
}
4347
}
4448

4549
pub struct TestChannelMonitor {

0 commit comments

Comments
 (0)