Ejemplo n.º 1
0
        public Amount CalculateSpendableBalance(Account account, int minConf)
        {
            var balance = _accounts[account].ZeroConfSpendableBalance;

            if (minConf == 0)
            {
                return(balance);
            }

            var unminedTxs = RecentTransactions.UnminedTransactions;

            foreach (var output in unminedTxs.SelectMany(kvp => OutputsToAccount(kvp.Value.Outputs, account)))
            {
                balance -= output.Amount;
            }

            if (minConf == 1)
            {
                return(balance);
            }

            var confHeight = BlockChain.ConfirmationHeight(ChainTip.Height, minConf);

            foreach (var block in RecentTransactions.MinedTransactions.ReverseList().TakeWhile(b => b.Height >= confHeight))
            {
                var unconfirmedTxs = block.Transactions;
                foreach (var output in unconfirmedTxs.SelectMany(tx => OutputsToAccount(tx.Outputs, account)))
                {
                    balance -= output.Amount;
                }
            }

            return(balance);
        }
Ejemplo n.º 2
0
        // TODO: This only supports BIP0032 accounts currently (NOT the imported account).
        // Results are indexed by their account number.
        // TODO: set locked balances
        public Balances[] CalculateBalances(int requiredConfirmations)
        {
            // Initial balances.  Unspendable outputs are subtracted from the totals.
            // TODO: set locked balance
            var balances = _bip0032Accounts.Select(a => new Balances(a.TotalBalance, a.TotalBalance, 0)).ToArray();

            if (requiredConfirmations == 0)
            {
                return(balances);
            }

            var controlledUnminedOutputs = RecentTransactions.UnminedTransactions
                                           .SelectMany(kvp => kvp.Value.Outputs)
                                           .OfType <WalletTransaction.Output.ControlledOutput>()
                                           .Where(a => a.Account.AccountNumber != ImportedAccountNumber); // Imported is not reported currently.

            foreach (var unminedOutput in controlledUnminedOutputs)
            {
                var accountNumber = unminedOutput.Account.AccountNumber;
                balances[checked ((int)accountNumber)].SpendableBalance -= unminedOutput.Amount;
            }

            if (requiredConfirmations == 1)
            {
                return(balances);
            }

            var confHeight = BlockChain.ConfirmationHeight(ChainTip.Height, requiredConfirmations);

            foreach (var block in RecentTransactions.MinedTransactions.ReverseList().TakeWhile(b => b.Height >= confHeight))
            {
                var controlledMinedOutputs = block.Transactions
                                             .SelectMany(tx => tx.Outputs)
                                             .OfType <WalletTransaction.Output.ControlledOutput>()
                                             .Where(a => a.Account.AccountNumber != ImportedAccountNumber); // Imported is not reported currently.
                foreach (var output in controlledMinedOutputs)
                {
                    var accountNumber = output.Account.AccountNumber;
                    balances[checked ((int)accountNumber)].SpendableBalance -= output.Amount;
                }
            }

            return(balances);
        }