Skip to content

Commit 09de3b7

Browse files
committed
Expose our "offchain balance" in Balances
`Balance` seeks to expose our balance accurate based on what we would get, less fees, if we were to force-close right now. This is great, but for an end-user wallet its not really what you want to display as the "balance" of the wallet. Instead, you want to give a balance which matches the sum of HTLCs received over time, which is only possible when balance information is avilable which ignores things like dust, anchors, fees, and reserve values. Here we provide such a balance - a new "offchain balance" in `HolderCommitmentTransactionBalance`.
1 parent fbf0c61 commit 09de3b7

File tree

6 files changed

+118
-17
lines changed

6 files changed

+118
-17
lines changed

lightning/src/chain/channelmonitor.rs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// This file is Copyright its original authors, visible in version control
1+
// This file is Copyright its original authors, visible in version controlXXX
22
// history.
33
//
44
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
@@ -802,6 +802,18 @@ pub struct HolderCommitmentTransactionBalance {
802802
/// The amount available to claim, in satoshis, excluding the on-chain fees which will be
803803
/// required to do so.
804804
pub amount_satoshis: u64,
805+
/// The amount which is owed to us, excluding HTLCs, before dust limits, fees, anchor outputs,
806+
/// and reserve values.
807+
///
808+
/// If the channel is (eventually) cooperatively closed, and this value is above the channel's
809+
/// dust limit, then we will be paid this on-chain less any fees required for the closure.
810+
///
811+
/// This is generally roughly equal to [`Self::amount_satoshis`] +
812+
/// [`Self::transaction_fee_satoshis`] + any anchor outputs in the current commitment
813+
/// transaction. It might differ slightly due to differences in rounding and HTLC calculation.
814+
///
815+
/// This will be `None` for channels last updated on LDK 0.2 or prior.
816+
pub amount_offchain_satoshis: Option<u64>,
805817
/// The transaction fee we pay for the closing commitment transaction. This amount is not
806818
/// included in the [`HolderCommitmentTransactionBalance::amount_satoshis`] value.
807819
/// This amount includes the sum of dust HTLCs on the commitment transaction, any elided anchors,
@@ -3117,6 +3129,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
31173129
.chain(us.pending_funding.iter())
31183130
.map(|funding| {
31193131
let to_self_value_sat = funding.current_holder_commitment_tx.to_broadcaster_value_sat();
3132+
let to_self_offchain_msat =
3133+
funding.current_holder_commitment_tx.to_broadcaster_value_offchain_msat();
31203134
// In addition to `commit_tx_fee_sat`, this can also include dust HTLCs, any
31213135
// elided anchors, and the total msat amount rounded down from non-dust HTLCs.
31223136
let transaction_fee_satoshis = if us.holder_pays_commitment_tx_fee.unwrap_or(true) {
@@ -3128,6 +3142,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
31283142
};
31293143
HolderCommitmentTransactionBalance {
31303144
amount_satoshis: to_self_value_sat + claimable_inbound_htlc_value_sat,
3145+
amount_offchain_satoshis:
3146+
to_self_offchain_msat.map(|v| v / 1_000 + claimable_inbound_htlc_value_sat),
31313147
transaction_fee_satoshis,
31323148
}
31333149
})
@@ -4556,16 +4572,23 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
45564572
})
45574573
}
45584574

4559-
#[rustfmt::skip]
45604575
fn build_counterparty_commitment_tx(
45614576
&self, channel_parameters: &ChannelTransactionParameters, commitment_number: u64,
45624577
their_per_commitment_point: &PublicKey, to_broadcaster_value: u64,
45634578
to_countersignatory_value: u64, feerate_per_kw: u32,
4564-
nondust_htlcs: Vec<HTLCOutputInCommitment>
4579+
nondust_htlcs: Vec<HTLCOutputInCommitment>,
45654580
) -> CommitmentTransaction {
45664581
let channel_parameters = &channel_parameters.as_counterparty_broadcastable();
4567-
CommitmentTransaction::new(commitment_number, their_per_commitment_point,
4568-
to_broadcaster_value, to_countersignatory_value, feerate_per_kw, nondust_htlcs, channel_parameters, &self.onchain_tx_handler.secp_ctx)
4582+
CommitmentTransaction::new_without_broadcaster_value(
4583+
commitment_number,
4584+
their_per_commitment_point,
4585+
to_broadcaster_value,
4586+
to_countersignatory_value,
4587+
feerate_per_kw,
4588+
nondust_htlcs,
4589+
channel_parameters,
4590+
&self.onchain_tx_handler.secp_ctx,
4591+
)
45694592
}
45704593

