public async Task <PresaleInfo> SaveOrUpdatePresaleInfoAsync(PresaleInfo presaleInfo) { using (var context = this.contextFactory()) { if (presaleInfo.Id == null || presaleInfo.Id == Guid.Empty) { presaleInfo.CreationTimestamp = DateTime.UtcNow; context.PresaleInfos.Add(presaleInfo); } else { var presaleInfoFromDb = await context.PresaleInfos.AsNoTracking().SingleOrDefaultAsync(p => p.Id == presaleInfo.Id); if (presaleInfoFromDb == null) { throw new NotFoundException($"Presale info with ID {presaleInfo.Id} could not be found."); } context.PresaleInfos.Update(presaleInfo); context.Entry(presaleInfo).Property(c => c.CreationTimestamp).IsModified = false; } await context.SaveChangesAsync(); return(presaleInfo); } }
private static async Task MainAsync() { Console.WriteLine("=========================="); Console.WriteLine("Starting chain explorer..."); Console.WriteLine("=========================="); try { // TODO - fetch last block from db ulong lastBlock = 0; //network = "https://mainnet.infura.io"; var web3 = new Web3(network); // https://nethereum.readthedocs.io/en/latest/nethereum-events-gettingstarted/#contract-filters-and-event-logs var bidEvent = web3.Eth.GetEvent <MasternodeSoldEventDTO>(contractAddress); while (true) { var balance = await web3.Eth.GetBalance.SendRequestAsync(contractAddress); var etherAmount = Web3.Convert.FromWei(balance.Value); Console.WriteLine($"Contract balance in ETH: {etherAmount}"); var fromBlockParameter = new BlockParameter(lastBlock + 1); var filterAllTransferEventsForContract = bidEvent.CreateFilterInput(fromBlockParameter, null); var allTransferEventsForContract = await bidEvent.GetAllChanges(filterAllTransferEventsForContract); // // does not work with infura :( // var filterAll = await bidEvent.CreateFilterAsync(); // var log = await bidEvent.GetFilterChanges(filterAll); foreach (var masternodeSoldEvent in allTransferEventsForContract) { var block = (ulong)masternodeSoldEvent.Log.BlockNumber.Value; Console.Write($"block {block}, tx-hash: {masternodeSoldEvent.Log.TransactionHash}"); // check if tx is already in the db - if not, create a new one var presaleInfo = await dataManager.GetPresaleInfoByTxHashAsync(masternodeSoldEvent.Log.TransactionHash); if (presaleInfo == null) { Console.WriteLine(" --> not in the DB create new entry"); var presaleInfoToAdd = new PresaleInfo(); presaleInfoToAdd.NrOfCoins = nrOfCoins; presaleInfoToAdd.AdditionalData = "waiting for sending coins"; presaleInfoToAdd.BlockNumber = block; presaleInfoToAdd.BuyerAddress = masternodeSoldEvent.Event.Buyer; presaleInfoToAdd.TargetAddressCoins = masternodeSoldEvent.Event.CoinsTargetAddress; presaleInfoToAdd.Price = Web3.Convert.FromWei(masternodeSoldEvent.Event.Price); presaleInfoToAdd.Referral = masternodeSoldEvent.Event.Referral; presaleInfoToAdd.TxHash = masternodeSoldEvent.Log.TransactionHash; await dataManager.SaveOrUpdatePresaleInfoAsync(presaleInfoToAdd); await sendCoinsQueueWriter.WriteMessagesToQueueAsync(new[] { new SendCoinsMessage(presaleInfoToAdd.Id) }); } else { Console.WriteLine(" --> already in the DB - skip"); } lastBlock = block; } Console.WriteLine($"going to sleep for {sleepTime} seconds..."); await Task.Delay(sleepTime * 1000); } } catch (Exception exception) { Console.WriteLine($"{DateTime.UtcNow} > Exception: {exception.Message}"); } }