public async Task request_eth_should_succeed_when_no_previous_requests_were_made() { _timestamper = new Timestamper(DateTime.UtcNow); await InitFaucetAsync(); var ethRequested = await TryRequestEthAsync(); ethRequested.Should().Be(FaucetResponse.RequestCompleted(new FaucetRequestDetails("127.0.0.1", _address, _value, _timestamper.UtcNow, Keccak.Zero))); }
public async Task request_eth_should_succeed_for_valid_address_and_non_zero_value() { var address = Address.FromNumber(1); UInt256 value = 1; _ethRequestService.UpdateFaucet(_faucetPeer); _faucetPeer.SendRequestEthAsync(address, value) .Returns(FaucetResponse.RequestCompleted(FaucetRequestDetails.Empty)); var ethRequested = await _ethRequestService.TryRequestEthAsync(Address.FromNumber(1), 1); ethRequested.Should().Be(FaucetResponse.RequestCompleted(FaucetRequestDetails.Empty)); }
public async Task request_eth_should_return_true() { var address = TestItem.AddressA; var value = 1.Ether(); _ethRequestService.TryRequestEthAsync(address, value).Returns(FaucetResponse.RequestCompleted(null)); var result = await _rpc.ndm_requestEth(address); await _ethRequestService.Received().TryRequestEthAsync(address, value); result.Data.Status.Should().Be(FaucetRequestStatus.RequestCompleted.ToString()); }
public async Task request_eth_should_succeed_when_previous_request_was_made_at_least_yesterday() { var requestedAt = new DateTime(2019, 1, 1); _timestamper = new Timestamper(requestedAt.AddDays(1)); var latestRequest = new EthRequest(Keccak.Zero, _host, _address, _value, requestedAt, Keccak.Zero); _repository.GetLatestAsync(_host).Returns(latestRequest); await InitFaucetAsync(); var ethRequested = await TryRequestEthAsync(); ethRequested.Should().Be(FaucetResponse.RequestCompleted(new FaucetRequestDetails("127.0.0.1", _address, _value, _timestamper.UtcNow, Keccak.Zero))); }
public async Task request_eth_should_fail_when_same_ip_address_sends_another_request_the_same_day() { var requestedAt = new DateTime(2019, 1, 1); _timestamper = new Timestamper(requestedAt); var latestRequest = new EthRequest(Keccak.Zero, _host, _address, _value, requestedAt, Keccak.Zero); _repository.GetLatestAsync(_host).Returns(latestRequest); await InitFaucetAsync(); var ethRequested = await TryRequestEthAsync(); ethRequested.Should() .Be(FaucetResponse.RequestAlreadyProcessedToday(FaucetRequestDetails.From(latestRequest))); }
public async Task <FaucetResponse> TryRequestEthAsync(string node, Address?address, UInt256 value) { if (!_enabled) { if (_logger.IsInfo) { _logger.Info("NDM Faucet is disabled."); } return(FaucetResponse.FaucetDisabled); } if (!_initialized) { if (_logger.IsInfo) { _logger.Info("NDM Faucet is not initialized."); } return(FaucetResponse.FaucetDisabled); } if (_today.Date != _timestamper.UtcNow.Date) { lock (_locker) { _today = _timestamper.UtcNow; _todayRequestsTotalValueWei = 0; } if (_logger.IsInfo) { _logger.Info($"NDM Faucet has updated its today's date ({_today.Date:d}) and reset the total requests value."); } } if (_faucetAddress is null || _faucetAddress == Address.Zero) { if (_logger.IsWarn) { _logger.Warn("NDM Faucet address is not set."); } return(FaucetResponse.FaucetAddressNotSet); } if (string.IsNullOrWhiteSpace(node) || address is null || address == Address.Zero) { if (_logger.IsInfo) { _logger.Info("Invalid NDM Faucet request."); } return(FaucetResponse.InvalidNodeAddress); } if (_faucetAddress == address) { if (_logger.IsInfo) { _logger.Info("NDM Faucet request cannot be processed for the same address as NDM Faucet."); } return(FaucetResponse.SameAddressAsFaucet); } if (value == 0) { if (_logger.IsInfo) { _logger.Info("NDM Faucet request cannot be processed for the zero value."); } return(FaucetResponse.ZeroValue); } if (value > _maxValue) { if (_logger.IsInfo) { _logger.Info($"NDM Faucet request from: {node} has too big value: {value} wei > {_maxValue} wei."); } return(FaucetResponse.TooBigValue); } if (_logger.IsInfo) { _logger.Info($"Received NDM Faucet request from: {node}, address: {address}, value: {value} wei."); } if (_pendingRequests.TryGetValue(node, out _)) { if (_logger.IsInfo) { _logger.Info($"NDM Faucet request from: {node} is already being processed."); } return(FaucetResponse.RequestAlreadyProcessing); } var latestRequest = await _requestRepository.GetLatestAsync(node); var requestedAt = _timestamper.UtcNow; if (!(latestRequest is null) && latestRequest.RequestedAt.Date >= requestedAt.Date) { if (_logger.IsInfo) { _logger.Info($"NDM Faucet request from: {node} was already processed today at: {latestRequest.RequestedAt}."); } return(FaucetResponse.RequestAlreadyProcessedToday(FaucetRequestDetails.From(latestRequest))); } if (!_pendingRequests.TryAdd(node, true)) { if (_logger.IsWarn) { _logger.Warn($"Couldn't start processing NDM Faucet request from: {node}."); } return(FaucetResponse.RequestError); } lock (_locker) { _todayRequestsTotalValueWei += value; if (_logger.IsInfo) { _logger.Info($"Increased NDM Faucet total value of today's ({_today.Date:d}) requests to {_todayRequestsTotalValueWei} wei."); } } if (_todayRequestsTotalValueWei > _dailyRequestsTotalValueWei) { if (_logger.IsInfo) { _logger.Info($"Daily ({_today.Date:d}) requests value for NDM Faucet was reached ({_dailyRequestsTotalValueWei} wei)."); } return(FaucetResponse.DailyRequestsTotalValueReached); } if (_logger.IsInfo) { _logger.Info($"NDM Faucet is processing request for: {node}, address: {address}, value: {value} wei."); } try { var nonce = await _blockchainBridge.GetNonceAsync(_faucetAddress); var transaction = new Transaction { Value = value, GasLimit = Transaction.BaseTxGasCost, GasPrice = 20.GWei(), To = address, SenderAddress = _faucetAddress, Nonce = nonce }; _wallet.Sign(transaction, await _blockchainBridge.GetNetworkIdAsync()); Keccak?transactionHash = await _blockchainBridge.SendOwnTransactionAsync(transaction); if (transactionHash == null) { return(FaucetResponse.ProcessingRequestError); } if (latestRequest is null) { Keccak requestId = Keccak.Compute(Rlp.Encode(Rlp.Encode(node)).Bytes); latestRequest = new EthRequest(requestId, node, address, value, requestedAt, transactionHash); await _requestRepository.AddAsync(latestRequest); } else { latestRequest.UpdateRequestDetails(address, value, requestedAt, transactionHash); await _requestRepository.UpdateAsync(latestRequest); } if (_logger.IsInfo) { _logger.Info($"NDM Faucet has successfully processed request for: {node}, address: {address}, value: {value} wei."); } return(FaucetResponse.RequestCompleted(FaucetRequestDetails.From(latestRequest))); } catch (Exception ex) { if (_logger.IsError) { _logger.Error(ex.Message, ex); } lock (_locker) { _todayRequestsTotalValueWei -= value; if (_logger.IsInfo) { _logger.Info($"Decreased NDM Faucet total value of today's ({_today.Date:d}) requests to {_todayRequestsTotalValueWei} wei."); } } return(FaucetResponse.ProcessingRequestError); } finally { _pendingRequests.TryRemove(node, out _); } }
public FaucetResponseForRpc(FaucetResponse response) : this(response.Status.ToString(), new FaucetRequestDetailsForRpc(response.LatestRequest)) { }
public EthRequestedMessage(FaucetResponse response) { Response = response; }