Block in wallet support
This commit is contained in:
parent
f66b4ff6b3
commit
4629472d69
|
@ -18,4 +18,5 @@
|
|||
|
||||
pub mod address;
|
||||
pub mod bip32;
|
||||
pub mod wallet;
|
||||
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
// Rust Bitcoin Library
|
||||
// Written in 2014 by
|
||||
// Andrew Poelstra <apoelstra@wpsoftware.net>
|
||||
// To the extent possible under law, the author(s) have dedicated all
|
||||
// copyright and related and neighboring rights to this software to
|
||||
// the public domain worldwide. This software is distributed without
|
||||
// any warranty.
|
||||
//
|
||||
// You should have received a copy of the CC0 Public Domain Dedication
|
||||
// along with this software.
|
||||
// If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
//
|
||||
|
||||
//! # Wallet
|
||||
//!
|
||||
//! Everything to do with the wallet
|
||||
//!
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::default::Default;
|
||||
|
||||
use network::constants::Network;
|
||||
use wallet::bip32::{mod, ChildNumber, ExtendedPrivKey, Normal, Hardened};
|
||||
|
||||
/// A Wallet error
|
||||
pub enum Error {
|
||||
/// Tried to lookup an account by name, but none was found
|
||||
AccountNotFound,
|
||||
/// Tried to add an account when one already exists with that name
|
||||
DuplicateAccount
|
||||
}
|
||||
|
||||
/// An account
|
||||
#[deriving(Clone, PartialEq, Eq, Show)]
|
||||
pub struct Account {
|
||||
name: String,
|
||||
internal_path: Vec<ChildNumber>,
|
||||
external_path: Vec<ChildNumber>
|
||||
}
|
||||
|
||||
impl Default for Account {
|
||||
fn default() -> Account {
|
||||
Account {
|
||||
name: String::new(),
|
||||
internal_path: vec![Hardened(0), Normal(1)],
|
||||
external_path: vec![Hardened(0), Normal(0)]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// A wallet
|
||||
#[deriving(Clone, PartialEq, Eq, Show)]
|
||||
pub struct Wallet {
|
||||
master: ExtendedPrivKey,
|
||||
accounts: HashMap<String, Account>
|
||||
}
|
||||
|
||||
impl Wallet {
|
||||
/// Creates a new wallet from a seed
|
||||
pub fn from_seed(network: Network, seed: &[u8]) -> Result<Wallet, bip32::Error> {
|
||||
let mut accounts = HashMap::new();
|
||||
accounts.insert(String::new(), Default::default());
|
||||
|
||||
Ok(Wallet {
|
||||
master: try!(ExtendedPrivKey::new_master(network, seed)),
|
||||
accounts: accounts
|
||||
})
|
||||
}
|
||||
|
||||
/// Adds an account to a wallet
|
||||
pub fn add_account(&mut self, name: String)
|
||||
-> Result<(), Error> {
|
||||
if self.accounts.find(&name).is_some() {
|
||||
return Err(DuplicateAccount);
|
||||
}
|
||||
|
||||
let idx = self.accounts.len() as u32;
|
||||
self.accounts.insert(name.clone(), Account {
|
||||
name: name,
|
||||
internal_path: vec![Hardened(idx), Normal(1)],
|
||||
external_path: vec![Hardened(idx), Normal(0)]
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue