Skip to content

Commit 760fd5c

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 8470e60 commit 760fd5c

File tree

7 files changed

+31
-9
lines changed

7 files changed

+31
-9
lines changed

fuzz/fuzz_targets/chanmon_fail_consistency.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ impl FeeEstimator for FuzzEstimator {
5959
fn get_est_sat_per_1000_weight(&self, _: ConfirmationTarget) -> u64 {
6060
253
6161
}
62+
fn get_min_relay_sat_per_1000_weight(&self) -> u64 {
63+
0
64+
}
6265
}
6366

6467
pub struct TestBroadcaster {}

fuzz/fuzz_targets/full_stack_target.rs

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

117123
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
@@ -3999,12 +3999,16 @@ mod tests {
39993999
use std::sync::Arc;
40004000

40014001
struct TestFeeEstimator {
4002-
fee_est: u64
4002+
fee_est: u64,
4003+
minrelayfee: u64
40034004
}
40044005
impl FeeEstimator for TestFeeEstimator {
40054006
fn get_est_sat_per_1000_weight(&self, _: ConfirmationTarget) -> u64 {
40064007
self.fee_est
40074008
}
4009+
fn get_min_relay_sat_per_1000_weight(&self) -> u64 {
4010+
self.minrelayfee
4011+
}
40084012
}
40094013

40104014
#[test]
@@ -4039,7 +4043,7 @@ mod tests {
40394043
#[test]
40404044
fn outbound_commitment_test() {
40414045
// Test vectors from BOLT 3 Appendix C:
4042-
let feeest = TestFeeEstimator{fee_est: 15000};
4046+
let feeest = TestFeeEstimator{fee_est: 15000, minrelayfee: 0};
40434047
let logger : Arc<Logger> = Arc::new(test_utils::TestLogger::new());
40444048
let secp_ctx = Secp256k1::new();
40454049

src/ln/functional_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ pub fn create_network(node_count: usize) -> Vec<Node> {
837837

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

src/ln/functional_tests.rs

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

3221-
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 })));
3221+
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})));
32223222
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
32233223
let (_, chan_0_monitor) = <(Sha256dHash, ChannelMonitor)>::read(&mut chan_0_monitor_read, Arc::new(test_utils::TestLogger::new())).unwrap();
32243224
assert!(chan_0_monitor_read.is_empty());
@@ -3232,7 +3232,7 @@ fn test_no_txn_manager_serialize_deserialize() {
32323232
<(Sha256dHash, ChannelManager)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
32333233
default_config: config,
32343234
keys_manager,
3235-
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
3235+
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0}),
32363236
monitor: nodes[0].chan_monitor.clone(),
32373237
chain_monitor: nodes[0].chain_monitor.clone(),
32383238
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
@@ -3284,7 +3284,7 @@ fn test_simple_manager_serialize_deserialize() {
32843284
let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
32853285
nodes[0].chan_monitor.simple_monitor.monitors.lock().unwrap().iter().next().unwrap().1.write_for_disk(&mut chan_0_monitor_serialized).unwrap();
32863286

3287-
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 })));
3287+
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})));
32883288
let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
32893289
let (_, chan_0_monitor) = <(Sha256dHash, ChannelMonitor)>::read(&mut chan_0_monitor_read, Arc::new(test_utils::TestLogger::new())).unwrap();
32903290
assert!(chan_0_monitor_read.is_empty());
@@ -3297,7 +3297,7 @@ fn test_simple_manager_serialize_deserialize() {
32973297
<(Sha256dHash, ChannelManager)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
32983298
default_config: UserConfig::new(),
32993299
keys_manager,
3300-
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
3300+
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0}),
33013301
monitor: nodes[0].chan_monitor.clone(),
33023302
chain_monitor: nodes[0].chain_monitor.clone(),
33033303
tx_broadcaster: nodes[0].tx_broadcaster.clone(),
@@ -3344,7 +3344,7 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
33443344
node_0_monitors_serialized.push(writer.0);
33453345
}
33463346

3347-
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 })));
3347+
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})));
33483348
let mut node_0_monitors = Vec::new();
33493349
for serialized in node_0_monitors_serialized.iter() {
33503350
let mut read = &serialized[..];
@@ -3358,7 +3358,7 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
33583358
let (_, nodes_0_deserialized) = <(Sha256dHash, ChannelManager)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
33593359
default_config: UserConfig::new(),
33603360
keys_manager,
3361-
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
3361+
fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253, min_relay_sat_per_kw: 0}),
33623362
monitor: nodes[0].chan_monitor.clone(),
33633363
chain_monitor: nodes[0].chain_monitor.clone(),
33643364
tx_broadcaster: nodes[0].tx_broadcaster.clone(),

src/util/test_utils.rs

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

3434
pub struct TestFeeEstimator {
3535
pub sat_per_kw: u64,
36+
pub min_relay_sat_per_kw: u64
3637
}
3738
impl chaininterface::FeeEstimator for TestFeeEstimator {
3839
fn get_est_sat_per_1000_weight(&self, _confirmation_target: ConfirmationTarget) -> u64 {
3940
self.sat_per_kw
4041
}
42+
fn get_min_relay_sat_per_1000_weight(&self) -> u64 {
43+
self.min_relay_sat_per_kw
44+
}
4145
}
4246

4347
pub struct TestChannelMonitor {

0 commit comments

Comments
 (0)