public static async Task Main(string[] args) { var erc20transferEventLogs = new List <EventLog <TransferEvent> >(); var erc721TransferEventLogs = new List <EventLog <Erc721TransferEvent> >(); var web3 = new Web3("https://rinkeby.infura.io/v3/7238211010344719ad14a89db874158c"); var erc20TransferHandler = new EventLogProcessorHandler <TransferEvent>( eventLog => erc20transferEventLogs.Add(eventLog)); var erc721TransferHandler = new EventLogProcessorHandler <Erc721TransferEvent>( eventLog => erc721TransferEventLogs.Add(eventLog)); var processingHandlers = new ProcessorHandler <FilterLog>[] { erc20TransferHandler, erc721TransferHandler }; //create our processor to retrieve transfers //restrict the processor to Transfers for a specific contract address var processor = web3.Processing.Logs.CreateProcessor(processingHandlers); //if we need to stop the processor mid execution - call cancel on the token var cancellationToken = new CancellationToken(); //crawl the required block range await processor.ExecuteAsync( toBlockNumber : new BigInteger(3146690), cancellationToken : cancellationToken, startAtBlockNumberIfNotProcessed : new BigInteger(3146684)); Console.WriteLine($"Expected 13 ERC20 transfers. Logs found: {erc20transferEventLogs.Count}."); Console.WriteLine($"Expected 3 ERC721 transfers. Logs found: {erc721TransferEventLogs.Count}."); }
public async Task AnyContractManyEventAsync() { var erc20transferEventLogs = new List <EventLog <TransferEvent> >(); var erc721TransferEventLogs = new List <EventLog <Erc721TransferEvent> >(); var web3 = new Web3.Web3(TestConfiguration.BlockchainUrls.Infura.Rinkeby); var erc20TransferHandler = new EventLogProcessorHandler <TransferEvent>( eventLog => erc20transferEventLogs.Add(eventLog)); var erc721TransferHandler = new EventLogProcessorHandler <Erc721TransferEvent>( eventLog => erc721TransferEventLogs.Add(eventLog)); var processingHandlers = new ProcessorHandler <FilterLog>[] { erc20TransferHandler, erc721TransferHandler }; //create our processor to retrieve transfers //restrict the processor to Transfers for a specific contract address var processor = web3.Processing.Logs.CreateProcessor(processingHandlers); //if we need to stop the processor mid execution - call cancel on the token var cancellationToken = new CancellationToken(); //crawl the required block range await processor.ExecuteAsync( toBlockNumber : new BigInteger(3146690), cancellationToken : cancellationToken, startAtBlockNumberIfNotProcessed : new BigInteger(3146684)); Assert.Equal(13, erc20transferEventLogs.Count); Assert.Equal(3, erc721TransferEventLogs.Count); }
public async Task ManyContractsMultipleEvents() { const string ERC20_QUEUE_NAME = "many-contract-multi-event-erc20"; const string APPROVAL_QUEUE_NAME = "many-contract-multi-event-approval"; var azureQueueFactory = new AzureStorageQueueFactory(_azureConnectionString); try { var erc20Queue = await azureQueueFactory.GetOrCreateQueueAsync(ERC20_QUEUE_NAME); var approvalQueue = await azureQueueFactory.GetOrCreateQueueAsync(APPROVAL_QUEUE_NAME); var erc20TransferProcessor = new EventLogProcessorHandler <TransferEventDTO>(transfer => erc20Queue.AddMessageAsync(transfer)); var approvalProcessor = new EventLogProcessorHandler <ApprovalEventDTO>(approval => approvalQueue.AddMessageAsync(approval)); var logProcessors = new ProcessorHandler <FilterLog>[] { erc20TransferProcessor, approvalProcessor }; var contractAddresses = new[] { "0x9EDCb9A9c4d34b5d6A082c86cb4f117A1394F831", "0xafbfefa496ae205cf4e002dee11517e6d6da3ef6" }; var contractFilter = new NewFilterInput { Address = contractAddresses }; var logProcessor = _web3.Processing.Logs.CreateProcessor(logProcessors, filter: contractFilter); //if we need to stop the processor mid execution - call cancel on the token var cancellationTokenSource = new CancellationTokenSource(); //crawl the required block range await logProcessor.ExecuteAsync( toBlockNumber : 3621716, cancellationToken : cancellationTokenSource.Token, startAtBlockNumberIfNotProcessed : 3621715); Assert.Equal(2, await erc20Queue.GetApproxMessageCountAsync()); Assert.Equal(1, await approvalQueue.GetApproxMessageCountAsync()); } finally { await azureQueueFactory.DeleteQueueAsync(ERC20_QUEUE_NAME); await azureQueueFactory.DeleteQueueAsync(APPROVAL_QUEUE_NAME); } }
public async Task AnyContractMultipleEvents() { const string ERC20_QUEUE_NAME = "any-contract-one-event-erc20"; const string ERC721_QUEUE_NAME = "any-contract-one-event-erc721"; var azureQueueFactory = new AzureStorageQueueFactory(_azureConnectionString); try { var erc20Queue = await azureQueueFactory.GetOrCreateQueueAsync(ERC20_QUEUE_NAME); var erc721Queue = await azureQueueFactory.GetOrCreateQueueAsync(ERC721_QUEUE_NAME); var erc20TransferProcessor = new EventLogProcessorHandler <TransferEventDTO>(transfer => erc20Queue.AddMessageAsync(transfer)); var erc721TransferProcessor = new EventLogProcessorHandler <Erc721TransferEvent>(transfer => erc721Queue.AddMessageAsync(transfer)); var logProcessors = new ProcessorHandler <FilterLog>[] { erc20TransferProcessor, erc721TransferProcessor }; var logProcessor = _web3.Processing.Logs.CreateProcessor(logProcessors); //if we need to stop the processor mid execution - call cancel on the token var cancellationTokenSource = new CancellationTokenSource(); //crawl the required block range await logProcessor.ExecuteAsync( toBlockNumber : 3146690, cancellationToken : cancellationTokenSource.Token, startAtBlockNumberIfNotProcessed : 3146684); Assert.Equal(13, await erc20Queue.GetApproxMessageCountAsync()); Assert.Equal(3, await erc721Queue.GetApproxMessageCountAsync()); } finally { await azureQueueFactory.DeleteQueueAsync(ERC20_QUEUE_NAME); await azureQueueFactory.DeleteQueueAsync(ERC721_QUEUE_NAME); } }
public static async Task Main(string[] args) { var erc20transferEventLogs = new List <EventLog <TransferEvent> >(); var approvalEventLogs = new List <EventLog <ApprovalEventDTO> >(); var web3 = new Web3("https://rinkeby.infura.io/v3/7238211010344719ad14a89db874158c"); var erc20TransferHandler = new EventLogProcessorHandler <TransferEvent>( eventLog => erc20transferEventLogs.Add(eventLog)); var erc721TransferHandler = new EventLogProcessorHandler <ApprovalEventDTO>( eventLog => approvalEventLogs.Add(eventLog)); var processingHandlers = new ProcessorHandler <FilterLog>[] { erc20TransferHandler, erc721TransferHandler }; var contractFilter = new NewFilterInput { Address = new [] { "0x9EDCb9A9c4d34b5d6A082c86cb4f117A1394F831" } }; //create our processor to retrieve transfers //restrict the processor to Transfers for a specific contract address var processor = web3.Processing.Logs.CreateProcessor( logProcessors: processingHandlers, filter: contractFilter); //if we need to stop the processor mid execution - call cancel on the token var cancellationToken = new CancellationToken(); //crawl the required block range await processor.ExecuteAsync( toBlockNumber : new BigInteger(3621716), cancellationToken : cancellationToken, startAtBlockNumberIfNotProcessed : new BigInteger(3621715)); Console.WriteLine($"Expected 2 ERC20 transfers. Logs found: {erc20transferEventLogs.Count}."); Console.WriteLine($"Expected 1 Approval. Logs found: {approvalEventLogs.Count}."); }
public async Task ExecuteAsync(ILogger logger) { if (!_config.Enabled) { logger.LogInformation($"{nameof(ProcessPurchaseOrderEventLogs)} is not enabled - see app settings"); return; } const int RequestRetryWeight = 0; // see below for retry algorithm var web3 = new Web3.Web3(_eshopConfiguration.EthereumRpcUrl); var walletBuyerService = new WalletBuyerService(web3, _eshopConfiguration.BuyerWalletAddress); var purchasingContractAddress = await walletBuyerService.PurchasingQueryAsync(); var filter = new NewFilterInput { Address = new[] { purchasingContractAddress } }; ILog log = logger.ToILog(); EventLogProcessorHandler <PurchaseOrderCreatedLogEventDTO> poCreatedHandler = CreatePurchaseOrderCreatedHandler(logger); var logProcessorHandlers = new ProcessorHandler <FilterLog>[] { poCreatedHandler }; IBlockchainProcessingOrchestrator orchestrator = new LogOrchestrator( ethApi: web3.Eth, logProcessors: logProcessorHandlers, filterInput: filter, defaultNumberOfBlocksPerRequest: (int)_config.NumberOfBlocksPerBatch, retryWeight: RequestRetryWeight); IWaitStrategy waitForBlockConfirmationsStrategy = new WaitStrategy(); ILastConfirmedBlockNumberService lastConfirmedBlockNumberService = new LastConfirmedBlockNumberService( web3.Eth.Blocks.GetBlockNumber, waitForBlockConfirmationsStrategy, _config.MinimumBlockConfirmations, log); var processor = new BlockchainProcessor( orchestrator, BlockProgressRepository, lastConfirmedBlockNumberService); var cancellationToken = new CancellationTokenSource(_config.TimeoutMs); var currentBlockOnChain = await web3.Eth.Blocks.GetBlockNumber.SendRequestAsync(); var blockToProcessTo = currentBlockOnChain.Value - _config.MinimumBlockConfirmations; var lastBlockProcessed = await BlockProgressRepository.GetLastBlockNumberProcessedAsync(); var minStartingBlock = _config.GetMinimumStartingBlock(); logger.LogInformation( $"Processing logs. To Block: {blockToProcessTo}, Last Block Processed: {lastBlockProcessed ?? 0}, Min Block: {minStartingBlock}"); await processor.ExecuteAsync( toBlockNumber : blockToProcessTo, cancellationToken : cancellationToken.Token, startAtBlockNumberIfNotProcessed : minStartingBlock); }