Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
cefef25
Move FundingTxInput::sequence to Utxo
jkczyz Jan 13, 2026
c4c85c3
f - update Utxo::sequence
jkczyz Feb 5, 2026
88b309f
Use FundingTxInput instead of Utxo in CoinSelection
jkczyz Jan 14, 2026
39b2022
f - use OutPoint instead of Utxo in get_prevtx
jkczyz Feb 4, 2026
2243972
f - s/amount/input_amount
jkczyz Feb 5, 2026
01e1e73
Make ClaimId optional in coin selection
jkczyz Jan 28, 2026
eeb7307
f - avoid force_conflicting_utxo_spend without claim_id
jkczyz Feb 4, 2026
b05be85
f - TODO about reusing inputs for splice RBF
jkczyz Feb 10, 2026
011dfe1
Add FundingNeeded event for splicing
jkczyz Dec 18, 2025
55b2838
f - drop FundingTemplate serialization
jkczyz Feb 5, 2026
6f64219
f - add TODO(taproot)
jkczyz Feb 5, 2026
e99a284
f - remove Input serialization
jkczyz Feb 10, 2026
bfab911
f - remove TODO that is no longer relevant
jkczyz Feb 10, 2026
a1e6186
f - don't push back MessageSendEvent::SendSpliceLocked
jkczyz Feb 10, 2026
1a641f7
Use CoinSelection::change_output when splicing
jkczyz Jan 20, 2026
c31c809
Consistently log in propose_quiescence
jkczyz Feb 2, 2026
2e3cc5f
f - log_debug
jkczyz Feb 5, 2026
a0add1c
Run rustfmt on fuzz
jkczyz Feb 2, 2026
353f169
Move wallet utils to dedicated module
jkczyz Jan 28, 2026
95b1ac9
Move sync wallet utils to util::wallet_utils
jkczyz Jan 28, 2026
6daa738
Make ConfirmedUtxo the primary type
jkczyz Jan 28, 2026
eb6451c
Add expect_splice_failed_events helper
jkczyz Feb 6, 2026
57014fa
Split DiscardFunding from SpliceFailed event
jkczyz Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
203 changes: 81 additions & 122 deletions fuzz/src/chanmon_consistency.rs

Large diffs are not rendered by default.

86 changes: 51 additions & 35 deletions fuzz/src/full_stack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use bitcoin::opcodes;
use bitcoin::script::{Builder, ScriptBuf};
use bitcoin::transaction::Version;
use bitcoin::transaction::{Transaction, TxIn, TxOut};
use bitcoin::FeeRate;

use bitcoin::hash_types::{BlockHash, Txid};
use bitcoin::hashes::sha256::Hash as Sha256;
Expand All @@ -30,7 +31,7 @@ use bitcoin::hashes::Hash as _;
use bitcoin::hex::FromHex;
use bitcoin::WPubkeyHash;

use lightning::ln::funding::{FundingTxInput, SpliceContribution};
use lightning::ln::funding::SpliceContribution;

