コード例 #1
0
        public bool Tranfer(BlockchainAddress currentLoggedInAddress, BlockchainTransaction transactionHb)
        {
            var conn = ConnectionHelper.GetConnection();

            var myTransaction = conn.BeginTransaction();

            try
            {
                var balanceSender = new MySqlCommand("select * from blockchainaddress where address = @address ",
                                                     conn, myTransaction);
                balanceSender.Parameters.AddWithValue("@address", currentLoggedInAddress.Address);

                double currentAccountBalance = 0;
                var    reader = balanceSender.ExecuteReader();
                if (reader.Read())
                {
                    currentAccountBalance = reader.GetDouble("balance");
                }

                reader.Close();
                currentAccountBalance -= transactionHb.Amount;

                var updateQuery = ("update blockchainaddress set balance = @balance where address = @address");
                var sqlCmd      = new MySqlCommand(updateQuery, conn, myTransaction);
                sqlCmd.Parameters.AddWithValue("@balance", currentAccountBalance);
                sqlCmd.Parameters.AddWithValue("@address", currentLoggedInAddress.Address);
                var updateRs = sqlCmd.ExecuteNonQuery();

                var balanceReceiver = new MySqlCommand("select * from blockchainaddress where address = @address ",
                                                       conn, myTransaction);
                balanceReceiver.Parameters.AddWithValue("@address", transactionHb.ReceiverAddress);
                double receiverBalance = 0;
                var    readerReceiver  = balanceReceiver.ExecuteReader();

                if (readerReceiver.Read())
                {
                    receiverBalance = readerReceiver.GetDouble("balance");
                }

                readerReceiver.Close();

                receiverBalance += (transactionHb.Amount * 200);


                var updateQueryReceiver =
                    ("update blockchainaddress set balance = @balance where address = @address");
                var sqlCmdReceiver = new MySqlCommand(updateQueryReceiver, conn, myTransaction);
                sqlCmdReceiver.Parameters.AddWithValue("@balance", receiverBalance);
                sqlCmdReceiver.Parameters.AddWithValue("@address", transactionHb.ReceiverAddress);
                var updateResultReceiver = sqlCmdReceiver.ExecuteNonQuery();

                var historyTransactionQuery =
                    "insert into blockchaintransaction (TransactionId, Type, SenderAddress, ReceiverAddress, Amount, CreatedAtMLS, UpdatedAtMLS, Status) " +
                    "values (@id, @type, @senderAddress, @receiverAddress, @amount, @createdAtMLS, @updatedAtMLS, @status)";
                var historyTransactionCmd =
                    new MySqlCommand(historyTransactionQuery, conn, myTransaction);
                historyTransactionCmd.Parameters.AddWithValue("@id", transactionHb.TransactionId);
                historyTransactionCmd.Parameters.AddWithValue("@type", transactionHb.Type);
                historyTransactionCmd.Parameters.AddWithValue("@senderAddress",
                                                              transactionHb.SenderAddress);
                historyTransactionCmd.Parameters.AddWithValue("@receiverAddress",
                                                              transactionHb.ReceiverAddress);
                historyTransactionCmd.Parameters.AddWithValue("@amount", transactionHb.Amount);
                historyTransactionCmd.Parameters.AddWithValue("@createdAtMLS", transactionHb.CreatedAtMLS);
                historyTransactionCmd.Parameters.AddWithValue("@updatedAtMLS", transactionHb.UpdateAtMLS);
                historyTransactionCmd.Parameters.AddWithValue("@status", transactionHb.Status);
                var historyResult = historyTransactionCmd.ExecuteNonQuery();

                if (updateRs != 1 || historyResult != 1 || updateResultReceiver != 1)
                {
                    throw new Exception("Không thể thêm giao dịch hoặc update tài khoản.");
                }

                myTransaction.Commit();
                return(true);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                myTransaction.Rollback();
                return(false);
            }
            finally
            {
                conn.Close();
            }
        }
