1
1
use crate :: bitcoin:: secp256k1:: Secp256k1 ;
2
2
use crate :: seed:: RandomSeed ;
3
3
use crate :: seed:: Seed ;
4
+ use crate :: seed:: RANDOM_SEED_SIZE ;
4
5
use crate :: wallet:: sled:: Db ;
5
6
use anyhow:: anyhow;
6
7
use anyhow:: bail;
@@ -183,10 +184,10 @@ where
183
184
{
184
185
pub fn import_seed ( & mut self , msg : ImportSeed ) -> Result < AddressInfo > {
185
186
let seed = msg. seed ;
186
- let import_seed: [ u8 ; 256 ] = seed
187
+ let import_seed: [ u8 ; RANDOM_SEED_SIZE ] = seed
187
188
. clone ( )
188
189
. try_into ( )
189
- . map_err ( |_| anyhow ! ( "seed must be 256 bytes long" ) ) ?;
190
+ . map_err ( |_| anyhow ! ( "seed must be {RANDOM_SEED_SIZE} bytes long" ) ) ?;
190
191
191
192
let import_seed = RandomSeed :: from ( import_seed) ;
192
193
let ext_priv_key = import_seed. derive_extended_priv_key ( msg. network ) ?;
@@ -197,8 +198,17 @@ where
197
198
// recreate and update wallet
198
199
self . wallet = Actor :: build_wallet ( ext_priv_key, db) ?;
199
200
201
+ let name = msg. name ;
202
+ let wallet_seed = msg. path . join ( & name) ;
203
+
204
+ let now = Timestamp :: now ( ) ;
205
+ let backup_seed = msg. path . join ( format ! ( "{name}.{now}.back" ) ) ;
206
+
207
+ // copying old seed file to safety.
208
+ tokio:: fs:: copy ( & wallet_seed, & backup_seed) . await ?;
209
+
200
210
// write imported seed file to disk.
201
- tokio:: fs:: write ( msg . seed_path . as_path ( ) , seed) . await ?;
211
+ tokio:: fs:: write ( wallet_seed . as_path ( ) , seed) . await ?;
202
212
203
213
self . wallet
204
214
. get_address ( AddressIndex :: LastUnused )
@@ -410,7 +420,8 @@ pub struct Sign {
410
420
411
421
pub struct ImportSeed {
412
422
pub seed : Vec < u8 > ,
413
- pub seed_path : PathBuf ,
423
+ pub path : PathBuf ,
424
+ pub name : String ,
414
425
pub network : Network ,
415
426
}
416
427
@@ -540,7 +551,6 @@ fn seed_and_rpc_on_same_network(rpc: &electrum_client::Client, network: Network)
540
551
#[ cfg( test) ]
541
552
mod tests {
542
553
use super :: * ;
543
- use crate :: seed;
544
554
use bdk:: database:: MemoryDatabase ;
545
555
use bdk_ext:: keypair;
546
556
use bdk_ext:: new_test_wallet;
@@ -630,13 +640,13 @@ mod tests {
630
640
let mut import_seed = [ 0u8 ; 32 ] ;
631
641
thread_rng ( ) . fill ( & mut import_seed) ;
632
642
633
- let seed_path = data_dir. join ( seed:: TAKER_WALLET_SEED_FILE ) ;
634
643
// import seed
635
644
actor
636
645
. send ( ImportSeed {
637
646
seed : import_seed. to_vec ( ) ,
638
647
network : Network :: Testnet ,
639
- seed_path,
648
+ path : data_dir,
649
+ name : crate :: seed:: TAKER_WALLET_SEED_FILE . to_string ( ) ,
640
650
} )
641
651
. await
642
652
. unwrap ( )
@@ -670,8 +680,6 @@ mod tests {
670
680
671
681
let wallet = actor. create ( None ) . spawn ( & mut tasks) ;
672
682
673
- let seed_path = data_dir. join ( seed:: TAKER_WALLET_SEED_FILE ) ;
674
-
675
683
const IMPORT_SEED : [ u8 ; 256 ] = [
676
684
137 , 78 , 181 , 39 , 89 , 143 , 9 , 224 , 92 , 125 , 51 , 183 , 87 , 95 , 206 , 236 , 135 , 33 , 54 , 10 ,
677
685
237 , 169 , 132 , 74 , 230 , 66 , 244 , 244 , 89 , 224 , 23 , 62 , 163 , 60 , 39 , 66 , 19 , 213 , 68 ,
@@ -693,7 +701,8 @@ mod tests {
693
701
. send ( ImportSeed {
694
702
seed : IMPORT_SEED . to_vec ( ) ,
695
703
network : Network :: Testnet ,
696
- seed_path,
704
+ path : data_dir,
705
+ name : crate :: seed:: TAKER_WALLET_SEED_FILE . to_string ( ) ,
697
706
} )
698
707
. await
699
708
. unwrap ( )
0 commit comments