/// <summary> /// Adds an account to the current wallet. /// </summary> /// <remarks> /// The name given to the account is of the form "account (i)" by default, where (i) is an incremental index starting at 0. /// According to BIP44, an account at index (i) can only be created when the account at index (i - 1) contains at least one transaction. /// </remarks> /// <seealso cref="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki"/> /// <param name="password">The password used to decrypt the wallet's <see cref="EncryptedSeed"/>.</param> /// <param name="coinType">The type of coin this account is for.</param> /// <param name="accountCreationTime">Creation time of the account to be created.</param> /// <param name="accountIndex">The index at which an account will be created. If left null, a new account will be created after the last used one.</param> /// <param name="accountName">The name of the account to be created. If left null, an account will be created according to the <see cref="Wallet.AccountNamePattern"/>.</param> /// <returns>A new HD account.</returns> public HdAccount AddNewAccount(string password, CoinType coinType, DateTimeOffset accountCreationTime, int?accountIndex = null, string accountName = null) { Guard.NotEmpty(password, nameof(password)); AccountRoot accountRoot = this.AccountsRoot.Single(a => a.CoinType == coinType); return(accountRoot.AddNewAccount(password, this.EncryptedSeed, this.ChainCode, this.Network, accountCreationTime, accountIndex, accountName)); }
/// <summary> /// Update the last block synced height and hash in the wallet. /// </summary> /// <param name="coinType">The type of the coin this account is for.</param> /// <param name="block">The block whose details are used to update the wallet.</param> public void SetLastBlockDetailsByCoinType(CoinType coinType, ChainedHeader block) { AccountRoot accountRoot = this.AccountsRoot.SingleOrDefault(a => a.CoinType == coinType); if (accountRoot == null) { return; } accountRoot.LastBlockSyncedHeight = block.Height; accountRoot.LastBlockSyncedHash = block.HashBlock; }
/// <summary> /// Gets the first account that contains no transaction. /// </summary> /// <returns>An unused account.</returns> public HdAccount GetFirstUnusedAccount(CoinType coinType) { // Get the accounts root for this type of coin. AccountRoot accountsRoot = this.AccountsRoot.Single(a => a.CoinType == coinType); if (accountsRoot.Accounts.Any()) { // Get an unused account. HdAccount firstUnusedAccount = accountsRoot.GetFirstUnusedAccount(); if (firstUnusedAccount != null) { return(firstUnusedAccount); } } return(null); }
/// <summary> /// Adds an account to the current wallet. /// </summary> /// <remarks> /// The name given to the account is of the form "account (i)" by default, where (i) is an incremental index starting at 0. /// According to BIP44, an account at index (i) can only be created when the account at index (i - 1) contains at least one transaction. /// </remarks> /// <seealso cref="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki"/> /// <param name="coinType">The type of coin this account is for.</param> /// <param name="extPubKey">The extended public key for the wallet<see cref="EncryptedSeed"/>.</param> /// <param name="accountIndex">Zero-based index of the account to add.</param> /// <param name="accountCreationTime">Creation time of the account to be created.</param> /// <returns>A new HD account.</returns> public HdAccount AddNewAccount(CoinType coinType, ExtPubKey extPubKey, int accountIndex, DateTimeOffset accountCreationTime) { AccountRoot accountRoot = this.AccountsRoot.Single(a => a.CoinType == coinType); return(accountRoot.AddNewAccount(extPubKey, accountIndex, this.Network, accountCreationTime)); }
/// <summary> /// Gets an account from the wallet's accounts. /// </summary> /// <param name="accountName">The name of the account to retrieve.</param> /// <param name="coinType">The type of the coin this account is for.</param> /// <returns>The requested account or <c>null</c> if the account does not exist.</returns> public HdAccount GetAccountByCoinType(string accountName, CoinType coinType) { AccountRoot accountRoot = this.AccountsRoot.SingleOrDefault(a => a.CoinType == coinType); return(accountRoot?.GetAccountByName(accountName)); }
public WalletAccounts(AccountRoot accountRoot) : this() { this.AccountRoot = accountRoot; }