Fix wallet serialization to not use "" as a key anywhere
Turns out TOML does not support tables named "", so we instead encode the accounts list as an array rather than a name-keyed hashmap. This is fine since the account name is in the account structure itself anyway.
This commit is contained in:
parent
bc7077fac4
commit
9f56b9c57f
|
@ -20,6 +20,7 @@ use std::collections::HashMap;
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::io::extensions::u64_from_be_bytes;
|
use std::io::extensions::u64_from_be_bytes;
|
||||||
use collections::hash::sip::hash_with_keys;
|
use collections::hash::sip::hash_with_keys;
|
||||||
|
use serialize::{Decoder, Decodable, Encoder, Encodable};
|
||||||
|
|
||||||
use blockdata::transaction::{PayToPubkeyHash, TxOut};
|
use blockdata::transaction::{PayToPubkeyHash, TxOut};
|
||||||
use network::constants::Network;
|
use network::constants::Network;
|
||||||
|
@ -52,12 +53,47 @@ impl Default for Account {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A wallet
|
/// A wallet
|
||||||
#[deriving(Clone, PartialEq, Eq, Encodable, Decodable, Show)]
|
#[deriving(Clone, PartialEq, Eq, Show)]
|
||||||
pub struct Wallet {
|
pub struct Wallet {
|
||||||
master: ExtendedPrivKey,
|
master: ExtendedPrivKey,
|
||||||
accounts: HashMap<String, Account>
|
accounts: HashMap<String, Account>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<S: Encoder<E>, E> Encodable<S, E> for Wallet {
|
||||||
|
fn encode(&self, s: &mut S) -> Result<(), E> {
|
||||||
|
s.emit_struct("wallet", 2, |s| {
|
||||||
|
try!(s.emit_struct_field("master", 0, |s| self.master.encode(s)));
|
||||||
|
s.emit_struct_field("accounts", 1,
|
||||||
|
|s| s.emit_seq(self.accounts.len(), |s| {
|
||||||
|
for (_, account) in self.accounts.iter() {
|
||||||
|
try!(account.encode(s));
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D: Decoder<E>, E> Decodable<D, E> for Wallet {
|
||||||
|
fn decode(d: &mut D) -> Result<Wallet, E> {
|
||||||
|
d.read_struct("wallet", 2, |d| {
|
||||||
|
Ok(Wallet {
|
||||||
|
master: try!(d.read_struct_field("master", 0, Decodable::decode)),
|
||||||
|
accounts: try!(d.read_struct_field("accounts", 1, |d| {
|
||||||
|
d.read_seq(|d, len| {
|
||||||
|
let mut ret = HashMap::new();
|
||||||
|
for i in range(0, len) {
|
||||||
|
let accnt: Account = try!(d.read_seq_elt(i, Decodable::decode));
|
||||||
|
ret.insert(accnt.name.clone(), accnt);
|
||||||
|
}
|
||||||
|
Ok(ret)
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Wallet {
|
impl Wallet {
|
||||||
/// Creates a new wallet from a BIP32 seed
|
/// Creates a new wallet from a BIP32 seed
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
Loading…
Reference in New Issue