/// <summary> /// Gets the first unused cold staking address. Creates a new address if required. /// </summary> /// <param name="walletName">The name of the wallet providing the cold staking address.</param> /// <param name="isColdWalletAddress">Indicates whether we need the cold wallet address (versus the hot wallet address).</param> /// <returns>The cold staking address or <c>null</c> if the required account does not exist.</returns> internal HdAddress GetFirstUnusedColdStakingAddress(string walletName, bool isColdWalletAddress) { Guard.NotNull(walletName, nameof(walletName)); Wallet.Wallet wallet = this.GetWalletByName(walletName); HdAccount account = this.GetColdStakingAccount(wallet, isColdWalletAddress); if (account == null) { this.logger.LogTrace("(-)[ACCOUNT_DOES_NOT_EXIST]:null"); return(null); } HdAddress address = account.GetFirstUnusedReceivingAddress(); if (address == null) { this.logger.LogDebug("No unused address exists on account '{0}'. Adding new address.", account.Name); IEnumerable <HdAddress> newAddresses = account.CreateAddresses(wallet.Network, 1); this.UpdateKeysLookupLocked(newAddresses); address = newAddresses.First(); } this.logger.LogTrace("(-):'{0}'", address.Address); return(address); }
/// <summary> /// Gets the first unused cold staking address. Creates a new address if required. /// </summary> /// <param name="walletName">The name of the wallet providing the cold staking address.</param> /// <param name="isColdWalletAddress">Indicates whether we need the cold wallet address (versus the hot wallet address).</param> /// <returns>The cold staking address or <c>null</c> if the required account does not exist.</returns> internal HdAddress GetFirstUnusedColdStakingAddress(string walletName, bool isColdWalletAddress) { Guard.NotNull(walletName, nameof(walletName)); this.logger.LogTrace("({0}:'{1}',{2}:{3})", nameof(walletName), walletName, nameof(isColdWalletAddress), isColdWalletAddress); Wallet.Wallet wallet = this.GetWalletByName(walletName); HdAccount account = this.GetColdStakingAccount(wallet, isColdWalletAddress); if (account == null) { this.logger.LogTrace("(-)[ACCOUNT_DOES_NOT_EXIST]:null"); return(null); } HdAddress address = account.GetFirstUnusedReceivingAddress(); if (address == null) { this.logger.LogTrace("No unused address exists on account '{0}'. Adding new address.", account.Name); address = account.CreateAddresses(wallet.Network, 1).First(); } this.logger.LogTrace("(-):'{0}'", address.Address); return(address); }
public void GetFirstUnusedReceivingAddressWithoutReceivingAddressReturnsNull() { var account = new HdAccount(); HdAddress result = account.GetFirstUnusedReceivingAddress(); Assert.Null(result); }
public void GetFirstUnusedReceivingAddressWithoutReceivingAddressReturnsNull() { var account = new HdAccount(); account.ExternalAddresses.Clear(); var result = account.GetFirstUnusedReceivingAddress(); Assert.Null(result); }
public void GetFirstUnusedReceivingAddressWithoutReceivingAddressReturnsNull() { var store = new WalletMemoryStore(); var account = new HdAccount(); account.ExternalAddresses.Clear(); HdAddress result = account.GetFirstUnusedReceivingAddress(store); Assert.Null(result); }
public List <Transaction> RetrieveFilteredUtxos(string walletName, string walletPassword, string transactionHex, FeeRate feeRate, string walletAccount = null) { var retrievalTransactions = new List <Transaction>(); Transaction transactionToReclaim = this.network.Consensus.ConsensusFactory.CreateTransaction(transactionHex); foreach (TxOut output in transactionToReclaim.Outputs) { Wallet.Wallet wallet = this.GetWallet(walletName); HdAddress address = wallet.GetAllAddresses(Wallet.Wallet.AllAccounts).FirstOrDefault(a => a.ScriptPubKey == output.ScriptPubKey); // The address is not in the wallet so ignore this output. if (address == null) { continue; } HdAccount destinationAccount = wallet.GetAccounts(Wallet.Wallet.NormalAccounts).First(); // This shouldn't really happen unless the user has no proper accounts in the wallet. if (destinationAccount == null) { continue; } Script destination = destinationAccount.GetFirstUnusedReceivingAddress().ScriptPubKey; ISecret extendedPrivateKey = wallet.GetExtendedPrivateKeyForAddress(walletPassword, address); Key privateKey = extendedPrivateKey.PrivateKey; var builder = new TransactionBuilder(this.network); var coin = new Coin(transactionToReclaim, output); builder.AddCoins(coin); builder.AddKeys(privateKey); builder.Send(destination, output.Value); builder.SubtractFees(); builder.SendEstimatedFees(feeRate); Transaction builtTransaction = builder.BuildTransaction(true); retrievalTransactions.Add(builtTransaction); } return(retrievalTransactions); }
public void GetFirstUnusedReceivingAddressWithoutExistingUnusedReceivingAddressReturnsNull() { var account = new HdAccount(); account.ExternalAddresses.Add(new HdAddress { Index = 2, Transactions = new List <TransactionData> { new TransactionData() } }); account.ExternalAddresses.Add(new HdAddress { Index = 1, Transactions = new List <TransactionData> { new TransactionData() } }); HdAddress result = account.GetFirstUnusedReceivingAddress(); Assert.Null(result); }
public void GetFirstUnusedReceivingAddressWithExistingUnusedReceivingAddressReturnsAddressWithLowestIndex() { var account = new HdAccount(); account.ExternalAddresses.Add(new HdAddress { Index = 3 }); account.ExternalAddresses.Add(new HdAddress { Index = 2 }); account.ExternalAddresses.Add(new HdAddress { Index = 1, Transactions = new List <TransactionData> { new TransactionData() } }); HdAddress result = account.GetFirstUnusedReceivingAddress(); Assert.Equal(account.ExternalAddresses.ElementAt(1), result); }
public MockChainNode(CoreNode coreNode, IMockChain chain, Mnemonic mnemonic = null) { this.CoreNode = coreNode; this.chain = chain; // Set up address and mining (Wallet wallet, _) = this.CoreNode.FullNode.WalletManager().CreateWallet(this.Password, this.WalletName, this.Passphrase, mnemonic); HdAccount account = wallet.GetAccount(this.AccountName); this.MinerAddress = account.GetFirstUnusedReceivingAddress(); Key key = wallet.GetExtendedPrivateKeyForAddress(this.Password, this.MinerAddress).PrivateKey; this.CoreNode.SetMinerSecret(new BitcoinSecret(key, this.CoreNode.FullNode.Network)); // Set up services for later this.smartContractWalletController = this.CoreNode.FullNode.NodeController <SmartContractWalletController>(); this.smartContractsController = this.CoreNode.FullNode.NodeController <SmartContractsController>(); this.stateRoot = this.CoreNode.FullNode.NodeService <IStateRepositoryRoot>(); this.blockStore = this.CoreNode.FullNode.NodeService <IBlockStore>(); }
public void GetFirstUnusedReceivingAddressWithExistingUnusedReceivingAddressReturnsAddressWithLowestIndex() { var store = new WalletMemoryStore(); var account = new HdAccount(); account.ExternalAddresses.Add(new HdAddress { Index = 3, Address = "3" }); account.ExternalAddresses.Add(new HdAddress { Index = 2, Address = "2" }); account.ExternalAddresses.Add(new HdAddress { Index = 1, Address = "1" }); store.Add(new List <TransactionOutputData> { new TransactionOutputData { OutPoint = new OutPoint(new uint256(1), 1), Address = "1" } }); HdAddress result = account.GetFirstUnusedReceivingAddress(store); Assert.Equal(account.ExternalAddresses.ElementAt(1), result); }
public static void SetMinerSecret(CoreNode coreNode, string walletName = "mywallet", string walletPassword = "******", string accountName = "account 0", string miningAddress = null) { if (coreNode.MinerSecret == null) { Wallet wallet = coreNode.FullNode.WalletManager().GetWallet(walletName); HdAccount account = wallet.GetAccount(accountName); HdAddress address; if (!string.IsNullOrEmpty(miningAddress)) { address = account.ExternalAddresses.Concat(account.InternalAddresses).Single(add => add.Address == miningAddress); } else { address = account.GetFirstUnusedReceivingAddress(); } coreNode.MinerHDAddress = address; Key extendedPrivateKey = wallet.GetExtendedPrivateKeyForAddress(walletPassword, address).PrivateKey; coreNode.SetMinerSecret(new BitcoinSecret(extendedPrivateKey, coreNode.FullNode.Network)); } }