public async Task <Result <BigInteger> > GetNonceAsync(
            Atomex.EthereumConfig ethereum,
            string address,
            bool pending = true,
            CancellationToken cancellationToken = default)
        {
            var transactionCountResult = await((IEthereumBlockchainApi)ethereum.BlockchainApi)
                                         .GetTransactionCountAsync(address, pending, cancellationToken)
                                         .ConfigureAwait(false);

            if (transactionCountResult.HasError)
            {
                return(transactionCountResult);
            }

            var nonceFromNetwork = transactionCountResult.Value;

            lock (_offlineNonces)
            {
                var currentNonce = _offlineNonces.TryGetValue(address, out var offlineNonce) &&
                                   offlineNonce.Nonce > nonceFromNetwork &&
                                   DateTimeOffset.UtcNow - offlineNonce.LastUpdated < TimeSpan.FromMinutes(5)
                    ? offlineNonce.Nonce
                    : nonceFromNetwork;

                _offlineNonces[address] = new NonceEntry
                {
                    Nonce       = currentNonce + 1,
                    LastUpdated = DateTimeOffset.UtcNow
                };

                return(currentNonce);
            }
        }
        public async Task <Result <BigInteger> > GetNonceAsync(
            Atomex.Ethereum ethereum,
            string address,
            CancellationToken cancellationToken = default)
        {
            var transactionCountResult = await((IEthereumBlockchainApi)ethereum.BlockchainApi)
                                         .GetTransactionCountAsync(address, cancellationToken)
                                         .ConfigureAwait(false);

            if (transactionCountResult.HasError)
            {
                return(transactionCountResult);
            }

            var nonce = transactionCountResult.Value;

            lock (_syncRoot)
            {
                if (_nonces.TryGetValue(address, out var offlineNonce))
                {
                    if (offlineNonce.Value >= nonce &&
                        DateTime.UtcNow - offlineNonce.LastUpdatedTimeUtc <= ExpirationTimeOut)
                    {
                        return(offlineNonce.Value++);
                    }

                    _nonces[address] = new NonceEntry
                    {
                        Value = nonce + 1,
                        LastUpdatedTimeUtc = DateTime.UtcNow
                    };

                    return(nonce);
                }

                _nonces.Add(address, new NonceEntry
                {
                    Value = nonce + 1,
                    LastUpdatedTimeUtc = DateTime.UtcNow
                });

                return(nonce);
            }
        }
예제 #3
0
        public async Task <BigInteger> GetNonce(Atomix.Ethereum ethereum, string address)
        {
            var nonce = await((IEthereumBlockchainApi)ethereum.BlockchainApi)
                        .GetTransactionCountAsync(address)
                        .ConfigureAwait(false);

            lock (_syncRoot)
            {
                if (_nonces.TryGetValue(address, out var offlineNonce))
                {
                    if (offlineNonce.Value >= nonce &&
                        DateTime.UtcNow - offlineNonce.LastUpdatedTimeUtc <= ExpirationTimeOut)
                    {
                        return(offlineNonce.Value++);
                    }
                    else
                    {
                        _nonces[address] = new NonceEntry
                        {
                            Value = nonce + 1,
                            LastUpdatedTimeUtc = DateTime.UtcNow
                        };

                        return(nonce);
                    }
                }
                else
                {
                    _nonces.Add(address, new NonceEntry
                    {
                        Value = nonce + 1,
                        LastUpdatedTimeUtc = DateTime.UtcNow
                    });

                    return(nonce);
                }
            }
        }