Пример #1
0
        private static void Main(string[] args)
        {
            try
            {
                var repositoryConfig = new RepositoryConfiguration
                {
                    ConnectionString = AppSettingHelper.GetDbConnection()
                };

                _persistenceFactory = new VakapayRepositoryMysqlPersistenceFactory(repositoryConfig);

                var btcBusiness = new BitcoinBusiness.BitcoinBusiness(_persistenceFactory);
                var rpc         = new BitcoinRpc(AppSettingHelper.GetBitcoinNode(),
                                                 AppSettingHelper.GetBitcoinRpcAuthentication());

                var transaction = rpc.FindTransactionByHash(args[0]);
                Logger.Debug("BitcoinNotify =>> BTCTransactionModel: " + transaction.Data);
                var transactionModel = BtcTransactionModel.FromJson(transaction.Data);
                if (transactionModel.BtcTransactionDetailsModel != null &&
                    transactionModel.BtcTransactionDetailsModel.Length > 0)
                {
                    foreach (var transactionModelDetail in transactionModel.BtcTransactionDetailsModel)
                    {
                        _walletBusiness = new WalletBusiness.WalletBusiness(_persistenceFactory);
                        if (transactionModelDetail.Category.Equals("receive"))
                        {
                            HandleNotifyDataReceiver(transactionModel, transactionModelDetail, btcBusiness);
                        }
                        else if (transactionModelDetail.Category.Equals("send"))
                        {
                            // if isExist(by address and transactionId) then update, else insert
                            HandleNotifyDataSend(transactionModel, transactionModelDetail, btcBusiness);
                        }
                    }
                }
                else
                {
                    Logger.Debug("BitcoinNotify BtcTransactionDetailsModel is not exist");
                }
            }
            catch (Exception e)
            {
                Logger.Error(e, "BitcoinNotify exception");
            }
        }
Пример #2
0
        /// <summary>
        /// HandleNotifyDataSend
        /// </summary>
        /// <param name="transactionModel"></param>
        /// <param name="transactionModelDetail"></param>
        /// <param name="btcBusiness"></param>
        private static void HandleNotifyDataSend(BtcTransactionModel transactionModel,
                                                 BtcTransactionDetailModel transactionModelDetail, AbsBlockchainBusiness btcBusiness)
        {
            try
            {
                Logger.Debug("HandleNotifyDataSend start");
                if (transactionModel.Confirmations > 0)
                {
                    using (var bitCoinRawTransactionRepository = btcBusiness
                                                                 .VakapayRepositoryFactory.GetBitcoinWithdrawTransactionRepository(btcBusiness.DbConnection))
                    {
                        var currentBtcWithdrawTransaction =
                            GetBtcWithdrawTransaction(bitCoinRawTransactionRepository, transactionModelDetail.Address,
                                                      transactionModel.Txid);

                        Logger.Debug(
                            "HandleNotifyDataSend =>> btcWithdrawTransaction: " + currentBtcWithdrawTransaction);
                        if (currentBtcWithdrawTransaction == null)
                        {
                            return;
                        }
                        Logger.Debug("HandleNotifyDataSend ==>> Update hash and time update ");
                        var currentTime = CommonHelper.GetUnixTimestamp();
                        if (currentBtcWithdrawTransaction.UserId == null)
                        {
                            currentBtcWithdrawTransaction.UserId = GetUserIdByAddress(transactionModelDetail.Address);
                        }

                        currentBtcWithdrawTransaction.BlockHash = transactionModel.BlockHash;
                        currentBtcWithdrawTransaction.UpdatedAt = currentTime;
                        bitCoinRawTransactionRepository.Update(currentBtcWithdrawTransaction);
                    }
                }
                else
                {
                    Logger.Debug("HandleNotifyDataSend =>> confirm == 0");
                }
            }
            catch (Exception e)
            {
                Logger.Error(e, "HandleNotifyDataSend exception");
            }
        }
