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
            });
        }