/// <summary>
        /// Processes an event when request is received.
        /// </summary>
        /// <param name="requestId">Unique Id of the request.</param>
        /// <param name="relayRequest">Relay request.</param>
        /// <returns>Task tracking request.</returns>
        public Task RequestReceivedAsync(string requestId, RelayRequest relayRequest)
        {
            lock (this.lockObject)
            {
                Console.SetCursorPosition(0, this.requestCount);

                Console.Write(string.Format(
                                  CultureInfo.InvariantCulture,
                                  "{0} - {1}",
                                  relayRequest.HttpMethod,
                                  relayRequest.RequestPathAndQuery));

                this.requestConsoleDetailsMap[requestId] = new RequestConsoleDetails
                {
                    RequestStartTime         = DateTime.Now,
                    RequestConsoleTopCursor  = this.requestCount,
                    RequestConsoleLeftCursor = Console.CursorLeft,
                };

                this.requestCount += 2;
                Console.WriteLine();
            }

            return(Task.CompletedTask);
        }
示例#2
0
        public async Task <RelayResponse> RelayAsync(Uri relayUrl, RelayRequest request)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = relayUrl;
                client.Timeout     = TimeSpan.FromMilliseconds(_httpTimeout);

                var content       = JsonConvert.SerializeObject(request);
                var stringContent = new StringContent(content, Encoding.UTF8, "application/json");

                var result = await client.PostAsync("/relay", stringContent);

                result.EnsureSuccessStatusCode();

                string contentResult = await result.Content.ReadAsStringAsync();

                return(JsonConvert.DeserializeObject <RelayResponse>(contentResult));
            }
        }
        /// <summary>
        /// Executed when a new request is received.
        /// </summary>
        /// <param name="requestId">Unique request Id.</param>
        /// <param name="relayRequest">Relay request instance.</param>
        /// <returns>Task tracking operation.</returns>
        public Task RequestReceivedAsync(string requestId, RelayRequest relayRequest)
        {
            this.Dispatcher.Invoke(() =>
            {
                this.logger.LogTrace("Received request with Id '{0}'", requestId);

                KeyValuePair <string, RequestDetails> requestItem = new KeyValuePair <string, RequestDetails>(requestId, new RequestDetails
                {
                    Method             = relayRequest.HttpMethod.Method,
                    RequestHeaders     = relayRequest.Headers.GetHeaderMap(),
                    RequestData        = this.GetUIFriendlyString(relayRequest.InputStream, relayRequest.Headers[HttpRequestHeader.ContentType], relayRequest.Headers[HttpRequestHeader.ContentEncoding]),
                    RequestReceiveTime = relayRequest.RequestStartDateTime.DateTime,
                    Url        = relayRequest.RequestPathAndQuery,
                    StatusCode = "Active",
                });

                this.requestMap.Add(requestItem);
            });

            return(Task.CompletedTask);
        }
        private async Task <string> SendViaRelay(
            string relayUrl,
            TransactionInput transaction,
            BigInteger txFee,
            BigInteger gasPrice,
            BigInteger gasLimit,
            BigInteger nonce,
            string relayHubAddress,
            string relayAddress,
            string signature,
            string approvalData,
            BigInteger relayMaxNonce)
        {
            var requestData = new RelayRequest
            {
                EncodedFunction = transaction.Data,
                Signature       = signature.HexToByteArray(),
                ApprovalData    = approvalData.HexToByteArray(),
                From            = transaction.From,
                To              = transaction.To,
                GasPrice        = gasPrice,
                GasLimit        = gasLimit,
                RelayFee        = txFee,
                RecipientNonce  = nonce,
                RelayMaxNonce   = relayMaxNonce,
                RelayHubAddress = relayHubAddress,
                UserAgent       = _options.UserAgent
            };

            RelayResponse relayResponse = await _relayClient.RelayAsync(new Uri(relayUrl), requestData)
                                          .ConfigureAwait(false);

            if (!string.IsNullOrEmpty(relayResponse.Error))
            {
                throw new Exception(relayResponse.Error);
            }

            if (relayResponse.Nonce.Value.IsZero)
            {
                throw new Exception("Empty body received from server, or neither 'error' nor 'nonce' fields present.");
            }

            ValidateTx(
                relayResponse,
                transaction,
                txFee,
                gasPrice,
                gasLimit,
                nonce,
                relayHubAddress,
                relayAddress);

            var    tx   = relayResponse.ToTransaction();
            string hash = string.Empty;
            var    ethSendTransaction = new EthSendRawTransaction(_client);

            try
            {
                hash = await ethSendTransaction.SendRequestAsync(tx.GetRLPEncoded().ToHex().EnsureHexPrefix())
                       .ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                if (!ex.Message.Contains("the tx doesn't have the correct nonce") &&
                    !ex.Message.Contains("known transaction") &&
                    !ex.Message.Contains("nonce too low"))
                {
                    throw ex;
                }
            }

            var txHash = relayResponse.Hash;

            if (!string.IsNullOrEmpty(hash) &&
                relayResponse.Hash.EnsureHexPrefix().ToLower() != hash.EnsureHexPrefix().ToLower())
            {
                txHash = hash;
            }

            return(txHash);
        }