Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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}");
            }
        }