Esempio n. 1
0
        private async Task <bool> HasTransactionMinned(string timestampId, string transactionId, bool isPremiumPlan, CancellationToken cancellationToken)
        {
            Guard.Argument(timestampId, nameof(timestampId)).NotNull().NotEmpty().NotWhiteSpace();
            Guard.Argument(transactionId, nameof(transactionId)).NotNull().NotEmpty().NotWhiteSpace();

            IWeb3 web3 = null;

            if (isPremiumPlan)
            {
                var premiumAccount = new ManagedAccount(_settings.NetheriumPremiumAccountFromAddress, string.Empty);
                web3 = new Web3(premiumAccount, _settings.NetheriumAccountNodeEndpoint);
            }
            else
            {
                var basicAccount = new ManagedAccount(_settings.NetheriumBasicAccountFromAddress, string.Empty);
                web3 = new Web3(basicAccount, _settings.NetheriumAccountNodeEndpoint);
            }

            _logger.Information($"Checking ETH transaction with transactionId '{transactionId}' for timestampId '{timestampId}' on '{web3.TransactionManager.Account.Address}'.");
            var receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(transactionId);

            if (receipt == null || receipt.BlockNumber.Value < 0)
            {
                _logger.Information($"ETH transaction with transactionId '{transactionId}' still pending.");
                return(false);
            }

            _logger.Information($"ETH transaction with transactionId '{transactionId}' succeeded.");
            var timestamp = await _timestampRepository.GetTimestampById(timestampId, cancellationToken);

            if (timestamp.Status != TimestampState.Pending)
            {
                _logger.Warning($"It is not ideal work-flow. Investigate with time stamp identifier '{timestamp.Id}' and transaction identifier '{timestamp.TransactionId}'");
            }
            else
            {
                timestamp.BlockNumber = (long)receipt.BlockNumber.Value;

                timestamp.Status    = TimestampState.Succeeded;
                timestamp.Timestamp = DateTime.UtcNow;
                _logger.Information($"Transaction successful for an user '{timestamp.UserId}' with transaction identifier '{timestamp.TransactionId}'.");
                await _timestampRepository.UpdateTimestamp(timestamp, cancellationToken);
            }

            return(true);
        }