Пример #3
0
 /// <summary>
 /// CreateNewBtcDepositTransaction
 /// </summary>
 /// <param name="transactionModel"></param>
 /// <param name="transactionModelDetail"></param>
 /// <param name="btcDepositTransactionRepository"></param>
 /// <param name="currentTime"></param>
 private static void CreateNewBtcDepositTransaction(BtcTransactionModel transactionModel,
                                                    BtcTransactionDetailModel transactionModelDetail,
                                                    IBitcoinDepositTransactionRepository btcDepositTransactionRepository, long currentTime
                                                    )
 {
     try
     {
         Logger.Debug("cretateNewBtcDepositTransaction ");
         var btcDepositTransaction = new BitcoinDepositTransaction
         {
             Hash        = transactionModel.Txid,
             BlockNumber = 0,
             BlockHash   = transactionModel.BlockHash,
             Amount      = transactionModel.Amount,
             FromAddress = "",
             ToAddress   = transactionModelDetail.Address,
             Fee         = 0,
             Status      = Status.STATUS_PENDING,
             CreatedAt   = currentTime,
             UpdatedAt   = currentTime
         };
         var userId = GetUserIdByAddress(transactionModelDetail.Address);
         if (userId == null)
         {
             return;
         }
         var portfolioHistoryBusiness =
             new PortfolioHistoryBusiness.PortfolioHistoryBusiness(_persistenceFactory, false);
         portfolioHistoryBusiness.InsertWithPrice(userId);
         btcDepositTransaction.UserId = userId;
         Logger.Debug("cretateNewBtcDepositTransaction =>> btcDepositTransaction: " +
                      btcDepositTransaction.ToJson());
         btcDepositTransactionRepository.Insert(btcDepositTransaction);
     }
     catch (Exception e)
     {
         Logger.Error(e, "cretateNewBtcDepositTransaction ");
     }
 }
