private void calculateOutputs(Wallet.Wallet wallet) { if (Inputs != null) { long balance = BalanceHelper.GetBalanceOfAddresses(Inputs.Select(i => i.Key).ToArray()); Outputs.Add(new Output(wallet.NewAddress().Key, balance - TransactionFee - Outputs.Select(o => o.Amount).Sum())); } }
public void AddTransaction(Transaction transaction) { if (transaction.Verify()) { // Check if if (transaction.Outputs != null) { // If Coinbase transaction no validity if (transaction.Inputs == null) { _memPool.Add(transaction); } else { decimal balance = BalanceHelper.GetBalanceOfAddresses(transaction.Inputs.Select(i => i.Key).ToArray()); // Check if enough balance on inputs if (balance >= (transaction.Outputs.Select(o => o.Amount).Sum() + transaction.TransactionFee)) { bool everUsedAsInput = BalanceHelper.EverUsedAsInput(transaction.Inputs.Select(i => i.Key).ToArray()); // Check if ever used as input before if (!everUsedAsInput) { if (!_memPool.Select(mp => mp.GenerateHash()).Any(t => t == transaction.GenerateHash())) { _memPool.Add(transaction); _networkSynchronizer.BroadcastTransaction(transaction); } } else { throw new Exception("Eine der Adressen wurde bereits als Input verwendet!"); } } else { throw new Exception("Nicht genug Guthaben!"); } } } } else { throw new Exception("Nicht valide Transaktion!"); } }
public decimal GetBalance() { var walletAddresses = Addresses.Select(a => a.Key).ToArray(); return(BalanceHelper.GetBalanceOfAddresses(walletAddresses)); }