diff --git a/zcash_client_backend/CHANGELOG.md b/zcash_client_backend/CHANGELOG.md index 9bf7fe75e..da8ea4f01 100644 --- a/zcash_client_backend/CHANGELOG.md +++ b/zcash_client_backend/CHANGELOG.md @@ -18,6 +18,10 @@ and this library adheres to Rust's notion of - The fields of `zcash_client_backend::wallet::ReceivedSaplingNote` are now private. Use `ReceivedSaplingNote::from_parts` for construction instead. Accessor methods are provided for each previously-public field. +- `zcash_client_backend::data_api` changes: + - The `NoteMismatch` variant of `data_api::error::Error` now wraps a + `data_api::NoteId` instead of a backend-specific note identifier. The + related `NoteRef` type parameter has been removed from `data_api::error::Error`. ## [0.10.0] - 2023-09-25 diff --git a/zcash_client_backend/src/data_api/error.rs b/zcash_client_backend/src/data_api/error.rs index 31a9b39c9..a982cece5 100644 --- a/zcash_client_backend/src/data_api/error.rs +++ b/zcash_client_backend/src/data_api/error.rs @@ -20,9 +20,11 @@ use crate::data_api::wallet::input_selection::InputSelectorError; #[cfg(feature = "transparent-inputs")] use zcash_primitives::{legacy::TransparentAddress, zip32::DiversifierIndex}; +use super::NoteId; + /// Errors that can occur as a consequence of wallet operations. #[derive(Debug)] -pub enum Error { +pub enum Error { /// An error occurred retrieving data from the underlying data source DataSource(DataSourceError), @@ -56,7 +58,7 @@ pub enum Error fmt::Display for Error +impl fmt::Display for Error where DE: fmt::Display, CE: fmt::Display, SE: fmt::Display, FE: fmt::Display, - N: fmt::Display, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match &self { @@ -111,7 +112,7 @@ where Error::ScanRequired => write!(f, "Must scan blocks first"), Error::Builder(e) => write!(f, "An error occurred building the transaction: {}", e), Error::MemoForbidden => write!(f, "It is not possible to send a memo to a transparent address."), - Error::NoteMismatch(n) => write!(f, "A note being spent ({}) does not correspond to either the internal or external full viewing key for the provided spending key.", n), + Error::NoteMismatch(n) => write!(f, "A note being spent ({:?}) does not correspond to either the internal or external full viewing key for the provided spending key.", n), #[cfg(feature = "transparent-inputs")] Error::AddressNotRecognized(_) => { @@ -129,13 +130,12 @@ where } } -impl error::Error for Error +impl error::Error for Error where DE: Debug + Display + error::Error + 'static, CE: Debug + Display + error::Error + 'static, SE: Debug + Display + error::Error + 'static, FE: Debug + Display + 'static, - N: Debug + Display, { fn source(&self) -> Option<&(dyn error::Error + 'static)> { match &self { @@ -148,19 +148,19 @@ where } } -impl From> for Error { +impl From> for Error { fn from(e: builder::Error) -> Self { Error::Builder(e) } } -impl From for Error { +impl From for Error { fn from(e: BalanceError) -> Self { Error::BalanceError(e) } } -impl From> for Error { +impl From> for Error { fn from(e: InputSelectorError) -> Self { match e { InputSelectorError::DataSource(e) => Error::DataSource(e), @@ -177,19 +177,19 @@ impl From> for Error From for Error { +impl From for Error { fn from(e: sapling::builder::Error) -> Self { Error::Builder(builder::Error::SaplingBuild(e)) } } -impl From for Error { +impl From for Error { fn from(e: transparent::builder::Error) -> Self { Error::Builder(builder::Error::TransparentBuild(e)) } } -impl From> for Error { +impl From> for Error { fn from(e: ShardTreeError) -> Self { Error::CommitmentTree(e) } diff --git a/zcash_client_backend/src/data_api/wallet.rs b/zcash_client_backend/src/data_api/wallet.rs index f4373d8bb..7da3dc873 100644 --- a/zcash_client_backend/src/data_api/wallet.rs +++ b/zcash_client_backend/src/data_api/wallet.rs @@ -37,7 +37,7 @@ use crate::{ pub mod input_selection; use input_selection::{GreedyInputSelector, GreedyInputSelectorError, InputSelector}; -use super::ShieldedProtocol; +use super::{NoteId, ShieldedProtocol}; #[cfg(feature = "transparent-inputs")] use { @@ -206,7 +206,6 @@ pub fn create_spend_to_address( ::Error, GreedyInputSelectorError, Infallible, - DbT::NoteRef, >, > where @@ -309,7 +308,6 @@ pub fn spend( ::Error, InputsT::Error, ::Error, - DbT::NoteRef, >, > where @@ -358,13 +356,7 @@ pub fn propose_transfer( min_confirmations: NonZeroU32, ) -> Result< Proposal, - Error< - DbT::Error, - CommitmentTreeErrT, - InputsT::Error, - ::Error, - DbT::NoteRef, - >, + Error::Error>, > where DbT: WalletWrite, @@ -395,13 +387,7 @@ pub fn propose_shielding( min_confirmations: NonZeroU32, ) -> Result< Proposal, - Error< - DbT::Error, - CommitmentTreeErrT, - InputsT::Error, - ::Error, - DbT::NoteRef, - >, + Error::Error>, > where ParamsT: consensus::Parameters, @@ -443,7 +429,6 @@ pub fn create_proposed_transaction( ::Error, InputsErrT, FeeRuleT::Error, - DbT::NoteRef, >, > where @@ -488,8 +473,7 @@ where let mut builder = Builder::new(params.clone(), proposal.min_target_height(), None); let checkpoint_depth = wallet_db.get_checkpoint_depth(min_confirmations)?; - - wallet_db.with_sapling_tree_mut::<_, _, Error<_, _, _, _, _>>(|sapling_tree| { + wallet_db.with_sapling_tree_mut::<_, _, Error<_, _, _, _>>(|sapling_tree| { for selected in proposal.sapling_inputs() { let (note, key, merkle_path) = select_key_for_note( sapling_tree, @@ -498,7 +482,14 @@ where &dfvk, checkpoint_depth, )? - .ok_or(Error::NoteMismatch(selected.internal_note_id().clone()))?; + .ok_or_else(|| { + Error::NoteMismatch(NoteId { + txid: *selected.txid(), + protocol: ShieldedProtocol::Sapling, + output_index: selected.output_index(), + }) + })?; + builder.add_sapling_spend(key, selected.diversifier(), note, merkle_path)?; } Ok(()) @@ -724,7 +715,6 @@ pub fn shield_transparent_funds( ::Error, InputsT::Error, ::Error, - DbT::NoteRef, >, > where diff --git a/zcash_client_sqlite/src/testing.rs b/zcash_client_sqlite/src/testing.rs index 386543c10..f6a9bbc7e 100644 --- a/zcash_client_sqlite/src/testing.rs +++ b/zcash_client_sqlite/src/testing.rs @@ -445,7 +445,6 @@ impl TestState { commitment_tree::Error, GreedyInputSelectorError, Infallible, - ReceivedNoteId, >, > { let params = self.network(); @@ -478,7 +477,6 @@ impl TestState { commitment_tree::Error, InputsT::Error, ::Error, - ReceivedNoteId, >, > where @@ -512,7 +510,6 @@ impl TestState { Infallible, InputsT::Error, ::Error, - ReceivedNoteId, >, > where @@ -546,7 +543,6 @@ impl TestState { Infallible, InputsT::Error, ::Error, - ReceivedNoteId, >, > where @@ -578,7 +574,6 @@ impl TestState { commitment_tree::Error, Infallible, FeeRuleT::Error, - ReceivedNoteId, >, > where @@ -615,7 +610,6 @@ impl TestState { commitment_tree::Error, InputsT::Error, ::Error, - ReceivedNoteId, >, > where diff --git a/zcash_client_sqlite/src/wallet/sapling.rs b/zcash_client_sqlite/src/wallet/sapling.rs index 1fa831f41..db5b6bb85 100644 --- a/zcash_client_sqlite/src/wallet/sapling.rs +++ b/zcash_client_sqlite/src/wallet/sapling.rs @@ -986,7 +986,6 @@ pub(crate) mod tests { commitment_tree::Error, GreedyInputSelectorError, Infallible, - ReceivedNoteId, >, > { let txid = st.create_spend_to_address(