diff --git a/Cargo.toml b/Cargo.toml index 62b6e2ec..9fe23423 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,6 @@ members = [ ] [patch.crates-io] -lightning = { git = "https://github.com/p2pderivatives/rust-lightning/", rev = "47c8479" } -lightning-net-tokio = { git = "https://github.com/p2pderivatives/rust-lightning/", rev = "47c8479" } -lightning-persister = { git = "https://github.com/p2pderivatives/rust-lightning/", rev = "47c8479" } +lightning = { git = "https://github.com/p2pderivatives/rust-lightning/", rev = "b11794d6" } +lightning-net-tokio = { git = "https://github.com/p2pderivatives/rust-lightning/", rev = "b11794d6" } +lightning-persister = { git = "https://github.com/p2pderivatives/rust-lightning/", rev = "b11794d6" } diff --git a/bitcoin-rpc-provider/Cargo.toml b/bitcoin-rpc-provider/Cargo.toml index bbde2e17..0e150c50 100644 --- a/bitcoin-rpc-provider/Cargo.toml +++ b/bitcoin-rpc-provider/Cargo.toml @@ -9,7 +9,7 @@ bitcoin = {version = "0.29.2"} bitcoincore-rpc = {version = "0.16.0"} bitcoincore-rpc-json = {version = "0.16.0"} dlc-manager = {path = "../dlc-manager"} -lightning = {version = "0.0.114"} +lightning = {version = "0.0.116"} log = "0.4.14" rust-bitcoin-coin-selection = {version = "0.1.0", git = "https://github.com/p2pderivatives/rust-bitcoin-coin-selection", features = ["rand"]} simple-wallet = {path = "../simple-wallet"} diff --git a/bitcoin-rpc-provider/src/lib.rs b/bitcoin-rpc-provider/src/lib.rs index 94fabd12..13e7c9ca 100644 --- a/bitcoin-rpc-provider/src/lib.rs +++ b/bitcoin-rpc-provider/src/lib.rs @@ -25,18 +25,11 @@ use rust_bitcoin_coin_selection::select_coins; /// The minimum feerate we are allowed to send, as specify by LDK. const MIN_FEERATE: u32 = 253; -#[derive(Clone, Eq, Hash, PartialEq)] -pub enum Target { - Background, - Normal, - HighPriority, -} - pub struct BitcoinCoreProvider { client: Arc>, // Used to implement the FeeEstimator interface, heavily inspired by // https://github.com/lightningdevkit/ldk-sample/blob/main/src/bitcoind_client.rs#L26 - fees: Arc>, + fees: Arc>, } #[derive(Debug)] @@ -107,10 +100,10 @@ impl BitcoinCoreProvider { pub fn new_from_rpc_client(rpc_client: Client) -> Self { let client = Arc::new(Mutex::new(rpc_client)); - let mut fees: HashMap = HashMap::new(); - fees.insert(Target::Background, AtomicU32::new(MIN_FEERATE)); - fees.insert(Target::Normal, AtomicU32::new(2000)); - fees.insert(Target::HighPriority, AtomicU32::new(5000)); + let mut fees: HashMap = HashMap::new(); + fees.insert(ConfirmationTarget::Background, AtomicU32::new(MIN_FEERATE)); + fees.insert(ConfirmationTarget::Normal, AtomicU32::new(2000)); + fees.insert(ConfirmationTarget::HighPriority, AtomicU32::new(5000)); let fees = Arc::new(fees); poll_for_fee_estimates(client.clone(), fees.clone()); BitcoinCoreProvider { client, fees } @@ -372,35 +365,22 @@ impl Blockchain for BitcoinCoreProvider { } impl FeeEstimator for BitcoinCoreProvider { - fn get_est_sat_per_1000_weight( - &self, - confirmation_target: lightning::chain::chaininterface::ConfirmationTarget, - ) -> u32 { - match confirmation_target { - ConfirmationTarget::Background => self - .fees - .get(&Target::Background) - .unwrap() - .load(Ordering::Acquire), - ConfirmationTarget::Normal => self - .fees - .get(&Target::Normal) - .unwrap() - .load(Ordering::Acquire), - ConfirmationTarget::HighPriority => self - .fees - .get(&Target::HighPriority) - .unwrap() - .load(Ordering::Acquire), - } + fn get_est_sat_per_1000_weight(&self, confirmation_target: ConfirmationTarget) -> u32 { + self.fees + .get(&confirmation_target) + .unwrap() + .load(Ordering::Acquire) } } -fn poll_for_fee_estimates(client: Arc>, fees: Arc>) { +fn poll_for_fee_estimates( + client: Arc>, + fees: Arc>, +) { std::thread::spawn(move || loop { match query_fee_estimate(&client, 144, EstimateMode::Economical) { Ok(fee_rate) => { - fees.get(&Target::Background) + fees.get(&ConfirmationTarget::Background) .unwrap() .store(fee_rate, Ordering::Release); } @@ -410,7 +390,7 @@ fn poll_for_fee_estimates(client: Arc>, fees: Arc { - fees.get(&Target::Normal) + fees.get(&ConfirmationTarget::Normal) .unwrap() .store(fee_rate, Ordering::Release); } @@ -420,7 +400,7 @@ fn poll_for_fee_estimates(client: Arc>, fees: Arc { - fees.get(&Target::HighPriority) + fees.get(&ConfirmationTarget::HighPriority) .unwrap() .store(fee_rate, Ordering::Release); } diff --git a/dlc-manager/Cargo.toml b/dlc-manager/Cargo.toml index 78df49e3..08343a38 100644 --- a/dlc-manager/Cargo.toml +++ b/dlc-manager/Cargo.toml @@ -19,7 +19,7 @@ bitcoin = {version = "0.29.2"} dlc = {version = "0.4.0", path = "../dlc"} dlc-messages = {version = "0.4.0", path = "../dlc-messages"} dlc-trie = {version = "0.4.0", path = "../dlc-trie"} -lightning = {version = "0.0.114"} +lightning = {version = "0.0.116"} log = "0.4.14" rand_chacha = {version = "0.3.1", optional = true} secp256k1-zkp = {version = "0.7.0", features = ["bitcoin_hashes", "rand", "rand-std"]} @@ -37,8 +37,8 @@ dlc-manager = {path = ".", features = ["use-serde"]} dlc-messages = {path = "../dlc-messages", features = ["serde"]} electrs-blockchain-provider = {path = "../electrs-blockchain-provider"} env_logger = "0.9.1" -lightning-persister = {version = "0.0.114"} -lightning-transaction-sync = {version = "0.0.114", features=["esplora-blocking"]} +lightning-persister = {version = "0.0.116"} +lightning-transaction-sync = {version = "0.0.116", features=["esplora-blocking"]} mocks = {path = "../mocks"} secp256k1-zkp = {version = "0.7.0", features = ["bitcoin_hashes", "rand", "rand-std", "global-context", "use-serde"]} serde = "1.0" diff --git a/dlc-manager/src/sub_channel_manager.rs b/dlc-manager/src/sub_channel_manager.rs index 148633da..14bee05b 100644 --- a/dlc-manager/src/sub_channel_manager.rs +++ b/dlc-manager/src/sub_channel_manager.rs @@ -16,7 +16,8 @@ use dlc_messages::{ FundingSignatures, SubChannelMessage, }; use lightning::{ - chain::{chaininterface::FeeEstimator, keysinterface::ChannelSigner}, + chain::chaininterface::FeeEstimator, + events::{ClosureReason, MessageSendEventsProvider}, ln::{ chan_utils::{ build_commitment_secret, derive_private_key, derive_private_revocation_key, @@ -25,9 +26,9 @@ use lightning::{ channelmanager::ChannelDetails, msgs::{ChannelMessageHandler, DecodeError, RevokeAndACK}, }, - util::{errors::APIError, events::MessageSendEventsProvider}, + sign::ChannelSigner, util::{ - events::ClosureReason, + errors::APIError, ser::{Readable, Writeable, Writer}, }, }; @@ -3865,6 +3866,92 @@ where self.ln_channel_manager .provided_init_features(their_node_id) } + + fn handle_open_channel_v2( + &self, + their_node_id: &PublicKey, + msg: &lightning::ln::msgs::OpenChannelV2, + ) { + self.ln_channel_manager + .handle_open_channel_v2(their_node_id, msg) + } + + fn handle_accept_channel_v2( + &self, + their_node_id: &PublicKey, + msg: &lightning::ln::msgs::AcceptChannelV2, + ) { + self.ln_channel_manager + .handle_accept_channel_v2(their_node_id, msg) + } + + fn handle_tx_add_input( + &self, + their_node_id: &PublicKey, + msg: &lightning::ln::msgs::TxAddInput, + ) { + self.ln_channel_manager + .handle_tx_add_input(their_node_id, msg) + } + + fn handle_tx_add_output( + &self, + their_node_id: &PublicKey, + msg: &lightning::ln::msgs::TxAddOutput, + ) { + self.ln_channel_manager + .handle_tx_add_output(their_node_id, msg) + } + + fn handle_tx_remove_input( + &self, + their_node_id: &PublicKey, + msg: &lightning::ln::msgs::TxRemoveInput, + ) { + self.ln_channel_manager + .handle_tx_remove_input(their_node_id, msg) + } + + fn handle_tx_remove_output( + &self, + their_node_id: &PublicKey, + msg: &lightning::ln::msgs::TxRemoveOutput, + ) { + self.ln_channel_manager + .handle_tx_remove_output(their_node_id, msg) + } + + fn handle_tx_complete(&self, their_node_id: &PublicKey, msg: &lightning::ln::msgs::TxComplete) { + self.ln_channel_manager + .handle_tx_complete(their_node_id, msg) + } + + fn handle_tx_signatures( + &self, + their_node_id: &PublicKey, + msg: &lightning::ln::msgs::TxSignatures, + ) { + self.ln_channel_manager + .handle_tx_signatures(their_node_id, msg) + } + + fn handle_tx_init_rbf(&self, their_node_id: &PublicKey, msg: &lightning::ln::msgs::TxInitRbf) { + self.ln_channel_manager + .handle_tx_init_rbf(their_node_id, msg) + } + + fn handle_tx_ack_rbf(&self, their_node_id: &PublicKey, msg: &lightning::ln::msgs::TxAckRbf) { + self.ln_channel_manager + .handle_tx_ack_rbf(their_node_id, msg) + } + + fn handle_tx_abort(&self, their_node_id: &PublicKey, msg: &lightning::ln::msgs::TxAbort) { + self.ln_channel_manager.handle_tx_abort(their_node_id, msg) + } + + fn get_genesis_hashes(&self) -> Option> { + self.ln_channel_manager.get_genesis_hashes() + } } impl< @@ -3892,14 +3979,11 @@ where F::Target: FeeEstimator, SP::Target: LnDlcSignerProvider, { - fn get_and_clear_pending_msg_events(&self) -> Vec { + fn get_and_clear_pending_msg_events(&self) -> Vec { let mut msg_events = self.ln_channel_manager.get_and_clear_pending_msg_events(); for event in msg_events.iter_mut() { - if let lightning::util::events::MessageSendEvent::SendChannelReestablish { - msg, .. - } = event - { + if let lightning::events::MessageSendEvent::SendChannelReestablish { msg, .. } = event { match self.dlc_channel_manager.get_store().get_sub_channel(msg.channel_id) { Err(e) => error!("Unexpected error {} trying to retrieve sub channel {:?} during sending of reestablish.", e, msg.channel_id), Ok(None) => trace!("No sub channel with id {:?} to reestablish", msg.channel_id), diff --git a/dlc-manager/src/subchannel/mod.rs b/dlc-manager/src/subchannel/mod.rs index 2c2cf907..2a3a9960 100644 --- a/dlc-manager/src/subchannel/mod.rs +++ b/dlc-manager/src/subchannel/mod.rs @@ -9,7 +9,6 @@ use lightning::{ chain::{ chaininterface::{BroadcasterInterface, FeeEstimator}, chainmonitor::ChainMonitor, - keysinterface::{EntropySource, NodeSigner, SignerProvider, WriteableEcdsaChannelSigner}, Watch, }, ln::{ @@ -18,6 +17,7 @@ use lightning::{ msgs::{ChannelMessageHandler, CommitmentSigned, RevokeAndACK}, }, routing::router::Router, + sign::{EntropySource, NodeSigner, SignerProvider, WriteableEcdsaChannelSigner}, util::{errors::APIError, logger::Logger}, }; use secp256k1_zkp::{ecdsa::Signature, EcdsaAdaptorSignature, PublicKey, SecretKey}; @@ -376,7 +376,7 @@ pub struct ClosingSubChannel { /// Provides the ability to access and update Lightning Network channels. pub trait LNChannelManager: ChannelMessageHandler where - SP: lightning::chain::keysinterface::ChannelSigner, + SP: lightning::sign::ChannelSigner, { /// Returns the details of the channel with given `channel_id` if found. fn get_channel_details(&self, channel_id: &ChannelId) -> Option; diff --git a/dlc-manager/tests/custom_signer.rs b/dlc-manager/tests/custom_signer.rs index cc70094e..cfb1219e 100644 --- a/dlc-manager/tests/custom_signer.rs +++ b/dlc-manager/tests/custom_signer.rs @@ -1,4 +1,7 @@ -use std::sync::{Arc, Mutex}; +use std::{ + ops::Deref, + sync::{Arc, Mutex}, +}; use bitcoin::{Script, Transaction, TxOut}; use dlc_manager::{ @@ -6,12 +9,12 @@ use dlc_manager::{ subchannel::{LnDlcChannelSigner, LnDlcSignerProvider}, }; use lightning::{ - chain::keysinterface::{ - ChannelSigner, EcdsaChannelSigner, EntropySource, ExtraSign, InMemorySigner, KeysManager, - NodeSigner, SignerProvider, SpendableOutputDescriptor, WriteableEcdsaChannelSigner, - }, ln::{chan_utils::ChannelPublicKeys, msgs::DecodeError, script::ShutdownScript}, - util::ser::{Readable, Writeable}, + sign::{ + ChannelSigner, EcdsaChannelSigner, EntropySource, InMemorySigner, KeysManager, NodeSigner, + SignerProvider, SpendableOutputDescriptor, WriteableEcdsaChannelSigner, + }, + util::ser::{ReadableArgs, Writeable}, }; use secp256k1_zkp::{Secp256k1, SecretKey, Signing}; @@ -86,6 +89,13 @@ impl ChannelSigner for CustomSigner { .unwrap() .provide_channel_parameters(channel_parameters) } + + fn set_channel_value_satoshis(&mut self, value: u64) { + self.in_memory_signer + .lock() + .unwrap() + .set_channel_value_satoshis(value) + } } impl EcdsaChannelSigner for CustomSigner { @@ -222,24 +232,18 @@ impl EcdsaChannelSigner for CustomSigner { .unwrap() .sign_channel_announcement_with_funding_key(msg, secp_ctx) } -} -impl ExtraSign for CustomSigner { - fn sign_with_fund_key_callback(&self, cb: &mut F) - where - F: FnMut(&secp256k1_zkp::SecretKey), - { - self.in_memory_signer - .lock() - .unwrap() - .sign_with_fund_key_callback(cb) - } - - fn set_channel_value_satoshis(&mut self, value: u64) { + fn sign_holder_htlc_transaction( + &self, + htlc_tx: &Transaction, + input: usize, + htlc_descriptor: &lightning::events::bump_transaction::HTLCDescriptor, + secp_ctx: &Secp256k1, + ) -> Result { self.in_memory_signer .lock() .unwrap() - .set_channel_value_satoshis(value) + .sign_holder_htlc_transaction(htlc_tx, input, htlc_descriptor, secp_ctx) } } @@ -249,9 +253,12 @@ impl Writeable for CustomSigner { } } -impl Readable for CustomSigner { - fn read(reader: &mut R) -> Result { - let in_memory_signer = InMemorySigner::read(reader)?; +impl ReadableArgs for CustomSigner +where + ES::Target: EntropySource, +{ + fn read(reader: &mut R, entropy_source: ES) -> Result { + let in_memory_signer = InMemorySigner::read(reader, entropy_source)?; Ok(Self::new(in_memory_signer)) } } @@ -322,6 +329,7 @@ impl CustomKeysManager { outputs, change_destination_script, feerate_sat_per_1000_weight, + None, secp_ctx, ) } @@ -356,14 +364,14 @@ impl SignerProvider for CustomKeysManager { } fn read_chan_signer(&self, reader: &[u8]) -> Result { - CustomSigner::read(&mut std::io::Cursor::new(reader)) + CustomSigner::read(&mut std::io::Cursor::new(reader), self) } - fn get_destination_script(&self) -> Script { + fn get_destination_script(&self) -> Result { self.keys_manager.get_destination_script() } - fn get_shutdown_scriptpubkey(&self) -> ShutdownScript { + fn get_shutdown_scriptpubkey(&self) -> Result { self.keys_manager.get_shutdown_scriptpubkey() } } @@ -385,20 +393,20 @@ impl EntropySource for CustomKeysManager { } impl NodeSigner for CustomKeysManager { - fn get_inbound_payment_key_material(&self) -> lightning::chain::keysinterface::KeyMaterial { + fn get_inbound_payment_key_material(&self) -> lightning::sign::KeyMaterial { self.keys_manager.get_inbound_payment_key_material() } fn get_node_id( &self, - recipient: lightning::chain::keysinterface::Recipient, + recipient: lightning::sign::Recipient, ) -> Result { self.keys_manager.get_node_id(recipient) } fn ecdh( &self, - recipient: lightning::chain::keysinterface::Recipient, + recipient: lightning::sign::Recipient, other_key: &secp256k1_zkp::PublicKey, tweak: Option<&secp256k1_zkp::Scalar>, ) -> Result { @@ -409,7 +417,7 @@ impl NodeSigner for CustomKeysManager { &self, hrp_bytes: &[u8], invoice_data: &[bitcoin::bech32::u5], - recipient: lightning::chain::keysinterface::Recipient, + recipient: lightning::sign::Recipient, ) -> Result { self.keys_manager .sign_invoice(hrp_bytes, invoice_data, recipient) diff --git a/dlc-manager/tests/ln_dlc_channel_execution_tests.rs b/dlc-manager/tests/ln_dlc_channel_execution_tests.rs index a4c9e204..262c57c6 100644 --- a/dlc-manager/tests/ln_dlc_channel_execution_tests.rs +++ b/dlc-manager/tests/ln_dlc_channel_execution_tests.rs @@ -34,23 +34,20 @@ use electrs_blockchain_provider::{ElectrsBlockchainProvider, OutSpendResp}; use lightning::{ chain::{ chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator}, - keysinterface::{EntropySource, KeysManager}, BestBlock, Confirm, }, + events::{Event, EventHandler, EventsProvider, PaymentPurpose}, ln::{ - channelmanager::{ChainParameters, PaymentId}, + channelmanager::{ChainParameters, PaymentId, RecipientOnionFields}, peer_handler::{IgnoringMessageHandler, MessageHandler}, }, routing::{ gossip::{NetworkGraph, NodeId}, - router::{DefaultRouter, RouteHop, RouteParameters}, + router::{DefaultRouter, Path, RouteParameters}, scoring::{ChannelUsage, Score}, }, - util::{ - config::UserConfig, - events::{Event, EventHandler, EventsProvider, PaymentPurpose}, - ser::Writeable, - }, + sign::{EntropySource, KeysManager}, + util::{config::UserConfig, ser::Writeable}, }; use lightning_persister::FilesystemPersister; use lightning_transaction_sync::EsploraSyncClient; @@ -89,6 +86,8 @@ pub(crate) type ChannelManager = lightning::ln::channelmanager::ChannelManager< Arc>>, Arc, Arc>, + (), + TestScorer, >, >, Arc, @@ -259,21 +258,29 @@ impl TestScorer { } impl Score for TestScorer { - fn channel_penalty_msat(&self, _: u64, _: &NodeId, _: &NodeId, _: ChannelUsage) -> u64 { + type ScoreParams = (); + fn channel_penalty_msat( + &self, + _short_channel_id: u64, + _source: &NodeId, + _target: &NodeId, + _usage: ChannelUsage, + _score_params: &Self::ScoreParams, + ) -> u64 { self.penalty_msat } - fn payment_path_failed(&mut self, _path: &[&RouteHop], _short_channel_id: u64) {} + fn payment_path_failed(&mut self, _actual_path: &Path, _actual_short_channel_id: u64) {} - fn payment_path_successful(&mut self, _path: &[&RouteHop]) {} + fn payment_path_successful(&mut self, _actual_path: &Path) {} - fn probe_failed(&mut self, _path: &[&RouteHop], _short_channel_id: u64) {} + fn probe_failed(&mut self, _actual_path: &Path, _: u64) {} - fn probe_successful(&mut self, _path: &[&RouteHop]) {} + fn probe_successful(&mut self, _actual_path: &Path) {} } impl EventHandler for LnDlcParty { - fn handle_event(&self, event: lightning::util::events::Event) { + fn handle_event(&self, event: lightning::events::Event) { match event { Event::FundingGenerationReady { temporary_channel_id, @@ -368,7 +375,7 @@ impl EventHandler for LnDlcParty { &Secp256k1::new(), ) .unwrap(); - self.blockchain.broadcast_transaction(&spending_tx); + self.blockchain.broadcast_transactions(&[&spending_tx]); } Event::ChannelClosed { channel_id, reason, .. @@ -440,6 +447,7 @@ fn create_ln_node( logger.clone(), keys_manager.get_secure_random_bytes(), scorer, + (), )); let channel_manager = { @@ -462,6 +470,10 @@ fn create_ln_node( consistent_keys_manager.clone(), user_config, chain_params, + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() as u32, )) }; @@ -517,13 +529,13 @@ fn create_ln_node( chan_handler: sub_channel_manager.clone(), route_handler: Arc::new(IgnoringMessageHandler {}), onion_message_handler: Arc::new(IgnoringMessageHandler {}), + custom_message_handler: Arc::new(IgnoringMessageHandler {}), }; let peer_manager = PeerManager::new( lightning_msg_handler, current_time.try_into().unwrap(), &ephemeral_bytes, logger.clone(), - Arc::new(IgnoringMessageHandler {}), consistent_keys_manager.clone(), ); @@ -2006,6 +2018,7 @@ fn make_ln_payment(alice_node: &LnDlcParty, bob_node: &LnDlcParty, final_value_m ), alice_node.logger.clone(), &scorer, + &(), &random_seed_bytes, ) .unwrap(); @@ -2018,7 +2031,12 @@ fn make_ln_payment(alice_node: &LnDlcParty, bob_node: &LnDlcParty, final_value_m alice_node .channel_manager - .send_spontaneous_payment(&route, Some(payment_preimage), payment_id) + .send_spontaneous_payment( + &route, + Some(payment_preimage), + RecipientOnionFields::spontaneous_empty(), + payment_id, + ) .unwrap(); bob_node.process_events(); @@ -2143,7 +2161,7 @@ fn renew(test_params: &LnDlcTestParams, dlc_channel_id: &ChannelId) { } fn cheat_with_revoked_tx(cheat_tx: &Transaction, test_params: &mut LnDlcTestParams) { - test_params.electrs.broadcast_transaction(cheat_tx); + test_params.electrs.broadcast_transactions(&[cheat_tx]); // wait for cheat tx to be confirmed test_params.generate_blocks(6); diff --git a/dlc-messages/Cargo.toml b/dlc-messages/Cargo.toml index 631b1ce4..2721b8be 100644 --- a/dlc-messages/Cargo.toml +++ b/dlc-messages/Cargo.toml @@ -13,7 +13,7 @@ use-serde = ["serde", "secp256k1-zkp/use-serde"] [dependencies] bitcoin = {version = "0.29.2"} dlc = {version = "0.4.0", path = "../dlc"} -lightning = {version = "0.0.114"} +lightning = {version = "0.0.116"} secp256k1-zkp = {version = "0.7.0", features = ["bitcoin_hashes", "rand", "rand-std"]} serde = {version = "1.0", features = ["derive"], optional = true} log = "0.4.14" diff --git a/dlc-messages/src/message_handler.rs b/dlc-messages/src/message_handler.rs index 2b36e2bb..ef0f392d 100644 --- a/dlc-messages/src/message_handler.rs +++ b/dlc-messages/src/message_handler.rs @@ -9,6 +9,7 @@ use std::{ use lightning::{ ln::{ + features::{InitFeatures, NodeFeatures}, msgs::{DecodeError, LightningError}, peer_handler::CustomMessageHandler, wire::{CustomMessageReader, Type}, @@ -38,7 +39,7 @@ impl Default for MessageHandler { } } -impl lightning::util::events::OnionMessageProvider for MessageHandler { +impl lightning::events::OnionMessageProvider for MessageHandler { fn next_onion_message_for_peer( &self, _peer_node_id: PublicKey, @@ -302,6 +303,14 @@ impl CustomMessageHandler for MessageHandler { fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> { self.msg_events.lock().unwrap().drain(..).collect() } + + fn provided_node_features(&self) -> NodeFeatures { + NodeFeatures::empty() + } + + fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { + InitFeatures::empty() + } } #[inline] diff --git a/dlc-sled-storage-provider/Cargo.toml b/dlc-sled-storage-provider/Cargo.toml index 987d6137..f627f6d5 100644 --- a/dlc-sled-storage-provider/Cargo.toml +++ b/dlc-sled-storage-provider/Cargo.toml @@ -14,7 +14,7 @@ wallet = ["bitcoin", "secp256k1-zkp", "simple-wallet"] [dependencies] bitcoin = {version = "0.29", optional = true} dlc-manager = {path = "../dlc-manager"} -lightning = {version = "0.0.114"} +lightning = {version = "0.0.116"} log = "0.4.14" secp256k1-zkp = {version = "0.7", optional = true} simple-wallet = {path = "../simple-wallet", optional = true} diff --git a/electrs-blockchain-provider/Cargo.toml b/electrs-blockchain-provider/Cargo.toml index ac452537..7f91b213 100644 --- a/electrs-blockchain-provider/Cargo.toml +++ b/electrs-blockchain-provider/Cargo.toml @@ -9,8 +9,8 @@ version = "0.1.0" bitcoin = {version = "0.29"} bitcoin-test-utils = {path = "../bitcoin-test-utils"} dlc-manager = {path = "../dlc-manager"} -lightning = {version = "0.0.114"} -lightning-block-sync = {version = "0.0.114"} +lightning = {version = "0.0.116"} +lightning-block-sync = {version = "0.0.116"} log = "0.4.14" reqwest = {version = "0.11", features = ["blocking", "json"]} rust-bitcoin-coin-selection = {version = "0.1.0", git = "https://github.com/p2pderivatives/rust-bitcoin-coin-selection", features = ["rand"]} diff --git a/electrs-blockchain-provider/src/lib.rs b/electrs-blockchain-provider/src/lib.rs index 41c09f26..82b3a010 100644 --- a/electrs-blockchain-provider/src/lib.rs +++ b/electrs-blockchain-provider/src/lib.rs @@ -12,7 +12,6 @@ use bitcoin_test_utils::tx_to_string; use dlc_manager::{error::Error, Blockchain, Utxo}; use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator}; use lightning_block_sync::{BlockData, BlockHeaderData, BlockSource, BlockSourceError}; -use log::error; use reqwest::blocking::Response; use serde::Deserialize; use serde::Serialize; @@ -21,6 +20,7 @@ const MIN_FEERATE: u32 = 253; #[derive(Clone, Eq, Hash, PartialEq)] pub enum Target { + Minimum = 1008, Background = 144, Normal = 18, HighPriority = 6, @@ -203,6 +203,11 @@ impl simple_wallet::WalletBlockchainProvider for ElectrsBlockchainProvider { impl FeeEstimator for ElectrsBlockchainProvider { fn get_est_sat_per_1000_weight(&self, confirmation_target: ConfirmationTarget) -> u32 { let est = match confirmation_target { + ConfirmationTarget::MempoolMinimum => self + .fees + .get(&Target::Minimum) + .unwrap() + .load(Ordering::Acquire), ConfirmationTarget::Background => self .fees .get(&Target::Background) @@ -305,26 +310,25 @@ impl BlockSource for ElectrsBlockchainProvider { } impl BroadcasterInterface for ElectrsBlockchainProvider { - fn broadcast_transaction(&self, tx: &Transaction) { + fn broadcast_transactions(&self, txs: &[&Transaction]) { let client = self.client.clone(); let host = self.host.clone(); - let tx_body = bitcoin_test_utils::tx_to_string(tx); + let bodies = txs + .iter() + .map(|tx| bitcoin_test_utils::tx_to_string(tx)) + .collect::>(); std::thread::spawn(move || { - match client - .post(format!("{host}tx")) - .body(tx_body.clone()) - .send() - { - Err(e) => { - error!("Error broadcasting transaction {}: {}", tx_body, e); - } - Ok(res) => { - if res.error_for_status_ref().is_err() { - let body = res.text().unwrap_or_default(); - error!("Error broadcasting transaction {}: {}", tx_body, body); + for body in bodies { + match client.post(format!("{host}tx")).body(body).send() { + Err(_) => {} + Ok(res) => { + if res.error_for_status_ref().is_err() { + // let body = res.text().unwrap_or_default(); + // TODO(tibo): log + } } - } - }; + }; + } }); } } diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index f558cf0f..a9fe6b17 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -10,7 +10,7 @@ cargo-fuzz = true [dependencies] dlc-messages = {path = "../dlc-messages"} honggfuzz = "0.5" -lightning = {version = "0.0.114"} +lightning = {version = "0.0.116"} [workspace] members = ["."] diff --git a/mocks/Cargo.toml b/mocks/Cargo.toml index 1539de6e..00340a17 100644 --- a/mocks/Cargo.toml +++ b/mocks/Cargo.toml @@ -9,6 +9,6 @@ bitcoin = "0.29" dlc = {path = "../dlc"} dlc-manager = {path = "../dlc-manager"} dlc-messages = {path = "../dlc-messages"} -lightning = {version = "0.0.114"} +lightning = {version = "0.0.116"} secp256k1-zkp = {version = "0.7.0", features = ["bitcoin_hashes", "rand", "rand-std"]} simple-wallet = {path = "../simple-wallet"} diff --git a/mocks/src/mock_blockchain.rs b/mocks/src/mock_blockchain.rs index 70a17421..345cebe6 100644 --- a/mocks/src/mock_blockchain.rs +++ b/mocks/src/mock_blockchain.rs @@ -45,18 +45,21 @@ impl BroadcasterInterface for MockBlockchain where T::Target: BroadcasterInterface, { - fn broadcast_transaction(&self, tx: &bitcoin::Transaction) { - if !*self.discard.lock().unwrap() && !self.discard_ids.lock().unwrap().contains(&tx.txid()) - { - self.inner.broadcast_transaction(tx); - } + fn broadcast_transactions(&self, txs: &[&Transaction]) { + let to_discard = self.discard_ids.lock().unwrap(); + let to_send = txs + .iter() + .filter(|tx| !to_discard.contains(&tx.txid())) + .cloned() + .collect::>(); + self.inner.broadcast_transactions(&to_send); } } pub struct MockBroadcaster {} impl BroadcasterInterface for MockBroadcaster { - fn broadcast_transaction(&self, _tx: &bitcoin::Transaction) { + fn broadcast_transactions(&self, _tx: &[&bitcoin::Transaction]) { unimplemented!(); } } diff --git a/sample/Cargo.toml b/sample/Cargo.toml index 45e2770c..3c3b3cac 100644 --- a/sample/Cargo.toml +++ b/sample/Cargo.toml @@ -12,8 +12,8 @@ dlc-manager = {path = "../dlc-manager", features = ["use-serde", "parallel"]} dlc-messages = {path = "../dlc-messages"} dlc-sled-storage-provider = {path = "../dlc-sled-storage-provider"} futures = "0.3" -lightning = {version = "0.0.114"} -lightning-net-tokio = {version = "0.0.114"} +lightning = {version = "0.0.116"} +lightning-net-tokio = {version = "0.0.116"} p2pd-oracle-client = {path = "../p2pd-oracle-client"} serde = "1.0" serde_json = "1.0" diff --git a/sample/src/main.rs b/sample/src/main.rs index fc836d25..0d71e410 100644 --- a/sample/src/main.rs +++ b/sample/src/main.rs @@ -9,10 +9,10 @@ use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey}; use bitcoin_rpc_provider::BitcoinCoreProvider; use dlc_manager::{Oracle, SystemTimeProvider}; use dlc_messages::message_handler::MessageHandler as DlcMessageHandler; -use lightning::chain::keysinterface::KeysManager; use lightning::ln::peer_handler::{ ErroringMessageHandler, IgnoringMessageHandler, MessageHandler, PeerManager as LdkPeerManager, }; +use lightning::sign::KeysManager; use lightning_net_tokio::SocketDescriptor; use p2pd_oracle_client::P2PDOracleClient; use std::collections::hash_map::HashMap; @@ -136,11 +136,11 @@ async fn main() { chan_handler: Arc::new(ErroringMessageHandler::new()), route_handler: Arc::new(IgnoringMessageHandler {}), onion_message_handler: Arc::new(IgnoringMessageHandler {}), + custom_message_handler: dlc_message_handler.clone(), }, time.as_secs() as u32, &ephemeral_bytes, logger.clone(), - dlc_message_handler.clone(), Arc::clone(&keys_manager), )); diff --git a/scripts/run_integration_tests.sh b/scripts/run_integration_tests.sh index c002ddb6..d5f6f544 100755 --- a/scripts/run_integration_tests.sh +++ b/scripts/run_integration_tests.sh @@ -12,15 +12,15 @@ fi export TEST_BIN=$1 LIST=$(bash ${PWD}/scripts/generate_test_list.sh $TEST_BIN) -docker-compose up -d -./scripts/wait_for_electrs.sh for TEST_NAME in $LIST do if [ ! -z $TEST_NAME ] then + docker-compose up -d + ./scripts/wait_for_electrs.sh RUST_MIN_STACK=104857600 cargo test -- $TEST_NAME --ignored --exact --nocapture + docker-compose down -v fi done -docker-compose down -v diff --git a/simple-wallet/Cargo.toml b/simple-wallet/Cargo.toml index 83a0ce8e..daace72f 100644 --- a/simple-wallet/Cargo.toml +++ b/simple-wallet/Cargo.toml @@ -9,7 +9,7 @@ version = "0.1.0" bitcoin = "0.29" dlc = {path = "../dlc"} dlc-manager = {path = "../dlc-manager"} -lightning = {version = "0.0.114"} +lightning = {version = "0.0.116"} rust-bitcoin-coin-selection = {version = "0.1.0", git = "https://github.com/p2pderivatives/rust-bitcoin-coin-selection", features = ["rand"]} secp256k1-zkp = {version = "0.7.0"}