/// <summary>
        /// Initialize object from another <see cref="ICredentialsProvider"/> implementation.
        /// </summary>
        /// <param name="credProvider">The source provider.</param>
        /// <param name="seed">UUID encryption seed (optional)</param>
        public MemoryEncryptedCredentialsProvider(ICredentialsProvider credProvider, Guid?seed = null)
        {
            if (seed == null)
            {
                this.seed = MakeZipper();
            }
            else
            {
                this.seed = MakeZipper((Guid)seed);
            }

            if (credProvider == null)
            {
                return;
            }

            this.key        = EncryptIt(credProvider.GetKey());
            this.secret     = EncryptIt(credProvider.GetSecret());
            this.passphrase = EncryptIt(credProvider.GetPassphrase());
            this.sandbox    = credProvider.GetSandbox();
            this.futures    = credProvider.GetFutures();
        }
Esempio n. 2
0
        /// <summary>
        /// Make a new request to the API endpoint.
        /// </summary>
        /// <param name="method">The <see cref="HttpMethod"/> of the new call.</param>
        /// <param name="uri">The relative path of the endpoint.</param>
        /// <param name="timeout">Timeout value, in seconds.</param>
        /// <param name="auth">True if the call is authenticated.</param>
        /// <param name="reqParams">Optional parameters for the call.</param>
        /// <param name="wholeResponseJson">True to return the whole response, or false to just return the 'data' portion.</param>
        /// <returns>A <see cref="JToken"/> object that can be deserialized to suit members in the derived class.</returns>
        protected async Task <JToken> MakeRequest(
            HttpMethod method,
            string uri,
            int timeout = 10,
            bool auth   = true,
            IDictionary <string, object> reqParams = null,
            bool wholeResponseJson = false)
        {
            string token;
            string json_data = reqParams != null?JsonConvert.SerializeObject(reqParams) : "";

            if (method == HttpMethod.Get || method == HttpMethod.Delete)
            {
                if (reqParams != null && reqParams.Count > 0)
                {
                    // sort the keys as per the Python API
                    var sdict = new SortedDictionary <string, object>(reqParams);
                    var sb    = new StringBuilder();

                    foreach (var kv in sdict)
                    {
                        if (sb.Length != 0)
                        {
                            sb.Append("&");
                        }

                        string sval;

                        if (kv.Value is Enum)
                        {
                            sval = EnumToStringConverter <Enum> .GetEnumName((Enum)kv.Value);
                        }
                        else
                        {
                            sval = kv.Value.ToString();
                        }

                        sb.Append(string.Format("{0}={1}", kv.Key, sval));
                    }

                    uri += "?" + sb.ToString();
                }

                token = uri;
            }
            else
            {
                token = uri + json_data;
            }

            Uri requri = UriJoin(this.url, uri);

            HttpRequestMessage req = new HttpRequestMessage(method, requri);

            req.Headers.Clear();

            // KuCoin API Authentication Magic

            ICredentialsProvider cred = ResolveCredentials();

            if (auth && cred != null)
            {
                var now_time    = EpochTime.DateToSeconds(DateTime.Now) * 1000;
                var str_to_sign = now_time.ToString() + method.Method + token;

                var sign = CreateToken(str_to_sign, cred.GetSecret());

                if (isv1api)
                {
                    req.Headers.Add("KC-API-SIGN", sign);
                    req.Headers.Add("KC-API-TIMESTAMP", now_time.ToString());
                    req.Headers.Add("KC-API-KEY", cred.GetKey());
                    req.Headers.Add("KC-API-PASSPHRASE", cred.GetPassphrase());
                }
                else
                {
                    var passphrase = CreateToken(cred.GetPassphrase(), cred.GetSecret());

                    req.Headers.Add("KC-API-SIGN", sign);
                    req.Headers.Add("KC-API-TIMESTAMP", now_time.ToString());
                    req.Headers.Add("KC-API-KEY", cred.GetKey());
                    req.Headers.Add("KC-API-PASSPHRASE", passphrase);
                    req.Headers.Add("KC-API-KEY-VERSION", "2");
                }
            }

            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.Timeout = new TimeSpan(0, 0, timeout);

                if (method == HttpMethod.Get)
                {
                    json_data = "";
                }

                req.Content = new StringContent(json_data, Encoding.UTF8, "application/json");

                long nt = DateTime.UtcNow.Ticks;

                lock (requestLockObject)
                {
                    if (nt - lastTime < 2_500_000)
                    {
                        Thread.Sleep(250);
                    }

                    lastTime = nt;
                }

                var resp = await httpClient.SendAsync(req);

                var result = await CheckResponseData(resp, wholeResponseJson);

                return(result);
            }
        }