コード例 #2
0
        public bool UpdateBalance(BlockchainAddress currentAddress, BlockchainTransaction blockchainTransaction)
        {
            ConnectionHelper.GetConnection();
            var tran = ConnectionHelper.GetConnection().BeginTransaction();

            try
            {
                var cmd = new MySqlCommand("select * from BlockchainAddress where Address = @Address",
                                           ConnectionHelper.GetConnection());
                cmd.Parameters.AddWithValue("@Address", currentAddress.Address);
                var    reader = cmd.ExecuteReader();
                double currentAddressBalance = 0;

                if (reader.Read())
                {
                    currentAddressBalance = reader.GetDouble("balance");
                }

                reader.Close();
                if (currentAddressBalance < 0)
                {
                    Console.WriteLine("Khong du tien");
                    return(false);
                }

                if (blockchainTransaction.Type == BlockchainTransaction.TransactionType.WITHDRAW)
                {
                    if (currentAddressBalance < blockchainTransaction.Amount)
                    {
                        Console.WriteLine("Khong du tien de thuc hien giao dich");
                        return(false);
                    }

                    currentAddressBalance -= blockchainTransaction.Amount;
                }
                else if (blockchainTransaction.Type == BlockchainTransaction.TransactionType.DEPOSIT)
                {
                    currentAddressBalance += blockchainTransaction.Amount;
                }

                var updateQuery =
                    "update `blockchainaddress` set `balance` = @balance where Address = @Address";
                var sqlCmd = new MySqlCommand(updateQuery, ConnectionHelper.GetConnection());
                sqlCmd.Parameters.AddWithValue("@balance", currentAddressBalance);
                sqlCmd.Parameters.AddWithValue("@address", currentAddress.Address);
                var updateResult = sqlCmd.ExecuteNonQuery();


                var historyTransactionQuery =
                    "insert into `blockchaintransaction` (TransactionId, Type, Amount, SenderAddress, ReceiverAddress, CreatedAtMLS, UpdateAtMLS)" +
                    "values (@id, @type, @amount, @SenderAddress, @ReceiverAddress, @CreatedAtMLS, @UpdateAtMLS)";

                var historyTransactionCmd = new MySqlCommand(historyTransactionQuery, ConnectionHelper.GetConnection());
                historyTransactionCmd.Parameters.AddWithValue("@id", blockchainTransaction.TransactionId);
                historyTransactionCmd.Parameters.AddWithValue("@amount", blockchainTransaction.Amount);
                historyTransactionCmd.Parameters.AddWithValue("@type", blockchainTransaction.Type);
                historyTransactionCmd.Parameters.AddWithValue("@message", blockchainTransaction.Status);
                historyTransactionCmd.Parameters.AddWithValue("@SenderAddress",
                                                              blockchainTransaction.SenderAddress);
                historyTransactionCmd.Parameters.AddWithValue("@ReceiverAddress",
                                                              blockchainTransaction.ReceiverAddress);
                historyTransactionCmd.Parameters.AddWithValue("@CreatedAtMLS",
                                                              blockchainTransaction.CreatedAtMLS);
                historyTransactionCmd.Parameters.AddWithValue("@UpdateAtMLS",
                                                              blockchainTransaction.UpdateAtMLS);
                var historyResult = historyTransactionCmd.ExecuteNonQuery();
                if (updateResult != 1 || historyResult != 1)
                {
                    throw new Exception("Khong the giao dich hoac them tai khoan.");
                }

                tran.Commit();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                tran.Rollback();
                return(false);
            }

            ConnectionHelper.GetConnection();
            return(true);
        }
コード例 #3
0
        public async Task <PaymentTransactionInfo> ProcessCallback(ProcessPaymentTransaction request)
        {
            var blockchainAddress = context.BlockchainAddresses.FirstOrDefault(addr => addr.Address == request.Address && addr.Currency == request.Currency);

            if (blockchainAddress == null)
            {
                var msg = $"{request.Currency} address not found - {request.Address}";
                logger.LogError(msg);
                throw new ApplicationException(msg);
            }

            if (request.VerificationCode != blockchainAddress.VerificationCode)
            {
                var msg = $"Invalid VerificationCode {request.VerificationCode} for {request.Address}";
                logger.LogError(msg);
                throw new ApplicationException(msg);
            }

            PaymentTransactionInfo transactionInfo;

            using (var transaction = await context.Database.BeginTransactionAsync())
            {
                var wallet = context.Wallets.FirstOrDefault(w => w.UserId == blockchainAddress.UserId && w.Currency == blockchainAddress.Currency);
                if (wallet == null)
                {
                    wallet = new Wallet()
                    {
                        UserId   = blockchainAddress.UserId.Value,
                        Amount   = 0,
                        Currency = blockchainAddress.Currency,
                    };
                    context.Wallets.Add(wallet);
                    context.SaveChanges();
                }

                var blockchainTransaction = context.BlockchainTransactions
                                            .FirstOrDefault(t => t.Hash == request.TransactionHash &&
                                                            t.BlockchainAddressId == blockchainAddress.Id);

                if (blockchainTransaction != null)
                {
                    if (blockchainTransaction.Status == BlockchainTransactionStatus.Pending ||
                        blockchainTransaction.Status == BlockchainTransactionStatus.New)
                    {
                        blockchainTransaction.Status      = request.IsConfirmed ? BlockchainTransactionStatus.ConfirmedAndValidated : BlockchainTransactionStatus.Pending;
                        blockchainTransaction.LastUpdated = DateTime.UtcNow;
                        context.Update(blockchainTransaction);

                        if (blockchainTransaction.Status == BlockchainTransactionStatus.ConfirmedAndValidated)
                        {
                            ProcessPayment(wallet, blockchainTransaction);
                        }
                    }
                    else
                    {
                        logger.LogError($"Can not override status from {blockchainTransaction.Status} to {request.IsConfirmed}");
                    }
                }
                else
                {
                    blockchainTransaction = new BlockchainTransaction
                    {
                        Id   = Guid.NewGuid(),
                        Hash = request.TransactionHash,
                        Type = BlockchainTransactionType.Deposit,
                        BlockchainAddressId = blockchainAddress.Id,
                        Amount = request.Amount,
                        //AmountBigInt = request.AmountBigInt,//TODO: Please add as string
                        Currency    = request.Currency,
                        Fee         = request.Fee,
                        DateCreated = DateTime.UtcNow,
                        Status      = request.IsConfirmed ? BlockchainTransactionStatus.ConfirmedAndValidated : BlockchainTransactionStatus.Pending
                    };

                    context.BlockchainTransactions.Add(blockchainTransaction);

                    if (blockchainTransaction.Status == BlockchainTransactionStatus.ConfirmedAndValidated)
                    {
                        ProcessPayment(wallet, blockchainTransaction);
                    }
                }

                await context.SaveChangesAsync();

                transaction.Commit();

                transactionInfo = new PaymentTransactionInfo
                {
                    TransactionId   = blockchainTransaction.Id,
                    TransactionHash = blockchainTransaction.Hash,
                    Amount          = blockchainTransaction.Amount,
                    Currency        = request.Currency.ToString(),
                    GatewayCode     = request.GatewayCode,
                    Status          = blockchainTransaction.Status,
                    IsValid         = true
                };
            }

            return(transactionInfo);
        }