diff --git a/lib/src/lightwallet.rs b/lib/src/lightwallet.rs index e29a12e..1c17c65 100644 --- a/lib/src/lightwallet.rs +++ b/lib/src/lightwallet.rs @@ -202,7 +202,12 @@ impl LightWallet { pub fn read(mut reader: R, config: &LightClientConfig) -> io::Result { let version = reader.read_u64::()?; - assert!(version <= LightWallet::serialized_version()); + if version > LightWallet::serialized_version() { + let e = format!("Don't know how to read wallet version {}. Do you have the latest version?", version); + error!("{}", e); + return Err(io::Error::new(ErrorKind::InvalidData, e)); + } + info!("Reading wallet version {}", version); let locked = if version >= 4 { @@ -1350,7 +1355,7 @@ impl LightWallet { if selected_value < u64::from(target_value) { let e = format!( - "Insufficient verified funds (have {}, need {:?}).\nNote: funds need {} confirmations before they can be spent", + "Insufficient verified funds (have {}, need {:?}). NOTE: funds need {} confirmations before they can be spent.", selected_value, target_value, self.config.anchor_offset ); error!("{}", e); diff --git a/lib/src/lightwallet/bugs.rs b/lib/src/lightwallet/bugs.rs index 0f6028d..fbe9755 100644 --- a/lib/src/lightwallet/bugs.rs +++ b/lib/src/lightwallet/bugs.rs @@ -43,6 +43,9 @@ impl BugBip39Derivation { } pub fn fix_bug(client: &LightClient) -> String { + use zcash_primitives::transaction::components::amount::DEFAULT_FEE; + use std::convert::TryInto; + if !BugBip39Derivation::has_bug(client) { let r = object!{ "has_bug" => false @@ -51,7 +54,32 @@ impl BugBip39Derivation { return r.pretty(2); } - // TODO: Tranfer money + // Tranfer money + // 1. The desination is z address #0 + let zaddr = client.do_address()["z_addresses"][0].as_str().unwrap().to_string(); + let balance_json = client.do_balance(); + let fee: u64 = DEFAULT_FEE.try_into().unwrap(); + let amount: u64 = balance_json["zbalance"].as_u64().unwrap() + + balance_json["tbalance"].as_u64().unwrap() + - fee; + + let txid = if amount > 0 { + match client.do_send(vec![(&zaddr, amount, None)]) { + Ok(txid) => txid, + Err(e) => { + let r = object!{ + "has_bug" => true, + "fixed" => false, + "error" => e, + }; + + return r.pretty(2); + } + } + } else { + "".to_string() + }; + // regen addresses let wallet = client.wallet.read().unwrap(); @@ -75,7 +103,8 @@ impl BugBip39Derivation { let r = object!{ "has_bug" => true, - "fixed" => true, + "fixed" => true, + "txid" => txid, }; return r.pretty(2);