public async Task WillSwallowDecodingErrorsAndIgnoreLog()
        {
            var indexer     = new Mock <IEventIndexer <TransferEvent> >();
            var indexedLogs = new List <EventLog <TransferEvent> >();

            indexer.Setup(i => i.IndexAsync(It.IsAny <IEnumerable <EventLog <TransferEvent> > >()))
            .Returns <IEnumerable <EventLog <TransferEvent> > >(
                logs => { indexedLogs.AddRange(logs); return(Task.CompletedTask); });

            var processor = new EventIndexProcessor <TransferEvent>(indexer.Object, logsPerIndexBatch: 10);

            var topicsForAnotherEvent = new object[]
            {
                "0xEdf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                "0x0000000000000000000000000000000000000000000000000000000000000000",
                "0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b91",
                "0x0000000000000000000000000000000000000000000000400000402000000001"
            };

            await processor.ProcessLogsAsync(new[] { new  FilterLog {
                                                         Topics = topicsForAnotherEvent
                                                     } });

            Assert.Empty(indexedLogs);
            Assert.Equal(0, processor.Pending);
        }
        public async Task SendsToIndexerInBatchesAndSendsAnyPendingOnDispose()
        {
            var indexer     = new Mock <IEventIndexer <TransferEvent> >();
            var indexedLogs = new List <EventLog <TransferEvent> >();

            indexer.Setup(i => i.IndexAsync(It.IsAny <IEnumerable <EventLog <TransferEvent> > >()))
            .Returns <IEnumerable <EventLog <TransferEvent> > >(
                logs => { indexedLogs.AddRange(logs); return(Task.CompletedTask); });

            var processor = new EventIndexProcessor <TransferEvent>(indexer.Object, logsPerIndexBatch: 10);

            var topics = new object[]
            {
                "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                "0x0000000000000000000000000000000000000000000000000000000000000000",
                "0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b91",
                "0x0000000000000000000000000000000000000000000000400000402000000001"
            };

            for (var i = 0; i < 25; i++)
            {
                var log = new  FilterLog {
                    Topics = topics
                };

                await processor.ProcessLogsAsync(new[] { log });
            }

            Assert.Equal(20, indexedLogs.Count);
            Assert.Equal(5, processor.Pending);

            processor.Dispose();
            Assert.Equal(25, indexedLogs.Count);
            Assert.Equal(0, processor.Pending);
        }
Exemplo n.º 3
0
        public static ILogsProcessorBuilder AddToSearchIndex <TEventDto>(
            this ILogsProcessorBuilder processorBuilder,
            IEventIndexer <TEventDto> indexer,
            Predicate <EventLog <TEventDto> > predicate = null) where TEventDto : class, new()
        {
            var processor = new EventIndexProcessor <TEventDto>(indexer, predicate: predicate);

            processorBuilder.Add(processor);
            return(processorBuilder);
        }
Exemplo n.º 4
0
        public async Task AddEventAsync <TEvent>(string indexName = null) where TEvent : class, new()
        {
            var index = await SearchService.GetOrCreateEventIndex <TEvent>(indexName);

            _indexers.Add(index);

            var processor = new EventIndexProcessor <TEvent>(index);

            _logProcessors.Add(processor);
        }
        public async Task IsLogForEvent()
        {
            var indexer   = new Mock <IEventIndexer <TransferEvent> >();
            var processor = new EventIndexProcessor <TransferEvent>(indexer.Object);

            var transferLog = new FilterLog {
                Topics = new object[] { TransferEvent.Signature() }
            };
            var irrelevantLog = new FilterLog {
                Topics = new object[] { "SignatureForAnotherEvent" }
            };

            Assert.True(processor.IsLogForEvent(transferLog));
            Assert.False(processor.IsLogForEvent(irrelevantLog));
        }
Exemplo n.º 6
0
        public async Task UsingTheIndividualComponents()
        {
            TransferMetadata.CurrentChainUrl = BlockchainUrl;

            var web3 =
                new Web3.Web3(BlockchainUrl);

            using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey))
            {
                await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);

                try
                {
                    using (var transferIndexer =
                               await azureSearchService.CreateEventIndexer <TransferEvent_ERC20>(AzureTransferIndexName))
                    {
                        using (var transferProcessor =
                                   new EventIndexProcessor <TransferEvent_ERC20>(transferIndexer))
                        {
                            var logProcessor = new BlockRangeLogsProcessor(
                                web3.Eth.Filters.GetLogs,
                                new ILogProcessor[] { transferProcessor });

                            var progressRepository =
                                new JsonBlockProgressRepository(CreateJsonFileToHoldProgress());

                            var progressService = new StaticBlockRangeProgressService(
                                3146684, 3146694, progressRepository);

                            var batchProcessorService = new LogsProcessor(
                                logProcessor, progressService, maxNumberOfBlocksPerBatch: 2);

                            BlockRange?lastBlockRangeProcessed;
                            do
                            {
                                lastBlockRangeProcessed = await batchProcessorService.ProcessOnceAsync();
                            } while (lastBlockRangeProcessed != null);

                            Assert.Equal(19, transferIndexer.Indexed);
                        }
                    }
                }
                finally
                {
                    await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);
                }
            }
        }
Exemplo n.º 7
0
        public async Task CustomComposition()
        {
            TransferMetadata.CurrentChainUrl = BlockchainUrl;

            var blockchainProxyService =
                new BlockchainProxyService(BlockchainUrl);

            using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey))
            {
                await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);

                using (var transferIndexer = await azureSearchService.GetOrCreateEventIndex <TransferEvent_ERC20>(AzureTransferIndexName))
                {
                    using (var transferProcessor =
                               new EventIndexProcessor <TransferEvent_ERC20>(transferIndexer))
                    {
                        var logProcessor = new BlockchainLogProcessor(
                            blockchainProxyService,
                            new ILogProcessor[] { transferProcessor });

                        var progressRepository =
                            new JsonBlockProgressRepository(CreateJsonFileToHoldProgress());

                        var progressService = new StaticBlockRangeProgressService(
                            3146684, 3146694, progressRepository);

                        var batchProcessorService = new BlockchainBatchProcessorService(
                            logProcessor, progressService, maxNumberOfBlocksPerBatch: 2);

                        BlockRange?lastBlockRangeProcessed;
                        do
                        {
                            lastBlockRangeProcessed = await batchProcessorService.ProcessLatestBlocksAsync();
                        } while (lastBlockRangeProcessed != null);

                        Assert.Equal(19, transferIndexer.Indexed);
                    }
                }

                await azureSearchService.DeleteIndexAsync(AzureTransferIndexName);
            }
        }