protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { // only authenticated requests write json, everything uses GET and url params if (CanMakeAuthenticatedRequest(payload)) { request.AddHeader("Authorization", CryptoUtility.BasicAuthenticationString(PublicApiKey.ToUnsecureString(), PrivateApiKey.ToUnsecureString())); if (request.Method == "POST") { await CryptoUtility.WritePayloadJsonToRequestAsync(request, payload); } } }
protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { if (PrivateApiKey != null && PublicApiKey != null) { request.AddHeader("Authorization", CryptoUtility.BasicAuthenticationString(PublicApiKey.ToUnsecureString(), PrivateApiKey.ToUnsecureString())); } if (CanMakeAuthenticatedRequest(payload)) { request.AddHeader("apToken", authenticationDetails.Token); payload.Add("OMSId", authenticationDetails.OMSId); payload.Add("AccountId", authenticationDetails.AccountId); } if (request.Method == "POST") { await request.WritePayloadJsonToRequestAsync(payload); } }
protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { if (!CanMakeAuthenticatedRequest(payload)) { return; } // We don't need nonce in the request. Using it only to not break CanMakeAuthenticatedRequest. payload.Remove("nonce"); var method = request.Method; var now = DateTime.Now; var timeStamp = TimeZoneInfo.ConvertTimeToUtc(now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); var requestUrl = request.RequestUri.PathAndQuery; var body = payload.Any() ? JsonConvert.SerializeObject(payload) : string.Empty; var sign = string.IsNullOrEmpty(body) ? CryptoUtility.SHA256SignBase64($"{timeStamp}{method}{requestUrl}", PrivateApiKey !.ToUnsecureString().ToBytesUTF8()) : CryptoUtility.SHA256SignBase64($"{timeStamp}{method}{requestUrl}{body}", PrivateApiKey !.ToUnsecureString().ToBytesUTF8()); request.AddHeader("OK-ACCESS-KEY", PublicApiKey !.ToUnsecureString()); request.AddHeader("OK-ACCESS-SIGN", sign); request.AddHeader("OK-ACCESS-TIMESTAMP", timeStamp); request.AddHeader("OK-ACCESS-PASSPHRASE", Passphrase !.ToUnsecureString()); request.AddHeader("x-simulated-trading", "0"); request.AddHeader("content-type", "application/json"); if (request.Method == "POST") { await request.WritePayloadJsonToRequestAsync(payload); } }
protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { if (CanMakeAuthenticatedRequest(payload)) { if (request.Method == "POST") { request.AddHeader("content-type", "application/json"); payload.Remove("nonce"); var msg = CryptoUtility.GetJsonForPayload(payload); await CryptoUtility.WriteToRequestAsync(request, msg); } } }
protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { if (CanMakeAuthenticatedRequest(payload)) { // Coinbase is funny and wants a seconds double for the nonce, weird... we convert it to double and back to string invariantly to ensure decimal dot is used and not comma string timestamp = payload["nonce"].ToStringInvariant(); payload.Remove("nonce"); string form = CryptoUtility.GetJsonForPayload(payload); byte[] secret = CryptoUtility.ToBytesBase64Decode(PrivateApiKey); string toHash = timestamp + request.Method.ToUpperInvariant() + request.RequestUri.PathAndQuery + form; string signatureBase64String = CryptoUtility.SHA256SignBase64(toHash, secret); secret = null; toHash = null; request.AddHeader("CB-ACCESS-KEY", PublicApiKey.ToUnsecureString()); request.AddHeader("CB-ACCESS-SIGN", signatureBase64String); request.AddHeader("CB-ACCESS-TIMESTAMP", timestamp); request.AddHeader("CB-ACCESS-PASSPHRASE", CryptoUtility.ToUnsecureString(Passphrase)); if (request.Method == "POST") { await CryptoUtility.WriteToRequestAsync(request, form); } } }
protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { if (CanMakeAuthenticatedRequest(payload)) { if (payload.TryGetValue("body", out var body)) { payload.Remove("body"); } var nonce = payload["nonce"].ToString(); payload.Remove("nonce"); var json = JsonConvert.SerializeObject(body ?? payload); if (json == "{}") { json = ""; } var passphrase = Passphrase?.ToUnsecureString(); if (string.IsNullOrEmpty(passphrase)) { passphrase = PrivateApiKey?.ToUnsecureString(); } var hexSha384 = CryptoUtility.SHA384Sign( $"{request.RequestUri.PathAndQuery.Replace("/spot", string.Empty)}{nonce}{json}", passphrase); request.AddHeader("btse-sign", hexSha384); request.AddHeader("btse-nonce", nonce); request.AddHeader("btse-api", PublicApiKey.ToUnsecureString()); await request.WriteToRequestAsync(json); } await base.ProcessRequestAsync(request, payload); }
protected override async Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { // Only Private APIs are POST and need Authorization if (CanMakeAuthenticatedRequest(payload) && request.Method == "POST") { var signature = string.Empty; payload.Add("key", PublicApiKey.ToUnsecureString()); var jsonContent = payload.GetJsonForPayload(); if (!string.IsNullOrEmpty(jsonContent)) { signature = CryptoUtility.SHA512Sign(jsonContent, PrivateApiKey.ToUnsecureBytesUTF8()).ToLowerInvariant(); } request.AddHeader("Hash", signature); var content = jsonContent.ToBytesUTF8(); await request.WriteAllAsync(content, 0, content.Length); } }
protected override Task ProcessRequestAsync(IHttpWebRequest request, Dictionary <string, object> payload) { if (CanMakeAuthenticatedRequest(payload)) { payload.Remove("nonce"); var bodyPayload = payload.Where(_ => _.Key.StartsWith("body.")).ToDictionary(_ => _.Key.Substring(5), _ => _.Value); var headerPayload = payload.Where(_ => !_.Key.StartsWith("body.")).ToDictionary(_ => _.Key, _ => _.Value); foreach (var item in headerPayload) { request.AddHeader(item.Key, item.Value.ToString()); } if (request.Method == "POST" && bodyPayload.Count() > 0) { //var query = CryptoUtility.GetFormForPayload(bodyPayload); var form = request.WritePayloadFormToRequestAsync(bodyPayload).Result; } } return(base.ProcessRequestAsync(request, payload)); }