public TransactionHashInfo CreateTransaction(TransactionDataSigned signedData) { var dateReceived = DateTime.UtcNow; var newTransaction = new Transaction(signedData); if (dbService.GetTransactions().Any(t => t.TransactionHashHex == newTransaction.TransactionHashHex)) { return(new TransactionHashInfo { IsValid = true, ErrorMessage = $"Duplicate transaction", DateReceived = dateReceived, TransactionHash = newTransaction.TransactionHashHex }); } bool isValidTransaction = ValidateTransaction(signedData); if (!isValidTransaction) { return(new TransactionHashInfo { IsValid = isValidTransaction, ErrorMessage = "Transaction data is corrupted.", DateReceived = dateReceived, TransactionHash = "" }); } //validate balance var bal = GetBalance(signedData.From, 1).ConfirmedBalance.Balance; var hasFunds = (bal >= signedData.Value + signedData.Fee); if (!hasFunds) { return(new TransactionHashInfo { IsValid = false, ErrorMessage = $"Not enough funds. Available funds: {bal}, required funds: {signedData.Value} + {signedData.Fee} for the fee", DateReceived = dateReceived, TransactionHash = "" }); } dbService.AddTransaction(newTransaction); PropagateTransactionToPeers(newTransaction); return(new TransactionHashInfo() { IsValid = isValidTransaction, DateReceived = dateReceived, TransactionHash = newTransaction.TransactionHashHex }); }