use lightning::blinded_path::message::{BlindedMessagePath, MessageContext, MessageForwardNode};
use lightning::blinded_path::payment::{BlindedPaymentPath, ReceiveTlvs};
Expand All @@ -39,7 +40,6 @@ use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget,
use lightning::chain::chainmonitor;
use lightning::chain::transaction::OutPoint;
use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, Confirm, Listen};
use lightning::events::bump_transaction::sync::WalletSourceSync;
use lightning::events::Event;
use lightning::ln::channel_state::ChannelDetails;
use lightning::ln::channelmanager::{
Expand All @@ -65,12 +65,14 @@ use lightning::sign::{
SignerProvider,
};
use lightning::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
use lightning::util::async_poll::{MaybeSend, MaybeSync};
use lightning::util::config::{ChannelConfig, UserConfig};
use lightning::util::hash_tables::*;
use lightning::util::logger::Logger;
use lightning::util::ser::{Readable, Writeable};
use lightning::util::test_channel_signer::{EnforcementState, TestChannelSigner};
use lightning::util::test_utils::TestWalletSource;
use lightning::util::wallet_utils::{WalletSourceSync, WalletSync};

use lightning_invoice::RawBolt11Invoice;

Expand Down Expand Up @@ -227,7 +229,7 @@ type ChannelMan<'a> = ChannelManager<
Arc<dyn chain::Filter>,
Arc<TestBroadcaster>,
Arc<FuzzEstimator>,
Arc<dyn Logger>,
Arc<dyn Logger + MaybeSend + MaybeSync>,
Arc<TestPersister>,
Arc<KeyProvider>,
>,
Expand All @@ -239,14 +241,20 @@ type ChannelMan<'a> = ChannelManager<
Arc<FuzzEstimator>,
&'a FuzzRouter,
&'a FuzzRouter,
Arc<dyn Logger>,
Arc<dyn Logger + MaybeSend + MaybeSync>,
>;
type PeerMan<'a> = PeerManager<
Peer<'a>,
Arc<ChannelMan<'a>>,
Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn UtxoLookup>, Arc<dyn Logger>>>,
Arc<
P2PGossipSync<
Arc<NetworkGraph<Arc<dyn Logger + MaybeSend + MaybeSync>>>,
Arc<dyn UtxoLookup>,
Arc<dyn Logger + MaybeSend + MaybeSync>,
>,
>,
IgnoringMessageHandler,
Arc<dyn Logger>,
Arc<dyn Logger + MaybeSend + MaybeSync>,
IgnoringMessageHandler,
Arc<KeyProvider>,
IgnoringMessageHandler,
Expand All @@ -260,7 +268,7 @@ struct MoneyLossDetector<'a> {
Arc<dyn chain::Filter>,
Arc<TestBroadcaster>,
Arc<FuzzEstimator>,
Arc<dyn Logger>,
Arc<dyn Logger + MaybeSend + MaybeSync>,
Arc<TestPersister>,
Arc<KeyProvider>,
>,
Expand All @@ -285,7 +293,7 @@ impl<'a> MoneyLossDetector<'a> {
Arc<dyn chain::Filter>,
Arc<TestBroadcaster>,
Arc<FuzzEstimator>,
Arc<dyn Logger>,
Arc<dyn Logger + MaybeSend + MaybeSync>,
Arc<TestPersister>,
Arc<KeyProvider>,
>,
Expand Down Expand Up @@ -520,7 +528,7 @@ impl SignerProvider for KeyProvider {
}

#[inline]
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger + MaybeSend + MaybeSync>) {
if data.len() < 32 {
return;
}
Expand Down Expand Up @@ -668,9 +676,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
script_pubkey: wallet.get_change_script().unwrap(),
}],
};
let coinbase_txid = coinbase_tx.compute_txid();
wallet
.add_utxo(bitcoin::OutPoint { txid: coinbase_txid, vout: 0 }, Amount::from_sat(1_000_000));
wallet.add_utxo(coinbase_tx.clone(), 0);

loop {
match get_slice!(1)[0] {
Expand Down Expand Up @@ -1026,21 +1032,15 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
if splice_in_sats == 0 {
continue;
}
// Create a funding input from the coinbase transaction
if let Ok(input) = FundingTxInput::new_p2wpkh(coinbase_tx.clone(), 0) {
let contribution = SpliceContribution::splice_in(
Amount::from_sat(splice_in_sats.min(900_000)), // Cap at available funds minus fees
vec![input],
Some(wallet.get_change_script().unwrap()),
);
let _ = channelmanager.splice_channel(
&chan.channel_id,
&chan.counterparty.node_id,
contribution,
253, // funding_feerate_per_kw
None,
);
}
let contribution = SpliceContribution::splice_in(
Amount::from_sat(splice_in_sats.min(900_000)), // Cap at available funds minus fees
);
let _ = channelmanager.splice_channel(
&chan.channel_id,
&chan.counterparty.node_id,
contribution,
FeeRate::from_sat_per_kwu(253),
);
},
// Splice-out: remove funds from a channel
51 => {
Expand Down Expand Up @@ -1070,8 +1070,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
&chan.channel_id,
&chan.counterparty.node_id,
contribution,
253, // funding_feerate_per_kw
None,
FeeRate::from_sat_per_kwu(253),
);
},
_ => return,
Expand Down Expand Up @@ -1102,6 +1101,21 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
intercepted_htlcs.push(intercept_id);
}
},
Event::FundingNeeded {
channel_id, counterparty_node_id, funding_template, ..
} => {
let wallet = WalletSync::new(&wallet, Arc::clone(&logger));
let contribution = funding_template.build_sync(&wallet).unwrap();
let locktime = None;
channelmanager
.funding_contributed(
&channel_id,
&counterparty_node_id,
contribution,
locktime,
)
.unwrap();
},
Event::FundingTransactionReadyForSigning {
channel_id,
counterparty_node_id,
Expand All @@ -1128,14 +1142,15 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
}
}

pub fn full_stack_test<Out: test_logger::Output>(data: &[u8], out: Out) {
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new("".to_owned(), out));
pub fn full_stack_test<Out: test_logger::Output + MaybeSend + MaybeSync>(data: &[u8], out: Out) {
let logger: Arc<dyn Logger + MaybeSend + MaybeSync> =
Arc::new(test_logger::TestLogger::new("".to_owned(), out));
do_test(data, &logger);
}

