// CreateEncryptedWallet creates a new default account with a wallet file // encrypted with passphrase. func (am *AccountManager) CreateEncryptedWallet(passphrase []byte) error { if len(am.AllAccounts()) != 0 { return ErrWalletExists } // Get current block's height and hash. bs, err := GetCurBlock() if err != nil { return err } // Create new wallet in memory. wlt, err := wallet.NewWallet("", "Default acccount", passphrase, activeNet.Params, &bs, cfg.KeypoolSize) if err != nil { return err } // Create new account and begin managing with the global account // manager. Registering will fail if the new account can not be // written immediately to disk. a := &Account{ Wallet: wlt, TxStore: txstore.New(), lockedOutpoints: map[btcwire.OutPoint]struct{}{}, } if err := am.RegisterNewAccount(a); err != nil { return err } // Begin tracking account against a connected btcd. a.Track() return nil }
// CreateEncryptedWallet creates a new account with a wallet file // encrypted with passphrase. func (store *AccountStore) CreateEncryptedWallet(name, desc string, passphrase []byte) error { store.RLock() _, ok := store.accounts[name] store.RUnlock() if ok { return ErrAcctExists } // Get current block's height and hash. bs, err := GetCurBlock() if err != nil { return err } // Create new wallet in memory. wlt, err := wallet.NewWallet(name, desc, passphrase, cfg.Net(), &bs, cfg.KeypoolSize) if err != nil { return err } // Create new account with the wallet. A new JSON ID is set for // transaction notifications. account := &Account{ Wallet: wlt, name: name, } account.ScheduleWalletWrite() account.ScheduleTxStoreWrite() account.ScheduleUtxoStoreWrite() // Mark all active payment addresses as belonging to this account. for addr := range account.ActivePaymentAddresses() { MarkAddressForAccount(addr, name) } // Save the account in the global account map. The mutex is // already held at this point, and will be unlocked when this // func returns. store.Lock() store.accounts[name] = account store.Unlock() // Begin tracking account against a connected btcd. // // TODO(jrick): this should *only* happen if btcd is connected. account.Track() // Ensure that the account is written out to disk. if err := account.WriteScheduledToDisk(); err != nil { return err } return nil }
func TestFakeTxs(t *testing.T) { // First we need a wallet. w, err := wallet.NewWallet("banana wallet", "", []byte("banana"), btcwire.MainNet, &wallet.BlockStamp{}, 100) if err != nil { t.Errorf("Can not create encrypted wallet: %s", err) return } a := &Account{ Wallet: w, lockedOutpoints: map[btcwire.OutPoint]struct{}{}, } w.Unlock([]byte("banana")) // Create and add a fake Utxo so we have some funds to spend. // // This will pass validation because btcscript is unaware of invalid // tx inputs, however, this example would fail in btcd. utxo := &tx.Utxo{} addr, err := w.NextChainedAddress(&wallet.BlockStamp{}, 100) if err != nil { t.Errorf("Cannot get next address: %s", err) return } copy(utxo.AddrHash[:], addr.ScriptAddress()) ophash := (btcwire.ShaHash)([...]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}) out := btcwire.NewOutPoint(&ophash, 0) utxo.Out = tx.OutPoint(*out) ss, err := btcscript.PayToAddrScript(addr) if err != nil { t.Errorf("Could not create utxo PkScript: %s", err) return } utxo.Subscript = tx.PkScript(ss) utxo.Amt = 1000000 utxo.Height = 12345 a.UtxoStore = append(a.UtxoStore, utxo) // Fake our current block height so btcd doesn't need to be queried. curBlock.BlockStamp.Height = 12346 // Create the transaction. pairs := map[string]int64{ "17XhEvq9Nahdj7Xe1nv6oRe1tEmaHUuynH": 5000, } _, err = a.txToPairs(pairs, 1) if err != nil { t.Errorf("Tx creation failed: %s", err) return } }
// CreateEncryptedWallet creates a new default account with a wallet file // encrypted with passphrase. func (am *AccountManager) CreateEncryptedWallet(passphrase []byte) error { if len(am.AllAccounts()) != 0 { return ErrWalletExists } // Get current block's height and hash. bs, err := GetCurBlock() if err != nil { return err } // Create new wallet in memory. wlt, err := wallet.NewWallet("", "Default acccount", passphrase, cfg.Net(), &bs, cfg.KeypoolSize) if err != nil { return err } // Create new account and begin managing with the global account // manager. Registering will fail if the new account can not be // written immediately to disk. a := &Account{ Wallet: wlt, } if err := am.RegisterNewAccount(a); err != nil { return err } // Mark all active payment addresses as belonging to this account. // // TODO(jrick) move this to the account manager for addr := range a.ActivePaymentAddresses() { MarkAddressForAccount(addr, "") } // Begin tracking account against a connected btcd. a.Track() return nil }