Esempio n. 1
0
    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);
            }
        }
Esempio n. 5
0
    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}.");
    }
Esempio n. 6
0
        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);
        }