#[no_mangle]
pub extern "C" fn full_stack_run(data: *const u8, datalen: usize) {
let logger: Arc<dyn Logger> =
let logger: Arc<dyn Logger + MaybeSend + MaybeSync> =
Arc::new(test_logger::TestLogger::new("".to_owned(), test_logger::DevNull {}));
do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, &logger);
}
Expand Down Expand Up @@ -1921,6 +1936,7 @@ pub fn write_fst_seeds(path: &str) {

#[cfg(test)]
mod tests {
use lightning::util::async_poll::{MaybeSend, MaybeSync};
use lightning::util::logger::{Logger, Record};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
Expand Down Expand Up @@ -1952,7 +1968,7 @@ mod tests {
let test = super::two_peer_forwarding_seed();

let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger + MaybeSend + MaybeSync>));

let log_entries = logger.lines.lock().unwrap();
// 1
Expand Down Expand Up @@ -1987,7 +2003,7 @@ mod tests {
let test = super::gossip_exchange_seed();

let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger + MaybeSend + MaybeSync>));

let log_entries = logger.lines.lock().unwrap();
assert_eq!(log_entries.get(&("lightning::ln::peer_handler".to_string(), "Sending message to all peers except Some(PublicKey(0000000000000000000000000000000000000000000000000000000000000002ff00000000000000000000000000000000000000000000000000000000000002)) or the announced channel's counterparties: ChannelAnnouncement { node_signature_1: 3026020200b202200303030303030303030303030303030303030303030303030303030303030303, node_signature_2: 3026020200b202200202020202020202020202020202020202020202020202020202020202020202, bitcoin_signature_1: 3026020200b202200303030303030303030303030303030303030303030303030303030303030303, bitcoin_signature_2: 3026020200b202200202020202020202020202020202020202020202020202020202020202020202, contents: UnsignedChannelAnnouncement { features: [], chain_hash: 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000, short_channel_id: 42, node_id_1: NodeId(030303030303030303030303030303030303030303030303030303030303030303), node_id_2: NodeId(020202020202020202020202020202020202020202020202020202020202020202), bitcoin_key_1: NodeId(030303030303030303030303030303030303030303030303030303030303030303), bitcoin_key_2: NodeId(020202020202020202020202020202020202020202020202020202020202020202), excess_data: [] } }".to_string())), Some(&1));
Expand All @@ -2000,7 +2016,7 @@ mod tests {
let test = super::splice_seed();

let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger + MaybeSend + MaybeSync>));

let log_entries = logger.lines.lock().unwrap();

Expand Down
25 changes: 14 additions & 11 deletions fuzz/src/lsps_message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,20 @@ pub fn do_test(data: &[u8]) {
genesis_block.header.time,
));

let liquidity_manager = Arc::new(LiquidityManagerSync::new(
Arc::clone(&keys_manager),
Arc::clone(&keys_manager),
Arc::clone(&manager),
None::<Arc<dyn Filter + Send + Sync>>,
None,
kv_store,
Arc::clone(&tx_broadcaster),
None,
None,
).unwrap());
let liquidity_manager = Arc::new(
LiquidityManagerSync::new(
Arc::clone(&keys_manager),
Arc::clone(&keys_manager),
Arc::clone(&manager),
None::<Arc<dyn Filter + Send + Sync>>,
None,
kv_store,
Arc::clone(&tx_broadcaster),
None,
None,
)
.unwrap(),
);
let mut reader = data;
if let Ok(Some(msg)) = liquidity_manager.read(LSPS_MESSAGE_TYPE_ID, &mut reader) {
let secp = Secp256k1::signing_only();
Expand Down
5 changes: 3 additions & 2 deletions lightning-tests/src/upgrade_downgrade_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ use lightning_0_0_125::routing::router as router_0_0_125;
use lightning_0_0_125::util::ser::Writeable as _;

use lightning::chain::channelmonitor::{ANTI_REORG_DELAY, HTLC_FAIL_BACK_BUFFER};
use lightning::events::bump_transaction::sync::WalletSourceSync;
use lightning::events::{ClosureReason, Event, HTLCHandlingFailureType};
use lightning::util::wallet_utils::WalletSourceSync;
use lightning::ln::functional_test_utils::*;
use lightning::ln::funding::SpliceContribution;
use lightning::ln::msgs::BaseMessageHandler as _;
Expand Down Expand Up @@ -455,7 +455,8 @@ fn do_test_0_1_htlc_forward_after_splice(fail_htlc: bool) {
value: Amount::from_sat(1_000),
script_pubkey: nodes[0].wallet_source.get_change_script().unwrap(),
}]);
let splice_tx = splice_channel(&nodes[0], &nodes[1], ChannelId(chan_id_bytes_a), contribution);
let (splice_tx, _) =
splice_channel(&nodes[0], &nodes[1], ChannelId(chan_id_bytes_a), contribution);
for node in nodes.iter() {
mine_transaction(node, &splice_tx);
connect_blocks(node, ANTI_REORG_DELAY - 1);
Expand Down
Loading