fix(#187): signature fails sometimes for spot v3 with param GET requests. add example for query spot tpsl orders
This commit is contained in:
@@ -17,6 +17,7 @@ export const API_ERROR_CODE = {
|
||||
/** This could mean bad request, incorrect value types or even incorrect/missing values */
|
||||
PARAMS_MISSING_OR_WRONG: 10001,
|
||||
INVALID_API_KEY_OR_PERMISSIONS: 10003,
|
||||
SIGNATURE_NOT_VALID: 10004,
|
||||
INCORRECT_API_KEY_PERMISSIONS: 10005,
|
||||
INCORRECT_PRIVATE_OPERATIONS: 3303001,
|
||||
/** Account not unified margin, update required */
|
||||
|
||||
@@ -108,7 +108,7 @@ export default abstract class BaseRestClient {
|
||||
}
|
||||
}
|
||||
|
||||
private isSpotClient() {
|
||||
private isSpotV1Client() {
|
||||
return this.clientType === REST_CLIENT_TYPE_ENUM.spot;
|
||||
}
|
||||
|
||||
@@ -233,7 +233,7 @@ export default abstract class BaseRestClient {
|
||||
isPublicApi
|
||||
);
|
||||
|
||||
if (method === 'GET' || this.isSpotClient()) {
|
||||
if (method === 'GET' || this.isSpotV1Client()) {
|
||||
return {
|
||||
...options,
|
||||
params: signResult.paramsWithSign,
|
||||
@@ -343,13 +343,20 @@ export default abstract class BaseRestClient {
|
||||
|
||||
// usdc is different for some reason
|
||||
if (signMethod === 'usdc') {
|
||||
const sortProperties = false;
|
||||
const signRequestParams =
|
||||
method === 'GET'
|
||||
? serializeParams(res.originalParams, strictParamValidation)
|
||||
? serializeParams(
|
||||
res.originalParams,
|
||||
strictParamValidation,
|
||||
sortProperties
|
||||
)
|
||||
: JSON.stringify(res.originalParams);
|
||||
|
||||
const paramsStr = timestamp + key + recvWindow + signRequestParams;
|
||||
res.sign = await signMessage(paramsStr, this.secret);
|
||||
|
||||
// console.log('sign req: ', paramsStr);
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -360,16 +367,18 @@ export default abstract class BaseRestClient {
|
||||
|
||||
// Optional, set to 5000 by default. Increase if timestamp/recv_window errors are seen.
|
||||
if (recvWindow) {
|
||||
if (this.isSpotClient()) {
|
||||
if (this.isSpotV1Client()) {
|
||||
res.originalParams.recvWindow = recvWindow;
|
||||
} else {
|
||||
res.originalParams.recv_window = recvWindow;
|
||||
}
|
||||
}
|
||||
const sortProperties = true;
|
||||
|
||||
res.serializedParams = serializeParams(
|
||||
res.originalParams,
|
||||
strictParamValidation
|
||||
strictParamValidation,
|
||||
sortProperties
|
||||
);
|
||||
res.sign = await signMessage(res.serializedParams, this.secret);
|
||||
res.paramsWithSign = {
|
||||
|
||||
@@ -30,12 +30,23 @@ export interface RestClientOptions {
|
||||
parse_exceptions?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialise a (flat) object into a query string
|
||||
* @param params the object to serialise
|
||||
* @param strict_validation throw if any properties are undefined
|
||||
* @param sortProperties sort properties alphabetically before building a query string
|
||||
* @returns the params object as a serialised string key1=value1&key2=value2&etc
|
||||
*/
|
||||
export function serializeParams(
|
||||
params: object = {},
|
||||
strict_validation = false
|
||||
strict_validation = false,
|
||||
sortProperties = true
|
||||
): string {
|
||||
return Object.keys(params)
|
||||
.sort()
|
||||
const properties = sortProperties
|
||||
? Object.keys(params).sort()
|
||||
: Object.keys(params);
|
||||
|
||||
return properties
|
||||
.map((key) => {
|
||||
const value = params[key];
|
||||
if (strict_validation === true && typeof value === 'undefined') {
|
||||
|
||||
Reference in New Issue
Block a user