/// <summary> /// Creates a cold staking account and ensures that it has at least one address. /// If the account already exists then the existing account is returned. /// </summary> /// <remarks> /// <para>In order to keep track of cold staking addresses and balances we are using <see cref="HdAccount"/>'s /// with indexes starting from the value defined in <see cref="Wallet.Wallet.SpecialPurposeAccountIndexesStart"/>. /// </para><para> /// We are using two such accounts, one when the wallet is in the role of cold wallet, and another one when /// the wallet is in the role of hot wallet. For this reason we specify the required account when calling this /// method. /// </para></remarks> /// <param name="walletName">The name of the wallet where we wish to create the account.</param> /// <param name="isColdWalletAccount">Indicates whether we need the cold wallet account (versus the hot wallet account).</param> /// <param name="walletPassword">The wallet password which will be used to create the account.</param> /// <returns>The new or existing cold staking account.</returns> internal HdAccount GetOrCreateColdStakingAccount(string walletName, bool isColdWalletAccount, string walletPassword) { Wallet.Wallet wallet = this.GetWallet(walletName); HdAccount account = this.GetColdStakingAccount(wallet, isColdWalletAccount); if (account != null) { this.logger.LogTrace("(-)[ACCOUNT_ALREADY_EXIST]:'{0}'", account.Name); return(account); } this.logger.LogDebug("The {0} wallet account for '{1}' does not exist and will now be created.", isColdWalletAccount ? "cold" : "hot", wallet.Name); int accountIndex; string accountName; if (isColdWalletAccount) { accountIndex = ColdWalletAccountIndex; accountName = ColdWalletAccountName; } else { accountIndex = HotWalletAccountIndex; accountName = HotWalletAccountName; } account = wallet.AddNewAccount(walletPassword, accountIndex, accountName, this.dateTimeProvider.GetTimeOffset()); this.logger.LogTrace("(-):'{0}'", account.Name); return(account); }
/// <summary> /// Creates a cold staking account and ensures that it has at least one address. /// If the account already exists then the existing account is returned. /// </summary> /// <remarks> /// <para>In order to keep track of cold staking addresses and balances we are using <see cref="HdAccount"/>'s /// with indexes starting from the value defined in <see cref="Wallet.Wallet.SpecialPurposeAccountIndexesStart"/>. /// </para><para> /// We are using two such accounts, one when the wallet is in the role of cold wallet, and another one when /// the wallet is in the role of hot wallet. For this reason we specify the required account when calling this /// method. /// </para></remarks> /// <param name="walletName">The name of the wallet where we wish to create the account.</param> /// <param name="isColdWalletAccount">Indicates whether we need the cold wallet account (versus the hot wallet account).</param> /// <param name="walletPassword">The wallet password which will be used to create the account.</param> /// <returns>The new or existing cold staking account.</returns> internal HdAccount GetOrCreateColdStakingAccount(string walletName, bool isColdWalletAccount, string walletPassword) { this.logger.LogTrace("({0}:'{1}',{2}:{3})", nameof(walletName), walletName, nameof(isColdWalletAccount), isColdWalletAccount); Wallet.Wallet wallet = this.GetWalletByName(walletName); HdAccount account = this.GetColdStakingAccount(wallet, isColdWalletAccount); if (account != null) { this.logger.LogTrace("(-)[ACCOUNT_ALREADY_EXIST]:'{0}'", account.Name); return(account); } this.logger.LogTrace("The {0} wallet account for '{1}' does not exist and will now be created.", isColdWalletAccount ? "cold" : "hot", wallet.Name); int accountIndex; string accountName; if (isColdWalletAccount) { accountIndex = ColdWalletAccountIndex; accountName = ColdWalletAccountName; } else { accountIndex = HotWalletAccountIndex; accountName = HotWalletAccountName; } account = wallet.AddNewAccount(walletPassword, this.dateTimeProvider.GetTimeOffset(), accountIndex, accountName); // Maintain at least one unused address at all times. This will ensure that wallet recovery will also work. IEnumerable <HdAddress> newAddresses = account.CreateAddresses(wallet.Network, 1, false); this.UpdateKeysLookupLocked(newAddresses); // Save the changes to the file. this.SaveWallet(wallet); this.logger.LogTrace("(-):'{0}'", account.Name); return(account); }