public static bool RelevantTransaction(WalletTransaction tx, Account account, out Amount debit, out Amount credit) { if (tx == null) throw new ArgumentNullException(nameof(tx)); debit = 0; credit = 0; var relevant = false; foreach (var input in tx.Inputs) { if (input.PreviousAccount == account) { relevant = true; debit -= input.Amount; } } foreach (var output in tx.Outputs) { var controlledOutput = output as WalletTransaction.Output.ControlledOutput; if (controlledOutput?.Account == account) { relevant = true; credit += output.Amount; } } return relevant; }
public static bool RelevantTransaction(WalletTransaction tx, Account account, out Amount debit, out Amount credit) { if (tx == null) { throw new ArgumentNullException(nameof(tx)); } debit = 0; credit = 0; var relevant = false; foreach (var input in tx.Inputs) { if (input.PreviousAccount == account) { relevant = true; debit -= input.Amount; } } foreach (var output in tx.Outputs) { var controlledOutput = output as WalletTransaction.Output.ControlledOutput; if (controlledOutput?.Account == account) { relevant = true; credit += output.Amount; } } return(relevant); }
public TransactionViewModel(Wallet wallet, WalletTransaction transaction, BlockIdentity transactionLocation) { _transaction = transaction; _location = transactionLocation; var groupedOutputs = _transaction.NonChangeOutputs.Select(o => { var destination = wallet.OutputDestination(o); return new GroupedOutput(o.Amount, destination); }).Aggregate(new List<GroupedOutput>(), (items, next) => { var item = items.Find(a => a.Destination == next.Destination); if (item == null) items.Add(next); else item.Amount += next.Amount; return items; }); Confirmations = BlockChain.Confirmations(wallet.ChainTip.Height, transactionLocation); Inputs = _transaction.Inputs.Select(input => new Input(-input.Amount, wallet.AccountName(input.PreviousAccount))).ToArray(); Outputs = _transaction.Outputs.Select(output => new Output(output.Amount, wallet.OutputDestination(output))).ToArray(); GroupedOutputs = groupedOutputs; }
private void AddTransactionToTotals(WalletTransaction tx, Dictionary<Account, AccountState> modifiedAccounts) { var isCoinbase = BlockChain.IsCoinbase(tx.Transaction); foreach (var input in tx.Inputs) { TotalBalance -= input.Amount; var accountState = _accounts[input.PreviousAccount]; accountState.TotalBalance -= input.Amount; if (isCoinbase) accountState.ImmatureCoinbaseReward -= input.Amount; modifiedAccounts[input.PreviousAccount] = accountState; } foreach (var output in tx.Outputs.OfType<WalletTransaction.Output.ControlledOutput>()) { TotalBalance += output.Amount; var accountState = _accounts[output.Account]; accountState.TotalBalance += output.Amount; if (isCoinbase) accountState.ImmatureCoinbaseReward += output.Amount; modifiedAccounts[output.Account] = accountState; } _transactionCount++; }
private void AddTransactionToTotals(WalletTransaction tx, Dictionary <Account, AccountProperties> modifiedAccounts) { var isCoinbase = BlockChain.IsCoinbase(tx.Transaction); foreach (var input in tx.Inputs) { TotalBalance -= input.Amount; var accountProperties = _accounts[input.PreviousAccount]; accountProperties.TotalBalance -= input.Amount; if (isCoinbase) { accountProperties.ImmatureCoinbaseReward -= input.Amount; } modifiedAccounts[input.PreviousAccount] = accountProperties; } foreach (var output in tx.Outputs.OfType <WalletTransaction.Output.ControlledOutput>()) { TotalBalance += output.Amount; var accountProperties = _accounts[output.Account]; accountProperties.TotalBalance += output.Amount; if (isCoinbase) { accountProperties.ImmatureCoinbaseReward += output.Amount; } modifiedAccounts[output.Account] = accountProperties; } _transactionCount++; }
public AccountTransactionViewModel(WalletTransaction transaction, Amount runningBalanceDelta, Amount runningBalance) { _transaction = transaction; BalanceDelta = runningBalanceDelta; _balance = runningBalance; }
public string OutputDestination(WalletTransaction.Output output) { if (output is WalletTransaction.Output.ControlledOutput) { var controlledOutput = (WalletTransaction.Output.ControlledOutput)output; if (controlledOutput.Change) return "Change"; else return _accounts[controlledOutput.Account].AccountName; } else { var uncontrolledOutput = (WalletTransaction.Output.UncontrolledOutput)output; Address address; if (Address.TryFromOutputScript(uncontrolledOutput.PkScript, ActiveChain, out address)) return address.Encode(); else return "Non-address output"; } }
private static IEnumerable<WalletTransaction.Output.ControlledOutput> OutputsToAccount(WalletTransaction.Output[] outputs, Account account) { return outputs.OfType<WalletTransaction.Output.ControlledOutput>().Where(o => o.Account == account); }
private void RemoveTransactionFromTotals(WalletTransaction tx, Dictionary<Account, AccountProperties> modifiedAccounts) { var isCoinbase = BlockChain.IsCoinbase(tx.Transaction); foreach (var input in tx.Inputs) { TotalBalance += input.Amount; var accountProperties = _accounts[input.PreviousAccount]; accountProperties.TotalBalance += input.Amount; if (isCoinbase) accountProperties.ImmatureCoinbaseReward += input.Amount; modifiedAccounts[input.PreviousAccount] = accountProperties; } foreach (var output in tx.Outputs.OfType<WalletTransaction.Output.ControlledOutput>()) { TotalBalance -= output.Amount; var accountProperties = _accounts[output.Account]; accountProperties.TotalBalance -= output.Amount; if (isCoinbase) accountProperties.ImmatureCoinbaseReward -= output.Amount; modifiedAccounts[output.Account] = accountProperties; } _transactionCount--; }