@@ -237,6 +237,7 @@ impl Wallet {
237237 network : Network ,
238238 ) -> Result < Self , DescriptorError > {
239239 Self :: new ( descriptor, change_descriptor, ( ) , network) . map_err ( |e| match e {
240+ NewError :: NonEmptyDatabase => unreachable ! ( "mock-database cannot have data" ) ,
240241 NewError :: Descriptor ( e) => e,
241242 NewError :: Write ( _) => unreachable ! ( "mock-write must always succeed" ) ,
242243 } )
@@ -251,6 +252,7 @@ impl Wallet {
251252 ) -> Result < Self , crate :: descriptor:: DescriptorError > {
252253 Self :: new_with_genesis_hash ( descriptor, change_descriptor, ( ) , network, genesis_hash)
253254 . map_err ( |e| match e {
255+ NewError :: NonEmptyDatabase => unreachable ! ( "mock-database cannot have data" ) ,
254256 NewError :: Descriptor ( e) => e,
255257 NewError :: Write ( _) => unreachable ! ( "mock-write must always succeed" ) ,
256258 } )
@@ -288,6 +290,8 @@ where
288290/// [`new_with_genesis_hash`]: Wallet::new_with_genesis_hash
289291#[ derive( Debug ) ]
290292pub enum NewError < W > {
293+ /// Database already has data.
294+ NonEmptyDatabase ,
291295 /// There was problem with the passed-in descriptor(s).
292296 Descriptor ( crate :: descriptor:: DescriptorError ) ,
293297 /// We were unable to write the wallet's data to the persistence backend.
@@ -300,6 +304,10 @@ where
300304{
301305 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
302306 match self {
307+ NewError :: NonEmptyDatabase => write ! (
308+ f,
309+ "database already has data - use `load` or `new_or_load` methods instead"
310+ ) ,
303311 NewError :: Descriptor ( e) => e. fmt ( f) ,
304312 NewError :: Write ( e) => e. fmt ( f) ,
305313 }
@@ -446,13 +454,18 @@ impl<D> Wallet<D> {
446454 pub fn new_with_genesis_hash < E : IntoWalletDescriptor > (
447455 descriptor : E ,
448456 change_descriptor : Option < E > ,
449- db : D ,
457+ mut db : D ,
450458 network : Network ,
451459 genesis_hash : BlockHash ,
452460 ) -> Result < Self , NewError < D :: WriteError > >
453461 where
454462 D : PersistBackend < ChangeSet > ,
455463 {
464+ if let Ok ( changeset) = db. load_from_persistence ( ) {
465+ if changeset. is_some ( ) {
466+ return Err ( NewError :: NonEmptyDatabase ) ;
467+ }
468+ }
456469 let secp = Secp256k1 :: new ( ) ;
457470 let ( chain, chain_changeset) = LocalChain :: from_genesis_hash ( genesis_hash) ;
458471 let mut index = KeychainTxOutIndex :: < KeychainKind > :: default ( ) ;
@@ -615,6 +628,9 @@ impl<D> Wallet<D> {
615628 genesis_hash,
616629 )
617630 . map_err ( |e| match e {
631+ NewError :: NonEmptyDatabase => {
632+ unreachable ! ( "database is already checked to have no data" )
633+ }
618634 NewError :: Descriptor ( e) => NewOrLoadError :: Descriptor ( e) ,
619635 NewError :: Write ( e) => NewOrLoadError :: Write ( e) ,
620636 } ) ,
0 commit comments