public LogsProcessorBuilder(IEthApiContractService ethApiContractService, Action <FilterInputBuilder <TEventDto> > configureFilterBuilder, params string[] contractAddresses)
            : base(ethApiContractService)
        {
            var filterBuilder = new FilterInputBuilder <TEventDto>();

            configureFilterBuilder(filterBuilder);
            Filters.Add(filterBuilder.Build(contractAddresses));
        }
コード例 #2
0
ファイル: EventExtensions.cs プロジェクト: zzz8415/Nethereum
        public static NewFilterInput CreateFilterInput(this EventABI eventABI, string contractAddress, object[] filterTopic1, BlockParameter fromBlock = null,
                                                       BlockParameter toBlock = null)
        {
            var ethFilterInput = FilterInputBuilder.GetDefaultFilterInput(contractAddress, fromBlock, toBlock);

            ethFilterInput.Topics = eventABI.GetTopicBuilder().GetTopics(filterTopic1);
            return(ethFilterInput);
        }
コード例 #3
0
ファイル: EventExtensions.cs プロジェクト: zzz8415/Nethereum
        public static NewFilterInput CreateFilterInput <T1, T2, T3>(this EventABI eventABI, T1 filterTopic1, T2 filterTopic2, T3 filterTopic3,
                                                                    BlockParameter fromBlock = null, BlockParameter toBlock = null)
        {
            var ethFilterInput = FilterInputBuilder.GetDefaultFilterInput((string)null, fromBlock, toBlock);

            ethFilterInput.Topics = eventABI.GetTopicBuilder().GetTopics(filterTopic1, filterTopic2, filterTopic3);
            return(ethFilterInput);
        }
コード例 #4
0
        public static NewFilterInput CreateFilterInput(this EventABI eventABI, string[] contractAddress, BlockParameter fromBlock = null, BlockParameter toBlock = null)
        {
            var eventTopicBuilder = new EventTopicBuilder(eventABI);
            var ethFilterInput    = FilterInputBuilder.GetDefaultFilterInput(contractAddress, fromBlock, toBlock);

            ethFilterInput.Topics = eventTopicBuilder.GetSignatureTopic();
            return(ethFilterInput);
        }