45714594
#[rustfmt::skip]

lightning/src/ln/chan_utils.rs

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,9 @@ impl HolderCommitmentTransaction {
13751375
for _ in 0..nondust_htlcs.len() {
13761376
counterparty_htlc_sigs.push(dummy_sig);
13771377
}
1378-
let inner = CommitmentTransaction::new(0, &dummy_key, 0, 0, 0, nondust_htlcs, &channel_parameters.as_counterparty_broadcastable(), &secp_ctx);
1378+
let inner = CommitmentTransaction::new_without_broadcaster_value(
1379+
0, &dummy_key, 0, 0, 0, nondust_htlcs, &channel_parameters.as_counterparty_broadcastable(), &secp_ctx
1380+
);
13791381
HolderCommitmentTransaction {
13801382
inner,
13811383
counterparty_sig: dummy_sig,
@@ -1606,6 +1608,7 @@ impl<'a> TrustedClosingTransaction<'a> {
16061608
#[derive(Clone, Debug)]
16071609
pub struct CommitmentTransaction {
16081610
commitment_number: u64,
1611+
to_broadcaster_value_offchain_msat: Option<u64>,
16091612
to_broadcaster_value_sat: Amount,
16101613
to_countersignatory_value_sat: Amount,
16111614
to_broadcaster_delay: Option<u16>, // Added in 0.0.117
@@ -1626,6 +1629,7 @@ impl PartialEq for CommitmentTransaction {
16261629
#[rustfmt::skip]
16271630
fn eq(&self, o: &Self) -> bool {
16281631
let eq = self.commitment_number == o.commitment_number &&
1632+
self.to_broadcaster_value_offchain_msat == o.to_broadcaster_value_offchain_msat &&
16291633
self.to_broadcaster_value_sat == o.to_broadcaster_value_sat &&
16301634
self.to_countersignatory_value_sat == o.to_countersignatory_value_sat &&
16311635
self.feerate_per_kw == o.feerate_per_kw &&
@@ -1655,6 +1659,7 @@ impl Writeable for CommitmentTransaction {
16551659
(12, self.nondust_htlcs, required_vec),
16561660
(14, legacy_deserialization_prevention_marker, option),
16571661
(15, self.channel_type_features, required),
1662+
(17, self.to_broadcaster_value_offchain_msat, option),
16581663
});
16591664
Ok(())
16601665
}
@@ -1674,6 +1679,7 @@ impl Readable for CommitmentTransaction {
16741679
(12, nondust_htlcs, required_vec),
16751680
(14, _legacy_deserialization_prevention_marker, (option, explicit_type: ())),
16761681
(15, channel_type_features, option),
1682+
(17, to_broadcaster_value_offchain_msat, option),
16771683
});
16781684

16791685
let mut additional_features = ChannelTypeFeatures::empty();
@@ -1683,6 +1689,7 @@ impl Readable for CommitmentTransaction {
16831689
Ok(Self {
16841690
commitment_number: commitment_number.0.unwrap(),
16851691
to_broadcaster_value_sat: to_broadcaster_value_sat.0.unwrap(),
1692+
to_broadcaster_value_offchain_msat,
16861693
to_countersignatory_value_sat: to_countersignatory_value_sat.0.unwrap(),
16871694
to_broadcaster_delay,
16881695
feerate_per_kw: feerate_per_kw.0.unwrap(),
@@ -1700,8 +1707,55 @@ impl CommitmentTransaction {
17001707
/// All HTLCs MUST be above the dust limit for the channel.
17011708
/// The broadcaster and countersignatory amounts MUST be either 0 or above dust. If the amount
17021709
/// is 0, the corresponding output will be omitted from the transaction.
1710+
pub fn new(
1711+
commitment_number: u64, per_commitment_point: &PublicKey, to_broadcaster_value_sat: u64,
1712+
to_broadcaster_value_offchain_msat: u64, to_countersignatory_value_sat: u64,
1713+
feerate_per_kw: u32, nondust_htlcs: Vec<HTLCOutputInCommitment>,
1714+
channel_parameters: &DirectedChannelTransactionParameters,
1715+
secp_ctx: &Secp256k1<secp256k1::All>,
1716+
) -> CommitmentTransaction {
1717+
debug_assert!(to_broadcaster_value_sat * 1000 <= to_broadcaster_value_offchain_msat);
1718+
Self::build(
1719+
commitment_number,
1720+
per_commitment_point,
1721+
to_broadcaster_value_sat,
1722+
Some(to_broadcaster_value_offchain_msat),
1723+
to_countersignatory_value_sat,
1724+
feerate_per_kw,
1725+
nondust_htlcs,
1726+
channel_parameters,
1727+
secp_ctx,
1728+
)
1729+
}
1730+
1731+
pub(crate) fn new_without_broadcaster_value(
1732+
commitment_number: u64, per_commitment_point: &PublicKey, to_broadcaster_value_sat: u64,
1733+
to_countersignatory_value_sat: u64, feerate_per_kw: u32,
1734+
nondust_htlcs: Vec<HTLCOutputInCommitment>,
1735+
channel_parameters: &DirectedChannelTransactionParameters,
1736+
secp_ctx: &Secp256k1<secp256k1::All>,
1737+
) -> CommitmentTransaction {
1738+
Self::build(
1739+
commitment_number,
1740+
per_commitment_point,
1741+
to_broadcaster_value_sat,
1742+
None,
1743+
to_countersignatory_value_sat,
1744+
feerate_per_kw,
1745+
nondust_htlcs,
1746+
channel_parameters,
1747+
secp_ctx,
1748+
)
1749+
}
1750+
17031751
#[rustfmt::skip]
1704-
pub fn new(commitment_number: u64, per_commitment_point: &PublicKey, to_broadcaster_value_sat: u64, to_countersignatory_value_sat: u64, feerate_per_kw: u32, mut nondust_htlcs: Vec<HTLCOutputInCommitment>, channel_parameters: &DirectedChannelTransactionParameters, secp_ctx: &Secp256k1<secp256k1::All>) -> CommitmentTransaction {
1752+
fn build(
1753+
commitment_number: u64, per_commitment_point: &PublicKey, to_broadcaster_value_sat: u64,
1754+
to_broadcaster_value_offchain_msat: Option<u64>, to_countersignatory_value_sat: u64,
1755+
feerate_per_kw: u32, mut nondust_htlcs: Vec<HTLCOutputInCommitment>,
1756+
channel_parameters: &DirectedChannelTransactionParameters,
1757+
secp_ctx: &Secp256k1<secp256k1::All>,
1758+
) -> CommitmentTransaction {
17051759
let to_broadcaster_value_sat = Amount::from_sat(to_broadcaster_value_sat);
17061760
let to_countersignatory_value_sat = Amount::from_sat(to_countersignatory_value_sat);
17071761
let keys = TxCreationKeys::from_channel_static_keys(per_commitment_point, channel_parameters.broadcaster_pubkeys(), channel_parameters.countersignatory_pubkeys(), secp_ctx);
@@ -1717,6 +1771,7 @@ impl CommitmentTransaction {
17171771
CommitmentTransaction {
17181772
commitment_number,
17191773
to_broadcaster_value_sat,
1774+
to_broadcaster_value_offchain_msat,
17201775
to_countersignatory_value_sat,
17211776
to_broadcaster_delay: Some(channel_parameters.contest_delay()),
17221777
feerate_per_kw,
@@ -2034,6 +2089,12 @@ impl CommitmentTransaction {
20342089
self.keys.per_commitment_point
20352090
}
20362091

2092+
/// The value which is owed the broadcaster (excluding HTLCs) before reductions due to dust
2093+
/// limits, being rounded down to the nearest sat, reserve value(s).
2094+
pub fn to_broadcaster_value_offchain_msat(&self) -> Option<u64> {
2095+
self.to_broadcaster_value_offchain_msat
2096+
}
2097+
20372098
/// The value to be sent to the broadcaster
20382099
pub fn to_broadcaster_value_sat(&self) -> u64 {
20392100
self.to_broadcaster_value_sat.to_sat()
@@ -2324,7 +2385,7 @@ mod tests {
23242385

23252386
#[rustfmt::skip]
23262387
fn build(&self, to_broadcaster_sats: u64, to_countersignatory_sats: u64, nondust_htlcs: Vec<HTLCOutputInCommitment>) -> CommitmentTransaction {
2327-
CommitmentTransaction::new(
2388+
CommitmentTransaction::new_without_broadcaster_value(
23282389
self.commitment_number, &self.per_commitment_point, to_broadcaster_sats, to_countersignatory_sats, self.feerate_per_kw,
23292390
nondust_htlcs, &self.channel_parameters.as_holder_broadcastable(), &self.secp_ctx
23302391
)

lightning/src/ln/htlc_reserve_unit_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2346,7 +2346,7 @@ pub fn do_test_dust_limit_fee_accounting(can_afford: bool) {
23462346
get_channel_ref!(nodes[0], nodes[1], per_peer_lock, peer_state_lock, chan_id);
23472347
let chan_signer = channel.as_funded().unwrap().get_signer();
23482348

2349-
let commitment_tx = CommitmentTransaction::new(
2349+
let commitment_tx = CommitmentTransaction::new_without_broadcaster_value(
23502350
commitment_number,
23512351
&remote_point,
23522352
node_1_balance_sat,

lightning/src/ln/monitor_tests.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ fn do_chanmon_claim_value_coop_close(keyed_anchors: bool, p2a_anchor: bool) {
338338
assert_eq!(vec![Balance::ClaimableOnChannelClose {
339339
balance_candidates: vec![HolderCommitmentTransactionBalance {
340340
amount_satoshis: 1_000_000 - 1_000 - commitment_tx_fee - anchor_outputs_value,
341+
amount_offchain_satoshis: Some(1_000_000 - 1_000),
341342
transaction_fee_satoshis: commitment_tx_fee,
342343
}],
343344
confirmed_balance_candidate_index: 0,
@@ -350,6 +351,7 @@ fn do_chanmon_claim_value_coop_close(keyed_anchors: bool, p2a_anchor: bool) {
350351
assert_eq!(vec![Balance::ClaimableOnChannelClose {
351352
balance_candidates: vec![HolderCommitmentTransactionBalance {
352353
amount_satoshis: 1_000,
354+
amount_offchain_satoshis: Some(1_000),
353355
transaction_fee_satoshis: 0,
354356
}],
355357
confirmed_balance_candidate_index: 0,
@@ -537,10 +539,12 @@ fn do_test_claim_value_force_close(keyed_anchors: bool, p2a_anchor: bool, prev_c
537539
let commitment_tx_fee = chan_feerate as u64 *
538540
(chan_utils::commitment_tx_base_weight(&channel_type_features) + 2 * chan_utils::COMMITMENT_TX_WEIGHT_PER_HTLC) / 1000;
539541
let anchor_outputs_value = if keyed_anchors { 2 * channel::ANCHOR_OUTPUT_VALUE_SATOSHI } else { 0 };
540-
let amount_satoshis = 1_000_000 - 3_000 - 4_000 - 1_000 - 3 - commitment_tx_fee - anchor_outputs_value - 1; /* msat amount that is burned to fees */
542+
let amount_offchain_satoshis = 1_000_000 - 3_000 - 4_000 - 1_000 - 3 - 1 /* msat amount that is burned to fees */;
543+
let amount_satoshis = amount_offchain_satoshis - commitment_tx_fee - anchor_outputs_value;
541544
assert_eq!(sorted_vec(vec![Balance::ClaimableOnChannelClose {
542545
balance_candidates: vec![HolderCommitmentTransactionBalance {
543546
amount_satoshis,
547+
amount_offchain_satoshis: Some(amount_offchain_satoshis),
544548
// In addition to `commitment_tx_fee`, this also includes the dust HTLC, and the total msat amount rounded down from non-dust HTLCs
545549
transaction_fee_satoshis: if p2a_anchor { 0 } else { 1_000_000 - 4_000 - 3_000 - 1_000 - amount_satoshis - anchor_outputs_value },
546550
}],
@@ -554,6 +558,7 @@ fn do_test_claim_value_force_close(keyed_anchors: bool, p2a_anchor: bool, prev_c
554558
assert_eq!(sorted_vec(vec![Balance::ClaimableOnChannelClose {
555559
balance_candidates: vec![HolderCommitmentTransactionBalance {
556560
amount_satoshis: 1_000,
561+
amount_offchain_satoshis: Some(1_000),
557562
transaction_fee_satoshis: 0,
558563
}],
559564
confirmed_balance_candidate_index: 0,
@@ -600,17 +605,19 @@ fn do_test_claim_value_force_close(keyed_anchors: bool, p2a_anchor: bool, prev_c
600605
let commitment_tx_fee = chan_feerate as u64 *
601606
(chan_utils::commitment_tx_base_weight(&channel_type_features) +
602607
if prev_commitment_tx { 1 } else { 2 } * chan_utils::COMMITMENT_TX_WEIGHT_PER_HTLC) / 1000;
603-
let amount_satoshis = 1_000_000 - // Channel funding value in satoshis
608+
let amount_offchain_satoshis = 1_000_000 - // Channel funding value in satoshis
604609
4_000 - // The to-be-failed HTLC value in satoshis
605610
3_000 - // The claimed HTLC value in satoshis
606611
1_000 - // The push_msat value in satoshis
607612
3 - // The dust HTLC value in satoshis
608-
commitment_tx_fee - // The commitment transaction fee with two HTLC outputs
609-
anchor_outputs_value - // The anchor outputs value in satoshis
610613
1; // The rounded up msat part of the one HTLC
614+
let amount_satoshis = amount_offchain_satoshis -
615+
commitment_tx_fee - // The commitment transaction fee with two HTLC outputs
616+
anchor_outputs_value; // The anchor outputs value in satoshis
611617
let mut a_expected_balances = vec![Balance::ClaimableOnChannelClose {
612618
balance_candidates: vec![HolderCommitmentTransactionBalance {
613-
amount_satoshis, // Channel funding value in satoshis
619+
amount_satoshis,
620+
amount_offchain_satoshis: Some(amount_offchain_satoshis),
614621
// In addition to `commitment_tx_fee`, this also includes the dust HTLC, and the total msat amount rounded down from non-dust HTLCs
615622
transaction_fee_satoshis: if p2a_anchor { 0 } else { 1_000_000 - 4_000 - 3_000 - 1_000 - amount_satoshis - anchor_outputs_value },
616623
}],
@@ -629,6 +636,7 @@ fn do_test_claim_value_force_close(keyed_anchors: bool, p2a_anchor: bool, prev_c
629636
assert_eq!(vec![Balance::ClaimableOnChannelClose {
630637
balance_candidates: vec![HolderCommitmentTransactionBalance {
631638
amount_satoshis: 1_000 + 3_000 + 4_000,
639+
amount_offchain_satoshis: Some(1_000 + 3_000 + 4_000),
632640
transaction_fee_satoshis: 0,
633641
}],
634642
confirmed_balance_candidate_index: 0,
@@ -1168,6 +1176,7 @@ fn test_no_preimage_inbound_htlc_balances() {
11681176
assert_eq!(sorted_vec(vec![Balance::ClaimableOnChannelClose {
11691177
balance_candidates: vec![HolderCommitmentTransactionBalance {
11701178
amount_satoshis: 1_000_000 - 500_000 - 10_000 - commitment_tx_fee,
1179+
amount_offchain_satoshis: Some(1_000_000 - 500_000 - 10_000),
11711180
transaction_fee_satoshis: commitment_tx_fee,
11721181
}],
11731182
confirmed_balance_candidate_index: 0,
@@ -1181,6 +1190,7 @@ fn test_no_preimage_inbound_htlc_balances() {
11811190
assert_eq!(sorted_vec(vec![Balance::ClaimableOnChannelClose {
11821191
balance_candidates: vec![HolderCommitmentTransactionBalance {
11831192
amount_satoshis: 500_000 - 20_000,
1193+
amount_offchain_satoshis: Some(500_000 - 20_000),
11841194
transaction_fee_satoshis: 0,
11851195
}],
11861196
confirmed_balance_candidate_index: 0,
@@ -1480,6 +1490,7 @@ fn do_test_revoked_counterparty_commitment_balances(keyed_anchors: bool, p2a_anc
14801490
Balance::ClaimableOnChannelClose {
14811491
balance_candidates: vec![HolderCommitmentTransactionBalance {
14821492
amount_satoshis: 100_000 - 5_000 - 4_000 - 3 - 2_000 + 3_000 - 1 /* rounded up msat parts of HTLCs */,
1493+
amount_offchain_satoshis: Some(100_000 - 5_000 - 4_000 - 3 - 2_000 + 3_000 - 1) /* rounded up msat parts of HTLCs */,
14831494
transaction_fee_satoshis: 0,
14841495
}],
14851496
confirmed_balance_candidate_index: 0,
@@ -2026,6 +2037,7 @@ fn do_test_revoked_counterparty_aggregated_claims(keyed_anchors: bool, p2a_ancho
20262037
assert_eq!(sorted_vec(vec![Balance::ClaimableOnChannelClose {
20272038
balance_candidates: vec![HolderCommitmentTransactionBalance {
20282039
amount_satoshis: 100_000 - 4_000 - 3_000 - 1 /* rounded up msat parts of HTLCs */,
2040+
amount_offchain_satoshis: Some(100_000 - 4_000 - 3_000 - 1) /* rounded up msat parts of HTLCs */,
20292041
transaction_fee_satoshis: 0,
20302042
}],
20312043
confirmed_balance_candidate_index: 0,

lightning/src/ln/update_fee_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ pub fn do_test_update_fee_that_funder_cannot_afford(channel_type_features: Chann
489489
let local_chan_signer = local_chan.as_funded().unwrap().get_signer();
490490

491491
let nondust_htlcs: Vec<HTLCOutputInCommitment> = vec![];
492-
let commitment_tx = CommitmentTransaction::new(
492+
let commitment_tx = CommitmentTransaction::new_without_broadcaster_value(
493493
INITIAL_COMMITMENT_NUMBER - 1,
494494
&remote_point,
495495
push_sats,
@@ -590,7 +590,7 @@ pub fn test_update_fee_that_saturates_subs() {
590590
get_channel_ref!(nodes[0], nodes[1], per_peer_lock, peer_state_lock, chan_id);
591591
let local_chan_signer = local_chan.as_funded().unwrap().get_signer();
592592
let nondust_htlcs: Vec<HTLCOutputInCommitment> = vec![];
593-
let commitment_tx = CommitmentTransaction::new(
593+
let commitment_tx = CommitmentTransaction::new_without_broadcaster_value(
594594
INITIAL_COMMITMENT_NUMBER,
595595
&remote_point,
596596
8500,

lightning/src/sign/tx_builder.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,11 @@ impl TxBuilder for SpecTxBuilder {
417417
)
418418
};
419419

420-
let mut to_broadcaster_value_sat = if local { value_to_self } else { value_to_remote };
420+
let (mut to_broadcaster_value_sat, to_broadcaster_value_offchain_msat) = if local {
421+
(value_to_self, value_to_self_after_htlcs_msat)
422+
} else {
423+
(value_to_remote, value_to_remote_after_htlcs_msat)
424+
};
421425
let mut to_countersignatory_value_sat = if local { value_to_remote } else { value_to_self };
422426

423427
if to_broadcaster_value_sat >= broadcaster_dust_limit_satoshis {
@@ -451,6 +455,7 @@ impl TxBuilder for SpecTxBuilder {
451455
commitment_number,
452456
per_commitment_point,
453457
to_broadcaster_value_sat,
458+
to_broadcaster_value_offchain_msat,
454459
to_countersignatory_value_sat,
455460
feerate_per_kw,
456461
htlcs_in_tx,

0 commit comments

Comments
 (0)