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)); }
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); }
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); }
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); }
/// <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) },
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); }
public void Assigns_Specified_Contract_Address() { var contractAddress = "0xC03cDD393C89D169bd4877d58f0554f320f21037"; var filter = new FilterInputBuilder <TransferEvent>().Build(contractAddress); Assert.Single(filter.Address, contractAddress); }
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)); }
public void Assigns_Specified_Contract_Addresses() { var ContractAddresses = new [] { "0xC03cDD393C89D169bd4877d58f0554f320f21037", "0xD03cDD393C89D169bd4877d58f0554f320f21037" }; var filter = new FilterInputBuilder <TransferEvent>().Build(ContractAddresses); Assert.True(filter.Address.SequenceEqual(ContractAddresses)); }
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)); }
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)); }
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)); }
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()); }
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)); }
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)); }
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); }