Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 3
0
        public void GetFirstUnusedReceivingAddressWithoutReceivingAddressReturnsNull()
        {
            var account = new HdAccount();

            HdAddress result = account.GetFirstUnusedReceivingAddress();

            Assert.Null(result);
        }
Ejemplo n.º 4
0
        public void GetFirstUnusedReceivingAddressWithoutReceivingAddressReturnsNull()
        {
            var account = new HdAccount();

            account.ExternalAddresses.Clear();

            var result = account.GetFirstUnusedReceivingAddress();

            Assert.Null(result);
        }
Ejemplo n.º 5
0
        public void GetFirstUnusedReceivingAddressWithoutReceivingAddressReturnsNull()
        {
            var store   = new WalletMemoryStore();
            var account = new HdAccount();

            account.ExternalAddresses.Clear();

            HdAddress result = account.GetFirstUnusedReceivingAddress(store);

            Assert.Null(result);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 9
0
        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>();
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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));
            }
        }