public async Task ExecuteAsync( IBalanceRepository balanceRepository, IBalanceMonitoringTaskRepository balanceMonitoringTaskRepository, ITransactionReceiptRepository transactionReceiptRepository, IBlockchainService blockchainService, BigInteger blockNumber) { var clearBlockTask = transactionReceiptRepository.ClearBlockAsync(blockNumber); var transactionReceipts = (await blockchainService.GetTransactionReceiptsAsync(blockNumber)) .ToList(); var affectedAddresses = transactionReceipts .Select(GetAddresses) .SelectMany(x => x) .Where(x => !string.IsNullOrEmpty(x) && x != "0x") .Distinct(); var ownAddresses = new List <string>(); foreach (var address in affectedAddresses) { var balance = await balanceRepository.TryGetAsync(address); if (balance != null) { ownAddresses.Add(address); if (balance.BlockNumber < blockNumber) { await balanceMonitoringTaskRepository.EnqueueAsync ( new BalanceMonitoringTask(address) ); } } } await clearBlockTask; if (_indexOnlyOwnTransactions) { var ownTransactionReceipts = transactionReceipts .Where(x => ownAddresses.Contains(x.From) || ownAddresses.Contains(x.To)); foreach (var receipt in ownTransactionReceipts) { await transactionReceiptRepository.InsertOrReplaceAsync(receipt); } } else { foreach (var receipt in transactionReceipts) { await transactionReceiptRepository.InsertOrReplaceAsync(receipt); } } }
/// <inheritdoc /> public async Task <bool> BeginObservationIfNotObservingAsync( string address) { var observationBegan = await _balanceRepository .CreateIfNotExistsAsync(address); await _balanceMonitoringTaskRepository.EnqueueAsync ( new BalanceMonitoringTask(address) ); if (observationBegan) { _log.Info ( $"Wallet [{address}] has been added to balance observation list.", new { address } ); } return(observationBegan); }