11use anyhow:: ensure;
2+ use bip39:: Mnemonic ;
23use clap:: Parser ;
4+ use tracing:: info;
35
4- const MIN_CHUNK_SIZE : u64 = 4 ;
5- const MIN_LIFETIME : u64 = 18 ;
6- const DEFAULT_ACTIVATION_EPOCH : usize = 0 ;
7- const DEFAULT_NUM_ACTIVE_EPOCHS : usize = 1 << 18 ;
6+ const MIN_CHUNK_SIZE : u32 = 4 ;
7+ const MIN_LIFETIME : u32 = 18 ;
8+ const DEFAULT_ACTIVATION_EPOCH : u32 = 0 ;
9+ const DEFAULT_NUM_ACTIVE_EPOCHS : u32 = 1 << 18 ;
810
911#[ derive( Debug , Parser ) ]
1012pub struct AccountManagerConfig {
@@ -14,23 +16,31 @@ pub struct AccountManagerConfig {
1416
1517 /// Account lifetime in 2 ** lifetime slots
1618 #[ arg( short, long, default_value_t = 18 ) ]
17- pub lifetime : u64 ,
19+ pub lifetime : u32 ,
1820
1921 /// Chunk size for messages
2022 #[ arg( short, long, default_value_t = 5 ) ]
21- pub chunk_size : u64 ,
23+ pub chunk_size : u32 ,
2224
2325 /// Seed phrase for key generation
2426 #[ arg( short, long) ]
2527 pub seed_phrase : Option < String > ,
2628
29+ /// Optional BIP39 passphrase used with the seed phrase
30+ #[ arg( long) ]
31+ pub passphrase : Option < String > ,
32+
2733 /// Activation epoch for the validator
2834 #[ arg( long, default_value_t = DEFAULT_ACTIVATION_EPOCH ) ]
29- pub activation_epoch : usize ,
35+ pub activation_epoch : u32 ,
3036
3137 /// Number of active epochs
3238 #[ arg( long, default_value_t = DEFAULT_NUM_ACTIVE_EPOCHS ) ]
33- pub num_active_epochs : usize ,
39+ pub num_active_epochs : u32 ,
40+
41+ /// Path for keystore directory (relative to data-dir if not absolute)
42+ #[ arg( long) ]
43+ pub keystore_path : Option < String > ,
3444}
3545
3646impl Default for AccountManagerConfig {
@@ -40,8 +50,10 @@ impl Default for AccountManagerConfig {
4050 lifetime : 18 ,
4151 chunk_size : 5 ,
4252 seed_phrase : None ,
53+ passphrase : None ,
4354 activation_epoch : DEFAULT_ACTIVATION_EPOCH ,
4455 num_active_epochs : DEFAULT_NUM_ACTIVE_EPOCHS ,
56+ keystore_path : None ,
4557 }
4658 }
4759}
@@ -60,14 +72,22 @@ impl AccountManagerConfig {
6072 self . lifetime >= MIN_LIFETIME ,
6173 "Lifetime must be at least {MIN_LIFETIME}"
6274 ) ;
75+
6376 Ok ( ( ) )
6477 }
6578
6679 pub fn get_seed_phrase ( & self ) -> String {
6780 if let Some ( phrase) = & self . seed_phrase {
6881 phrase. clone ( )
6982 } else {
70- "default_seed_phrase" . to_string ( )
83+ // Generate a new BIP39 mnemonic with 24 words (256 bits of entropy)
84+ let entropy: [ u8 ; 32 ] = rand:: random ( ) ;
85+ let mnemonic = Mnemonic :: from_entropy ( & entropy) . expect ( "Failed to generate mnemonic" ) ;
86+ let phrase = mnemonic. words ( ) . collect :: < Vec < _ > > ( ) . join ( " " ) ;
87+ info ! ( "{}" , "=" . repeat( 89 ) ) ;
88+ info ! ( "Generated new seed phrase (KEEP SAFE): {phrase}" ) ;
89+ info ! ( "{}" , "=" . repeat( 89 ) ) ;
90+ phrase
7191 }
7292 }
7393}
0 commit comments