diff --git a/Cargo.lock b/Cargo.lock index f66ad58..a930e5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -983,11 +983,11 @@ dependencies = [ "bitcoincore-rpc", "chrono", "crossbeam", + "ddk-dlc", + "ddk-manager", + "ddk-messages", "ddk-payouts", - "dlc", - "dlc-manager", - "dlc-messages", - "dlc-trie", + "ddk-trie", "hex", "kormir", "lightning", @@ -1008,6 +1008,51 @@ dependencies = [ "uuid", ] +[[package]] +name = "ddk-dlc" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ad5d59b454f683860a3c857fd1b5c873421808b95c8cb12d7aa7285fb02fd4" +dependencies = [ + "bitcoin", + "miniscript", + "secp256k1-sys", + "secp256k1-zkp", + "serde", +] + +[[package]] +name = "ddk-manager" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b04cf05f776d5b50be8864d40f60e17e03bdfb20947f4928cfff41e70dc155d4" +dependencies = [ + "async-trait", + "bitcoin", + "ddk-dlc", + "ddk-messages", + "ddk-trie", + "futures", + "hex-conservative 0.1.2", + "lightning", + "log", + "secp256k1-zkp", + "serde", +] + +[[package]] +name = "ddk-messages" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc7c2985d667a61cd05b552e7608ddb48c42b91225ee88378266bfcb3c0b390" +dependencies = [ + "bitcoin", + "ddk-dlc", + "lightning", + "secp256k1-zkp", + "serde", +] + [[package]] name = "ddk-node" version = "0.0.12" @@ -1035,75 +1080,34 @@ version = "0.0.12" dependencies = [ "anyhow", "bitcoin", - "dlc", - "dlc-manager", - "dlc-trie", + "ddk-dlc", + "ddk-manager", + "ddk-trie", "serde", "serde_json", ] [[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "dlc" -version = "0.7.0" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=async#1b979ccab1a4823747f358c04ed0ba66d9eb5019" -dependencies = [ - "bitcoin", - "miniscript", - "secp256k1-sys", - "secp256k1-zkp", - "serde", -] - -[[package]] -name = "dlc-manager" -version = "0.7.0" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=async#1b979ccab1a4823747f358c04ed0ba66d9eb5019" -dependencies = [ - "async-trait", - "bitcoin", - "dlc", - "dlc-messages", - "dlc-trie", - "futures", - "hex-conservative 0.1.2", - "lightning", - "log", - "secp256k1-zkp", - "serde", -] - -[[package]] -name = "dlc-messages" +name = "ddk-trie" version = "0.7.0" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=async#1b979ccab1a4823747f358c04ed0ba66d9eb5019" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a49ce43084ead615b5f3409e6b9d3780277bbde5415f31da5873d7aa3077b6c" dependencies = [ "bitcoin", - "dlc", - "lightning", + "ddk-dlc", "secp256k1-zkp", "serde", ] [[package]] -name = "dlc-trie" -version = "0.7.0" -source = "git+https://github.com/bennyhodl/rust-dlc?branch=async#1b979ccab1a4823747f358c04ed0ba66d9eb5019" +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "bitcoin", - "dlc", - "secp256k1-zkp", - "serde", + "block-buffer", + "crypto-common", + "subtle", ] [[package]] @@ -1952,12 +1956,13 @@ dependencies = [ [[package]] name = "kormir" -version = "0.3.0" -source = "git+https://github.com/bennyhodl/kormir?branch=rust-dlc-async#35cbe3afcfb7bc4991d732a85c311b374a8632b3" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d55dddf4f5a3346cc2af25d3cc3c72be835baeb605e09325358f7f90e524901" dependencies = [ "bitcoin", - "dlc", - "dlc-messages", + "ddk-dlc", + "ddk-messages", "hex", "lightning", "log", diff --git a/ddk-node/src/command.rs b/ddk-node/src/command.rs index c05c4d2..250900f 100644 --- a/ddk-node/src/command.rs +++ b/ddk-node/src/command.rs @@ -9,12 +9,12 @@ use crate::ddkrpc::{ }; use anyhow::anyhow; use ddk::bitcoin::Transaction; -use ddk::dlc::{EnumerationPayout, Payout}; -use ddk::dlc_manager::contract::contract_input::ContractInput; -use ddk::dlc_manager::contract::offered_contract::OfferedContract; -use ddk::dlc_manager::contract::Contract; -use ddk::dlc_messages::oracle_msgs::{EventDescriptor, OracleAnnouncement}; -use ddk::dlc_messages::{AcceptDlc, OfferDlc}; +use ddk::ddk_dlc::{EnumerationPayout, Payout}; +use ddk::ddk_manager::contract::contract_input::ContractInput; +use ddk::ddk_manager::contract::offered_contract::OfferedContract; +use ddk::ddk_manager::contract::Contract; +use ddk::ddk_messages::oracle_msgs::{EventDescriptor, OracleAnnouncement}; +use ddk::ddk_messages::{AcceptDlc, OfferDlc}; use ddk::util; use ddk::wallet::LocalOutput; use inquire::{Select, Text}; @@ -172,6 +172,8 @@ pub async fn cli_command( }) .await? .into_inner(); + let offer_hex = hex::encode(&offer.offer_dlc); + println!("{}", offer_hex); let offer_dlc: OfferDlc = serde_json::from_slice(&offer.offer_dlc)?; let offer = serde_json::to_string_pretty(&offer_dlc)?; print!("{}", offer); @@ -193,6 +195,8 @@ pub async fn cli_command( .await? .into_inner(); let accept_dlc: AcceptDlc = serde_json::from_slice(&accept.accept_dlc)?; + let accept_hex = hex::encode(&accept.accept_dlc); + println!("{}", accept_hex); let accept_dlc = serde_json::to_string_pretty(&accept_dlc)?; print!("{}", accept_dlc) } diff --git a/ddk-node/src/convert.rs b/ddk-node/src/convert.rs index 5f2a852..37245be 100644 --- a/ddk-node/src/convert.rs +++ b/ddk-node/src/convert.rs @@ -1,4 +1,4 @@ -use ddk::dlc_manager::contract::{ +use ddk::ddk_manager::contract::{ accepted_contract::AcceptedContract, offered_contract::OfferedContract, signed_contract::SignedContract, ClosedContract, Contract, FailedAcceptContract, FailedSignContract, PreClosedContract, diff --git a/ddk-node/src/lib.rs b/ddk-node/src/lib.rs index 429dae6..b95a0d3 100644 --- a/ddk-node/src/lib.rs +++ b/ddk-node/src/lib.rs @@ -8,9 +8,9 @@ mod seed; use ddk::bitcoin::secp256k1::PublicKey; use ddk::bitcoin::{Address, Amount, FeeRate, Network}; use ddk::builder::Builder; -use ddk::dlc_manager::contract::contract_input::ContractInput; -use ddk::dlc_manager::Oracle as DlcOracle; -use ddk::dlc_manager::Storage as DlcStorage; +use ddk::ddk_manager::contract::contract_input::ContractInput; +use ddk::ddk_manager::Oracle as DlcOracle; +use ddk::ddk_manager::Storage as DlcStorage; use ddk::oracle::kormir::KormirOracleClient; use ddk::storage::sled::SledStorage; use ddk::transport::lightning::LightningTransport; @@ -87,7 +87,7 @@ impl DdkNode { builder.set_storage(storage.clone()); builder.set_oracle(oracle.clone()); - let ddk: Ddk = builder.finish()?; + let ddk: Ddk = builder.finish().await?; ddk.start()?; diff --git a/ddk/Cargo.toml b/ddk/Cargo.toml index c469c61..bd42bd0 100644 --- a/ddk/Cargo.toml +++ b/ddk/Cargo.toml @@ -24,19 +24,14 @@ p2pderivatives = ["dep:reqwest"] sled = ["dep:sled"] [dependencies] -# dlc = { version = "0.7.0", features = ["use-serde"] } -# dlc-manager = { version = "0.7.0", features = ["use-serde"] } -# dlc-messages = { version = "0.7.0", features = [ "use-serde"] } -# dlc-trie = { version = "0.7.0", features = ["use-serde"] } -dlc = { version = "0.7.0", git = "https://github.com/bennyhodl/rust-dlc", branch = "async", features = ["use-serde"] } -dlc-manager = { version = "0.7.0", git = "https://github.com/bennyhodl/rust-dlc", branch = "async", features = ["use-serde", "async"] } -dlc-messages = { version = "0.7.0", git = "https://github.com/bennyhodl/rust-dlc", branch = "async", features = [ "use-serde"] } -dlc-trie = { version = "0.7.0", git = "https://github.com/bennyhodl/rust-dlc", branch = "async", features = ["use-serde"] } -# dlc = { version = "0.7.0", path = "../../rust-dlc/dlc", features = ["use-serde"] } -# dlc-manager = { version = "0.7.0", path = "../../rust-dlc/dlc-manager", features = ["use-serde", "async"] } -# dlc-messages = { version = "0.7.0", path = "../../rust-dlc/dlc-messages", features = [ "use-serde"] } -# dlc-trie = { version = "0.7.0", path = "../../rust-dlc/dlc-trie", features = ["use-serde"] } - +ddk-dlc = { version = "0.7.0", features = ["use-serde"] } +ddk-manager = { version = "0.7.1", features = ["use-serde"] } +ddk-messages = { version = "0.7.0", features = [ "use-serde"] } +ddk-trie = { version = "0.7.0", features = ["use-serde"] } +# ddk-dlc = { version = "0.7.0", path = "../../rust-dlc/dlc", features = ["use-serde"] } +# ddk-manager = { version = "0.7.1", path = "../../rust-dlc/dlc-manager", features = ["use-serde", "async"] } +# ddk-messages = { version = "0.7.0", path = "../../rust-dlc/dlc-messages", features = [ "use-serde"] } +# ddk-trie = { version = "0.7.0", path = "../../rust-dlc/dlc-trie", features = ["use-serde"] } bitcoin = { version = "0.32.2", features = ["rand", "serde"] } bdk_esplora = { version = "0.19", features = ["blocking", "async"] } @@ -70,9 +65,8 @@ lightning-net-tokio = { version = "0.0.125", optional = true } # oracle feature reqwest = { version = "0.12.9", features = ["blocking"], optional = true } -# kormir = "0.3.0" -kormir = { version = "0.3.0", git = "https://github.com/bennyhodl/kormir", branch = "rust-dlc-async", optional = true } -# kormir = { version = "0.3.0", path = "../../kormir/kormir" } +kormir = { version = "0.3.2", optional = true } +# kormir = { version = "0.3.2", path = "../../kormir/kormir", optional = true } [dev-dependencies] test-log = { version = "0.2.16", features = ["trace"] } diff --git a/ddk/examples/ddk.rs b/ddk/examples/ddk.rs index 655852e..e25928c 100644 --- a/ddk/examples/ddk.rs +++ b/ddk/examples/ddk.rs @@ -24,7 +24,7 @@ async fn main() -> Result<()> { builder.set_storage(storage.clone()); builder.set_oracle(oracle_client.clone()); - let ddk: ApplicationDdk = builder.finish()?; + let ddk: ApplicationDdk = builder.finish().await?; ddk.start().expect("couldn't start ddk"); diff --git a/ddk/src/builder.rs b/ddk/src/builder.rs index 0f4e921..e036d69 100644 --- a/ddk/src/builder.rs +++ b/ddk/src/builder.rs @@ -1,7 +1,7 @@ use bitcoin::Network; use crossbeam::channel::unbounded; -use dlc_manager::manager::Manager; -use dlc_manager::SystemTimeProvider; +use ddk_manager::manager::Manager; +use ddk_manager::SystemTimeProvider; use std::collections::HashMap; use std::sync::{Arc, RwLock}; @@ -78,14 +78,14 @@ impl Builder { self } - /// DLC contract storage. Storage is used by the [dlc_manager::manager::Manager] to create, update, retrieve, and + /// DLC contract storage. Storage is used by the [ddk_manager::manager::Manager] to create, update, retrieve, and /// delete contracts. MUST implement [crate::Storage] pub fn set_storage(&mut self, storage: Arc) -> &mut Self { self.storage = Some(storage); self } - /// Oracle implementation for the [dlc_manager::manager::Manager] to retrieve oracle attestations and announcements. + /// Oracle implementation for the [ddk_manager::manager::Manager] to retrieve oracle attestations and announcements. /// MUST implement [crate::Oracle]. pub fn set_oracle(&mut self, oracle: Arc) -> &mut Self { self.oracle = Some(oracle); @@ -111,7 +111,7 @@ impl Builder { } /// Builds the `DlcDevKit` instance. Fails if any components are missing. - pub fn finish(&self) -> anyhow::Result> { + pub async fn finish(&self) -> anyhow::Result> { tracing::info!( network = self.network.to_string(), esplora = self.esplora_host, @@ -153,15 +153,18 @@ impl Builder { let (sender, receiver) = unbounded::(); - let manager = Arc::new(Manager::new( - wallet.clone(), - wallet.clone(), - esplora_client.clone(), - storage.clone(), - oracles, - Arc::new(SystemTimeProvider {}), - wallet.clone(), - )?); + let manager = Arc::new( + Manager::new( + wallet.clone(), + wallet.clone(), + esplora_client.clone(), + storage.clone(), + oracles, + Arc::new(SystemTimeProvider {}), + wallet.clone(), + ) + .await?, + ); tracing::info!("Created ddk dlc manager."); Ok(DlcDevKit { diff --git a/ddk/src/chain/esplora.rs b/ddk/src/chain/esplora.rs index f5ffdd6..a42c52e 100644 --- a/ddk/src/chain/esplora.rs +++ b/ddk/src/chain/esplora.rs @@ -3,7 +3,7 @@ use bdk_esplora::esplora_client::Error as EsploraError; use bdk_esplora::esplora_client::{AsyncClient, BlockingClient, Builder}; use bitcoin::Network; use bitcoin::{Transaction, Txid}; -use dlc_manager::error::Error as ManagerError; +use ddk_manager::error::Error as ManagerError; /// Esplora client for getting chain information. Holds both a blocking /// and an async client. @@ -29,18 +29,20 @@ impl EsploraClient { } } -/// Implements the `dlc_manager::Blockchain` interface. Grabs chain related information +/// Implements the `ddk_manager::Blockchain` interface. Grabs chain related information /// regarding DLC transactions. -impl dlc_manager::Blockchain for EsploraClient { +#[async_trait::async_trait] +impl ddk_manager::Blockchain for EsploraClient { fn get_network(&self) -> Result { Ok(self.network) } - fn get_transaction(&self, tx_id: &Txid) -> Result { + async fn get_transaction(&self, tx_id: &Txid) -> Result { tracing::info!(txid = tx_id.to_string(), "Broadcasting transaction."); let txn = self - .blocking_client + .async_client .get_tx(tx_id) + .await .map_err(esplora_err_to_manager_err)?; match txn { @@ -51,7 +53,10 @@ impl dlc_manager::Blockchain for EsploraClient { } } - fn send_transaction(&self, transaction: &bitcoin::Transaction) -> Result<(), ManagerError> { + async fn send_transaction( + &self, + transaction: &bitcoin::Transaction, + ) -> Result<(), ManagerError> { tracing::info!( txid = transaction.compute_txid().to_string(), num_inputs = transaction.input.len(), @@ -59,7 +64,7 @@ impl dlc_manager::Blockchain for EsploraClient { "Broadcasting transaction." ); - if let Err(e) = self.blocking_client.broadcast(transaction) { + if let Err(e) = self.async_client.broadcast(transaction).await { tracing::error!( error =? e, "Could not broadcast transaction {}", @@ -71,16 +76,18 @@ impl dlc_manager::Blockchain for EsploraClient { Ok(()) } - fn get_block_at_height(&self, height: u64) -> Result { + async fn get_block_at_height(&self, height: u64) -> Result { tracing::info!(height, "Getting block at height."); let block_hash = self - .blocking_client + .async_client .get_block_hash(height as u32) + .await .map_err(esplora_err_to_manager_err)?; let block = self - .blocking_client + .async_client .get_block_by_hash(&block_hash) + .await .map_err(esplora_err_to_manager_err)?; match block { @@ -92,25 +99,31 @@ impl dlc_manager::Blockchain for EsploraClient { } } - fn get_blockchain_height(&self) -> Result { + async fn get_blockchain_height(&self) -> Result { Ok(self - .blocking_client + .async_client .get_height() + .await .map_err(esplora_err_to_manager_err)? as u64) } - fn get_transaction_confirmations(&self, tx_id: &bitcoin::Txid) -> Result { + async fn get_transaction_confirmations( + &self, + tx_id: &bitcoin::Txid, + ) -> Result { tracing::info!( txid = tx_id.to_string(), "Getting transaction confirmations." ); let txn = self - .blocking_client + .async_client .get_tx_status(tx_id) + .await .map_err(esplora_err_to_manager_err)?; let tip_height = self - .blocking_client + .async_client .get_height() + .await .map_err(esplora_err_to_manager_err)?; if txn.confirmed { diff --git a/ddk/src/ddk.rs b/ddk/src/ddk.rs index c226ab1..924e05c 100644 --- a/ddk/src/ddk.rs +++ b/ddk/src/ddk.rs @@ -7,19 +7,19 @@ use anyhow::anyhow; use bitcoin::secp256k1::PublicKey; use bitcoin::Network; use crossbeam::channel::{unbounded, Receiver, Sender}; -use dlc_manager::error::Error; -use dlc_manager::{ +use ddk_manager::error::Error; +use ddk_manager::{ contract::contract_input::ContractInput, CachedContractSignerProvider, ContractId, SimpleSigner, SystemTimeProvider, }; -use dlc_messages::oracle_msgs::OracleAnnouncement; -use dlc_messages::{AcceptDlc, Message, OfferDlc}; +use ddk_messages::oracle_msgs::OracleAnnouncement; +use ddk_messages::{AcceptDlc, Message, OfferDlc}; use std::sync::{Arc, RwLock}; use std::time::Duration; use tokio::runtime::Runtime; -/// DlcDevKit type alias for the [dlc_manager::manager::Manager] -pub type DlcDevKitDlcManager = dlc_manager::manager::Manager< +/// DlcDevKit type alias for the [ddk_manager::manager::Manager] +pub type DlcDevKitDlcManager = ddk_manager::manager::Manager< Arc, Arc, SimpleSigner>>, Arc, @@ -165,7 +165,7 @@ where contract, responder, } => { - let accept_dlc = manager.accept_contract_offer(&contract); + let accept_dlc = manager.accept_contract_offer(&contract).await; responder.send(accept_dlc).expect("can't send") } @@ -251,11 +251,11 @@ mod tests { test_util::{generate_blocks, test_ddk, TestSuite}, Transport, }; - use dlc_manager::{ + use ddk_manager::{ contract::{contract_input::ContractInput, Contract}, Storage, }; - use dlc_messages::{oracle_msgs::OracleAnnouncement, Message}; + use ddk_messages::{oracle_msgs::OracleAnnouncement, Message}; use rstest::rstest; use tokio::time::sleep; @@ -278,7 +278,9 @@ mod tests { vec![vec![announcement.clone()]], ); - let alice_makes_offer = alice_makes_offer.expect("alice did not create an offer"); + let alice_makes_offer = alice_makes_offer + .await + .expect("alice did not create an offer"); let contract_id = alice_makes_offer.temporary_contract_id.clone(); let alice_pubkey = alice.ddk.transport.public_key(); @@ -287,7 +289,8 @@ mod tests { let bob_receives_offer = bob .ddk .manager - .on_dlc_message(&Message::Offer(alice_makes_offer), alice_pubkey); + .on_dlc_message(&Message::Offer(alice_makes_offer), alice_pubkey) + .await; let bob_receive_offer = bob_receives_offer.expect("bob did not receive the offer"); assert!(bob_receive_offer.is_none()); @@ -296,6 +299,7 @@ mod tests { .ddk .manager .accept_contract_offer(&contract_id) + .await .expect("bob could not accept offer"); let (contract_id, _counter_party, bob_accept_dlc) = bob_accept_offer; @@ -304,6 +308,7 @@ mod tests { .ddk .manager .on_dlc_message(&Message::Accept(bob_accept_dlc), bob_pubkey) + .await .expect("alice did not receive accept"); assert!(alice_receive_accept.is_some()); @@ -312,6 +317,7 @@ mod tests { bob.ddk .manager .on_dlc_message(&alice_sign_message, alice_pubkey) + .await .expect("bob did not receive sign message"); generate_blocks(10); @@ -379,6 +385,7 @@ mod tests { bob.ddk .manager .close_confirmed_contract(&contract_id, vec![(0, attestation.unwrap())]) + .await .unwrap(); sleep(Duration::from_secs(10)).await; diff --git a/ddk/src/error.rs b/ddk/src/error.rs index 68adc0e..380a0bd 100644 --- a/ddk/src/error.rs +++ b/ddk/src/error.rs @@ -1,5 +1,5 @@ use bdk_esplora::esplora_client::Error as EsploraError; -use dlc_manager::error::Error as ManagerError; +use ddk_manager::error::Error as ManagerError; pub fn esplora_err_to_manager_err(e: EsploraError) -> ManagerError { ManagerError::BlockchainError(e.to_string()) diff --git a/ddk/src/lib.rs b/ddk/src/lib.rs index f78d6a7..2c178d0 100644 --- a/ddk/src/lib.rs +++ b/ddk/src/lib.rs @@ -33,9 +33,9 @@ pub use ddk::DlcManagerMessage; /// Re-exports pub use bitcoin; -pub use dlc; -pub use dlc_manager; -pub use dlc_messages; +pub use ddk_dlc; +pub use ddk_manager; +pub use ddk_messages; /// Default nostr relay. pub const DEFAULT_NOSTR_RELAY: &str = "wss://nostr.dlcdevkit.com"; @@ -43,8 +43,8 @@ pub const DEFAULT_NOSTR_RELAY: &str = "wss://nostr.dlcdevkit.com"; use async_trait::async_trait; use bitcoin::secp256k1::{PublicKey, SecretKey}; use ddk::DlcDevKitDlcManager; -use dlc_messages::oracle_msgs::OracleAnnouncement; -use dlc_messages::Message; +use ddk_messages::oracle_msgs::OracleAnnouncement; +use ddk_messages::Message; use error::WalletError; use transport::PeerInformation; @@ -69,7 +69,7 @@ pub trait Transport: Send + Sync + 'static { } /// Storage for DLC contracts. -pub trait Storage: dlc_manager::Storage + Send + Sync + 'static { +pub trait Storage: ddk_manager::Storage + Send + Sync + 'static { ///// Instantiate the storage for the BDK wallet. fn initialize_bdk(&self) -> Result; /// Save changeset to the wallet storage. @@ -91,6 +91,6 @@ pub trait KeyStorage { } /// Oracle client -pub trait Oracle: dlc_manager::Oracle + Send + Sync + 'static { +pub trait Oracle: ddk_manager::Oracle + Send + Sync + 'static { fn name(&self) -> String; } diff --git a/ddk/src/nostr/mod.rs b/ddk/src/nostr/mod.rs index a8aa43d..1c0fb07 100644 --- a/ddk/src/nostr/mod.rs +++ b/ddk/src/nostr/mod.rs @@ -1,9 +1,9 @@ -use dlc_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; +use ddk_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; use lightning::io::Cursor; use lightning::util::ser::Readable; use nostr_rs::{Filter, Kind, PublicKey as NostrPublicKey, Timestamp}; -/// Nostr [dlc_messages::oracle_msgs::OracleAnnouncement] marketplace. +/// Nostr [ddk_messages::oracle_msgs::OracleAnnouncement] marketplace. #[cfg(feature = "marketplace")] pub mod marketplace; diff --git a/ddk/src/oracle/kormir.rs b/ddk/src/oracle/kormir.rs index 0f20688..aab613a 100644 --- a/ddk/src/oracle/kormir.rs +++ b/ddk/src/oracle/kormir.rs @@ -1,6 +1,6 @@ use anyhow::anyhow; use bitcoin::key::XOnlyPublicKey; -use dlc_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; +use ddk_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; use kormir::storage::OracleEventData; use lightning::{io::Cursor, util::ser::Readable}; use serde::Serialize; @@ -67,7 +67,10 @@ impl KormirOracleClient { /// Kormir events includes announcements info, nonce index, signatures /// if announcement has been signed, and nostr information. pub async fn list_events(&self) -> anyhow::Result> { - get(&self.host, "list-events").await + get(&self.host, "list-events").await.map_err(|e| { + println!("Error in list events. {}", e.to_string()); + anyhow!("List events") + }) } /// Creates an enum oracle announcament. @@ -113,7 +116,9 @@ impl KormirOracleClient { announcement: OracleAnnouncement, outcome: String, ) -> anyhow::Result { - let event_id = match self.list_events().await?.iter().find(|event| { + let event_id = self.list_events().await?; + + let event_id = match event_id.iter().find(|event| { event.announcement.oracle_event.event_id == announcement.oracle_event.event_id }) { Some(ann) => ann.id, @@ -125,6 +130,8 @@ impl KormirOracleClient { None => return Err(anyhow!("No id in kormir oracle event data.")), }; + tracing::info!("Signing event. event_id={:?} id={id}", event_id); + let event = SignEnumEvent { id, outcome }; let hex = self @@ -150,7 +157,8 @@ impl KormirOracleClient { } } -impl dlc_manager::Oracle for KormirOracleClient { +#[async_trait::async_trait] +impl ddk_manager::Oracle for KormirOracleClient { fn get_public_key(&self) -> bitcoin::key::XOnlyPublicKey { self.pubkey } @@ -158,13 +166,13 @@ impl dlc_manager::Oracle for KormirOracleClient { async fn get_attestation( &self, event_id: &str, - ) -> Result { + ) -> Result { tracing::info!(event_id, "Getting attestation to close contract."); let attestation = get::(&self.host, &format!("attestation/{event_id}")) .await .map_err(|e| { tracing::error!(error=?e, "Could not get attestation."); - dlc_manager::error::Error::OracleError("Could not get attestation".into()) + ddk_manager::error::Error::OracleError("Could not get attestation".into()) })?; tracing::info!(event_id, attestation =? attestation, "Kormir attestation."); Ok(attestation) @@ -173,14 +181,14 @@ impl dlc_manager::Oracle for KormirOracleClient { async fn get_announcement( &self, event_id: &str, - ) -> Result { + ) -> Result { tracing::info!(event_id, "Getting oracle announcement."); let announcement = get::(&self.host, &format!("announcement/{event_id}")) .await .map_err(|e| { tracing::error!(error =? e, "Could not get announcement."); - dlc_manager::error::Error::OracleError("Could not get announcement".into()) + ddk_manager::error::Error::OracleError("Could not get announcement".into()) })?; tracing::info!(event_id, announcement=?announcement, "Kormir announcement."); Ok(announcement) @@ -200,7 +208,7 @@ mod tests { use super::*; async fn create_kormir() -> KormirOracleClient { - KormirOracleClient::new("http://127.0.0.1:8082") + KormirOracleClient::new("https://kormir.dlcdevkit.com") .await .unwrap() } diff --git a/ddk/src/oracle/memory.rs b/ddk/src/oracle/memory.rs index e0d50d9..05959f3 100644 --- a/ddk/src/oracle/memory.rs +++ b/ddk/src/oracle/memory.rs @@ -1,5 +1,6 @@ use bitcoin::bip32::Xpriv; use bitcoin::key::rand::Rng; +use bitcoin::secp256k1::schnorr::Signature; use kormir::storage::{MemoryStorage, Storage}; use kormir::{Oracle as Kormir, OracleAttestation}; @@ -25,7 +26,8 @@ impl Oracle for MemoryOracle { } } -impl dlc_manager::Oracle for MemoryOracle { +#[async_trait::async_trait] +impl ddk_manager::Oracle for MemoryOracle { fn get_public_key(&self) -> bitcoin::XOnlyPublicKey { self.oracle.public_key() } @@ -33,7 +35,7 @@ impl dlc_manager::Oracle for MemoryOracle { async fn get_announcement( &self, event_id: &str, - ) -> Result { + ) -> Result { Ok(self .oracle .storage @@ -47,20 +49,30 @@ impl dlc_manager::Oracle for MemoryOracle { async fn get_attestation( &self, event_id: &str, - ) -> Result { - let signatures = self + ) -> Result { + let event = self .oracle .storage .get_event(event_id.parse().unwrap()) .await .unwrap() - .unwrap() - .signatures; + .unwrap(); + + let sigs = event.signatures + .iter() + .map(|sig| sig.1) + .collect::>(); + + let outcomes = event.signatures + .iter() + .map(|outcome| outcome.0.clone()) + .collect::>(); Ok(OracleAttestation { + event_id: event.announcement.oracle_event.event_id, oracle_public_key: self.oracle.public_key(), - signatures: signatures.values().cloned().collect::>(), - outcomes: signatures.keys().cloned().collect::>(), + signatures: sigs, + outcomes, }) } } @@ -68,7 +80,7 @@ impl dlc_manager::Oracle for MemoryOracle { #[cfg(test)] mod tests { use chrono::{Local, TimeDelta}; - use dlc_manager::Oracle; + use ddk_manager::Oracle; use super::*; @@ -91,8 +103,10 @@ mod tests { ) .await .unwrap(); + println!("create: {}", announcement.oracle_event.event_id); let ann = oracle.get_announcement(&format!("{id}")).await.unwrap(); + println!("get_announcement: {}", ann.oracle_event.event_id); assert_eq!(ann, announcement); @@ -102,7 +116,10 @@ mod tests { .await .unwrap(); + println!("sign: {:?}", sign.event_id); + let att = oracle.get_attestation(&format!("{id}")).await.unwrap(); + println!("get_attestation: {}", att.event_id); assert_eq!(sign, att); } diff --git a/ddk/src/oracle/p2p_derivatives.rs b/ddk/src/oracle/p2p_derivatives.rs index 6024923..b5d169f 100644 --- a/ddk/src/oracle/p2p_derivatives.rs +++ b/ddk/src/oracle/p2p_derivatives.rs @@ -4,9 +4,9 @@ //! Http client wrapper for the Crypto Garage DLC oracle use chrono::{DateTime, SecondsFormat, Utc}; -use dlc::secp256k1_zkp::{schnorr::Signature, XOnlyPublicKey}; -use dlc_manager::error::Error as DlcManagerError; -use dlc_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; +use ddk_manager::error::Error as DlcManagerError; +use ddk_messages::oracle_msgs::{OracleAnnouncement, OracleAttestation}; +use ddk_dlc::secp256k1_zkp::{schnorr::Signature, XOnlyPublicKey}; use crate::Oracle; @@ -62,13 +62,13 @@ where reqwest::get(path) .await .map_err(|x| { - dlc_manager::error::Error::IOError( + ddk_manager::error::Error::IOError( std::io::Error::new(std::io::ErrorKind::Other, x).into(), ) })? .json::() .await - .map_err(|e| dlc_manager::error::Error::OracleError(e.to_string())) + .map_err(|e| ddk_manager::error::Error::OracleError(e.to_string())) } fn pubkey_path(host: &str) -> String { @@ -135,7 +135,8 @@ fn parse_event_id(event_id: &str) -> Result<(String, DateTime), DlcManagerE Ok((asset_id.to_string(), date_time)) } -impl dlc_manager::Oracle for P2PDOracleClient { +#[async_trait::async_trait] +impl ddk_manager::Oracle for P2PDOracleClient { fn get_public_key(&self) -> XOnlyPublicKey { self.public_key } @@ -153,16 +154,17 @@ impl dlc_manager::Oracle for P2PDOracleClient { async fn get_attestation( &self, event_id: &str, - ) -> Result { + ) -> Result { let (asset_id, date_time) = parse_event_id(event_id)?; let path = attestation_path(&self.host, &asset_id, &date_time); let AttestationResponse { - event_id: _, + event_id, signatures, values, } = get::(&path).await?; Ok(OracleAttestation { + event_id, oracle_public_key: self.public_key, signatures, outcomes: values, diff --git a/ddk/src/storage/memory.rs b/ddk/src/storage/memory.rs index 061c4f4..d1e1474 100644 --- a/ddk/src/storage/memory.rs +++ b/ddk/src/storage/memory.rs @@ -1,8 +1,8 @@ use crate::transport::PeerInformation; use crate::Storage; use bdk_chain::Merge; -use dlc_manager::{channel::Channel, contract::Contract, ChannelId, ContractId}; -use dlc_messages::oracle_msgs::OracleAnnouncement; +use ddk_manager::{channel::Channel, contract::Contract, ChannelId, ContractId}; +use ddk_messages::oracle_msgs::OracleAnnouncement; use std::collections::HashMap; use std::sync::RwLock; @@ -13,7 +13,7 @@ pub struct MemoryStorage { announcements: RwLock>, contracts: RwLock>, channels: RwLock>, - chain_monitor: RwLock>, + chain_monitor: RwLock>, } impl MemoryStorage { @@ -67,32 +67,32 @@ impl Storage for MemoryStorage { } } -impl dlc_manager::Storage for MemoryStorage { +impl ddk_manager::Storage for MemoryStorage { fn get_contract( &self, - id: &dlc_manager::ContractId, - ) -> Result, dlc_manager::error::Error> { + id: &ddk_manager::ContractId, + ) -> Result, ddk_manager::error::Error> { Ok(self.contracts.read().unwrap().get(id).cloned()) } fn get_channel( &self, - channel_id: &dlc_manager::ChannelId, - ) -> Result, dlc_manager::error::Error> { + channel_id: &ddk_manager::ChannelId, + ) -> Result, ddk_manager::error::Error> { Ok(self.channels.read().unwrap().get(channel_id).cloned()) } fn get_contracts( &self, - ) -> Result, dlc_manager::error::Error> { + ) -> Result, ddk_manager::error::Error> { Ok(self.contracts.read().unwrap().values().cloned().collect()) } fn upsert_channel( &self, - channel: dlc_manager::channel::Channel, - contract: Option, - ) -> Result<(), dlc_manager::error::Error> { + channel: ddk_manager::channel::Channel, + contract: Option, + ) -> Result<(), ddk_manager::error::Error> { if let Some(contract) = contract { self.contracts .write() @@ -108,16 +108,16 @@ impl dlc_manager::Storage for MemoryStorage { fn delete_channel( &self, - channel_id: &dlc_manager::ChannelId, - ) -> Result<(), dlc_manager::error::Error> { + channel_id: &ddk_manager::ChannelId, + ) -> Result<(), ddk_manager::error::Error> { self.channels.write().unwrap().remove(channel_id); Ok(()) } fn create_contract( &self, - contract: &dlc_manager::contract::offered_contract::OfferedContract, - ) -> Result<(), dlc_manager::error::Error> { + contract: &ddk_manager::contract::offered_contract::OfferedContract, + ) -> Result<(), ddk_manager::error::Error> { self.contracts .write() .unwrap() @@ -127,16 +127,16 @@ impl dlc_manager::Storage for MemoryStorage { fn delete_contract( &self, - id: &dlc_manager::ContractId, - ) -> Result<(), dlc_manager::error::Error> { + id: &ddk_manager::ContractId, + ) -> Result<(), ddk_manager::error::Error> { self.contracts.write().unwrap().remove(id); Ok(()) } fn update_contract( &self, - contract: &dlc_manager::contract::Contract, - ) -> Result<(), dlc_manager::error::Error> { + contract: &ddk_manager::contract::Contract, + ) -> Result<(), ddk_manager::error::Error> { self.contracts .write() .unwrap() @@ -146,15 +146,15 @@ impl dlc_manager::Storage for MemoryStorage { fn get_chain_monitor( &self, - ) -> Result, dlc_manager::error::Error> { + ) -> Result, ddk_manager::error::Error> { Ok(None) } fn get_contract_offers( &self, ) -> Result< - Vec, - dlc_manager::error::Error, + Vec, + ddk_manager::error::Error, > { let contracts = self.contracts.read().unwrap(); let offers = contracts @@ -170,8 +170,8 @@ impl dlc_manager::Storage for MemoryStorage { fn get_signed_channels( &self, - _channel_state: Option, - ) -> Result, dlc_manager::error::Error> + _channel_state: Option, + ) -> Result, ddk_manager::error::Error> { let channels = self.channels.read().unwrap(); Ok(channels @@ -186,8 +186,8 @@ impl dlc_manager::Storage for MemoryStorage { fn get_signed_contracts( &self, ) -> Result< - Vec, - dlc_manager::error::Error, + Vec, + ddk_manager::error::Error, > { let contracts = self.contracts.read().unwrap(); Ok(contracts @@ -201,7 +201,7 @@ impl dlc_manager::Storage for MemoryStorage { fn get_offered_channels( &self, - ) -> Result, dlc_manager::error::Error> + ) -> Result, ddk_manager::error::Error> { let channels = self.channels.read().unwrap(); Ok(channels @@ -215,16 +215,16 @@ impl dlc_manager::Storage for MemoryStorage { fn persist_chain_monitor( &self, - _monitor: &dlc_manager::chain_monitor::ChainMonitor, - ) -> Result<(), dlc_manager::error::Error> { + _monitor: &ddk_manager::chain_monitor::ChainMonitor, + ) -> Result<(), ddk_manager::error::Error> { Ok(()) } fn get_confirmed_contracts( &self, ) -> Result< - Vec, - dlc_manager::error::Error, + Vec, + ddk_manager::error::Error, > { let contracts = self.contracts.read().unwrap(); Ok(contracts @@ -238,7 +238,7 @@ impl dlc_manager::Storage for MemoryStorage { fn get_preclosed_contracts( &self, - ) -> Result, dlc_manager::error::Error> { + ) -> Result, ddk_manager::error::Error> { let contracts = self.contracts.read().unwrap(); Ok(contracts .values() diff --git a/ddk/src/storage/sled/contract.rs b/ddk/src/storage/sled/contract.rs index 6b8c0b2..7ab2329 100644 --- a/ddk/src/storage/sled/contract.rs +++ b/ddk/src/storage/sled/contract.rs @@ -1,18 +1,18 @@ use super::{SledStorage, CHAIN_MONITOR_KEY, CHAIN_MONITOR_TREE}; use crate::util::{deserialize_contract, serialize_contract}; use bitcoin::consensus::ReadExt; -use dlc_manager::chain_monitor::ChainMonitor; -use dlc_manager::channel::accepted_channel::AcceptedChannel; -use dlc_manager::channel::offered_channel::OfferedChannel; -use dlc_manager::channel::signed_channel::{SignedChannel, SignedChannelStateType}; -use dlc_manager::channel::{ +use ddk_manager::chain_monitor::ChainMonitor; +use ddk_manager::channel::accepted_channel::AcceptedChannel; +use ddk_manager::channel::offered_channel::OfferedChannel; +use ddk_manager::channel::signed_channel::{SignedChannel, SignedChannelStateType}; +use ddk_manager::channel::{ Channel, ClosedChannel, ClosedPunishedChannel, ClosingChannel, FailedAccept, FailedSign, }; -use dlc_manager::contract::offered_contract::OfferedContract; -use dlc_manager::contract::ser::Serializable; -use dlc_manager::contract::signed_contract::SignedContract; -use dlc_manager::contract::{Contract, PreClosedContract}; -use dlc_manager::{error::Error, ContractId, Storage}; +use ddk_manager::contract::offered_contract::OfferedContract; +use ddk_manager::contract::ser::Serializable; +use ddk_manager::contract::signed_contract::SignedContract; +use ddk_manager::contract::{Contract, PreClosedContract}; +use ddk_manager::{error::Error, ContractId, Storage}; use sled::transaction::{ConflictableTransactionResult, UnabortableTransactionError}; use sled::Transactional; use std::convert::TryInto; @@ -241,14 +241,14 @@ impl Storage for SledStorage { Ok(()) } - fn delete_channel(&self, channel_id: &dlc_manager::ChannelId) -> Result<(), Error> { + fn delete_channel(&self, channel_id: &ddk_manager::ChannelId) -> Result<(), Error> { self.channel_tree()? .remove(channel_id) .map_err(to_storage_error)?; Ok(()) } - fn get_channel(&self, channel_id: &dlc_manager::ChannelId) -> Result, Error> { + fn get_channel(&self, channel_id: &ddk_manager::ChannelId) -> Result, Error> { match self .channel_tree()? .get(channel_id) @@ -292,7 +292,7 @@ impl Storage for SledStorage { .map_err(|e| Error::StorageError(format!("Error writing chain monitor: {}", e)))?; Ok(()) } - fn get_chain_monitor(&self) -> Result, dlc_manager::error::Error> { + fn get_chain_monitor(&self) -> Result, ddk_manager::error::Error> { let serialized = self .open_tree(&[CHAIN_MONITOR_TREE])? .get([CHAIN_MONITOR_KEY]) diff --git a/ddk/src/storage/sled/mod.rs b/ddk/src/storage/sled/mod.rs index a69cdbe..6d6b26f 100644 --- a/ddk/src/storage/sled/mod.rs +++ b/ddk/src/storage/sled/mod.rs @@ -7,9 +7,9 @@ mod wallet; use bdk_chain::Merge; use bdk_wallet::ChangeSet; -use dlc_manager::contract::ser::Serializable; -use dlc_manager::error::Error; -use dlc_messages::oracle_msgs::OracleAnnouncement; +use ddk_manager::contract::ser::Serializable; +use ddk_manager::error::Error; +use ddk_messages::oracle_msgs::OracleAnnouncement; use lightning::io::{Cursor, Read}; use sled::{Db, Tree}; diff --git a/ddk/src/test_util/mod.rs b/ddk/src/test_util/mod.rs index 8050552..2f6cd31 100644 --- a/ddk/src/test_util/mod.rs +++ b/ddk/src/test_util/mod.rs @@ -9,13 +9,13 @@ use bitcoin::{ Address, Amount, Network, }; use chrono::{Local, TimeDelta}; -use ddk_payouts::enumeration::create_contract_input; -use dlc::EnumerationPayout; -use dlc_manager::{ +use ddk_dlc::EnumerationPayout; +use ddk_manager::{ contract::contract_input::ContractInput, manager::Manager, ContractId, Storage, SystemTimeProvider, }; -use dlc_messages::oracle_msgs::OracleAnnouncement; +use ddk_messages::oracle_msgs::OracleAnnouncement; +use ddk_payouts::enumeration::create_contract_input; use kormir::{storage::MemoryStorage as KormirMemoryStorage, Oracle}; use std::{ fs::File, @@ -64,7 +64,7 @@ pub async fn test_ddk() -> ( (test, test_two, announcement, contract_input) } -fn fund_addresses( +pub fn fund_addresses( node_one_address: &Address, node_two_address: &Address, ) { @@ -137,14 +137,14 @@ pub fn contract_input(announcement: &OracleAnnouncement) -> ContractInput { vec![ EnumerationPayout { outcome: "rust".to_string(), - payout: dlc::Payout { + payout: ddk_dlc::Payout { offer: 100_000, accept: 0, }, }, EnumerationPayout { outcome: "go".to_string(), - payout: dlc::Payout { + payout: ddk_dlc::Payout { offer: 0, accept: 100_000, }, @@ -162,9 +162,9 @@ type DlcManager = Arc< Manager< Arc, Arc< - dlc_manager::CachedContractSignerProvider< + ddk_manager::CachedContractSignerProvider< Arc, - dlc_manager::SimpleSigner, + ddk_manager::SimpleSigner, >, >, Arc, @@ -172,7 +172,7 @@ type DlcManager = Arc< Arc, Arc, Arc, - dlc_manager::SimpleSigner, + ddk_manager::SimpleSigner, >, >; @@ -227,6 +227,7 @@ impl TestSuite { .set_transport(transport) .set_storage(storage) .finish() + .await .unwrap(); ddk @@ -256,7 +257,9 @@ impl TestSuite { impl Drop for TestWallet { fn drop(&mut self) { - std::fs::remove_dir_all(self.1.clone()).expect("couldn't remove wallet dir"); + if let Err(_) = std::fs::remove_dir_all(self.1.clone()) { + println!("Couldn't remove wallet dir.") + }; } } diff --git a/ddk/src/transport/lightning/mod.rs b/ddk/src/transport/lightning/mod.rs index 58ac5d3..90a9a14 100644 --- a/ddk/src/transport/lightning/mod.rs +++ b/ddk/src/transport/lightning/mod.rs @@ -37,7 +37,7 @@ impl Transport for LightningTransport { /// Sends a message to a peer. /// /// TODO: Assert that we are connected to the peer before sending. - fn send_message(&self, counterparty: PublicKey, message: dlc_messages::Message) { + fn send_message(&self, counterparty: PublicKey, message: ddk_messages::Message) { self.message_handler.send_message(counterparty, message) } @@ -58,7 +58,7 @@ impl Transport for LightningTransport { "Processing DLC message" ); - match manager.on_dlc_message(&message, counter_party) { + match manager.on_dlc_message(&message, counter_party).await { Err(e) => { tracing::error!(error =? e, "On message error.") } diff --git a/ddk/src/transport/lightning/peer_manager.rs b/ddk/src/transport/lightning/peer_manager.rs index db25ae6..be26689 100644 --- a/ddk/src/transport/lightning/peer_manager.rs +++ b/ddk/src/transport/lightning/peer_manager.rs @@ -1,6 +1,6 @@ use anyhow::anyhow; use bitcoin::{key::rand::Fill, secp256k1::PublicKey}; -use dlc_messages::message_handler::MessageHandler as DlcMessageHandler; +use ddk_messages::message_handler::MessageHandler as DlcMessageHandler; use lightning::{ ln::peer_handler::{ ErroringMessageHandler, IgnoringMessageHandler, MessageHandler, diff --git a/ddk/src/transport/memory.rs b/ddk/src/transport/memory.rs index 8aed3a2..10c42f0 100644 --- a/ddk/src/transport/memory.rs +++ b/ddk/src/transport/memory.rs @@ -6,7 +6,7 @@ use bitcoin::{ secp256k1::{All, PublicKey, Secp256k1}, }; use crossbeam::channel::{unbounded, Receiver, Sender}; -use dlc_messages::Message; +use ddk_messages::Message; pub struct MemoryTransport { pub receiver: Receiver<(Message, PublicKey)>, @@ -69,7 +69,7 @@ impl Transport for MemoryTransport { loop { timer.tick().await; if let Ok(msg) = self.receiver.recv() { - match manager.on_dlc_message(&msg.0, msg.1) { + match manager.on_dlc_message(&msg.0, msg.1).await { Ok(s) => { if let Some(reply) = s { self.send_message(msg.1, reply); diff --git a/ddk/src/transport/nostr/messages.rs b/ddk/src/transport/nostr/messages.rs index 13436b0..201e798 100644 --- a/ddk/src/transport/nostr/messages.rs +++ b/ddk/src/transport/nostr/messages.rs @@ -1,6 +1,7 @@ use crate::nostr::{DLC_MESSAGE_KIND, ORACLE_ANNOUNCMENT_KIND, ORACLE_ATTESTATION_KIND}; -use dlc_messages::message_handler::read_dlc_message; -use dlc_messages::{Message, WireMessage}; +use ddk_dlc::secp256k1_zkp::PublicKey as SecpPublicKey; +use ddk_messages::message_handler::read_dlc_message; +use ddk_messages::{Message, WireMessage}; use lightning::ln::wire::Type; use lightning::util::ser::{Readable, Writeable}; use nostr_rs::nips::nip04; @@ -45,7 +46,7 @@ pub fn parse_dlc_msg_event(event: &Event, secret_key: &SecretKey) -> anyhow::Res pub fn handle_dlc_msg_event( event: &Event, secret_key: &SecretKey, -) -> anyhow::Result<(dlc::secp256k1_zkp::PublicKey, Message, Event)> { +) -> anyhow::Result<(SecpPublicKey, Message, Event)> { if event.kind != Kind::Custom(8_888) { return Err(anyhow::anyhow!("Event reveived was not DLC Message event.")); } diff --git a/ddk/src/transport/nostr/mod.rs b/ddk/src/transport/nostr/mod.rs index d9b1b44..fed6126 100644 --- a/ddk/src/transport/nostr/mod.rs +++ b/ddk/src/transport/nostr/mod.rs @@ -5,7 +5,7 @@ pub use relay_handler::NostrDlc; use crate::{DlcDevKitDlcManager, Oracle, Storage, Transport}; use bitcoin::secp256k1::PublicKey as BitcoinPublicKey; -use dlc_messages::Message; +use ddk_messages::Message; use nostr_rs::PublicKey; use std::sync::Arc; diff --git a/ddk/src/transport/nostr/relay_handler.rs b/ddk/src/transport/nostr/relay_handler.rs index c1a3da0..6cc7ea3 100644 --- a/ddk/src/transport/nostr/relay_handler.rs +++ b/ddk/src/transport/nostr/relay_handler.rs @@ -78,7 +78,7 @@ impl NostrDlc { } }; - match manager.on_dlc_message(&message, pubkey) { + match manager.on_dlc_message(&message, pubkey).await { Ok(Some(msg)) => { let event = super::messages::create_dlc_msg_event( event.pubkey, diff --git a/ddk/src/util.rs b/ddk/src/util.rs index eb48eed..c97e78c 100644 --- a/ddk/src/util.rs +++ b/ddk/src/util.rs @@ -1,13 +1,13 @@ use chrono::Utc; -use dlc_manager::contract::accepted_contract::AcceptedContract; -use dlc_manager::contract::offered_contract::OfferedContract; -use dlc_manager::contract::ser::Serializable; -use dlc_manager::contract::signed_contract::SignedContract; -use dlc_manager::contract::{ +use ddk_manager::contract::accepted_contract::AcceptedContract; +use ddk_manager::contract::offered_contract::OfferedContract; +use ddk_manager::contract::ser::Serializable; +use ddk_manager::contract::signed_contract::SignedContract; +use ddk_manager::contract::{ ClosedContract, Contract, FailedAcceptContract, FailedSignContract, PreClosedContract, }; -use dlc_manager::error::Error; -use dlc_messages::oracle_msgs::OracleAnnouncement; +use ddk_manager::error::Error; +use ddk_messages::oracle_msgs::OracleAnnouncement; use lightning::io::Read; /// Helper from rust-dlc to implement types for contracts. diff --git a/ddk/src/wallet.rs b/ddk/src/wallet.rs index b63f927..b9d29d7 100644 --- a/ddk/src/wallet.rs +++ b/ddk/src/wallet.rs @@ -23,7 +23,7 @@ use bitcoin::hashes::sha256::HashEngine; use bitcoin::hashes::Hash; use bitcoin::key::rand::{thread_rng, Fill}; use bitcoin::{secp256k1::SecretKey, Amount, FeeRate, ScriptBuf, Transaction}; -use dlc_manager::{error::Error as ManagerError, SimpleSigner}; +use ddk_manager::{error::Error as ManagerError, SimpleSigner}; use lightning::chain::chaininterface::{ConfirmationTarget, FeeEstimator}; use std::collections::HashMap; use std::io::Write; @@ -275,6 +275,29 @@ impl DlcDevKitWallet { Ok(tx.compute_txid()) } + pub fn send_all(&self, address: Address, fee_rate: FeeRate) -> Result { + let Ok(mut wallet) = self.wallet.try_write() else { + tracing::error!("Could not get lock to sync wallet."); + return Err(WalletError::Lock); + }; + + tracing::info!( + address = address.to_string(), + "Sending all UTXOs to address." + ); + + let mut tx_builder = wallet.build_tx(); + tx_builder.fee_rate(fee_rate); + tx_builder.drain_wallet(); + tx_builder.drain_to(address.script_pubkey()); + let mut psbt = tx_builder.finish().unwrap(); + wallet.sign(&mut psbt, SignOptions::default()).unwrap(); + let tx = psbt.extract_tx()?; + self.blockchain.blocking_client.broadcast(&tx)?; + + Ok(tx.compute_txid()) + } + pub fn get_transactions(&self) -> Result>, WalletError> { let Ok(wallet) = self.wallet.try_read() else { tracing::error!("Could not get lock to sync wallet."); @@ -313,7 +336,7 @@ impl FeeEstimator for DlcDevKitWallet { } } -impl dlc_manager::ContractSignerProvider for DlcDevKitWallet { +impl ddk_manager::ContractSignerProvider for DlcDevKitWallet { type Signer = SimpleSigner; // Using the data deterministically generate a key id. From a child key. @@ -352,7 +375,7 @@ impl dlc_manager::ContractSignerProvider for DlcDevKitWallet { } } -impl dlc_manager::Wallet for DlcDevKitWallet { +impl ddk_manager::Wallet for DlcDevKitWallet { fn get_new_address(&self) -> Result { let address = self .new_external_address() @@ -421,7 +444,7 @@ impl dlc_manager::Wallet for DlcDevKitWallet { amount: u64, fee_rate: u64, _lock_utxos: bool, - ) -> Result, ManagerError> { + ) -> Result, ManagerError> { let local_utxos = self.list_utxos().map_err(wallet_err_to_manager_err)?; let utxos = local_utxos @@ -442,7 +465,7 @@ impl dlc_manager::Wallet for DlcDevKitWallet { ScriptBuf::new().as_script(), &mut thread_rng(), ) - .unwrap(); + .map_err(|e| ManagerError::WalletError(Box::new(e)))?; let dlc_utxos = selected_utxos .selected @@ -450,7 +473,7 @@ impl dlc_manager::Wallet for DlcDevKitWallet { .map(|utxo| { let address = Address::from_script(&utxo.txout().script_pubkey, self.network).unwrap(); - dlc_manager::Utxo { + ddk_manager::Utxo { tx_out: utxo.txout().clone(), outpoint: utxo.outpoint(), address, @@ -466,9 +489,11 @@ impl dlc_manager::Wallet for DlcDevKitWallet { #[cfg(test)] mod tests { - use crate::test_util::TestSuite; - use bitcoin::{key::rand::Fill, AddressType}; - use dlc_manager::ContractSignerProvider; + use std::str::FromStr; + + use crate::test_util::{generate_blocks, TestSuite}; + use bitcoin::{key::rand::Fill, Address, AddressType, Amount, FeeRate, Network}; + use ddk_manager::{Blockchain, ContractSignerProvider}; #[test] fn address_is_p2wpkh() { @@ -488,4 +513,31 @@ mod tests { let key_info = test.0.derive_contract_signer(gen_key_id); assert!(key_info.is_ok()) } + + #[test] + fn send_all() { + use crate::test_util::fund_addresses; + let wallet = TestSuite::create_wallet("send_all"); + let network = wallet.0.blockchain.get_network().unwrap(); + let address = match network { + Network::Regtest => "bcrt1qt0yrvs7qx8guvpqsx8u9mypz6t4zr3pxthsjkm", + Network::Signet => "bcrt1q7h9uzwvyw29vrpujp69l7kce7e5w98mpn8kwsp", + _ => "bcrt1qt0yrvs7qx8guvpqsx8u9mypz6t4zr3pxthsjkm", + }; + let addr_one = wallet.0.new_external_address().unwrap().address; + let addr_two = wallet.0.new_external_address().unwrap().address; + fund_addresses(&addr_one, &addr_two); + wallet.0.sync().unwrap(); + assert!(wallet.0.get_balance().unwrap().confirmed > Amount::ZERO); + wallet + .0 + .send_all( + Address::from_str(address).unwrap().assume_checked(), + FeeRate::from_sat_per_vb(1).unwrap(), + ) + .unwrap(); + generate_blocks(5); + wallet.0.sync().unwrap(); + assert!(wallet.0.get_balance().unwrap().confirmed == Amount::ZERO) + } } diff --git a/ddk/tests/data/dlc_storage/sled/Accepted b/ddk/tests/data/dlc_storage/sled/Accepted index ae3c8c6..b1ed964 100644 Binary files a/ddk/tests/data/dlc_storage/sled/Accepted and b/ddk/tests/data/dlc_storage/sled/Accepted differ diff --git a/ddk/tests/data/dlc_storage/sled/AcceptedChannel b/ddk/tests/data/dlc_storage/sled/AcceptedChannel index a916141..f42724d 100644 Binary files a/ddk/tests/data/dlc_storage/sled/AcceptedChannel and b/ddk/tests/data/dlc_storage/sled/AcceptedChannel differ diff --git a/ddk/tests/data/dlc_storage/sled/Closed b/ddk/tests/data/dlc_storage/sled/Closed index 5437807..25937dc 100644 Binary files a/ddk/tests/data/dlc_storage/sled/Closed and b/ddk/tests/data/dlc_storage/sled/Closed differ diff --git a/ddk/tests/data/dlc_storage/sled/Confirmed b/ddk/tests/data/dlc_storage/sled/Confirmed index 0140114..7daa5df 100644 Binary files a/ddk/tests/data/dlc_storage/sled/Confirmed and b/ddk/tests/data/dlc_storage/sled/Confirmed differ diff --git a/ddk/tests/data/dlc_storage/sled/Confirmed1 b/ddk/tests/data/dlc_storage/sled/Confirmed1 index 28137ad..c187676 100644 Binary files a/ddk/tests/data/dlc_storage/sled/Confirmed1 and b/ddk/tests/data/dlc_storage/sled/Confirmed1 differ diff --git a/ddk/tests/data/dlc_storage/sled/Offered b/ddk/tests/data/dlc_storage/sled/Offered index f9b2a1c..01ace11 100644 Binary files a/ddk/tests/data/dlc_storage/sled/Offered and b/ddk/tests/data/dlc_storage/sled/Offered differ diff --git a/ddk/tests/data/dlc_storage/sled/OfferedChannel b/ddk/tests/data/dlc_storage/sled/OfferedChannel index ef7b3b4..a1d9f68 100644 Binary files a/ddk/tests/data/dlc_storage/sled/OfferedChannel and b/ddk/tests/data/dlc_storage/sled/OfferedChannel differ diff --git a/ddk/tests/data/dlc_storage/sled/PreClosed b/ddk/tests/data/dlc_storage/sled/PreClosed index 4e7be69..c3bc027 100644 Binary files a/ddk/tests/data/dlc_storage/sled/PreClosed and b/ddk/tests/data/dlc_storage/sled/PreClosed differ diff --git a/ddk/tests/data/dlc_storage/sled/Signed b/ddk/tests/data/dlc_storage/sled/Signed index f04137f..9575f80 100644 Binary files a/ddk/tests/data/dlc_storage/sled/Signed and b/ddk/tests/data/dlc_storage/sled/Signed differ diff --git a/ddk/tests/data/dlc_storage/sled/Signed1 b/ddk/tests/data/dlc_storage/sled/Signed1 index 83347d2..b65cb15 100644 Binary files a/ddk/tests/data/dlc_storage/sled/Signed1 and b/ddk/tests/data/dlc_storage/sled/Signed1 differ diff --git a/ddk/tests/data/dlc_storage/sled/SignedChannelEstablished b/ddk/tests/data/dlc_storage/sled/SignedChannelEstablished index 3688e5c..009890e 100644 Binary files a/ddk/tests/data/dlc_storage/sled/SignedChannelEstablished and b/ddk/tests/data/dlc_storage/sled/SignedChannelEstablished differ diff --git a/ddk/tests/data/dlc_storage/sled/SignedChannelSettled b/ddk/tests/data/dlc_storage/sled/SignedChannelSettled index 7aa5ff2..7b2c0b6 100644 Binary files a/ddk/tests/data/dlc_storage/sled/SignedChannelSettled and b/ddk/tests/data/dlc_storage/sled/SignedChannelSettled differ diff --git a/ddk/tests/ernest.rs b/ddk/tests/ernest.rs index 1fb8377..4753566 100644 --- a/ddk/tests/ernest.rs +++ b/ddk/tests/ernest.rs @@ -5,12 +5,12 @@ // secp256k1_zkp::{rand::thread_rng, KeyPair, Message, Secp256k1, ONE_KEY}, // EnumerationPayout, Payout, // }; -// use dlc_manager::contract::{ +// use ddk_manager::contract::{ // contract_input::{ContractInput, ContractInputInfo, OracleInput}, // enum_descriptor::EnumDescriptor, // ContractDescriptor, // }; -// use dlc_messages::oracle_msgs::{ +// use ddk_messages::oracle_msgs::{ // DigitDecompositionEventDescriptor, EnumEventDescriptor, EventDescriptor, OracleAnnouncement, // OracleEvent, // }; diff --git a/ddk/tests/nostr.rs b/ddk/tests/nostr.rs index ab7f2e1..a192d33 100644 --- a/ddk/tests/nostr.rs +++ b/ddk/tests/nostr.rs @@ -1,6 +1,6 @@ // include!("./util.rs"); -// use dlc_messages::Message; -// use dlc_messages::OfferDlc; +// use ddk_messages::Message; +// use ddk_messages::OfferDlc; // use nostr::{ // secp256k1::{Secp256k1, SecretKey}, // Keys, diff --git a/payouts/Cargo.toml b/payouts/Cargo.toml index 4bc13b0..99eaae5 100644 --- a/payouts/Cargo.toml +++ b/payouts/Cargo.toml @@ -8,15 +8,12 @@ repository = "https://github.com/bennyhodl/dlcdevkit" edition = "2021" [dependencies] -# dlc = { version = "0.7.0", features = ["use-serde"] } -# dlc-manager = { version = "0.7.0", features = ["use-serde"] } -# dlc-trie = { version = "0.7.0", features = ["use-serde"] } -dlc = { version = "0.7.0", git = "https://github.com/bennyhodl/rust-dlc", branch = "async", features = ["use-serde"] } -dlc-manager = { version = "0.7.0", git = "https://github.com/bennyhodl/rust-dlc", branch = "async", features = ["use-serde", "async"] } -dlc-trie = { version = "0.7.0", git = "https://github.com/bennyhodl/rust-dlc", branch = "async", features = ["use-serde"] } -# dlc = { version = "0.7.0", path = "../../rust-dlc/dlc", features = ["use-serde"] } -# dlc-manager = { version = "0.7.0", path = "../../rust-dlc/dlc-manager", features = ["use-serde", "async"] } -# dlc-trie = { version = "0.7.0", path = "../../rust-dlc/dlc-trie", features = ["use-serde"] } +ddk-dlc = { version = "0.7.0", features = ["use-serde"] } +ddk-manager = { version = "0.7.1", features = ["use-serde"] } +ddk-trie = { version = "0.7.0", features = ["use-serde"] } +# ddk-dlc = { version = "0.7.0", path = "../../rust-dlc/ddk-dlc", features = ["use-serde"] } +# ddk-manager = { version = "0.7.1", path = "../../rust-dlc/ddk-manager", features = ["use-serde", "async"] } +# ddk-trie = { version = "0.7.0", path = "../../rust-dlc/ddk-trie", features = ["use-serde"] } bitcoin = "0.32.2" serde = { version = "1.0.209", features = ["derive"] } diff --git a/payouts/src/enumeration.rs b/payouts/src/enumeration.rs index c54d1ed..2024d5c 100644 --- a/payouts/src/enumeration.rs +++ b/payouts/src/enumeration.rs @@ -1,9 +1,9 @@ use std::str::FromStr; use bitcoin::key::XOnlyPublicKey; -use dlc::EnumerationPayout; -use dlc_manager::contract::enum_descriptor::EnumDescriptor; -use dlc_manager::contract::{ +use ddk_dlc::EnumerationPayout; +use ddk_manager::contract::enum_descriptor::EnumDescriptor; +use ddk_manager::contract::{ contract_input::{ContractInput, ContractInputInfo, OracleInput}, ContractDescriptor, }; diff --git a/payouts/src/lib.rs b/payouts/src/lib.rs index 668520d..07ab03d 100644 --- a/payouts/src/lib.rs +++ b/payouts/src/lib.rs @@ -3,8 +3,8 @@ pub mod enumeration; use std::str::FromStr; use bitcoin::key::XOnlyPublicKey; -use dlc_manager::contract::numerical_descriptor::NumericalDescriptor; -use dlc_manager::{ +use ddk_manager::contract::numerical_descriptor::NumericalDescriptor; +use ddk_manager::{ contract::{ contract_input::{ContractInput, ContractInputInfo, OracleInput}, ContractDescriptor, @@ -14,7 +14,7 @@ use dlc_manager::{ RoundingInterval, RoundingIntervals, }, }; -use dlc_trie::OracleNumericInfo; +use ddk_trie::OracleNumericInfo; pub fn generate_payout_curve( min_price: u64,