From c0e3dfbdeae6fe38c137a147edf46ff653964d16 Mon Sep 17 00:00:00 2001 From: sosaucily Date: Wed, 29 Mar 2023 14:33:31 +0200 Subject: [PATCH 1/6] add a ManagerOptions type --- dlc-manager/Cargo.toml | 1 + dlc-manager/src/channel/offered_channel.rs | 8 +- dlc-manager/src/channel_updater.rs | 3 +- dlc-manager/src/manager.rs | 97 ++++++++++++-------- dlc-manager/tests/channel_execution_tests.rs | 46 +++++----- dlc-manager/tests/manager_execution_tests.rs | 6 +- sample/src/main.rs | 2 + 7 files changed, 99 insertions(+), 64 deletions(-) diff --git a/dlc-manager/Cargo.toml b/dlc-manager/Cargo.toml index 3bbd99d4..67630949 100644 --- a/dlc-manager/Cargo.toml +++ b/dlc-manager/Cargo.toml @@ -16,6 +16,7 @@ use-serde = ["serde", "dlc/use-serde", "dlc-messages/serde", "dlc-trie/use-serde [dependencies] async-trait = "0.1.50" bitcoin = {version = "0.29.2"} +derivative = {version = "2.2.0"} 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"} diff --git a/dlc-manager/src/channel/offered_channel.rs b/dlc-manager/src/channel/offered_channel.rs index b13a8dad..30d299a1 100644 --- a/dlc-manager/src/channel/offered_channel.rs +++ b/dlc-manager/src/channel/offered_channel.rs @@ -44,7 +44,11 @@ pub struct OfferedChannel { } impl OfferedChannel { - pub(crate) fn get_offer_channel_msg(&self, offered_contract: &OfferedContract) -> OfferChannel { + pub(crate) fn get_offer_channel_msg( + &self, + offered_contract: &OfferedContract, + cet_nsequence: u32, + ) -> OfferChannel { let party_points = &self.party_points; OfferChannel { protocol_version: crate::conversion_utils::PROTOCOL_VERSION, @@ -72,7 +76,7 @@ impl OfferedChannel { refund_locktime: offered_contract.refund_locktime, fee_rate_per_vb: offered_contract.fee_rate_per_vb, fund_output_serial_id: offered_contract.fund_output_serial_id, - cet_nsequence: crate::manager::CET_NSEQUENCE, + cet_nsequence, } } diff --git a/dlc-manager/src/channel_updater.rs b/dlc-manager/src/channel_updater.rs index dfd9cf74..9b7e371f 100644 --- a/dlc-manager/src/channel_updater.rs +++ b/dlc-manager/src/channel_updater.rs @@ -1490,6 +1490,7 @@ pub fn offer_collaborative_close( counter_payout: u64, signer: &S, time: &T, + peer_timeout: u64, ) -> Result<(CollaborativeCloseOffer, Transaction), Error> where S::Target: Signer, @@ -1535,7 +1536,7 @@ where counter_payout, offer_signature: close_signature, close_tx: close_tx.clone(), - timeout: time.unix_time_now() + super::manager::PEER_TIMEOUT, + timeout: time.unix_time_now() + peer_timeout, }; std::mem::swap(&mut state, &mut signed_channel.state); signed_channel.roll_back_state = Some(state); diff --git a/dlc-manager/src/manager.rs b/dlc-manager/src/manager.rs index b3595077..4644d0a7 100644 --- a/dlc-manager/src/manager.rs +++ b/dlc-manager/src/manager.rs @@ -19,6 +19,7 @@ use crate::Signer; use crate::{ChannelId, ContractId}; use bitcoin::Address; use bitcoin::Transaction; +use derivative::Derivative; use dlc_messages::channel::{ AcceptChannel, CollaborativeCloseOffer, OfferChannel, Reject, RenewAccept, RenewConfirm, RenewFinalize, RenewOffer, SettleAccept, SettleConfirm, SettleFinalize, SettleOffer, @@ -37,15 +38,23 @@ use std::collections::HashMap; use std::ops::Deref; use std::string::ToString; -/// The number of confirmations required before moving the the confirmed state. -pub const NB_CONFIRMATIONS: u32 = 6; -/// The delay to set the refund value to. -pub const REFUND_DELAY: u32 = 86400 * 7; -/// The nSequence value used for CETs in DLC channels -pub const CET_NSEQUENCE: u32 = 288; -/// Timeout in seconds when waiting for a peer's reply, after which a DLC channel -/// is forced closed. -pub const PEER_TIMEOUT: u64 = 3600; +/// The options used to configure the DLC manager. +#[derive(Derivative)] +#[derivative(Default)] +pub struct ManagerOptions { + /// The number of btc confirmations required before moving the DLC to the confirmed state. + #[derivative(Default(value = "6"))] + pub nb_confirmations: u32, + /// The delay to set the refund value to. + #[derivative(Default(value = "86400 * 7"))] + pub refund_delay: u32, + /// The nSequence value used for CETs in DLC channels + #[derivative(Default(value = "288"))] + pub cet_nsequence: u32, + /// Timeout in seconds when waiting for a peer's reply, after which a DLC channel + #[derivative(Default(value = "3600"))] + pub peer_timeout: u64, +} type ClosableContractInfo<'a> = Option<( &'a ContractInfo, @@ -71,6 +80,7 @@ where chain_monitor: ChainMonitor, time: T, fee_estimator: F, + options: ManagerOptions, } macro_rules! get_object_in_state { @@ -175,6 +185,7 @@ where oracles: HashMap, time: T, fee_estimator: F, + options: ManagerOptions, ) -> Result { let init_height = blockchain.get_blockchain_height()?; Ok(Manager { @@ -185,6 +196,7 @@ where oracles, time, fee_estimator, + options, chain_monitor: ChainMonitor::new(init_height), }) } @@ -284,7 +296,7 @@ where &self.secp, contract_input, oracle_announcements, - REFUND_DELAY, + self.options.refund_delay, &counter_party, &self.wallet, &self.blockchain, @@ -344,7 +356,11 @@ where offered_message: &OfferDlc, counter_party: PublicKey, ) -> Result<(), Error> { - offered_message.validate(&self.secp, REFUND_DELAY, REFUND_DELAY * 2)?; + offered_message.validate( + &self.secp, + self.options.refund_delay, + self.options.refund_delay * 2, + )?; let contract: OfferedContract = OfferedContract::try_from_offer_dlc(offered_message, counter_party)?; contract.validate()?; @@ -474,7 +490,7 @@ where let confirmations = self.blockchain.get_transaction_confirmations( &contract.accepted_contract.dlc_transactions.fund.txid(), )?; - if confirmations >= NB_CONFIRMATIONS { + if confirmations >= self.options.nb_confirmations { self.store .update_contract(&Contract::Confirmed(contract.clone()))?; } @@ -604,7 +620,7 @@ where let confirmations = self .blockchain .get_transaction_confirmations(&broadcasted_txid)?; - if confirmations >= NB_CONFIRMATIONS { + if confirmations >= self.options.nb_confirmations { let closed_contract = ClosedContract { attestations: contract.attestations.clone(), signed_cet: Some(contract.signed_cet.clone()), @@ -655,7 +671,7 @@ where }; return Ok(Contract::PreClosed(preclosed_contract)); - } else if confirmations < NB_CONFIRMATIONS { + } else if confirmations < self.options.nb_confirmations { let preclosed_contract = PreClosedContract { signed_contract: contract.clone(), attestations: Some(attestations), @@ -733,14 +749,15 @@ where contract_input, &counter_party, &oracle_announcements, - CET_NSEQUENCE, - REFUND_DELAY, + self.options.cet_nsequence, + self.options.refund_delay, &self.wallet, &self.blockchain, &self.time, )?; - let msg = offered_channel.get_offer_channel_msg(&offered_contract); + let msg = + offered_channel.get_offer_channel_msg(&offered_contract, self.options.cet_nsequence); self.store.upsert_channel( Channel::Offered(offered_channel), @@ -821,7 +838,7 @@ where &self.secp, &mut signed_channel, counter_payout, - PEER_TIMEOUT, + self.options.peer_timeout, &self.wallet, &self.time, )?; @@ -846,9 +863,9 @@ where let msg = crate::channel_updater::settle_channel_accept( &self.secp, &mut signed_channel, - CET_NSEQUENCE, + self.options.cet_nsequence, 0, - PEER_TIMEOUT, + self.options.peer_timeout, &self.wallet, &self.time, )?; @@ -885,9 +902,9 @@ where contract_input, oracle_announcements, counter_payout, - REFUND_DELAY, - PEER_TIMEOUT, - CET_NSEQUENCE, + self.options.refund_delay, + self.options.peer_timeout, + self.options.cet_nsequence, &self.wallet, &self.time, )?; @@ -926,8 +943,8 @@ where &self.secp, &mut signed_channel, &offered_contract, - CET_NSEQUENCE, - PEER_TIMEOUT, + self.options.cet_nsequence, + self.options.peer_timeout, &self.wallet, &self.time, )?; @@ -1014,6 +1031,7 @@ where counter_payout, &self.wallet, &self.time, + self.options.peer_timeout, )?; self.chain_monitor.add_tx( @@ -1107,7 +1125,7 @@ where if self .blockchain .get_transaction_confirmations(&buffer_tx.txid())? - > CET_NSEQUENCE + > self.options.cet_nsequence { let confirmed_contract = get_contract_in_state!(self, &contract_id, Confirmed, None as Option)?; @@ -1131,10 +1149,10 @@ where ) -> Result<(), Error> { offer_channel.validate( &self.secp, - REFUND_DELAY, - REFUND_DELAY * 2, - CET_NSEQUENCE, - CET_NSEQUENCE * 2, + self.options.refund_delay, + self.options.refund_delay * 2, + self.options.cet_nsequence, + self.options.cet_nsequence * 2, )?; let (channel, contract) = OfferedChannel::from_offer_channel(offer_channel, counter_party)?; @@ -1182,7 +1200,7 @@ where &offered_contract, accept_channel, //TODO(tibo): this should be parameterizable. - CET_NSEQUENCE, + self.options.cet_nsequence, &self.wallet, ); @@ -1334,9 +1352,9 @@ where &self.secp, &mut signed_channel, settle_accept, - CET_NSEQUENCE, + self.options.cet_nsequence, 0, - PEER_TIMEOUT, + self.options.peer_timeout, &self.wallet, &self.time, )?; @@ -1536,8 +1554,8 @@ where renew_accept, &mut signed_channel, &offered_contract, - CET_NSEQUENCE, - PEER_TIMEOUT, + self.options.cet_nsequence, + self.options.peer_timeout, &self.wallet, &self.time, )?; @@ -1790,7 +1808,7 @@ where crate::channel_updater::on_collaborative_close_offer( &mut signed_channel, close_offer, - PEER_TIMEOUT, + self.options.peer_timeout, &self.time, )?; @@ -2020,7 +2038,7 @@ where &counter_revocation_sk, &tx, &self.wallet.get_new_address()?, - CET_NSEQUENCE, + self.options.cet_nsequence, 0, fee_rate_per_vb, is_offer, @@ -2189,7 +2207,7 @@ where mod test { use dlc_messages::Message; use mocks::{ - dlc_manager::{manager::Manager, Oracle}, + dlc_manager::{manager::Manager, manager::ManagerOptions, Oracle}, memory_storage_provider::MemoryStorage, mock_blockchain::MockBlockchain, mock_oracle_provider::MockOracle, @@ -2199,6 +2217,8 @@ mod test { use secp256k1_zkp::PublicKey; use std::{collections::HashMap, rc::Rc}; + // use super::ManagerOptions; + type TestManager = Manager< Rc, Rc, @@ -2229,6 +2249,7 @@ mod test { oracles, time, blockchain.clone(), + ManagerOptions::default(), ) .unwrap() } diff --git a/dlc-manager/tests/channel_execution_tests.rs b/dlc-manager/tests/channel_execution_tests.rs index d2ead6ac..5496072e 100644 --- a/dlc-manager/tests/channel_execution_tests.rs +++ b/dlc-manager/tests/channel_execution_tests.rs @@ -5,7 +5,7 @@ use bitcoin::Amount; use bitcoin_test_utils::rpc_helpers::init_clients; use bitcoincore_rpc::RpcApi; use dlc_manager::contract::contract_input::ContractInput; -use dlc_manager::manager::Manager; +use dlc_manager::manager::{Manager, ManagerOptions}; use dlc_manager::{ channel::{signed_channel::SignedChannelState, Channel}, contract::Contract, @@ -347,6 +347,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), + ManagerOptions::default(), ) .unwrap(), )); @@ -362,10 +363,13 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), + ManagerOptions::default(), ) .unwrap(), )); + let cet_nsequence: u32 = ManagerOptions::default().cet_nsequence; + let bob_manager_loop = Arc::clone(&bob_manager); let bob_manager_send = Arc::clone(&bob_manager); let alice_send_loop = alice_send.clone(); @@ -526,7 +530,13 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { match path { TestPath::Close => { - close_established_channel(first, second, channel_id, &generate_blocks); + close_established_channel( + first, + second, + channel_id, + &generate_blocks, + cet_nsequence, + ); } TestPath::CollaborativeClose => { collaborative_close( @@ -549,6 +559,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { channel_id, &sync_receive, path, + ManagerOptions::default().peer_timeout, ); } TestPath::SettleReject => { @@ -623,6 +634,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { &sync_receive, &test_params.contract_input, path, + ManagerOptions::default().peer_timeout, ); } TestPath::RenewReject => { @@ -676,6 +688,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { second, channel_id, &generate_blocks, + cet_nsequence, ); } else if let TestPath::SettleCheat = path { cheat_punish(first, second, channel_id, &generate_blocks, false); @@ -721,6 +734,7 @@ fn close_established_channel( second: DlcParty, channel_id: ChannelId, generate_blocks: &F, + cet_nsequence: u32, ) where F: Fn(u64) -> (), { @@ -739,7 +753,7 @@ fn close_established_channel( .periodic_check() .expect("to be able to do the periodic check"); - let wait = dlc_manager::manager::CET_NSEQUENCE; + let wait = cet_nsequence; generate_blocks(10); @@ -1143,6 +1157,7 @@ fn renew_timeout( sync_receive: &Receiver<()>, contract_input: &ContractInput, path: TestPath, + peer_timeout: u64, ) { { let (renew_offer, _) = first @@ -1158,9 +1173,7 @@ fn renew_timeout( sync_receive.recv().expect("Error synchronizing"); if let TestPath::RenewOfferTimeout = path { - mocks::mock_time::set_time( - (EVENT_MATURITY as u64) + dlc_manager::manager::PEER_TIMEOUT + 2, - ); + mocks::mock_time::set_time((EVENT_MATURITY as u64) + peer_timeout + 2); first .lock() .unwrap() @@ -1183,9 +1196,7 @@ fn renew_timeout( sync_receive.recv().expect("Error synchronizing"); if let TestPath::RenewAcceptTimeout = path { - mocks::mock_time::set_time( - (EVENT_MATURITY as u64) + dlc_manager::manager::PEER_TIMEOUT + 2, - ); + mocks::mock_time::set_time((EVENT_MATURITY as u64) + peer_timeout + 2); second .lock() .unwrap() @@ -1196,9 +1207,7 @@ fn renew_timeout( } else if let TestPath::RenewConfirmTimeout = path { // Process Confirm sync_receive.recv().expect("Error synchronizing"); - mocks::mock_time::set_time( - (EVENT_MATURITY as u64) + dlc_manager::manager::PEER_TIMEOUT + 2, - ); + mocks::mock_time::set_time((EVENT_MATURITY as u64) + peer_timeout + 2); first .lock() .unwrap() @@ -1219,6 +1228,7 @@ fn settle_timeout( channel_id: ChannelId, sync_receive: &Receiver<()>, path: TestPath, + peer_timeout: u64, ) { let (settle_offer, _) = first .lock() @@ -1233,9 +1243,7 @@ fn settle_timeout( sync_receive.recv().expect("Error synchronizing"); if let TestPath::SettleOfferTimeout = path { - mocks::mock_time::set_time( - (EVENT_MATURITY as u64) + dlc_manager::manager::PEER_TIMEOUT + 2, - ); + mocks::mock_time::set_time((EVENT_MATURITY as u64) + peer_timeout + 2); first .lock() .unwrap() @@ -1258,9 +1266,7 @@ fn settle_timeout( sync_receive.recv().expect("Error synchronizing"); if let TestPath::SettleAcceptTimeout = path { - mocks::mock_time::set_time( - (EVENT_MATURITY as u64) + dlc_manager::manager::PEER_TIMEOUT + 2, - ); + mocks::mock_time::set_time((EVENT_MATURITY as u64) + peer_timeout + 2); second .lock() .unwrap() @@ -1271,9 +1277,7 @@ fn settle_timeout( } else if let TestPath::SettleConfirmTimeout = path { // Process Confirm sync_receive.recv().expect("Error synchronizing"); - mocks::mock_time::set_time( - (EVENT_MATURITY as u64) + dlc_manager::manager::PEER_TIMEOUT + 2, - ); + mocks::mock_time::set_time((EVENT_MATURITY as u64) + peer_timeout + 2); first .lock() .unwrap() diff --git a/dlc-manager/tests/manager_execution_tests.rs b/dlc-manager/tests/manager_execution_tests.rs index 5d5109f8..9a44f7d2 100644 --- a/dlc-manager/tests/manager_execution_tests.rs +++ b/dlc-manager/tests/manager_execution_tests.rs @@ -17,7 +17,7 @@ use test_utils::*; use bitcoin_test_utils::rpc_helpers::init_clients; use bitcoincore_rpc::RpcApi; use dlc_manager::contract::{numerical_descriptor::DifferenceParams, Contract}; -use dlc_manager::manager::Manager; +use dlc_manager::manager::{Manager, ManagerOptions}; use dlc_manager::{Blockchain, Oracle, Storage, Wallet}; use dlc_messages::{AcceptDlc, OfferDlc, SignDlc}; use dlc_messages::{CetAdaptorSignatures, Message}; @@ -502,6 +502,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), + ManagerOptions::default(), ) .unwrap(), )); @@ -517,6 +518,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), + ManagerOptions::default(), ) .unwrap(), )); @@ -685,7 +687,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { periodic_check!(second, contract_id, Confirmed); mocks::mock_time::set_time( - ((EVENT_MATURITY + dlc_manager::manager::REFUND_DELAY) as u64) + 1, + ((EVENT_MATURITY + ManagerOptions::default().refund_delay) as u64) + 1, ); generate_blocks(10); diff --git a/sample/src/main.rs b/sample/src/main.rs index cfcbc9f9..3a3013a8 100644 --- a/sample/src/main.rs +++ b/sample/src/main.rs @@ -7,6 +7,7 @@ use disk::FilesystemLogger; use bitcoin::secp256k1::rand::{thread_rng, RngCore}; use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey}; use bitcoin_rpc_provider::BitcoinCoreProvider; +use dlc_manager::manager::ManagerOptions; use dlc_manager::{Oracle, SystemTimeProvider}; use dlc_messages::message_handler::MessageHandler as DlcMessageHandler; use lightning::ln::peer_handler::{ @@ -88,6 +89,7 @@ async fn main() { oracles, Arc::new(dlc_manager::SystemTimeProvider {}), bitcoind_provider.clone(), + ManagerOptions::default(), ) .expect("Could not create manager."), )); From caa0a40fa33f592a26558bd09f58b839205c2616 Mon Sep 17 00:00:00 2001 From: sosaucily Date: Tue, 4 Apr 2023 14:25:13 +0200 Subject: [PATCH 2/6] Remove Derivative package and use standard Default trait; change refund_delay to a struct with a min and max --- dlc-manager/Cargo.toml | 1 - dlc-manager/src/channel_updater.rs | 5 +- dlc-manager/src/contract/offered_contract.rs | 5 +- dlc-manager/src/contract_updater.rs | 3 +- dlc-manager/src/manager.rs | 57 ++++++++++++++------ dlc-manager/tests/channel_execution_tests.rs | 4 +- dlc-manager/tests/manager_execution_tests.rs | 6 +-- sample/src/main.rs | 2 +- 8 files changed, 56 insertions(+), 27 deletions(-) diff --git a/dlc-manager/Cargo.toml b/dlc-manager/Cargo.toml index 67630949..3bbd99d4 100644 --- a/dlc-manager/Cargo.toml +++ b/dlc-manager/Cargo.toml @@ -16,7 +16,6 @@ use-serde = ["serde", "dlc/use-serde", "dlc-messages/serde", "dlc-trie/use-serde [dependencies] async-trait = "0.1.50" bitcoin = {version = "0.29.2"} -derivative = {version = "2.2.0"} 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"} diff --git a/dlc-manager/src/channel_updater.rs b/dlc-manager/src/channel_updater.rs index 9b7e371f..c85e3545 100644 --- a/dlc-manager/src/channel_updater.rs +++ b/dlc-manager/src/channel_updater.rs @@ -19,6 +19,7 @@ use crate::{ verify_signed_contract_internal, }, error::Error, + manager::RefundDelayWindow, utils::get_new_temporary_id, Blockchain, Signer, Time, Wallet, }; @@ -72,7 +73,7 @@ pub fn offer_channel( counter_party: &PublicKey, oracle_announcements: &[Vec], cet_nsequence: u32, - refund_delay: u32, + refund_delay: RefundDelayWindow, wallet: &W, blockchain: &B, time: &T, @@ -957,7 +958,7 @@ pub fn renew_offer( contract_input: &ContractInput, oracle_announcements: Vec>, counter_payout: u64, - refund_delay: u32, + refund_delay: RefundDelayWindow, peer_timeout: u64, cet_nsequence: u32, signer: &S, diff --git a/dlc-manager/src/contract/offered_contract.rs b/dlc-manager/src/contract/offered_contract.rs index b9e18a31..5dc1a609 100644 --- a/dlc-manager/src/contract/offered_contract.rs +++ b/dlc-manager/src/contract/offered_contract.rs @@ -3,6 +3,7 @@ use crate::conversion_utils::{ get_contract_info_and_announcements, get_tx_input_infos, BITCOIN_CHAINHASH, PROTOCOL_VERSION, }; +use crate::manager::RefundDelayWindow; use crate::utils::get_new_serial_id; use super::contract_info::ContractInfo; @@ -80,7 +81,7 @@ impl OfferedContract { offer_params: &PartyParams, funding_inputs_info: &[FundingInputInfo], counter_party: &PublicKey, - refund_delay: u32, + refund_delay: RefundDelayWindow, cet_locktime: u32, ) -> Self { let total_collateral = contract.offer_collateral + contract.accept_collateral; @@ -111,7 +112,7 @@ impl OfferedContract { fund_output_serial_id, fee_rate_per_vb: contract.fee_rate, cet_locktime, - refund_locktime: latest_maturity + refund_delay, + refund_locktime: latest_maturity + refund_delay.min, counter_party: *counter_party, } } diff --git a/dlc-manager/src/contract_updater.rs b/dlc-manager/src/contract_updater.rs index 055d7337..46a94c43 100644 --- a/dlc-manager/src/contract_updater.rs +++ b/dlc-manager/src/contract_updater.rs @@ -20,6 +20,7 @@ use crate::{ }, conversion_utils::get_tx_input_infos, error::Error, + manager::RefundDelayWindow, Blockchain, ChannelId, Signer, Time, Wallet, }; @@ -29,7 +30,7 @@ pub fn offer_contract( secp: &Secp256k1, contract_input: &ContractInput, oracle_announcements: Vec>, - refund_delay: u32, + refund_delay: RefundDelayWindow, counter_party: &PublicKey, wallet: &W, blockchain: &B, diff --git a/dlc-manager/src/manager.rs b/dlc-manager/src/manager.rs index 4644d0a7..92d9be53 100644 --- a/dlc-manager/src/manager.rs +++ b/dlc-manager/src/manager.rs @@ -19,7 +19,6 @@ use crate::Signer; use crate::{ChannelId, ContractId}; use bitcoin::Address; use bitcoin::Transaction; -use derivative::Derivative; use dlc_messages::channel::{ AcceptChannel, CollaborativeCloseOffer, OfferChannel, Reject, RenewAccept, RenewConfirm, RenewFinalize, RenewOffer, SettleAccept, SettleConfirm, SettleFinalize, SettleOffer, @@ -39,23 +38,50 @@ use std::ops::Deref; use std::string::ToString; /// The options used to configure the DLC manager. -#[derive(Derivative)] -#[derivative(Default)] pub struct ManagerOptions { /// The number of btc confirmations required before moving the DLC to the confirmed state. - #[derivative(Default(value = "6"))] pub nb_confirmations: u32, - /// The delay to set the refund value to. - #[derivative(Default(value = "86400 * 7"))] - pub refund_delay: u32, + /// The refund delay window to trigger the refund. + pub refund_delay: RefundDelayWindow, /// The nSequence value used for CETs in DLC channels - #[derivative(Default(value = "288"))] pub cet_nsequence: u32, /// Timeout in seconds when waiting for a peer's reply, after which a DLC channel - #[derivative(Default(value = "3600"))] pub peer_timeout: u64, } +/// The min and max value in seconds until a DLC will be refunded. +pub struct RefundDelayWindow { + /// The min delay in seconds to trigger the refund. + pub min: u32, + /// The max delay in seconds to trigger the refund. + pub max: u32, +} + +impl Clone for RefundDelayWindow { + fn clone(&self) -> Self { + Self { + min: self.min.clone(), + max: self.max.clone(), + } + } +} + +impl Copy for RefundDelayWindow {} + +impl Default for ManagerOptions { + fn default() -> Self { + Self { + nb_confirmations: 6, + refund_delay: RefundDelayWindow { + min: 86400 * 7, + max: 86400 * 14, + }, + cet_nsequence: 288, + peer_timeout: 3600, + } + } +} + type ClosableContractInfo<'a> = Option<( &'a ContractInfo, &'a AdaptorInfo, @@ -185,9 +211,10 @@ where oracles: HashMap, time: T, fee_estimator: F, - options: ManagerOptions, + options: Option, ) -> Result { let init_height = blockchain.get_blockchain_height()?; + let options = options.unwrap_or_default(); Ok(Manager { secp: secp256k1_zkp::Secp256k1::new(), wallet, @@ -358,8 +385,8 @@ where ) -> Result<(), Error> { offered_message.validate( &self.secp, - self.options.refund_delay, - self.options.refund_delay * 2, + self.options.refund_delay.min, + self.options.refund_delay.max, )?; let contract: OfferedContract = OfferedContract::try_from_offer_dlc(offered_message, counter_party)?; @@ -1149,8 +1176,8 @@ where ) -> Result<(), Error> { offer_channel.validate( &self.secp, - self.options.refund_delay, - self.options.refund_delay * 2, + self.options.refund_delay.min, + self.options.refund_delay.max, self.options.cet_nsequence, self.options.cet_nsequence * 2, )?; @@ -2249,7 +2276,7 @@ mod test { oracles, time, blockchain.clone(), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap() } diff --git a/dlc-manager/tests/channel_execution_tests.rs b/dlc-manager/tests/channel_execution_tests.rs index 5496072e..9d213cfb 100644 --- a/dlc-manager/tests/channel_execution_tests.rs +++ b/dlc-manager/tests/channel_execution_tests.rs @@ -347,7 +347,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); @@ -363,7 +363,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); diff --git a/dlc-manager/tests/manager_execution_tests.rs b/dlc-manager/tests/manager_execution_tests.rs index 9a44f7d2..84c0de02 100644 --- a/dlc-manager/tests/manager_execution_tests.rs +++ b/dlc-manager/tests/manager_execution_tests.rs @@ -502,7 +502,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); @@ -518,7 +518,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); @@ -687,7 +687,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { periodic_check!(second, contract_id, Confirmed); mocks::mock_time::set_time( - ((EVENT_MATURITY + ManagerOptions::default().refund_delay) as u64) + 1, + ((EVENT_MATURITY + ManagerOptions::default().refund_delay.min) as u64) + 1, ); generate_blocks(10); diff --git a/sample/src/main.rs b/sample/src/main.rs index 3a3013a8..bea80903 100644 --- a/sample/src/main.rs +++ b/sample/src/main.rs @@ -89,7 +89,7 @@ async fn main() { oracles, Arc::new(dlc_manager::SystemTimeProvider {}), bitcoind_provider.clone(), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .expect("Could not create manager."), )); From 57af6344794964995557226db2d650357a71ab4f Mon Sep 17 00:00:00 2001 From: sosaucily Date: Tue, 4 Apr 2023 14:47:31 +0200 Subject: [PATCH 3/6] removed unused import --- dlc-manager/src/manager.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/dlc-manager/src/manager.rs b/dlc-manager/src/manager.rs index 92d9be53..3be1306f 100644 --- a/dlc-manager/src/manager.rs +++ b/dlc-manager/src/manager.rs @@ -2244,8 +2244,6 @@ mod test { use secp256k1_zkp::PublicKey; use std::{collections::HashMap, rc::Rc}; - // use super::ManagerOptions; - type TestManager = Manager< Rc, Rc, From 891b986fad41c71b0f484ae349551ca12bcc2882 Mon Sep 17 00:00:00 2001 From: sosaucily Date: Tue, 4 Apr 2023 14:53:51 +0200 Subject: [PATCH 4/6] derive copy/clone rather than writing it --- dlc-manager/src/manager.rs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/dlc-manager/src/manager.rs b/dlc-manager/src/manager.rs index 3be1306f..ae6d2827 100644 --- a/dlc-manager/src/manager.rs +++ b/dlc-manager/src/manager.rs @@ -50,6 +50,7 @@ pub struct ManagerOptions { } /// The min and max value in seconds until a DLC will be refunded. +#[derive(Clone, Copy)] pub struct RefundDelayWindow { /// The min delay in seconds to trigger the refund. pub min: u32, @@ -57,17 +58,6 @@ pub struct RefundDelayWindow { pub max: u32, } -impl Clone for RefundDelayWindow { - fn clone(&self) -> Self { - Self { - min: self.min.clone(), - max: self.max.clone(), - } - } -} - -impl Copy for RefundDelayWindow {} - impl Default for ManagerOptions { fn default() -> Self { Self { From 6d7fc602a911eadd4a3eb638b983ac7d7bd0e0a2 Mon Sep 17 00:00:00 2001 From: sosaucily Date: Mon, 17 Apr 2023 11:33:23 +0200 Subject: [PATCH 5/6] switch refund_delay back to u32 to solve bug --- dlc-manager/Cargo.toml | 1 - dlc-manager/src/manager.rs | 26 +++++++++++--------- dlc-manager/tests/channel_execution_tests.rs | 4 +-- dlc-manager/tests/manager_execution_tests.rs | 4 +-- sample/src/main.rs | 2 +- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/dlc-manager/Cargo.toml b/dlc-manager/Cargo.toml index 67630949..3bbd99d4 100644 --- a/dlc-manager/Cargo.toml +++ b/dlc-manager/Cargo.toml @@ -16,7 +16,6 @@ use-serde = ["serde", "dlc/use-serde", "dlc-messages/serde", "dlc-trie/use-serde [dependencies] async-trait = "0.1.50" bitcoin = {version = "0.29.2"} -derivative = {version = "2.2.0"} 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"} diff --git a/dlc-manager/src/manager.rs b/dlc-manager/src/manager.rs index 4644d0a7..3a5dd0c6 100644 --- a/dlc-manager/src/manager.rs +++ b/dlc-manager/src/manager.rs @@ -19,7 +19,6 @@ use crate::Signer; use crate::{ChannelId, ContractId}; use bitcoin::Address; use bitcoin::Transaction; -use derivative::Derivative; use dlc_messages::channel::{ AcceptChannel, CollaborativeCloseOffer, OfferChannel, Reject, RenewAccept, RenewConfirm, RenewFinalize, RenewOffer, SettleAccept, SettleConfirm, SettleFinalize, SettleOffer, @@ -39,20 +38,14 @@ use std::ops::Deref; use std::string::ToString; /// The options used to configure the DLC manager. -#[derive(Derivative)] -#[derivative(Default)] pub struct ManagerOptions { /// The number of btc confirmations required before moving the DLC to the confirmed state. - #[derivative(Default(value = "6"))] pub nb_confirmations: u32, - /// The delay to set the refund value to. - #[derivative(Default(value = "86400 * 7"))] + /// The refund delay window to trigger the refund. pub refund_delay: u32, /// The nSequence value used for CETs in DLC channels - #[derivative(Default(value = "288"))] pub cet_nsequence: u32, /// Timeout in seconds when waiting for a peer's reply, after which a DLC channel - #[derivative(Default(value = "3600"))] pub peer_timeout: u64, } @@ -62,6 +55,16 @@ type ClosableContractInfo<'a> = Option<( Vec<(usize, OracleAttestation)>, )>; +impl Default for ManagerOptions { + fn default() -> Self { + Self { + nb_confirmations: 6, + refund_delay: 86400 * 7, + cet_nsequence: 288, + peer_timeout: 3600, + } + } +} /// Used to create and update DLCs. pub struct Manager where @@ -185,9 +188,10 @@ where oracles: HashMap, time: T, fee_estimator: F, - options: ManagerOptions, + options: Option, ) -> Result { let init_height = blockchain.get_blockchain_height()?; + let options = options.unwrap_or_default(); Ok(Manager { secp: secp256k1_zkp::Secp256k1::new(), wallet, @@ -2217,8 +2221,6 @@ mod test { use secp256k1_zkp::PublicKey; use std::{collections::HashMap, rc::Rc}; - // use super::ManagerOptions; - type TestManager = Manager< Rc, Rc, @@ -2249,7 +2251,7 @@ mod test { oracles, time, blockchain.clone(), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap() } diff --git a/dlc-manager/tests/channel_execution_tests.rs b/dlc-manager/tests/channel_execution_tests.rs index 5496072e..9d213cfb 100644 --- a/dlc-manager/tests/channel_execution_tests.rs +++ b/dlc-manager/tests/channel_execution_tests.rs @@ -347,7 +347,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); @@ -363,7 +363,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); diff --git a/dlc-manager/tests/manager_execution_tests.rs b/dlc-manager/tests/manager_execution_tests.rs index 9a44f7d2..f0592f5a 100644 --- a/dlc-manager/tests/manager_execution_tests.rs +++ b/dlc-manager/tests/manager_execution_tests.rs @@ -502,7 +502,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); @@ -518,7 +518,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .unwrap(), )); diff --git a/sample/src/main.rs b/sample/src/main.rs index 3a3013a8..bea80903 100644 --- a/sample/src/main.rs +++ b/sample/src/main.rs @@ -89,7 +89,7 @@ async fn main() { oracles, Arc::new(dlc_manager::SystemTimeProvider {}), bitcoind_provider.clone(), - ManagerOptions::default(), + Some(ManagerOptions::default()), ) .expect("Could not create manager."), )); From 9c393db0eb0211743491e0328163ec60fffde702 Mon Sep 17 00:00:00 2001 From: sosaucily Date: Mon, 24 Apr 2023 16:39:29 -0700 Subject: [PATCH 6/6] add back in consts; use none instead of Some(default) --- dlc-manager/src/manager.rs | 17 +++++++++++++++-- dlc-manager/tests/channel_execution_tests.rs | 12 ++++++------ dlc-manager/tests/manager_execution_tests.rs | 8 ++++---- sample/src/main.rs | 3 +-- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/dlc-manager/src/manager.rs b/dlc-manager/src/manager.rs index ae6d2827..4729c55c 100644 --- a/dlc-manager/src/manager.rs +++ b/dlc-manager/src/manager.rs @@ -37,6 +37,18 @@ use std::collections::HashMap; use std::ops::Deref; use std::string::ToString; +/// The number of btc confirmations required before moving the DLC to the confirmed state. +pub const NB_CONFIRMATIONS: u32 = 6; +/// The minimum time to trigger the refund. +pub const REFUND_DELAY_MIN: u32 = 86400 * 7; +/// The maximum time to trigger the refund. +pub const REFUND_DELAY_MAX: u32 = 86400 * 7 * 2; +/// The nSequence value used for CETs in DLC channels +pub const CET_NSEQUENCE: u32 = 288; +/// Timeout in seconds when waiting for a peer's reply, after which a DLC channel +/// is forced closed. +pub const PEER_TIMEOUT: u64 = 3600; + /// The options used to configure the DLC manager. pub struct ManagerOptions { /// The number of btc confirmations required before moving the DLC to the confirmed state. @@ -46,6 +58,7 @@ pub struct ManagerOptions { /// The nSequence value used for CETs in DLC channels pub cet_nsequence: u32, /// Timeout in seconds when waiting for a peer's reply, after which a DLC channel + /// is forced closed. pub peer_timeout: u64, } @@ -2224,7 +2237,7 @@ where mod test { use dlc_messages::Message; use mocks::{ - dlc_manager::{manager::Manager, manager::ManagerOptions, Oracle}, + dlc_manager::{manager::Manager, Oracle}, memory_storage_provider::MemoryStorage, mock_blockchain::MockBlockchain, mock_oracle_provider::MockOracle, @@ -2264,7 +2277,7 @@ mod test { oracles, time, blockchain.clone(), - Some(ManagerOptions::default()), + None, ) .unwrap() } diff --git a/dlc-manager/tests/channel_execution_tests.rs b/dlc-manager/tests/channel_execution_tests.rs index 9d213cfb..d0a07f43 100644 --- a/dlc-manager/tests/channel_execution_tests.rs +++ b/dlc-manager/tests/channel_execution_tests.rs @@ -5,7 +5,7 @@ use bitcoin::Amount; use bitcoin_test_utils::rpc_helpers::init_clients; use bitcoincore_rpc::RpcApi; use dlc_manager::contract::contract_input::ContractInput; -use dlc_manager::manager::{Manager, ManagerOptions}; +use dlc_manager::manager::Manager; use dlc_manager::{ channel::{signed_channel::SignedChannelState, Channel}, contract::Contract, @@ -347,7 +347,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - Some(ManagerOptions::default()), + None, ) .unwrap(), )); @@ -363,12 +363,12 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - Some(ManagerOptions::default()), + None, ) .unwrap(), )); - let cet_nsequence: u32 = ManagerOptions::default().cet_nsequence; + let cet_nsequence: u32 = dlc_manager::manager::CET_NSEQUENCE; let bob_manager_loop = Arc::clone(&bob_manager); let bob_manager_send = Arc::clone(&bob_manager); @@ -559,7 +559,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { channel_id, &sync_receive, path, - ManagerOptions::default().peer_timeout, + dlc_manager::manager::PEER_TIMEOUT, ); } TestPath::SettleReject => { @@ -634,7 +634,7 @@ fn channel_execution_test(test_params: TestParams, path: TestPath) { &sync_receive, &test_params.contract_input, path, - ManagerOptions::default().peer_timeout, + dlc_manager::manager::PEER_TIMEOUT, ); } TestPath::RenewReject => { diff --git a/dlc-manager/tests/manager_execution_tests.rs b/dlc-manager/tests/manager_execution_tests.rs index 84c0de02..2dbc015e 100644 --- a/dlc-manager/tests/manager_execution_tests.rs +++ b/dlc-manager/tests/manager_execution_tests.rs @@ -17,7 +17,7 @@ use test_utils::*; use bitcoin_test_utils::rpc_helpers::init_clients; use bitcoincore_rpc::RpcApi; use dlc_manager::contract::{numerical_descriptor::DifferenceParams, Contract}; -use dlc_manager::manager::{Manager, ManagerOptions}; +use dlc_manager::manager::Manager; use dlc_manager::{Blockchain, Oracle, Storage, Wallet}; use dlc_messages::{AcceptDlc, OfferDlc, SignDlc}; use dlc_messages::{CetAdaptorSignatures, Message}; @@ -502,7 +502,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { alice_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - Some(ManagerOptions::default()), + None, ) .unwrap(), )); @@ -518,7 +518,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { bob_oracles, Arc::clone(&mock_time), Arc::clone(&electrs), - Some(ManagerOptions::default()), + None, ) .unwrap(), )); @@ -687,7 +687,7 @@ fn manager_execution_test(test_params: TestParams, path: TestPath) { periodic_check!(second, contract_id, Confirmed); mocks::mock_time::set_time( - ((EVENT_MATURITY + ManagerOptions::default().refund_delay.min) as u64) + 1, + ((EVENT_MATURITY + dlc_manager::manager::REFUND_DELAY_MIN) as u64) + 1, ); generate_blocks(10); diff --git a/sample/src/main.rs b/sample/src/main.rs index bea80903..f63c51b1 100644 --- a/sample/src/main.rs +++ b/sample/src/main.rs @@ -7,7 +7,6 @@ use disk::FilesystemLogger; use bitcoin::secp256k1::rand::{thread_rng, RngCore}; use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey}; use bitcoin_rpc_provider::BitcoinCoreProvider; -use dlc_manager::manager::ManagerOptions; use dlc_manager::{Oracle, SystemTimeProvider}; use dlc_messages::message_handler::MessageHandler as DlcMessageHandler; use lightning::ln::peer_handler::{ @@ -89,7 +88,7 @@ async fn main() { oracles, Arc::new(dlc_manager::SystemTimeProvider {}), bitcoind_provider.clone(), - Some(ManagerOptions::default()), + None, ) .expect("Could not create manager."), ));