private HttpRequestMessage BuildUnauthenticatedRequestAsync(PoloniexRequest request)
        {
            var builder = new UriBuilder("https://poloniex.com/public")
            {
                Query = new NameValueCollection
                {
                    { "command", request.Command },
                    request.Parameters
                }.ToQueryString()
            };

            return(new HttpRequestMessage(HttpMethod.Get, builder.Uri));
        }
        private async Task <HttpRequestMessage> BuildAuthenticatedRequestAsync(PoloniexRequest request)
        {
            var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://poloniex.com/tradingApi")
            {
                Content = new NameValueCollection
                {
                    { "command", request.Command },
                    { "nonce", (DateTime.UtcNow.ToUnixTimestamp() * 100000).ToString() },
                    request.Parameters
                }.ToFormUrlEncodedContent()
            };

            var body = await requestMessage.Content.ReadAsStringAsync();

            var hash = this.HashString(this.secret, body);

            requestMessage.Headers.Add("Key", this.apiKey);
            requestMessage.Headers.Add("Sign", hash);

            return(requestMessage);
        }
        public async Task <T> SendRequestAsync <T>(PoloniexRequest request, Func <String, T> customDeserializer = null)
        {
            using (var client = new HttpClient())
            {
                var requestMessage = request.Api == PoloniexApi.Trading
                                        ? await this.BuildAuthenticatedRequestAsync(request)
                                        : this.BuildUnauthenticatedRequestAsync(request);

                var response = await client.SendAsync(requestMessage);

                var content = await response.Content.ReadAsStringAsync();

                if (!response.IsSuccessStatusCode)
                {
                    var error = JsonConvert.DeserializeObject <PoloniexError>(content);

                    throw new PoloniexException(error.Message);
                }

                return((customDeserializer != null)
                                        ? customDeserializer.Invoke(content)
                                        : JsonConvert.DeserializeObject <T>(content));
            }
        }