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); } }
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); } } }