Esempio n. 1
0
        public async Task ScanCancelByEventsAsync()
        {
            string latestScannedBlockKey = "CancelLatestScannedBlock";
            var    abi = await _abiProvider.GetCrowdsaleAbiAsync();

            var contract    = _nethereumClient.Eth.GetContract(abi, _ethSettings.EtherDeltaContractAddress);
            var cancelEvent = contract.GetEvent("Cancel");

            var blockNumHex = await _nethereumClient.Eth.Blocks.GetBlockNumber.SendRequestAsync();

            var blockNumLong = Convert.ToInt64(blockNumHex.Value.ToString());


            //to avoid races conditions between services
            blockNumLong -= 5;

            var latestScannedBlock = await _parametersService.GetLatestScannedBlockAsync(latestScannedBlockKey);

            var fromBlock = new BlockParameter(Convert.ToUInt64(latestScannedBlock + 1));

            var filterInput = cancelEvent.CreateFilterInput(fromBlock);

            var logs = await _etherscanService.GetEventsAsync(filterInput, latestScannedBlock + 1, blockNumLong);

            var eventLogsAll = cancelEvent.DecodeAllEventsForEvent <CancelEvent>(logs);

            var detectedTransactionHashes = eventLogsAll.Select(l => l.Log.TransactionHash).ToList();

            var existingDbTransactions = _context.CancelEvent
                                         .Where(t => detectedTransactionHashes.Contains(t.TransactionHash))
                                         .ToDictionary(t => t.TransactionHash, t => t);

            foreach (var eventEntry in eventLogsAll)
            {
                if (existingDbTransactions.TryGetValue(eventEntry.Log.TransactionHash, out var dbTransaction))
                {
                    continue;
                }

                var transaction = await _nethereumClient.Eth.Transactions.GetTransactionByHash.SendRequestAsync(eventEntry.Log.TransactionHash);

                var receipt = await _nethereumClient.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(eventEntry.Log.TransactionHash);

                var block = await _nethereumClient.Eth.Blocks.GetBlockWithTransactionsByNumber.SendRequestAsync(transaction.BlockNumber);

                var epoch = Convert.ToInt64(block.Timestamp.Value.ToString());

                var dbEvent = new CancelEventModel
                {
                    TokenGet   = eventEntry.Event.TokenGet,
                    AmountGet  = eventEntry.Event.AmountGet.ToString(),
                    TokenGive  = eventEntry.Event.TokenGive,
                    AmountGive = eventEntry.Event.AmountGive.ToString(),
                    Expires    = eventEntry.Event.Expires.ToString(),
                    Nonce      = eventEntry.Event.Nonce.ToString(),
                    User       = eventEntry.Event.User,

                    Hash            = ComputeHash(eventEntry.Event as CancelEvent),
                    TransactionHash = eventEntry.Log.TransactionHash,
                    Timestamp       = DateTimeOffset.FromUnixTimeSeconds(epoch),
                    BlockNum        = Convert.ToInt64(transaction.BlockNumber.Value.ToString()),
                    GasPriceWei     = Convert.ToInt64(transaction.GasPrice.Value.ToString()),
                    GasUsed         = Convert.ToInt64(receipt.GasUsed.Value.ToString()),
                };
                await _context.CancelEvent.AddAsync(dbEvent);
            }

            await _parametersService.SetLatestScannedBlockAsync(latestScannedBlockKey, blockNumLong);

            await _context.SaveChangesAsync();
        }