예제 #1
0
 public static UpdateTransactionRequest ToUpdateRequest(this BcnTransaction src, DateTime firstSeen)
 {
     return(new UpdateTransactionRequest
     {
         BlockId = src.BlockId,
         Confirmations = src.Confirmations,
         FirstSeen = firstSeen,
         Hash = src.Id,
         Amount = src.Amount,
         Blockchain = Enum.Parse <Service.PayInternal.Client.Models.BlockchainType>(src.Blockchain.ToString()),
         IdentityType = TransactionIdentityType.Hash,
         Identity = src.Id
     });
 }
예제 #2
0
        public async Task ExecuteAsync()
        {
            IEnumerable <TransactionState> cacheState = await _cacheMaintainer.GetAsync();

            foreach (TransactionState cacheTxState in cacheState)
            {
                BcnTransaction cacheTx = cacheTxState.Transaction;

                if (cacheTx.Blockchain != BlockchainType.Bitcoin)
                {
                    continue;
                }

                GetTransactionResponse bcnTransactionState;

                try
                {
                    bcnTransactionState = await _qBitNinjaClient.GetTransaction(new uint256(cacheTx.Id));
                }
                catch (Exception ex)
                {
                    _log.Error(ex, "Getting transaction from ninja", cacheTxState.ToDetails());

                    continue;
                }

                // if transaction has not been indexed by ninja yet
                if (bcnTransactionState == null)
                {
                    continue;
                }

                BcnTransaction bcnTx = bcnTransactionState.ToDomain();

                DiffResult <BcnTransaction> diffResult = _diffService.Diff(cacheTx, bcnTx);

                if (diffResult != null)
                {
                    var tx = diffResult.Object;

                    switch (diffResult.CompareState)
                    {
                    case DiffState.New:

                        _log.Warning("New transactions are not supported by watcher", context: tx.ToDetails());

                        break;

                    case DiffState.Updated:

                        UpdateTransactionRequest updateRequest = null;

                        try
                        {
                            updateRequest = tx.ToUpdateRequest(bcnTransactionState.FirstSeen.DateTime);

                            await _log.LogPayInternalExceptionIfAny(() =>
                                                                    _payInternalClient.UpdateTransactionAsync(updateRequest));
                        }
                        catch (Exception ex)
                        {
                            _log.Error(ex, context: updateRequest.ToDetails());
                        }

                        break;

                    default:
                        throw new Exception("Unknown transactions diff state");
                    }

                    cacheTxState.Transaction = bcnTx;

                    try
                    {
                        await _cacheMaintainer.SetItemAsync(cacheTxState);
                    }
                    catch (Exception ex)
                    {
                        _log.Error(ex, "Updating transaction cache", cacheTxState.ToDetails());

                        continue;
                    }
                }
            }
        }