From 662abfaf6d9ac5c412c4bc4d409ae99f5ddd8e19 Mon Sep 17 00:00:00 2001 From: Nicola Busanello Date: Wed, 6 Mar 2024 22:55:38 +0100 Subject: [PATCH] add CLI electrum support --- Cargo.lock | 7 +++++-- Cargo.toml | 2 +- cli/Cargo.toml | 2 +- cli/src/args.rs | 20 ++++++++++++++++---- src/resolvers/any.rs | 24 ++++++++++++++++++++++++ src/resolvers/mod.rs | 2 +- src/runtime.rs | 6 ++++-- 7 files changed, 52 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a03dc6f..ae0b04d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -467,10 +467,11 @@ dependencies = [ [[package]] name = "bp-util" version = "0.11.0-beta.4" -source = "git+https://github.com/BP-WG/bp-wallet?branch=master#8552e161d4b0f1115df4b5cd14e69257e7efead7" +source = "git+https://github.com/BP-WG/bp-wallet?branch=master#690d8f6bfe76f0f6cd8dbb0039368b1b9fcf45e7" dependencies = [ "amplify", "base64", + "bp-electrum", "bp-esplora", "bp-std", "bp-wallet", @@ -489,15 +490,17 @@ dependencies = [ [[package]] name = "bp-wallet" version = "0.11.0-beta.4" -source = "git+https://github.com/BP-WG/bp-wallet?branch=master#8552e161d4b0f1115df4b5cd14e69257e7efead7" +source = "git+https://github.com/BP-WG/bp-wallet?branch=master#690d8f6bfe76f0f6cd8dbb0039368b1b9fcf45e7" dependencies = [ "amplify", + "bp-electrum", "bp-esplora", "bp-std", "cfg_eval", "descriptors", "psbt", "serde", + "serde_json", "serde_with", "serde_yaml", "toml", diff --git a/Cargo.toml b/Cargo.toml index 62286a8..b5a2653 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -89,7 +89,7 @@ log = { workspace = true, optional = true } default = ["esplora_blocking"] all = ["esplora_blocking", "electrum", "serde", "log"] esplora_blocking = ["bp-esplora", "bp-wallet/esplora"] -electrum = ["bp-electrum"] +electrum = ["bp-electrum", "bp-wallet/electrum"] serde = ["serde_crate", "serde_with", "serde_yaml", "bp-std/serde", "bp-wallet/serde", "descriptors/serde", "rgb-psbt/serde"] [package.metadata.docs.rs] diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 3b8ab77..f6ec1a4 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -27,7 +27,7 @@ bp-wallet = { workspace = true } bp-util = { workspace = true } psbt = { workspace = true } rgb-std = { workspace = true, features = ["serde"] } -rgb-runtime = { version = "0.11.0-beta.1", path = "..", features = ["esplora_blocking", "log", "serde"] } +rgb-runtime = { version = "0.11.0-beta.1", path = "..", features = ["electrum", "esplora_blocking", "log", "serde"] } log = { workspace = true } env_logger = "0.10.1" clap = { version = "4.4.8", features = ["derive", "env"] } diff --git a/cli/src/args.rs b/cli/src/args.rs index caad6f8..eccdc16 100644 --- a/cli/src/args.rs +++ b/cli/src/args.rs @@ -23,8 +23,10 @@ use bp_util::{Config, DescriptorOpts}; use bpstd::{Wpkh, XpubDerivable}; -use rgb_rt::esplora_blocking::{Resolver, ResolverError}; -use rgb_rt::{RgbDescr, Runtime, RuntimeError, TapretKey}; +use rgb_rt::{ + electrum, esplora_blocking, AnyResolver, AnyResolverError, RgbDescr, Runtime, RuntimeError, + TapretKey, +}; use crate::Command; @@ -80,7 +82,17 @@ impl RgbArgs { } #[allow(clippy::result_large_err)] - pub fn resolver(&self) -> Result { - Resolver::new(&self.resolver.esplora) + pub fn resolver(&self) -> Result { + if self.resolver.electrum != bp_util::DEFAULT_ELECTRUM { + match electrum::Resolver::new(&self.resolver.electrum) { + Ok(c) => Ok(AnyResolver::Electrum(Box::new(c))), + Err(e) => Err(AnyResolverError::Electrum(e)), + } + } else { + match esplora_blocking::Resolver::new(&self.resolver.esplora) { + Ok(c) => Ok(AnyResolver::Esplora(Box::new(c))), + Err(e) => Err(AnyResolverError::Esplora(e)), + } + } } } diff --git a/src/resolvers/any.rs b/src/resolvers/any.rs index d2374f3..08f69d2 100644 --- a/src/resolvers/any.rs +++ b/src/resolvers/any.rs @@ -19,6 +19,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use rgbstd::containers::Consignment; use rgbstd::resolvers::ResolveHeight; use rgbstd::validation::{ResolveWitness, WitnessResolverError}; use rgbstd::{WitnessAnchor, WitnessId, XAnchor, XPubWitness}; @@ -42,6 +43,18 @@ pub enum AnyResolver { Esplora(Box), } +#[allow(clippy::large_enum_variant)] +#[derive(Debug, Display, Error, From)] +#[display(doc_comments)] +pub enum AnyResolverError { + #[cfg(feature = "electrum")] + #[display(inner)] + Electrum(::electrum::Error), + #[cfg(feature = "esplora_blocking")] + #[display(inner)] + Esplora(esplora::Error), +} + #[allow(clippy::large_enum_variant)] #[derive(Debug, Display, Error, From)] #[display(doc_comments)] @@ -56,6 +69,17 @@ pub enum AnyAnchorResolverError { Esplora(esplora_blocking::AnchorResolverError), } +impl AnyResolver { + pub fn add_terminals(&mut self, consignment: &Consignment) { + match self { + #[cfg(feature = "electrum")] + AnyResolver::Electrum(inner) => inner.add_terminals(consignment), + #[cfg(feature = "esplora_blocking")] + AnyResolver::Esplora(inner) => inner.add_terminals(consignment), + } + } +} + impl ResolveHeight for AnyResolver { type Error = AnyAnchorResolverError; diff --git a/src/resolvers/mod.rs b/src/resolvers/mod.rs index 8cdb5a3..3452915 100644 --- a/src/resolvers/mod.rs +++ b/src/resolvers/mod.rs @@ -27,4 +27,4 @@ pub mod esplora_blocking; pub mod electrum; #[cfg(any(feature = "electrum", feature = "esplora_blocking"))] -pub use any::AnyResolver; +pub use any::{AnyResolver, AnyResolverError}; diff --git a/src/runtime.rs b/src/runtime.rs index 84947cd..ef4040e 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -105,9 +105,11 @@ pub enum RuntimeError { #[from(bpwallet::LoadError)] Bp(bpwallet::RuntimeError), - #[cfg(feature = "esplora_blocking")] + /// resolver error: {0} + #[cfg(any(feature = "electrum", feature = "esplora_blocking"))] #[from] - Esplora(esplora::Error), + #[display(doc_comments)] + ResolverError(crate::AnyResolverError), #[from] Yaml(serde_yaml::Error),