From 24ccde46559935db3fcbf83844a5c7890c9a64ec Mon Sep 17 00:00:00 2001 From: KuboOrk Date: Thu, 28 Dec 2023 16:12:12 +0300 Subject: [PATCH 1/2] fixed type of timestamp parameter --- Src/Common/ApiServiceImp/BybitAssetService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Common/ApiServiceImp/BybitAssetService.cs b/Src/Common/ApiServiceImp/BybitAssetService.cs index 0efbb99..20083bf 100644 --- a/Src/Common/ApiServiceImp/BybitAssetService.cs +++ b/Src/Common/ApiServiceImp/BybitAssetService.cs @@ -536,7 +536,7 @@ public BybitAssetService(HttpClient httpClient, string apiKey, string apiSecret, /// /// /// id - public async Task PlaceAssetWithdraw(string coin, string chain, string address, string amount, int timestamp, string? tag = null, int? forceChain = null, AccountType? accountType = null, FeeType? feeType = null) + public async Task PlaceAssetWithdraw(string coin, string chain, string address, string amount, long timestamp, string? tag = null, int? forceChain = null, AccountType? accountType = null, FeeType? feeType = null) { var query = new Dictionary { { "coin", coin }, { "chain", chain }, { "address", address }, { "amount", amount }, { "timestamp", timestamp } }; BybitParametersUtils.AddOptionalParameters(query, From 54b650c52d688f6b9d43ac8b07a2e0b637d9d901 Mon Sep 17 00:00:00 2001 From: Sergio Barrionuevo Date: Tue, 29 Oct 2024 20:20:41 -0500 Subject: [PATCH 2/2] Fixed 'error in signature' Fixed 'error in signature'. Timestamp must be the same in signature as it is in header. It's captured once per request in local variable and then passed to signature generator method and http request generator method to set the header timestamp with same value. --- Src/Common/Services/BybitService.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Src/Common/Services/BybitService.cs b/Src/Common/Services/BybitService.cs index b7d7092..b4caa67 100644 --- a/Src/Common/Services/BybitService.cs +++ b/Src/Common/Services/BybitService.cs @@ -60,7 +60,7 @@ public BybitService(HttpClient httpClient, string? url = BybitConstants.HTTP_MAI content = JsonConvert.SerializeObject(query); } } - return await SendAsync(requestUri, httpMethod, null, content); + return await SendAsync(requestUri, httpMethod, CurrentTimeStamp, null, content); } /// @@ -80,8 +80,9 @@ public BybitService(HttpClient httpClient, string? url = BybitConstants.HTTP_MAI queryStringBuilder = BuildQueryString(query, queryStringBuilder); } + var timeStamp = CurrentTimeStamp; string? signature = null, content = null; - IBybitSignatureService bybitSignatureService = new BybitHmacSignatureGenerator(apiKey, apiSecret, CurrentTimeStamp, recvWindow); + IBybitSignatureService bybitSignatureService = new BybitHmacSignatureGenerator(apiKey, apiSecret, timeStamp, recvWindow); if (httpMethod == HttpMethod.Get) { requestUri = queryStringBuilder.Length > 0 ? requestUri + "?" + queryStringBuilder.ToString() : requestUri; @@ -93,7 +94,7 @@ public BybitService(HttpClient httpClient, string? url = BybitConstants.HTTP_MAI signature = bybitSignatureService.GeneratePostSignature(query ?? new Dictionary()); } - return await SendAsync(requestUri, httpMethod, signature, content ?? null); + return await SendAsync(requestUri, httpMethod, timeStamp, signature, content ?? null); } #endregion @@ -143,9 +144,9 @@ private StringBuilder BuildQueryString(Dictionary queryParameter /// Optional signature for authentication. /// Optional content to include in the request body. /// A task that represents the asynchronous operation. The task result contains the deserialized response object of type T or throws an exception if there's an issue. - private async Task SendAsync(string requestUri, HttpMethod httpMethod, string? signature = null, string? content = null) + private async Task SendAsync(string requestUri, HttpMethod httpMethod, string timeStamp, string? signature = null, string? content = null) { - using HttpRequestMessage request = BuildHttpRequest(requestUri, httpMethod, signature, content); + using HttpRequestMessage request = BuildHttpRequest(requestUri, httpMethod, timeStamp, signature, content); LogHttpRequestHeader(request); @@ -247,10 +248,11 @@ private void LogHttpRequestHeader(HttpRequestMessage request) /// /// The URI of the endpoint to request. /// The HTTP method (GET, POST, etc.) of the request. + /// the timestamp /// Optional signature for authentication. /// Optional content to include in the request body. /// Http Request message - private HttpRequestMessage BuildHttpRequest(string requestUri, HttpMethod httpMethod, string? signature, string? content) + private HttpRequestMessage BuildHttpRequest(string requestUri, HttpMethod httpMethod, string timeStamp, string? signature, string? content) { var baseUrl = this.url; var request = new HttpRequestMessage(httpMethod, baseUrl + requestUri); @@ -260,7 +262,7 @@ private HttpRequestMessage BuildHttpRequest(string requestUri, HttpMethod httpMe } request.Headers.Add("User-Agent", UserAgent); request.Headers.Add("X-BAPI-SIGN-TYPE", BybitConstants.DEFAULT_SIGN_TYPE); - request.Headers.Add("X-BAPI-TIMESTAMP", CurrentTimeStamp); + request.Headers.Add("X-BAPI-TIMESTAMP", timeStamp); request.Headers.Add("X-BAPI-RECV-WINDOW", recvWindow); if (this.apiKey is not null) {