Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v2.10.2: feat(#411) add spot SOR order endpoints #412

Merged
merged 1 commit into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "binance",
"version": "2.10.1",
"version": "2.10.2",
"description": "Node.js & JavaScript SDK for Binance REST APIs & WebSockets, with TypeScript & end-to-end tests.",
"main": "lib/index.js",
"types": "lib/index.d.ts",
Expand Down
38 changes: 38 additions & 0 deletions src/main-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,9 @@ import {
ReplaceSpotOrderParams,
ReplaceSpotOrderResultError,
ReplaceSpotOrderResultSuccess,
NewSpotSOROrderParams,
SOROrderResponseFull,
SORTestOrderResponse,
} from './types/spot';

import {
Expand Down Expand Up @@ -859,10 +862,45 @@ export class MainClient extends BaseRestClient {
return this.getPrivate('api/v3/allOrderList', params);
}

/**
* Query open OCO
*/
getAllOpenOCO(): Promise<any> {
return this.getPrivate('api/v3/openOrderList');
}

/**
* Places an order using smart order routing (SOR).
*/
submitNewSOROrder(
params: NewSpotSOROrderParams,
): Promise<SOROrderResponseFull> {
this.validateOrderId(params, 'newClientOrderId');
return this.postPrivate('api/v3/sor/order', params);
}

/**
* Test new order creation and signature/recvWindow using smart order routing (SOR).
* Creates and validates a new order but does not send it into the matching engine.
*/
testNewSOROrder(
params: NewSpotSOROrderParams & { computeCommissionRates?: boolean },
): Promise<{} | SORTestOrderResponse> {
this.validateOrderId(params, 'newClientOrderId');
return this.postPrivate('api/v3/sor/order/test', params);
}

/**
*
*
* Spot Account Endpoints
*
*
*/

/**
* Get current account information
*/
getAccountInformation(): Promise<AccountInformation> {
return this.getPrivate('api/v3/account');
}
Expand Down
100 changes: 87 additions & 13 deletions src/types/spot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,25 @@ export interface GetOCOParams {
origClientOrderId?: string;
}

export interface NewSpotSOROrderParams {
symbol: string;
side: OrderSide;
type: OrderType;
timeInForce?: OrderTimeInForce;
quantity: number;
price?: number;
newClientOrderId?: string;
strategyId?: number;
strategyType?: number;
icebergQty?: number;
newOrderRespType?: OrderResponseType;
selfTradePreventionMode?:
| 'EXPIRE_TAKER'
| 'EXPIRE_MAKER'
| 'EXPIRE_BOTH'
| 'NONE';
}

export type APILockTriggerCondition = 'GCR' | 'IFER' | 'UFR';

export interface APITriggerConditionSymbolStatus {
Expand Down Expand Up @@ -653,42 +672,97 @@ export interface OrderResponseFull {
fills: OrderFill[];
}

export interface GenericReplaceSpotOrderResult<C,N> {
export interface SOROrderFill {
matchType: string;
price: numberInString;
qty: numberInString;
commission: numberInString;
commissionAsset: string;
tradeId: number;
allocId: number;
}

export type SOROrderResponseFull = OrderResponseFull & {
workingTime: number;
fills: SOROrderFill[];
workingFloor: string;
selfTradePreventionMode: string;
usedSor: true;
};

export interface SORTestOrderResponse {
standardCommissionForOrder: {
//Standard commission rates on trades from the order.
maker: numberInString;
taker: numberInString;
};
taxCommissionForOrder: {
//Tax commission rates for trades from the order.
maker: numberInString;
taker: numberInString;
};
discount: {
//Discount on standard commissions when paying in BNB.
enabledForAccount: boolean;
enabledForSymbol: boolean;
discountAsset: string;
discount: numberInString; //Standard commission is reduced by this rate when paying commission in BNB.
};
}

export interface GenericReplaceSpotOrderResult<C, N> {
cancelResult: 'SUCCESS' | 'FAILURE';
newOrderResult: 'SUCCESS' | 'FAILURE' | 'NOT_ATTEMPTED';
cancelResponse: C;
newOrderResponse: N;
}

export interface ReplaceSpotOrderCancelStopFailure extends GenericReplaceSpotOrderResult<GenericCodeMsgError, null> {
export interface ReplaceSpotOrderCancelStopFailure
extends GenericReplaceSpotOrderResult<GenericCodeMsgError, null> {
cancelResult: 'FAILURE';
newOrderResult: 'NOT_ATTEMPTED';
}

export interface ReplaceSpotOrderNewFailure extends GenericReplaceSpotOrderResult<CancelSpotOrderResult, GenericCodeMsgError> {
export interface ReplaceSpotOrderNewFailure
extends GenericReplaceSpotOrderResult<
CancelSpotOrderResult,
GenericCodeMsgError
> {
cancelResult: 'SUCCESS';
newOrderResult: 'FAILURE';
}

export interface ReplaceSpotOrderCancelAllowFailure extends GenericReplaceSpotOrderResult<GenericCodeMsgError, OrderResponseACK | OrderResponseResult | OrderResponseFull> {
export interface ReplaceSpotOrderCancelAllowFailure
extends GenericReplaceSpotOrderResult<
GenericCodeMsgError,
OrderResponseACK | OrderResponseResult | OrderResponseFull
> {
cancelResult: 'FAILURE';
newOrderResult: 'SUCCESS';
}

export interface ReplaceSpotOrderCancelAllFailure extends GenericReplaceSpotOrderResult<GenericCodeMsgError, GenericCodeMsgError> {
export interface ReplaceSpotOrderCancelAllFailure
extends GenericReplaceSpotOrderResult<
GenericCodeMsgError,
GenericCodeMsgError
> {
cancelResult: 'FAILURE';
newOrderResult: 'FAILURE';
}

export interface ReplaceSpotOrderResultError {
data:
| ReplaceSpotOrderCancelStopFailure
| ReplaceSpotOrderNewFailure
| ReplaceSpotOrderCancelAllowFailure
| ReplaceSpotOrderCancelAllFailure
}

export interface ReplaceSpotOrderResultSuccess extends GenericReplaceSpotOrderResult<CancelSpotOrderResult, OrderResponseACK | OrderResponseResult | OrderResponseFull> {
data:
| ReplaceSpotOrderCancelStopFailure
| ReplaceSpotOrderNewFailure
| ReplaceSpotOrderCancelAllowFailure
| ReplaceSpotOrderCancelAllFailure;
}

export interface ReplaceSpotOrderResultSuccess
extends GenericReplaceSpotOrderResult<
CancelSpotOrderResult,
OrderResponseACK | OrderResponseResult | OrderResponseFull
> {
cancelResult: 'SUCCESS';
newOrderResult: 'SUCCESS';
}
Expand Down