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