diff --git a/Cargo.lock b/Cargo.lock index 390fad6..ed355c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -217,9 +217,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e89b6941c2d1a7045538884d6e760ccfffdf8e1ffc2613d8efa74305e1f3752" +checksum = "0f0e249228c6ad2d240c2dc94b714d711629d52bad946075d8e9b2f5391f0703" dependencies = [ "bindgen", "cc", @@ -400,7 +400,7 @@ dependencies = [ "bp-consensus", "bp-invoice", "commit_verify", - "indexmap 2.2.6", + "indexmap 2.3.0", "serde", ] @@ -572,9 +572,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.11" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", "clap_derive", @@ -582,9 +582,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.11" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", @@ -594,9 +594,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.11" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d029b67f89d30bbb547c89fd5161293c0aec155fc691d7924b64550662db93e" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -773,7 +773,7 @@ source = "git+https://github.com/BP-WG/bp-std?branch=master#b664d65aeec68b11b42f dependencies = [ "amplify", "bp-derive", - "indexmap 2.2.6", + "indexmap 2.3.0", "serde", ] @@ -1050,9 +1050,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -1244,9 +1244,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "dee4364d9f3b902ef14fab8a1ddffb783a1cb6b4bba3bfc1fa3922732c7de97f" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" @@ -1279,7 +1282,7 @@ dependencies = [ "chrono", "commit_verify", "descriptors", - "indexmap 2.2.6", + "indexmap 2.3.0", "serde", "strict_encoding", ] @@ -1366,7 +1369,7 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rgb-core" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-core?branch=mining#fa31db7d22d06b6fa5152b51666edc3eb3135447" +source = "git+https://github.com/RGB-WG/rgb-core?branch=contract-state2#1a7ec624e0b2a5b238babbd912e179fd449ad4fa" dependencies = [ "aluvm", "amplify", @@ -1403,7 +1406,7 @@ dependencies = [ [[package]] name = "rgb-invoice" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-std?branch=iface-generics#2d8405cccb9f4c494108f50f0ddacbf9ce2fd579" +source = "git+https://github.com/RGB-WG/rgb-std?branch=multiwitness#220c593a798395696a57f8e8d14aef309490701f" dependencies = [ "amplify", "baid64", @@ -1411,7 +1414,7 @@ dependencies = [ "bp-invoice", "fast32", "fluent-uri", - "indexmap 2.2.6", + "indexmap 2.3.0", "percent-encoding", "rand", "rgb-core", @@ -1452,7 +1455,7 @@ dependencies = [ "chrono", "commit_verify", "descriptors", - "indexmap 2.2.6", + "indexmap 2.3.0", "log", "rgb-psbt", "rgb-std", @@ -1464,7 +1467,7 @@ dependencies = [ [[package]] name = "rgb-std" version = "0.11.0-beta.6" -source = "git+https://github.com/RGB-WG/rgb-std?branch=iface-generics#2d8405cccb9f4c494108f50f0ddacbf9ce2fd579" +source = "git+https://github.com/RGB-WG/rgb-std?branch=multiwitness#220c593a798395696a57f8e8d14aef309490701f" dependencies = [ "aluvm", "amplify", @@ -1475,7 +1478,7 @@ dependencies = [ "chrono", "commit_verify", "getrandom", - "indexmap 2.2.6", + "indexmap 2.3.0", "rand", "rgb-core", "rgb-invoice", @@ -1723,7 +1726,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.6", + "indexmap 2.3.0", "serde", "serde_derive", "serde_json", @@ -1749,7 +1752,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.3.0", "itoa", "ryu", "serde", @@ -1843,7 +1846,7 @@ dependencies = [ "ascii-armor", "baid64", "half", - "indexmap 2.2.6", + "indexmap 2.3.0", "serde", "serde_json", "serde_yaml", @@ -1965,9 +1968,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", @@ -1977,20 +1980,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.17" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.3.0", "serde", "serde_spanned", "toml_datetime", @@ -2394,13 +2397,34 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.16" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] +[[package]] +name = "zerocopy" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index 099baf3..3c7a7b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -101,7 +101,7 @@ descriptors = { git = "https://github.com/BP-WG/bp-std", branch = "master" } psbt = { git = "https://github.com/BP-WG/bp-std", branch = "master" } bp-std = { git = "https://github.com/BP-WG/bp-std", branch = "master" } bp-wallet = { git = "https://github.com/BP-WG/bp-wallet", branch = "master" } -rgb-core = { git = "https://github.com/RGB-WG/rgb-core", branch = "mining" } -rgb-invoice = { git = "https://github.com/RGB-WG/rgb-std", branch = "iface-generics" } -rgb-std = { git = "https://github.com/RGB-WG/rgb-std", branch = "iface-generics" } +rgb-core = { git = "https://github.com/RGB-WG/rgb-core", branch = "contract-state2" } +rgb-invoice = { git = "https://github.com/RGB-WG/rgb-std", branch = "multiwitness" } +rgb-std = { git = "https://github.com/RGB-WG/rgb-std", branch = "multiwitness" } rgb-interfaces = { git = "https://github.com/RGB-WG/rgb-interfaces.git", branch = "iface-generics" } diff --git a/cli/src/command.rs b/cli/src/command.rs index 34bed5b..1a089d1 100644 --- a/cli/src/command.rs +++ b/cli/src/command.rs @@ -32,8 +32,8 @@ use bpwallet::Wallet; use ifaces::{IfaceStandard, Rgb20, Rgb21, Rgb25}; use psbt::{Psbt, PsbtVer}; use rgb::containers::{ - BuilderSeal, ContainerVer, ContentId, ContentSigs, Contract, FileContent, Supplement, Terminal, - Transfer, UniversalFile, + BuilderSeal, ContainerVer, ContentId, ContentSigs, Contract, FileContent, Supplement, Transfer, + UniversalFile, }; use rgb::interface::{AmountChange, IfaceId, OutpointFilter}; use rgb::invoice::{Beneficiary, Pay2Vout, RgbInvoice, RgbInvoiceBuilder, XChainNet}; @@ -44,9 +44,11 @@ use rgb::vm::RgbIsa; use rgb::{ BundleId, ContractId, DescriptorRgb, GenesisSeal, GraphSeal, Identity, OutputSeal, RgbDescr, RgbKeychain, RgbWallet, StateType, TransferParams, WalletError, WalletProvider, XChain, - XOutpoint, XOutputSeal, + XOutpoint, XOutputSeal, XWitnessId, }; use rgbstd::containers::ConsignmentExt; +use rgbstd::persistence::MemContract; +use seals::SecretSeal; use serde_crate::{Deserialize, Serialize}; use strict_types::encoding::{FieldName, TypeName}; use strict_types::StrictVal; @@ -437,7 +439,7 @@ impl Exec for RgbArgs { UniversalFile::Contract(contract) => { let id = contract.consignment_id(); eprintln!("Importing consignment {id}:"); - let mut resolver = self.resolver()?; + let resolver = self.resolver()?; eprint!("- validating the contract {} ... ", contract.contract_id()); let contract = contract .validate(&resolver, self.general.network.is_testnet()) @@ -446,7 +448,7 @@ impl Exec for RgbArgs { status.to_string() })?; eprintln!("success"); - stock.import_contract(contract, &mut resolver)?; + stock.import_contract(contract, &resolver)?; eprintln!("Consignment is imported"); } UniversalFile::Transfer(_) => { @@ -541,43 +543,63 @@ impl Exec for RgbArgs { println!(" {}:", owned.name); if let Ok(allocations) = contract.fungible(owned.name.clone(), &filter) { for allocation in allocations { + let witness = allocation + .witness + .as_ref() + .map(XWitnessId::to_string) + .unwrap_or(s!("~")); println!( " value={}, utxo={}, witness={} {}", allocation.state.value(), allocation.seal, - allocation.witness, + witness, filter.comment(allocation.seal.to_outpoint()) ); } } if let Ok(allocations) = contract.data(owned.name.clone(), &filter) { for allocation in allocations { + let witness = allocation + .witness + .as_ref() + .map(XWitnessId::to_string) + .unwrap_or(s!("~")); println!( " data={}, utxo={}, witness={} {}", allocation.state, allocation.seal, - allocation.witness, + witness, filter.comment(allocation.seal.to_outpoint()) ); } } if let Ok(allocations) = contract.attachments(owned.name.clone(), &filter) { for allocation in allocations { + let witness = allocation + .witness + .as_ref() + .map(XWitnessId::to_string) + .unwrap_or(s!("~")); println!( " file={}, utxo={}, witness={} {}", allocation.state, allocation.seal, - allocation.witness, + witness, filter.comment(allocation.seal.to_outpoint()) ); } } if let Ok(allocations) = contract.rights(owned.name.clone(), &filter) { for allocation in allocations { + let witness = allocation + .witness + .as_ref() + .map(XWitnessId::to_string) + .unwrap_or(s!("~")); println!( " utxo={}, witness={} {}", allocation.seal, - allocation.witness, + witness, filter.comment(allocation.seal.to_outpoint()) ); } @@ -713,8 +735,8 @@ impl Exec for RgbArgs { let contract = builder.issue_contract()?; let id = contract.contract_id(); - let mut resolver = self.resolver()?; - stock.import_contract(contract, &mut resolver)?; + let resolver = self.resolver()?; + stock.import_contract(contract, &resolver)?; eprintln!( "A new contract {id} is issued and added to the stash.\nUse `export` command \ to export the contract." @@ -849,7 +871,7 @@ impl Exec for RgbArgs { pub struct ConsignmentInspection { version: ContainerVer, transfer: bool, - terminals: SmallOrdMap, + terminals: SmallOrdMap>, supplements: TinyOrdSet, signatures: TinyOrdMap, } @@ -877,7 +899,7 @@ impl Exec for RgbArgs { ]; for lib in consignment.scripts { let mut buf = Vec::new(); - lib.print_disassemble::(&mut buf)?; + lib.print_disassemble::>(&mut buf)?; map.insert(format!("{}.aluasm", lib.id().to_baid64_mnemonic()), unsafe { String::from_utf8_unchecked(buf) }); @@ -1071,7 +1093,7 @@ impl Exec for RgbArgs { let valid = transfer .validate(&resolver, self.general.network.is_testnet()) .map_err(|(status, _)| status)?; - stock.accept_transfer(valid, &mut resolver)?; + stock.accept_transfer(valid, &resolver)?; eprintln!("Transfer accepted into the stash"); } } diff --git a/src/indexers/any.rs b/src/indexers/any.rs index b2c332d..3b5dca0 100644 --- a/src/indexers/any.rs +++ b/src/indexers/any.rs @@ -26,17 +26,18 @@ use std::collections::HashMap; use bp::Tx; use bpstd::Network; use rgbstd::containers::Consignment; -use rgbstd::resolvers::ResolveWitnessAnchor; use rgbstd::validation::{ResolveWitness, WitnessResolverError}; -use rgbstd::vm::WitnessAnchor; -use rgbstd::{XWitnessId, XWitnessTx}; +use rgbstd::XWitnessId; -use crate::{Txid, WitnessOrd, XChain}; +use crate::vm::{WitnessOrd, XWitnessTx}; +use crate::{Txid, XChain}; +// We need to repeat methods of `WitnessResolve` trait here to avoid making +// wrappers around resolver types. TODO: Use wrappers instead pub trait RgbResolver { fn check(&self, network: Network, expected_block_hash: String) -> Result<(), String>; - fn resolve_height(&mut self, txid: Txid) -> Result; - fn resolve_pub_witness(&self, txid: Txid) -> Result>; + fn resolve_pub_witness(&self, txid: Txid) -> Result, String>; + fn resolve_pub_witness_ord(&self, txid: Txid) -> Result; } /// Type that contains any of the [`Resolver`] types defined by the library @@ -107,28 +108,33 @@ impl AnyResolver { } } -impl ResolveWitnessAnchor for AnyResolver { - fn resolve_witness_anchor(&mut self, witness_id: XWitnessId) -> Result { +impl ResolveWitness for AnyResolver { + fn resolve_pub_witness( + &self, + witness_id: XWitnessId, + ) -> Result { let XWitnessId::Bitcoin(txid) = witness_id else { - return Err(format!("{} is not supported as layer 1 network", witness_id.layer1())); + return Err(WitnessResolverError::Other( + witness_id, + format!("{} is not supported as layer 1 network", witness_id.layer1()), + )); }; - if self.terminal_txes.contains_key(&txid) { - return Ok(WitnessAnchor { - witness_ord: WitnessOrd::offchain(0), - witness_id, - }); + if let Some(tx) = self.terminal_txes.get(&txid) { + return Ok(XWitnessTx::Bitcoin(tx.clone())); } - self.inner.resolve_height(txid) + self.inner + .resolve_pub_witness(txid) + .map_err(|e| WitnessResolverError::Other(witness_id, e)) + .and_then(|r| r.ok_or(WitnessResolverError::Unknown(witness_id))) + .map(XChain::Bitcoin) } -} -impl ResolveWitness for AnyResolver { - fn resolve_pub_witness( + fn resolve_pub_witness_ord( &self, witness_id: XWitnessId, - ) -> Result { + ) -> Result { let XWitnessId::Bitcoin(txid) = witness_id else { return Err(WitnessResolverError::Other( witness_id, @@ -136,16 +142,12 @@ impl ResolveWitness for AnyResolver { )); }; - if let Some(tx) = self.terminal_txes.get(&txid) { - return Ok(XWitnessTx::Bitcoin(tx.clone())); + if self.terminal_txes.contains_key(&txid) { + return Ok(WitnessOrd::Tentative); } self.inner - .resolve_pub_witness(txid) - .map(XWitnessTx::Bitcoin) - .map_err(|e| match e { - None => WitnessResolverError::Unknown(witness_id), - Some(e) => WitnessResolverError::Other(witness_id, e), - }) + .resolve_pub_witness_ord(txid) + .map_err(|e| WitnessResolverError::Other(witness_id, e)) } } diff --git a/src/indexers/electrum_blocking.rs b/src/indexers/electrum_blocking.rs index e9ee75b..78a085d 100644 --- a/src/indexers/electrum_blocking.rs +++ b/src/indexers/electrum_blocking.rs @@ -26,10 +26,10 @@ use std::iter; use bp::ConsensusDecode; use bpstd::{Network, Tx, Txid}; use electrum::{Client, ElectrumApi, Error, Param}; -use rgbstd::vm::WitnessAnchor; -use rgbstd::{WitnessOrd, WitnessPos, XWitnessId}; +use rgbstd::vm::WitnessPos; use super::RgbResolver; +use crate::vm::WitnessOrd; macro_rules! check { ($e:expr) => { @@ -69,11 +69,8 @@ impl RgbResolver for Client { Ok(()) } - fn resolve_height(&mut self, txid: Txid) -> Result { - let mut witness_anchor = WitnessAnchor { - witness_ord: WitnessOrd::Archived, - witness_id: XWitnessId::Bitcoin(txid), - }; + fn resolve_pub_witness_ord(&self, txid: Txid) -> Result { + let mut witness_ord = WitnessOrd::Archived; // We get the height of the tip of blockchain let header = check!(self.block_headers_subscribe()); @@ -88,7 +85,7 @@ impl RgbResolver for Client { if e.to_string() .contains("No such mempool or blockchain transaction") => { - return Ok(witness_anchor); + return Ok(witness_ord); } Err(e) => return Err(e.to_string()), Ok(v) => v, @@ -96,7 +93,7 @@ impl RgbResolver for Client { let forward = iter::from_fn(|| self.block_headers_pop().ok().flatten()).count() as isize; let Some(confirmations) = tx_details.get("confirmations") else { - return Ok(witness_anchor); + return Ok(witness_ord); }; let confirmations = check!( confirmations @@ -105,8 +102,8 @@ impl RgbResolver for Client { .ok_or(Error::InvalidResponse(tx_details.clone())) ); if confirmations == 0 { - witness_anchor.witness_ord = WitnessOrd::OffChain { priority: 1 }; - return Ok(witness_anchor); + witness_ord = WitnessOrd::Tentative; + return Ok(witness_ord); } let block_time = check!( tx_details @@ -133,20 +130,25 @@ impl RgbResolver for Client { WitnessPos::new(tx_height, block_time) .ok_or(Error::InvalidResponse(tx_details.clone())) ); - witness_anchor.witness_ord = WitnessOrd::OnChain(pos); + witness_ord = WitnessOrd::Mined(pos); - Ok(witness_anchor) + Ok(witness_ord) } - fn resolve_pub_witness(&self, txid: Txid) -> Result> { - let raw_tx = self.transaction_get_raw(&txid).map_err(|e| { - let e = e.to_string(); - if e.contains("No such mempool or blockchain transaction") { - return None; - } - Some(e) - })?; - Tx::consensus_deserialize(raw_tx) - .map_err(|e| Some(format!("cannot deserialize raw TX - {e}"))) + fn resolve_pub_witness(&self, txid: Txid) -> Result, String> { + self.transaction_get_raw(&txid) + .map_err(|e| e.to_string()) + .and_then(|raw_tx| { + Tx::consensus_deserialize(raw_tx) + .map_err(|e| format!("cannot deserialize raw TX - {e}")) + }) + .map(Some) + .or_else(|e| { + if e.contains("No such mempool or blockchain transaction") { + Ok(None) + } else { + Err(e) + } + }) } } diff --git a/src/indexers/esplora_blocking.rs b/src/indexers/esplora_blocking.rs index f77c293..2d1906c 100644 --- a/src/indexers/esplora_blocking.rs +++ b/src/indexers/esplora_blocking.rs @@ -22,11 +22,10 @@ use bp::Tx; use bpstd::{Network, Txid}; use esplora::{BlockingClient, Error}; -use rgbstd::vm::WitnessAnchor; -use rgbstd::{WitnessOrd, WitnessPos}; +use rgbstd::vm::WitnessPos; use super::RgbResolver; -use crate::XWitnessId; +use crate::vm::WitnessOrd; impl RgbResolver for BlockingClient { fn check(&self, _network: Network, expected_block_hash: String) -> Result<(), String> { @@ -38,30 +37,25 @@ impl RgbResolver for BlockingClient { Ok(()) } - fn resolve_height(&mut self, txid: Txid) -> Result { + fn resolve_pub_witness_ord(&self, txid: Txid) -> Result { let status = self.tx_status(&txid)?; let ord = match status .block_height .and_then(|h| status.block_time.map(|t| (h, t))) { Some((h, t)) => { - WitnessOrd::OnChain(WitnessPos::new(h, t as i64).ok_or(Error::InvalidServerData)?) + WitnessOrd::Mined(WitnessPos::new(h, t as i64).ok_or(Error::InvalidServerData)?) } // TODO: Figure out how to detect mempool transactions None => WitnessOrd::Archived, }; - Ok(WitnessAnchor { - witness_ord: ord, - witness_id: XWitnessId::Bitcoin(txid), - }) + Ok(ord) } - fn resolve_pub_witness(&self, txid: Txid) -> Result> { - self.tx(&txid) - .map_err(|e| match e { - Error::TransactionNotFound(_) => None, - e => Some(e.to_string()), - })? - .ok_or(None) + fn resolve_pub_witness(&self, txid: Txid) -> Result, String> { + self.tx(&txid).or_else(|e| match e { + Error::TransactionNotFound(_) => Ok(None), + e => Err(e.to_string()), + }) } } diff --git a/src/indexers/mempool_blocking.rs b/src/indexers/mempool_blocking.rs index c39d892..6dc0017 100644 --- a/src/indexers/mempool_blocking.rs +++ b/src/indexers/mempool_blocking.rs @@ -22,7 +22,7 @@ use bp::Tx; use bpstd::{Network, Txid}; use esplora::{BlockingClient, Config, Error}; -use rgbstd::vm::WitnessAnchor; +use rgbstd::vm::WitnessOrd; use super::RgbResolver; @@ -60,11 +60,11 @@ impl RgbResolver for MemPoolClient { self.inner.check(network, expected_block_hash) } - fn resolve_height(&mut self, txid: Txid) -> Result { - self.inner.resolve_height(txid) + fn resolve_pub_witness_ord(&self, txid: Txid) -> Result { + self.inner.resolve_pub_witness_ord(txid) } - fn resolve_pub_witness(&self, txid: Txid) -> Result> { + fn resolve_pub_witness(&self, txid: Txid) -> Result, String> { self.inner.resolve_pub_witness(txid) } } diff --git a/src/lib.rs b/src/lib.rs index 44d3fe1..7dd5e57 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,8 +37,6 @@ pub use errors::{CompletionError, CompositionError, HistoryError, PayError, Wall pub use pay::{TransferParams, WalletProvider}; pub use rgbstd::*; pub mod resolvers { - pub use rgbstd::resolvers::*; - #[cfg(any(feature = "electrum_blocking", feature = "esplora_blocking"))] pub use super::indexers::*; pub use super::indexers::{AnyResolver, RgbResolver}; diff --git a/src/pay.rs b/src/pay.rs index 397c7f2..41ed0a3 100644 --- a/src/pay.rs +++ b/src/pay.rs @@ -35,11 +35,12 @@ use rgbstd::containers::Transfer; use rgbstd::interface::OutpointFilter; use rgbstd::invoice::{Amount, Beneficiary, InvoiceState, RgbInvoice}; use rgbstd::persistence::{IndexProvider, StashProvider, StateProvider, Stock}; -use rgbstd::resolvers::ResolveWitnessAnchor; -use rgbstd::{ContractId, DataState, WitnessOrd, XChain, XOutpoint}; +use rgbstd::validation::ResolveWitness; +use rgbstd::{ContractId, DataState, XChain, XOutpoint}; use crate::invoice::NonFungible; -use crate::vm::WitnessAnchor; +use crate::validation::WitnessResolverError; +use crate::vm::{WitnessOrd, XWitnessTx}; use crate::wrapper::WalletWrapper; use crate::{ CompletionError, CompositionError, DescriptorRgb, PayError, RgbKeychain, Txid, XWitnessId, @@ -106,6 +107,8 @@ where Self::Descr: DescriptorRgb fn outpoints(&self) -> impl Iterator; fn txids(&self) -> impl Iterator; + // TODO: Add method `color` to add RGB information to an already existing PSBT + #[allow(clippy::result_large_err)] fn pay( &mut self, @@ -115,7 +118,7 @@ where Self::Descr: DescriptorRgb ) -> Result<(Psbt, PsbtMeta, Transfer), PayError> { let (mut psbt, meta) = self.construct_psbt_rgb(stock, invoice, params)?; // ... here we pass PSBT around signers, if necessary - let transfer = self.transfer(stock, invoice, &mut psbt, 2)?; + let transfer = self.transfer(stock, invoice, &mut psbt)?; Ok((psbt, meta, transfer)) } @@ -274,7 +277,6 @@ where Self::Descr: DescriptorRgb stock: &mut Stock, invoice: &RgbInvoice, psbt: &mut Psbt, - priority: u32, ) -> Result { let contract_id = invoice.contract.ok_or(CompletionError::NoContract)?; @@ -309,22 +311,28 @@ where Self::Descr: DescriptorRgb }; struct FasciaResolver { - priority: u32, + witness_id: XWitnessId, } - impl ResolveWitnessAnchor for FasciaResolver { - fn resolve_witness_anchor( - &mut self, + impl ResolveWitness for FasciaResolver { + fn resolve_pub_witness( + &self, + _: XWitnessId, + ) -> Result { + unreachable!() + } + fn resolve_pub_witness_ord( + &self, witness_id: XWitnessId, - ) -> Result { - Ok(WitnessAnchor { - witness_ord: WitnessOrd::offchain(self.priority), - witness_id, - }) + ) -> Result { + assert_eq!(witness_id, self.witness_id); + Ok(WitnessOrd::Tentative) } } stock - .consume_fascia(fascia, FasciaResolver { priority }) + .consume_fascia(fascia, FasciaResolver { + witness_id: XChain::Bitcoin(witness_txid), + }) .map_err(|e| e.to_string())?; let transfer = stock .transfer(contract_id, beneficiary2, beneficiary1) diff --git a/src/wallet.rs b/src/wallet.rs index 188d55b..797af2f 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -159,6 +159,6 @@ where W::Descr: DescriptorRgb invoice: &RgbInvoice, psbt: &mut Psbt, ) -> Result { - self.wallet.transfer(&mut self.stock, invoice, psbt, 2) + self.wallet.transfer(&mut self.stock, invoice, psbt) } }