Пример #4
0
        public override void SyncUpdate()
        {
            lock (AsyncElectrumScheduleService.Transactions)
            {
                AsyncElectrumScheduleService.SetStatus("Сверка транзакций из Electrum [" + AsyncElectrumScheduleService.Transactions.Count + " элементов] с базой данных");
                bool exist_new_tx = false;
                foreach (TransactionWalletHistoryResponseClass TransactionWallet in AsyncElectrumScheduleService.Transactions.Where(x => x.confirmations > MinRequedCountConfirmations))
                {
                    if (string.IsNullOrWhiteSpace(TransactionWallet.txid))
                    {
                        AsyncElectrumScheduleService.SetStatus("Прочитана транзакция из Electrum JSONRPC с пустым txid: " + TransactionWallet.ToString(), AbstractAsyncScheduler.StatusTypes.ErrorStatus);
                        AsyncElectrumScheduleService.SetStatus("Транзакция с пустым txid будет пропущена");
                        continue;
                    }

                    BtcTransactionModel btcTransaction;
                    try
                    {
                        btcTransaction = db.Set <BtcTransactionModel>().SingleOrDefault(x => x.TxId == TransactionWallet.txid);
                    }
                    catch (Exception e)
                    {
                        AsyncElectrumScheduleService.SetStatus("Ошибка поиска транзакции в БД SingleOrDefault(x => x.TxId == '" + TransactionWallet.txid + "')" + e.Message, AbstractAsyncScheduler.StatusTypes.ErrorStatus);
                        AsyncElectrumScheduleService.SetStatus("Ошибочная транзакция будет пропущена");
                        continue;
                    }

                    if (btcTransaction is null)
                    {
                        exist_new_tx = true;
                        AsyncElectrumScheduleService.SetStatus("Новая транзакция для записи в БД: " + TransactionWallet.ToString());
                        btcTransaction = new BtcTransactionModel()
                        {
                            TxId = TransactionWallet.txid,
                            Sum  = glob_tools.GetDoubleFromString(TransactionWallet.value)
                        };

                        db.Add(btcTransaction);
                        db.SaveChanges();

                        foreach (TransactionWalletHistoryResponseOutputsClass TransactionOut in TransactionWallet.outputs.Where(x => AsyncElectrumScheduleService.ElectrumClient?.IsAddressMine(x.address)?.result == true))
                        {
                            AsyncElectrumScheduleService.SetStatus("Запись нового TxOut: " + TransactionOut.ToString());
                            BtcTransactionOutModel btcTransactionOut = new BtcTransactionOutModel()
                            {
                                BtcTransactionModelId = btcTransaction.Id,
                                Sum         = glob_tools.GetDoubleFromString(TransactionOut.value),
                                Information = "txid:" + TransactionWallet.txid,
                                Address     = TransactionOut.address,
                                IsMine      = AsyncElectrumScheduleService.ElectrumClient.IsAddressMine(TransactionOut.address)?.result ?? false
                            };
                            db.Add(btcTransactionOut);
                            db.SaveChanges();

                            AsyncElectrumScheduleService.SetStatus("Поиск пользователя по BTC адресу > db.Users.SingleOrDefault(x => x.BitcoinAddress == '" + TransactionOut.address + "')");
                            UserModel user = db.Set <UserModel>().SingleOrDefault(x => x.BitcoinAddress == TransactionOut.address);
                            if (!(user is null))
                            {
                                AsyncElectrumScheduleService.SetStatus("Пользователь найден: " + user.ToString());
                                btcTransactionOut.UserId = user.Id;
                                db.Update(btcTransactionOut);
                                //
                                ///int fiat_sum = (int)(btcTransactionOut.Sum * options.Value.CurrentBtcRate);
                                user.BalanceBTC += btcTransactionOut.Sum;
                                db.Update(user);

                                string notify = "Пополнение /balance +" + string.Format("{0:F8}", Math.Round(btcTransactionOut.Sum, 8)) + "=" + user.BalanceBTC + " BTC";

                                db.Add(new eCommerceJournalModel()
                                {
                                    BaseObjectId   = btcTransactionOut.Id,
                                    TypeBaseObject = TypesBaseObject.TxOut,
                                    ClientId       = user.Id,
                                    SumBTC         = btcTransactionOut.Sum,
                                    Information    = notify
                                });
                                db.Add(new MessageModel()
                                {
                                    Information = notify, SenderId = null, RecipientId = user.Id, NeedTelegramNotify = user.TelegramId != default
                                });
Пример #5
0
        /// <summary>
        /// handle notify transaction receiver
        /// </summary>
        /// <param name="transactionModel"></param>
        /// <param name="transactionModelDetail"></param>
        /// <param name="btcBusiness"></param>
        private static void HandleNotifyDataReceiver(BtcTransactionModel transactionModel,
                                                     BtcTransactionDetailModel transactionModelDetail, AbsBlockchainBusiness btcBusiness)
        {
            try
            {
                Logger.Debug("HandleNotifiDataReceiver start");

                using (var btcDepositTransactionRepository = btcBusiness.VakapayRepositoryFactory.GetBitcoinDepositTransactionRepository(btcBusiness.DbConnection))
                {
                    Logger.Debug("HandleNotifiDataReceiver start1");
                    var currentBtcDepositTransaction = GetDepositTransaction(btcDepositTransactionRepository,
                                                                             transactionModelDetail.Address, transactionModel.Txid);
                    Logger.Debug("HandleNotifiDataReceiver =>> currentBtcDepositTransaction: " +
                                 currentBtcDepositTransaction);
                    var currentTime = CommonHelper.GetUnixTimestamp();
                    if (transactionModel.Confirmations == 0)
                    {
                        Logger.Debug("HandleNotifiDataReceiver with confirm = 0");
                        if (currentBtcDepositTransaction == null)
                        {
                            CreateNewBtcDepositTransaction(transactionModel, transactionModelDetail,
                                                           btcDepositTransactionRepository, currentTime);
                        }
                        else
                        {
                            // transaction is exist
                            Logger.Debug(
                                "HandleNotifiDataReceiver =>> BitcoinDepositTransaction is exist, don't create new data");
                        }
                    }
                    else
                    {
                        Logger.Debug("HandleNotifiDataReceiver with confirm > 0");
                        if (currentBtcDepositTransaction != null)
                        {
                            currentBtcDepositTransaction.BlockHash = transactionModel.BlockHash;
                            currentBtcDepositTransaction.Amount    = transactionModel.Amount;
                            currentBtcDepositTransaction.Status    = Status.STATUS_COMPLETED;
                            currentBtcDepositTransaction.UpdatedAt = currentTime;
                            btcDepositTransactionRepository.Update(currentBtcDepositTransaction);
                        }
                        else
                        {
                            CreateNewBtcDepositTransaction(transactionModel, transactionModelDetail,
                                                           btcDepositTransactionRepository, currentTime);
                        }

                        // update balance
                        _walletBusiness?.UpdateBalanceDeposit(transactionModelDetail.Address,
                                                              transactionModelDetail.Amount,
                                                              CryptoCurrency.BTC);

                        //insert new email data
                        CreateDataEmail(btcBusiness, transactionModelDetail);
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Error(e, "HandleNotifiDataReceiver exception");
            }
        }