コード例 #5
0
        /// <summary>
        /// Adds a filter based on the event signature
        /// For each filter in the processor a separate query is performed to request matching logs
        /// The logs for each filter are amalgamated in the retrieval stage
        /// Without filters - any log in the block range is retrieved and evaluated
        /// If filters are present - a log has to match atleast one filter (not all)
        /// </summary>
        /// <typeparam name="TEventDto"></typeparam>
        /// <returns></returns>
        public ILogsProcessorBuilder Filter <TEventDto>() where TEventDto : class, IEventDTO, new()
        {
            var filter = new FilterInputBuilder <TEventDto>().Build(ContractAddresses);

            AddOrReplaceContractAddressFilter(filter);

            return(Filter(filter));
        }
        public async Task TransfersInBlock()
        {
            var filter = new FilterInputBuilder <TransferEvent_ERC20>()
                         .Build(blockRange: new BlockRange(3860820, 3860820));

            var expectedLogs = new List <(string txHash, int logIndex)>
            {
                { ("0x99d3d6a1fe9eb4a44ff412bd02f3816b0b9061a2356b52a0f9bbc4b459d3f55a", 0) },
                { ("0x70e78bcb16275e38dfd1048625b7a5cb22e21027955d8de301b9fbd411c692d6", 7) },
コード例 #7
0
        public void Assigns_Specified_Block_Numbers()
        {
            var range = new BlockRange(15, 25);

            var filter = new FilterInputBuilder <TransferEvent>().Build(blockRange: range);

            Assert.Equal(range.From, filter.FromBlock.BlockNumber.Value);
            Assert.Equal(range.To, filter.ToBlock.BlockNumber.Value);
        }
コード例 #8
0
        public void Assigns_Specified_Contract_Address()
        {
            var contractAddress =
                "0xC03cDD393C89D169bd4877d58f0554f320f21037";

            var filter = new FilterInputBuilder <TransferEvent>().Build(contractAddress);

            Assert.Single(filter.Address, contractAddress);
        }
コード例 #9
0
        public ILogsProcessorBuilder Filter <TEventDto>(Action <FilterInputBuilder <TEventDto> > configureFilter) where TEventDto : class, IEventDTO, new()
        {
            var filterBuilder = new FilterInputBuilder <TEventDto>();

            configureFilter(filterBuilder);
            var filter = filterBuilder.Build(ContractAddresses);

            AddOrReplaceContractAddressFilter(filter);
            return(Filter(filter));
        }
コード例 #10
0
        public void Assigns_Specified_Contract_Addresses()
        {
            var ContractAddresses = new []
            {
                "0xC03cDD393C89D169bd4877d58f0554f320f21037",
                "0xD03cDD393C89D169bd4877d58f0554f320f21037"
            };

            var filter = new FilterInputBuilder <TransferEvent>().Build(ContractAddresses);

            Assert.True(filter.Address.SequenceEqual(ContractAddresses));
        }
コード例 #11
0
        public void Assigns_Event_Signature_To_Topic0()
        {
            var filter = new FilterInputBuilder <TransferEvent>().Build();

            var eventAbi = ABITypedRegistry.GetEvent <TransferEvent>();

            Assert.Equal(eventAbi.Sha3Signature.EnsureHexPrefix(), filter.Topics.FirstOrDefault());

            Assert.False(filter.IsTopicFiltered(1));
            Assert.False(filter.IsTopicFiltered(2));
            Assert.False(filter.IsTopicFiltered(3));
        }
コード例 #12
0
        public void Can_Assign_To_Topic3()
        {
            var value = BigInteger.One;

            var filter = new FilterInputBuilder <TransferEvent>()
                         .AddTopic(template => template.Value, value)
                         .Build();

            Assert.False(filter.IsTopicFiltered(1));
            Assert.False(filter.IsTopicFiltered(2));
            Assert.Equal("0x0000000000000000000000000000000000000000000000000000000000000001",
                         filter.GetFirstTopicValueAsString(3));
        }
コード例 #13
0
        public void Can_Assign_To_Topic2()
        {
            var to = "0xc14934679e71ef4d18b6ae927fe2b953c7fd9b91";

            var filter = new FilterInputBuilder <TransferEvent>()
                         .AddTopic(template => template.To, to)
                         .Build();

            Assert.False(filter.IsTopicFiltered(1));
            Assert.Equal("0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b91",
                         filter.GetFirstTopicValueAsString(2));
            Assert.False(filter.IsTopicFiltered(3));
        }
コード例 #14
0
        public void Can_Assign_Many_Values_To_A_Topic_At_Once()
        {
            var address1 = "0xc14934679e71ef4d18b6ae927fe2b953c7fd9b91";
            var address2 = "0xc24934679e71ef4d18b6ae927fe2b953c7fd9b91";

            var filter = new FilterInputBuilder <TransferEvent>()
                         .AddTopic((t) => t.From, new [] { address1, address2 })
                         .Build();

            var topicValues = filter.GetTopicValues(1);

            Assert.Equal("0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b91",
                         topicValues[0].ToString());

            Assert.Equal("0x000000000000000000000000c24934679e71ef4d18b6ae927fe2b953c7fd9b91",
                         topicValues[1].ToString());
        }
コード例 #15
0
        public void When_Parameter_Name_Is_Empty_Uses_Order_To_Find_Topic()
        {
            var from  = "0xc14934679e71ef4d18b6ae927fe2b953c7fd9b91";
            var to    = "0xc14934679e71ef4d18b6ae927fe2b953c7fd9b92";
            var value = BigInteger.One;

            var filter = new FilterInputBuilder <TransferEvent_WithEmptyParameterNames>()
                         .AddTopic(template => template.From, from)
                         .AddTopic(template => template.To, to)
                         .AddTopic(template => template.Value, value)
                         .Build();

            Assert.Equal("0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b91",
                         filter.GetFirstTopicValueAsString(1));

            Assert.Equal("0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b92",
                         filter.GetFirstTopicValueAsString(2));

            Assert.Equal("0x0000000000000000000000000000000000000000000000000000000000000001",
                         filter.GetFirstTopicValueAsString(3));
        }
コード例 #16
0
        public void Can_Assign_To_Multiple_Topics()
        {
            var from  = "0xc14934679e71ef4d18b6ae927fe2b953c7fd9b91";
            var to    = "0xc14934679e71ef4d18b6ae927fe2b953c7fd9b92";
            var value = BigInteger.One;

            var filter = new FilterInputBuilder <TransferEvent>()
                         .AddTopic(template => template.From, from)
                         .AddTopic(template => template.To, to)
                         .AddTopic(template => template.Value, value)
                         .Build();

            Assert.Equal("0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b91",
                         filter.GetFirstTopicValueAsString(1));

            Assert.Equal("0x000000000000000000000000c14934679e71ef4d18b6ae927fe2b953c7fd9b92",
                         filter.GetFirstTopicValueAsString(2));

            Assert.Equal("0x0000000000000000000000000000000000000000000000000000000000000001",
                         filter.GetFirstTopicValueAsString(3));
        }
コード例 #17
0
        public async Task Should_Configure_Get_Logs_Filter_For_Address_And_Event()
        {
            var          currentBlockOnChain  = 100;
            var          blockFrom            = new BigInteger(0);
            var          blockTo              = new BigInteger(0);
            const int    logsPerTransaction   = 1;
            const int    transactionsPerBlock = 1;
            const string contractAddress1     = "0x243e72b69141f6af525a9a5fd939668ee9f2b354";
            const string contractAddress2     = "0x343e72b69141f6af525a9a5fd939668ee9f2b354";
            var          contractAddresses    = new[] { contractAddress1, contractAddress2 };

            //set up mock
            var logRpcMock = new LogProcessingRpcMock(Web3Mock);

            logRpcMock.SetupGetCurrentBlockNumber(currentBlockOnChain);
            logRpcMock.SetupGetLogsToReturnDummyERC20Transfers(blockFrom, blockTo, logsPerTransaction, transactionsPerBlock);

            var transfersHandled = new List <EventLog <TransferEventDTO> >();

            var logProcessor = Web3.Processing.Logs.CreateProcessorForContracts <TransferEventDTO>(
                contractAddresses,
                transferEventLog =>
            {
                transfersHandled.Add(transferEventLog);
            });

            //act
            await logProcessor.ExecuteAsync(blockTo, startAtBlockNumberIfNotProcessed : blockFrom);

            //assert
            var expectedGetLogsFilter = new FilterInputBuilder <TransferEventDTO>().Build(contractAddresses);
            var actualGetLogsFilter   = logRpcMock.GetLogsFiltersInvoked.FirstOrDefault();
            var expectedLogCount      = ((blockTo - blockFrom) + 1) * transactionsPerBlock * logsPerTransaction;

            Assert.Equal(expectedGetLogsFilter.Topics[0], actualGetLogsFilter.Topics[0]);
            Assert.Equal(expectedGetLogsFilter.Address, actualGetLogsFilter.Address);
            Assert.Equal(expectedLogCount, transfersHandled.Count);
        }