diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 095ed2e..a0606e0 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -5,7 +5,7 @@ use std::sync::mpsc::{channel, Sender, Receiver}; use log::{info, error}; use zecwalletlitelib::{commands, - lightclient::{LightClient, LightClientConfig}, + lightclient::{LightClient, LightClientConfig, AddressParameters}, }; pub mod version; @@ -243,6 +243,7 @@ pub fn attempt_recover_seed(password: Option) { consensus_branch_id: "000000".to_string(), anchor_offset: 0, data_dir: None, + address_params: AddressParameters::new() }; match LightClient::attempt_recover_seed(&config, password) { diff --git a/lib/src/lightclient.rs b/lib/src/lightclient.rs index b6c05b8..6c866bb 100644 --- a/lib/src/lightclient.rs +++ b/lib/src/lightclient.rs @@ -57,6 +57,31 @@ impl WalletStatus { } } + +#[derive(Clone, Debug)] +pub struct AddressParameters { + pub coin_type: Option, + pub hrp_sapling_extended_spending_key: Option, + pub hrp_sapling_extended_full_viewing_key: Option, + pub hrp_sapling_payment_address: Option, + pub b58_pubkey_address_prefix: Option<[u8; 2]>, + pub b58_script_address_prefix: Option<[u8; 2]>, +} + +impl AddressParameters { + pub fn new() -> Self { + AddressParameters { + coin_type: Some(323), //Zero Default COIN_TYPE + hrp_sapling_extended_spending_key: None, + hrp_sapling_extended_full_viewing_key: None, + hrp_sapling_payment_address: None, + b58_pubkey_address_prefix: None, + b58_script_address_prefix: None + } + } +} + + #[derive(Clone, Debug)] pub struct LightClientConfig { pub server : http::Uri, @@ -64,7 +89,8 @@ pub struct LightClientConfig { pub sapling_activation_height : u64, pub consensus_branch_id : String, pub anchor_offset : u32, - pub data_dir : Option + pub data_dir : Option, + pub address_params : AddressParameters } impl LightClientConfig { @@ -78,6 +104,7 @@ impl LightClientConfig { consensus_branch_id : "".to_string(), anchor_offset : ANCHOR_OFFSET, data_dir : dir, + address_params : AddressParameters::new() } } @@ -101,6 +128,7 @@ impl LightClientConfig { consensus_branch_id : info.consensus_branch_id, anchor_offset : ANCHOR_OFFSET, data_dir : None, + address_params : AddressParameters::new() }; Ok((config, info.block_height)) @@ -249,58 +277,106 @@ impl LightClientConfig { }.parse().unwrap() } + pub fn set_coin_type(&mut self, param: u32) { + self.address_params.coin_type = Some(param); + } + + pub fn set_hrp_sapling_extended_spending_key(&mut self, param: String) { + self.address_params.hrp_sapling_extended_spending_key = Some(param); + } + + pub fn set_hrp_sapling_extended_full_viewing_key(&mut self, param: String) { + self.address_params.hrp_sapling_extended_full_viewing_key = Some(param); + } + + pub fn set_hrp_sapling_payment_address(&mut self, param: String) { + self.address_params.hrp_sapling_payment_address = Some(param); + } + + pub fn set_b58_pubkey_address_prefix(&mut self, param: [u8; 2]) { + self.address_params.b58_pubkey_address_prefix = Some(param); + } + + pub fn set_b58_script_address_prefix(&mut self, param: [u8; 2]) { + self.address_params.b58_script_address_prefix = Some(param); + } + pub fn get_coin_type(&self) -> u32 { - match &self.chain_name[..] { - "main" => mainnet::COIN_TYPE, - "test" => testnet::COIN_TYPE, - "regtest" => regtest::COIN_TYPE, - c => panic!("Unknown chain {}", c) + match &self.address_params.coin_type { + Some(s) => *s, + None => + match &self.chain_name[..] { + "main" => mainnet::COIN_TYPE, + "test" => testnet::COIN_TYPE, + "regtest" => regtest::COIN_TYPE, + c => panic!("Unknown chain {}", c) + } } } pub fn hrp_sapling_address(&self) -> &str { - match &self.chain_name[..] { - "main" => mainnet::HRP_SAPLING_PAYMENT_ADDRESS, - "test" => testnet::HRP_SAPLING_PAYMENT_ADDRESS, - "regtest" => regtest::HRP_SAPLING_PAYMENT_ADDRESS, - c => panic!("Unknown chain {}", c) + match &self.address_params.hrp_sapling_payment_address { + Some(s) => s, + None => + match &self.chain_name[..] { + "main" => mainnet::HRP_SAPLING_PAYMENT_ADDRESS, + "test" => testnet::HRP_SAPLING_PAYMENT_ADDRESS, + "regtest" => regtest::HRP_SAPLING_PAYMENT_ADDRESS, + c => panic!("Unknown chain {}", c) + } } } pub fn hrp_sapling_private_key(&self) -> &str { - match &self.chain_name[..] { - "main" => mainnet::HRP_SAPLING_EXTENDED_SPENDING_KEY, - "test" => testnet::HRP_SAPLING_EXTENDED_SPENDING_KEY, - "regtest" => regtest::HRP_SAPLING_EXTENDED_SPENDING_KEY, - c => panic!("Unknown chain {}", c) + match &self.address_params.hrp_sapling_extended_full_viewing_key { + Some(s) => s, + None => + match &self.chain_name[..] { + "main" => mainnet::HRP_SAPLING_EXTENDED_SPENDING_KEY, + "test" => testnet::HRP_SAPLING_EXTENDED_SPENDING_KEY, + "regtest" => regtest::HRP_SAPLING_EXTENDED_SPENDING_KEY, + c => panic!("Unknown chain {}", c) + } } } pub fn hrp_sapling_viewing_key(&self) -> &str { - match &self.chain_name[..] { - "main" => mainnet::HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, - "test" => testnet::HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, - "regtest" => regtest::HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, - c => panic!("Unknown chain {}", c) + match &self.address_params.hrp_sapling_extended_spending_key { + Some(s) => s, + None => + match &self.chain_name[..] { + "main" => mainnet::HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, + "test" => testnet::HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, + "regtest" => regtest::HRP_SAPLING_EXTENDED_FULL_VIEWING_KEY, + c => panic!("Unknown chain {}", c) + } } } pub fn base58_pubkey_address(&self) -> [u8; 2] { - match &self.chain_name[..] { - "main" => mainnet::B58_PUBKEY_ADDRESS_PREFIX, - "test" => testnet::B58_PUBKEY_ADDRESS_PREFIX, - "regtest" => regtest::B58_PUBKEY_ADDRESS_PREFIX, - c => panic!("Unknown chain {}", c) + match &self.address_params.b58_pubkey_address_prefix { + Some(s) => *s, + None => + match &self.chain_name[..] { + "main" => mainnet::B58_PUBKEY_ADDRESS_PREFIX, + "test" => testnet::B58_PUBKEY_ADDRESS_PREFIX, + "regtest" => regtest::B58_PUBKEY_ADDRESS_PREFIX, + c => panic!("Unknown chain {}", c) + } } } pub fn base58_script_address(&self) -> [u8; 2] { - match &self.chain_name[..] { - "main" => mainnet::B58_SCRIPT_ADDRESS_PREFIX, - "test" => testnet::B58_SCRIPT_ADDRESS_PREFIX, - "regtest" => regtest::B58_SCRIPT_ADDRESS_PREFIX, - c => panic!("Unknown chain {}", c) + match &self.address_params.b58_script_address_prefix { + Some(s) => *s, + None => + match &self.chain_name[..] { + "main" => mainnet::B58_SCRIPT_ADDRESS_PREFIX, + "test" => testnet::B58_SCRIPT_ADDRESS_PREFIX, + "regtest" => regtest::B58_SCRIPT_ADDRESS_PREFIX, + c => panic!("Unknown chain {}", c) + } } } diff --git a/lib/src/lightwallet/tests.rs b/lib/src/lightwallet/tests.rs index 986b909..6d70771 100644 --- a/lib/src/lightwallet/tests.rs +++ b/lib/src/lightwallet/tests.rs @@ -659,6 +659,7 @@ fn get_test_config() -> LightClientConfig { consensus_branch_id: "000000".to_string(), anchor_offset: 0, data_dir: None, + address_params: AddressParameters::new() } } @@ -671,6 +672,7 @@ fn get_main_config() -> LightClientConfig { consensus_branch_id: "000000".to_string(), anchor_offset: 0, data_dir: None, + address_params: AddressParameters::new() } } @@ -717,6 +719,7 @@ fn test_unconfirmed_txns() { consensus_branch_id: "000000".to_string(), anchor_offset: 5, // offset = 5 data_dir: None, + address_params: AddressParameters::new() }; let branch_id = u32::from_str_radix("2bb40e60", 16).unwrap(); @@ -2169,6 +2172,7 @@ fn test_t_z_derivation() { consensus_branch_id: "000000".to_string(), anchor_offset: 1, data_dir: None, + address_params: AddressParameters::new() }; let seed_phrase = Some("chimney better bulb horror rebuild whisper improve intact letter giraffe brave rib appear bulk aim burst snap salt hill sad merge tennis phrase raise".to_string()); @@ -2325,6 +2329,7 @@ fn test_import_birthday_adjust() { consensus_branch_id: "000000".to_string(), anchor_offset: 0, data_dir: None, + address_params: AddressParameters::new() }; let privkey = "secret-extended-key-main1q0p44m9zqqqqpqyxfvy5w2vq6ahvxyrwsk2w4h2zleun4cft4llmnsjlv77lhuuknv6x9jgu5g2clf3xq0wz9axxxq8klvv462r5pa32gjuj5uhxnvps6wsrdg6xll05unwks8qpgp4psmvy5e428uxaggn4l29duk82k3sv3njktaaj453fdmfmj2fup8rls4egqxqtj2p5a3yt4070khn99vzxj5ag5qjngc4v2kq0ctl9q2rpc2phu4p3e26egu9w88mchjf83sqgh3cev"; diff --git a/lib/src/lightwallet/walletzkey.rs b/lib/src/lightwallet/walletzkey.rs index 3c97c49..c8312c3 100644 --- a/lib/src/lightwallet/walletzkey.rs +++ b/lib/src/lightwallet/walletzkey.rs @@ -295,6 +295,7 @@ pub mod tests { consensus_branch_id: "000000".to_string(), anchor_offset: 0, data_dir: None, + address_params: AddressParameters::new() } }