feat: add specific errors for wallet persistence
This commit is contained in:
		
							parent
							
								
									68a9eb693d
								
							
						
					
					
						commit
						43c1ca66b8
					
				| @ -15,6 +15,18 @@ interface CalculateFeeError { | |||||||
|   NegativeFee(i64 fee); |   NegativeFee(i64 fee); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | [Error] | ||||||
|  | interface WalletCreationError { | ||||||
|  |   Io(string e); | ||||||
|  |   InvalidMagicBytes(sequence<u8> got, sequence<u8> expected); | ||||||
|  |   Descriptor(); | ||||||
|  |   Write(); | ||||||
|  |   Load(); | ||||||
|  |   NotInitialized(); | ||||||
|  |   LoadedGenesisDoesNotMatch(); | ||||||
|  |   LoadedNetworkDoesNotMatch(Network expected, Network? got); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| // ------------------------------------------------------------------------ | // ------------------------------------------------------------------------ | ||||||
| // bdk crate - types module | // bdk crate - types module | ||||||
| // ------------------------------------------------------------------------ | // ------------------------------------------------------------------------ | ||||||
| @ -86,7 +98,7 @@ enum ChangeSpendPolicy { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| interface Wallet { | interface Wallet { | ||||||
|   [Throws=Alpha3Error] |   [Throws=WalletCreationError] | ||||||
|   constructor(Descriptor descriptor, Descriptor? change_descriptor, string persistence_backend_path, Network network); |   constructor(Descriptor descriptor, Descriptor? change_descriptor, string persistence_backend_path, Network network); | ||||||
| 
 | 
 | ||||||
|   AddressInfo get_address(AddressIndex address_index); |   AddressInfo get_address(AddressIndex address_index); | ||||||
|  | |||||||
| @ -4,11 +4,13 @@ use bdk::chain::tx_graph::CalculateFeeError as BdkCalculateFeeError; | |||||||
| 
 | 
 | ||||||
| use std::fmt; | use std::fmt; | ||||||
| 
 | 
 | ||||||
|  | use bdk::bitcoin::Network; | ||||||
| use bdk::descriptor::DescriptorError; | use bdk::descriptor::DescriptorError; | ||||||
| use bdk::wallet::error::{BuildFeeBumpError, CreateTxError}; | use bdk::wallet::error::{BuildFeeBumpError, CreateTxError}; | ||||||
| use bdk::wallet::tx_builder::{AddUtxoError, AllowShrinkingError}; | use bdk::wallet::tx_builder::{AddUtxoError, AllowShrinkingError}; | ||||||
| use bdk::wallet::{NewError, NewOrLoadError}; | use bdk::wallet::{NewError, NewOrLoadError}; | ||||||
| use bdk_file_store::{FileError, IterError}; | use bdk_file_store::FileError as BdkFileError; | ||||||
|  | use bdk_file_store::IterError; | ||||||
| use std::convert::Infallible; | use std::convert::Infallible; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| @ -26,15 +28,83 @@ impl fmt::Display for Alpha3Error { | |||||||
| 
 | 
 | ||||||
| impl std::error::Error for Alpha3Error {} | impl std::error::Error for Alpha3Error {} | ||||||
| 
 | 
 | ||||||
| impl From<FileError> for Alpha3Error { | #[derive(Debug)] | ||||||
|     fn from(_: FileError) -> Self { | pub enum WalletCreationError { | ||||||
|         Alpha3Error::Generic |     // Errors coming from the FileError enum
 | ||||||
|  |     Io { | ||||||
|  |         e: String, | ||||||
|  |     }, | ||||||
|  |     InvalidMagicBytes { | ||||||
|  |         got: Vec<u8>, | ||||||
|  |         expected: Vec<u8>, | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     // Errors coming from the NewOrLoadError enum
 | ||||||
|  |     Descriptor, | ||||||
|  |     Write, | ||||||
|  |     Load, | ||||||
|  |     NotInitialized, | ||||||
|  |     LoadedGenesisDoesNotMatch, | ||||||
|  |     LoadedNetworkDoesNotMatch { | ||||||
|  |         expected: Network, | ||||||
|  |         got: Option<Network>, | ||||||
|  |     }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl fmt::Display for WalletCreationError { | ||||||
|  |     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||||||
|  |         match self { | ||||||
|  |             Self::Io { e } => write!(f, "io error trying to read file: {}", e), | ||||||
|  |             Self::InvalidMagicBytes { got, expected } => write!( | ||||||
|  |                 f, | ||||||
|  |                 "file has invalid magic bytes: expected={:?} got={:?}", | ||||||
|  |                 expected, got, | ||||||
|  |             ), | ||||||
|  |             Self::Descriptor => write!(f, "error with descriptor"), | ||||||
|  |             Self::Write => write!(f, "failed to write to persistence"), | ||||||
|  |             Self::Load => write!(f, "failed to load from persistence"), | ||||||
|  |             Self::NotInitialized => { | ||||||
|  |                 write!(f, "wallet is not initialized, persistence backend is empty") | ||||||
|  |             } | ||||||
|  |             Self::LoadedGenesisDoesNotMatch => { | ||||||
|  |                 write!(f, "loaded genesis hash does not match the expected one") | ||||||
|  |             } | ||||||
|  |             Self::LoadedNetworkDoesNotMatch { expected, got } => { | ||||||
|  |                 write!(f, "loaded network type is not {}, got {:?}", expected, got) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl From<NewOrLoadError<std::io::Error, IterError>> for Alpha3Error { | impl std::error::Error for WalletCreationError {} | ||||||
|     fn from(_: NewOrLoadError<std::io::Error, IterError>) -> Self { | 
 | ||||||
|         Alpha3Error::Generic | impl From<BdkFileError> for WalletCreationError { | ||||||
|  |     fn from(error: BdkFileError) -> Self { | ||||||
|  |         match error { | ||||||
|  |             BdkFileError::Io(_) => WalletCreationError::Io { | ||||||
|  |                 e: "io error trying to read file".to_string(), | ||||||
|  |             }, | ||||||
|  |             BdkFileError::InvalidMagicBytes { got, expected } => { | ||||||
|  |                 WalletCreationError::InvalidMagicBytes { got, expected } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl From<NewOrLoadError<std::io::Error, IterError>> for WalletCreationError { | ||||||
|  |     fn from(error: NewOrLoadError<std::io::Error, IterError>) -> Self { | ||||||
|  |         match error { | ||||||
|  |             NewOrLoadError::Descriptor(_) => WalletCreationError::Descriptor, | ||||||
|  |             NewOrLoadError::Write(_) => WalletCreationError::Write, | ||||||
|  |             NewOrLoadError::Load(_) => WalletCreationError::Load, | ||||||
|  |             NewOrLoadError::NotInitialized => WalletCreationError::NotInitialized, | ||||||
|  |             NewOrLoadError::LoadedGenesisDoesNotMatch { .. } => { | ||||||
|  |                 WalletCreationError::LoadedGenesisDoesNotMatch | ||||||
|  |             } | ||||||
|  |             NewOrLoadError::LoadedNetworkDoesNotMatch { expected, got } => { | ||||||
|  |                 WalletCreationError::LoadedNetworkDoesNotMatch { expected, got } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ use crate::wallet::TxBuilder; | |||||||
| use crate::wallet::Update; | use crate::wallet::Update; | ||||||
| use crate::wallet::Wallet; | use crate::wallet::Wallet; | ||||||
| 
 | 
 | ||||||
|  | use crate::error::WalletCreationError; | ||||||
| use bdk::bitcoin::Network; | use bdk::bitcoin::Network; | ||||||
| use bdk::keys::bip39::WordCount; | use bdk::keys::bip39::WordCount; | ||||||
| use bdk::wallet::tx_builder::ChangeSpendPolicy; | use bdk::wallet::tx_builder::ChangeSpendPolicy; | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| use crate::bitcoin::{OutPoint, PartiallySignedTransaction, Transaction}; | use crate::bitcoin::{OutPoint, PartiallySignedTransaction, Transaction}; | ||||||
| use crate::descriptor::Descriptor; | use crate::descriptor::Descriptor; | ||||||
| use crate::error::{Alpha3Error, CalculateFeeError}; | use crate::error::{Alpha3Error, CalculateFeeError, WalletCreationError}; | ||||||
| use crate::types::ScriptAmount; | use crate::types::ScriptAmount; | ||||||
| use crate::types::{Balance, FeeRate}; | use crate::types::{Balance, FeeRate}; | ||||||
| use crate::Script; | use crate::Script; | ||||||
| @ -32,7 +32,7 @@ impl Wallet { | |||||||
|         change_descriptor: Option<Arc<Descriptor>>, |         change_descriptor: Option<Arc<Descriptor>>, | ||||||
|         persistence_backend_path: String, |         persistence_backend_path: String, | ||||||
|         network: Network, |         network: Network, | ||||||
|     ) -> Result<Self, Alpha3Error> { |     ) -> Result<Self, WalletCreationError> { | ||||||
|         let descriptor = descriptor.as_string_private(); |         let descriptor = descriptor.as_string_private(); | ||||||
|         let change_descriptor = change_descriptor.map(|d| d.as_string_private()); |         let change_descriptor = change_descriptor.map(|d| d.as_string_private()); | ||||||
|         let db = Store::<ChangeSet>::open_or_create_new(MAGIC_BYTES, persistence_backend_path)?; |         let db = Store::<ChangeSet>::open_or_create_new(MAGIC_BYTES, persistence_backend_path)?; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user