Skip to content

Commit 1b8ccbe

Browse files
committed
Include base input fee in fee, in calculate_our_funding_satoshis; add test
1 parent b1fc7d8 commit 1b8ccbe

File tree

1 file changed

+85
-3
lines changed

1 file changed

+85
-3
lines changed

lightning/src/ln/channel.rs

+85-3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ use crate::chain::transaction::{OutPoint, TransactionData};
5757
use crate::sign::ecdsa::EcdsaChannelSigner;
5858
use crate::sign::{EntropySource, ChannelSigner, SignerProvider, NodeSigner, Recipient};
5959
use crate::events::{ClosureReason, Event};
60+
use crate::events::bump_transaction::BASE_INPUT_WEIGHT;
6061
use crate::routing::gossip::NodeId;
6162
use crate::util::ser::{Readable, ReadableArgs, TransactionU16LenLimited, Writeable, Writer};
6263
use crate::util::logger::{Logger, Record, WithContext};
@@ -4475,7 +4476,6 @@ pub(super) fn calculate_our_funding_satoshis(
44754476
holder_dust_limit_satoshis: u64,
44764477
) -> Result<u64, APIError> {
44774478
let mut total_input_satoshis = 0u64;
4478-
let mut our_contributed_weight = 0u64;
44794479

44804480
for (idx, input) in funding_inputs.iter().enumerate() {
44814481
if let Some(output) = input.1.as_transaction().output.get(input.0.previous_output.vout as usize) {
@@ -4486,6 +4486,9 @@ pub(super) fn calculate_our_funding_satoshis(
44864486
input.1.as_transaction().compute_txid(), input.0.previous_output.vout, idx) });
44874487
}
44884488
}
4489+
// inputs:
4490+
let mut our_contributed_weight = (funding_inputs.len() as u64) * BASE_INPUT_WEIGHT;
4491+
// witnesses:
44894492
our_contributed_weight = our_contributed_weight.saturating_add(total_witness_weight.to_wu());
44904493

44914494
// If we are the initiator, we must pay for weight of all common fields in the funding transaction.
@@ -10464,7 +10467,7 @@ mod tests {
1046410467
use bitcoin::amount::Amount;
1046510468
use bitcoin::constants::ChainHash;
1046610469
use bitcoin::script::{ScriptBuf, Builder};
10467-
use bitcoin::transaction::{Transaction, TxOut, Version};
10470+
use bitcoin::transaction::{Transaction, TxIn, TxOut, Version};
1046810471
use bitcoin::opcodes;
1046910472
use bitcoin::network::Network;
1047010473
use crate::ln::onion_utils::INVALID_ONION_BLINDING;
@@ -10486,7 +10489,7 @@ mod tests {
1048610489
use crate::routing::router::{Path, RouteHop};
1048710490
use crate::util::config::UserConfig;
1048810491
use crate::util::errors::APIError;
10489-
use crate::util::ser::{ReadableArgs, Writeable};
10492+
use crate::util::ser::{ReadableArgs, TransactionU16LenLimited, Writeable};
1049010493
use crate::util::test_utils;
1049110494
use crate::util::test_utils::{OnGetShutdownScriptpubkey, TestKeysInterface};
1049210495
use bitcoin::secp256k1::{Secp256k1, ecdsa::Signature};
@@ -12236,4 +12239,83 @@ mod tests {
1223612239
assert_eq!(node_a_chan.context.channel_state, ChannelState::AwaitingChannelReady(AwaitingChannelReadyFlags::THEIR_CHANNEL_READY));
1223712240
assert!(node_a_chan.check_get_channel_ready(0, &&logger).is_some());
1223812241
}
12242+
12243+
fn funding_input_sats(input_value_sats: u64) -> (TxIn, TransactionU16LenLimited) {
12244+
let input_1_prev_out = TxOut { value: Amount::from_sat(input_value_sats), script_pubkey: ScriptBuf::default() };
12245+
let input_1_prev_tx = Transaction {
12246+
input: vec![], output: vec![input_1_prev_out],
12247+
version: Version::TWO, lock_time: bitcoin::absolute::LockTime::ZERO,
12248+
};
12249+
let input_1_txin = TxIn {
12250+
previous_output: bitcoin::OutPoint { txid: input_1_prev_tx.compute_txid(), vout: 0 },
12251+
..Default::default()
12252+
};
12253+
(input_1_txin, TransactionU16LenLimited::new(input_1_prev_tx).unwrap())
12254+
}
12255+
12256+
#[test]
12257+
fn test_calculate_our_funding_satoshis() {
12258+
use crate::ln::channel::calculate_our_funding_satoshis;
12259+
use bitcoin::Weight;
12260+
12261+
// normal use case, output is less than the available inputs
12262+
assert_eq!(
12263+
calculate_our_funding_satoshis(
12264+
true,
12265+
&[
12266+
funding_input_sats(200_000),
12267+
funding_input_sats(100_000),
12268+
],
12269+
Weight::from_wu(300),
12270+
2000,
12271+
1000,
12272+
).unwrap(),
12273+
298332
12274+
);
12275+
12276+
assert_eq!(
12277+
calculate_our_funding_satoshis(
12278+
true,
12279+
&[funding_input_sats(20_000)],
12280+
Weight::from_wu(300),
12281+
2000,
12282+
1000,
12283+
).unwrap(),
12284+
18652
12285+
);
12286+
12287+
assert_eq!(
12288+
calculate_our_funding_satoshis(
12289+
true,
12290+
&[funding_input_sats(20_000)],
12291+
Weight::from_wu(0),
12292+
2000,
12293+
1000,
12294+
).unwrap(),
12295+
19252
12296+
);
12297+
12298+
assert_eq!(
12299+
calculate_our_funding_satoshis(
12300+
false,
12301+
&[funding_input_sats(20_000)],
12302+
Weight::from_wu(0),
12303+
2000,
12304+
1000,
12305+
).unwrap(),
12306+
19680
12307+
);
12308+
12309+
// below dust limit
12310+
assert_eq!(
12311+
calculate_our_funding_satoshis(
12312+
true,
12313+
&[funding_input_sats(20_000)],
12314+
Weight::from_wu(300),
12315+
2000,
12316+
20_000,
12317+
).unwrap(),
12318+
0
12319+
);
12320+
}
1223912321
}

0 commit comments

Comments
 (0)