diff --git a/CHANGELOG.md b/CHANGELOG.md index 26457bc..a972bb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## 0.3.8 - 2024-05-30 + +### Added +- `Convert`: + - `GET /sapi/v1/convert/exchangeInfo` + - `GET /sapi/v1/convert/assetInfo` + - `POST /sapi/v1/convert/getQuote` + - `POST /sapi/v1/convert/acceptQuote` + - `GET /sapi/v1/convert/orderStatus` + - `POST /sapi/v1/convert/limit/placeOrder` + - `POST /sapi/v1/convert/limit/cancelOrder` + - `GET /sapi/v1/convert/limit/queryOpenOrders` + - `GET /sapi/v1/convert/tradeFlow` + +- `Portfolio`: + - `GET /sapi/v1/portfolio/account` + - `GET /sapi/v1/portfolio/collateralRate` + - `GET /sapi/v1/portfolio/pmLoan` + - `POST /sapi/v1/portfolio/repay` + - `GET /sapi/v1/portfolio/interest-history` + - `GET /sapi/v1/portfolio/asset-index-price` + - `POST /sapi/v1/portfolio/auto-collection` + - `POST /sapi/v1/portfolio/asset-collection` + - `POST /sapi/v1/portfolio/bnb-transfer` + - `POST /sapi/v1/portfolio/repay-futures-switch` + - `GET /sapi/v1/portfolio/repay-futures-switch` + - `POST /sapi/v1/portfolio/repay-futures-negative-balance` + - `GET /sapi/v1/portfolio/margin-asset-leverage` + +### Changed +- Update dependencies +- Update `GET /api/v3/exchangeInfo` response type +- Correct `createMarginListenKey`, `renewMarginListenKey` and `closeMarginListenKey` url +- Update combined streams for websocket streams +- Update Websocket Testnet endpoint + ## 0.3.7 - 2024-04-04 ### Changed diff --git a/examples/restful/convert/acceptQuote.ts b/examples/restful/convert/acceptQuote.ts new file mode 100644 index 0000000..f1293dd --- /dev/null +++ b/examples/restful/convert/acceptQuote.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { acceptQuoteOptions, acceptQuoteResponse } from '../../../src/modules/restful/convert/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: acceptQuoteOptions = { + recvWindow: 5000, +}; + +client.acceptQuote('12415572564', options).then((res: acceptQuoteResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/cancelLimitOrder.ts b/examples/restful/convert/cancelLimitOrder.ts new file mode 100644 index 0000000..137101e --- /dev/null +++ b/examples/restful/convert/cancelLimitOrder.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { cancelLimitOrderOptions, cancelLimitOrderResponse } from '../../../src/modules/restful/convert/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: cancelLimitOrderOptions = { + recvWindow: 5000, +}; + +client.cancelLimitOrder(1603680255057330400, options).then((res: cancelLimitOrderResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/getConvertTradeHistory.ts b/examples/restful/convert/getConvertTradeHistory.ts new file mode 100644 index 0000000..b1e0757 --- /dev/null +++ b/examples/restful/convert/getConvertTradeHistory.ts @@ -0,0 +1,20 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { getConvertTradeHistoryOptions, getConvertTradeHistoryResponse } from '../../../src/modules/restful/convert/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: getConvertTradeHistoryOptions = { + limit: 100, + recvWindow: 5000, +}; + +client.getConvertTradeHistory(1623824139000, 1626416139000, options).then((res: getConvertTradeHistoryResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/getOrderQuantityPrecisionPerAsset.ts b/examples/restful/convert/getOrderQuantityPrecisionPerAsset.ts new file mode 100644 index 0000000..635fa78 --- /dev/null +++ b/examples/restful/convert/getOrderQuantityPrecisionPerAsset.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { getOrderQuantityPrecisionPerAssetOptions, getOrderQuantityPrecisionPerAssetResponse } from '../../../src/modules/restful/convert/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: getOrderQuantityPrecisionPerAssetOptions = { + recvWindow: 5000, +}; + +client.getOrderQuantityPrecisionPerAsset(options).then((res: getOrderQuantityPrecisionPerAssetResponse[]) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/listAllConvertPairs.ts b/examples/restful/convert/listAllConvertPairs.ts new file mode 100644 index 0000000..0894d7f --- /dev/null +++ b/examples/restful/convert/listAllConvertPairs.ts @@ -0,0 +1,21 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { listAllConvertPairsOptions, listAllConvertPairsResponse } from '../../../src/modules/restful/convert/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: listAllConvertPairsOptions = { + fromAsset: 'BTC', + toAsset: 'USDT', + recvWindow: 5000, +}; + +client.listAllConvertPairs(options).then((res: listAllConvertPairsResponse[]) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/orderStatus.ts b/examples/restful/convert/orderStatus.ts new file mode 100644 index 0000000..3b0ca45 --- /dev/null +++ b/examples/restful/convert/orderStatus.ts @@ -0,0 +1,20 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { orderStatusOptions, orderStatusResponse } from '../../../src/modules/restful/convert/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: orderStatusOptions = { + quoteId: '12415572564', + recvWindow: 5000, +}; + +client.orderStatus(options).then((res: orderStatusResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/placeLimitOrder.ts b/examples/restful/convert/placeLimitOrder.ts new file mode 100644 index 0000000..54a8ea4 --- /dev/null +++ b/examples/restful/convert/placeLimitOrder.ts @@ -0,0 +1,21 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { placeLimitOrderOptions, placeLimitOrderResponse } from '../../../src/modules/restful/convert/types'; +import { ConvertSide, ConvertExpiredType } from '../../../src/modules/enum'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: placeLimitOrderOptions = { + recvWindow: 5000, + baseAmount: 1 +}; + +client.placeLimitOrder('BNB', 'USDT', 1, ConvertSide.BUY, ConvertExpiredType.One_Day, options).then((res: placeLimitOrderResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/queryLimitOpenOrders.ts b/examples/restful/convert/queryLimitOpenOrders.ts new file mode 100644 index 0000000..b998197 --- /dev/null +++ b/examples/restful/convert/queryLimitOpenOrders.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { queryLimitOpenOrdersOptions, queryLimitOpenOrdersResponse } from '../../../src/modules/restful/convert/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: queryLimitOpenOrdersOptions = { + recvWindow: 5000, +}; + +client.queryLimitOpenOrders(options).then((res: queryLimitOpenOrdersResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/convert/sendQuoteRequest.ts b/examples/restful/convert/sendQuoteRequest.ts new file mode 100644 index 0000000..1f9aa9e --- /dev/null +++ b/examples/restful/convert/sendQuoteRequest.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { sendQuoteRequestOptions, sendQuoteRequestResponse } from '../../../src/modules/restful/convert/types'; + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: sendQuoteRequestOptions = { + fromAmount: 0.1, + recvWindow: 5000, +}; + +client.sendQuoteRequest('BNB', 'USDT', options).then((res: sendQuoteRequestResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/bnbTransfer.ts b/examples/restful/portfolioMargin/bnbTransfer.ts new file mode 100644 index 0000000..d2bfd53 --- /dev/null +++ b/examples/restful/portfolioMargin/bnbTransfer.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { bnbTransferOptions, bnbTransferResponse } from '../../../src/modules/restful/portfolioMargin/types'; +import { TransferSide } from '../../../src/modules/enum'; + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: bnbTransferOptions = { + recvWindow: 5000, +}; + +client.bnbTransfer(1.01, TransferSide.TO_UM, options).then((res: bnbTransferResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/changeAutorepayfuturesStatus.ts b/examples/restful/portfolioMargin/changeAutorepayfuturesStatus.ts new file mode 100644 index 0000000..8b32835 --- /dev/null +++ b/examples/restful/portfolioMargin/changeAutorepayfuturesStatus.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { changeAutorepayfuturesStatusOptions, changeAutorepayfuturesStatusResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: changeAutorepayfuturesStatusOptions = { + recvWindow: 5000, +}; + +client.changeAutorepayfuturesStatus(true, options).then((res: changeAutorepayfuturesStatusResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/fundAutocollection.ts b/examples/restful/portfolioMargin/fundAutocollection.ts new file mode 100644 index 0000000..ce3d443 --- /dev/null +++ b/examples/restful/portfolioMargin/fundAutocollection.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { fundAutocollectionOptions, fundAutocollectionResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: fundAutocollectionOptions = { + recvWindow: 5000, +}; + +client.fundAutocollection(options).then((res: fundAutocollectionResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/fundCollectionByAsset.ts b/examples/restful/portfolioMargin/fundCollectionByAsset.ts new file mode 100644 index 0000000..a06cc63 --- /dev/null +++ b/examples/restful/portfolioMargin/fundCollectionByAsset.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { fundCollectionByAssetOptions, fundCollectionByAssetResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: fundCollectionByAssetOptions = { + recvWindow: 5000, +}; + +client.fundCollectionByAsset('BTC', options).then((res: fundCollectionByAssetResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/getAutorepayfuturesStatus.ts b/examples/restful/portfolioMargin/getAutorepayfuturesStatus.ts new file mode 100644 index 0000000..d88c146 --- /dev/null +++ b/examples/restful/portfolioMargin/getAutorepayfuturesStatus.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { getAutorepayfuturesStatusOptions, getAutorepayfuturesStatusResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: getAutorepayfuturesStatusOptions = { + recvWindow: 5000, +}; + +client.getAutorepayfuturesStatus(options).then((res: getAutorepayfuturesStatusResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/getClassicPortfolioMarginNegativeBalanceInterestHistory.ts b/examples/restful/portfolioMargin/getClassicPortfolioMarginNegativeBalanceInterestHistory.ts new file mode 100644 index 0000000..f16bb95 --- /dev/null +++ b/examples/restful/portfolioMargin/getClassicPortfolioMarginNegativeBalanceInterestHistory.ts @@ -0,0 +1,21 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { getClassicPortfolioMarginNegativeBalanceInterestHistoryOptions, getClassicPortfolioMarginNegativeBalanceInterestHistoryResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: getClassicPortfolioMarginNegativeBalanceInterestHistoryOptions = { + asset: 'BNB', + size: 100, + recvWindow: 5000, +}; + +client.getClassicPortfolioMarginNegativeBalanceInterestHistory(options).then((res: getClassicPortfolioMarginNegativeBalanceInterestHistoryResponse[]) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/getPortfolioMarginAssetIndexPrice.ts b/examples/restful/portfolioMargin/getPortfolioMarginAssetIndexPrice.ts new file mode 100644 index 0000000..f68ce27 --- /dev/null +++ b/examples/restful/portfolioMargin/getPortfolioMarginAssetIndexPrice.ts @@ -0,0 +1,18 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { getPortfolioMarginAssetIndexPriceOptions, getPortfolioMarginAssetIndexPriceResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, '', { baseURL: baseURL }); + +const options: getPortfolioMarginAssetIndexPriceOptions = { + asset: 'BNB', +}; + +client.getPortfolioMarginAssetIndexPrice(options).then((res: getPortfolioMarginAssetIndexPriceResponse[]) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/getPortfolioMarginAssetLeverage.ts b/examples/restful/portfolioMargin/getPortfolioMarginAssetLeverage.ts new file mode 100644 index 0000000..77ceda9 --- /dev/null +++ b/examples/restful/portfolioMargin/getPortfolioMarginAssetLeverage.ts @@ -0,0 +1,14 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { getPortfolioMarginAssetLeverageResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, '', { baseURL: baseURL }); + +client.getPortfolioMarginAssetLeverage().then((res: getPortfolioMarginAssetLeverageResponse[]) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/portfolioMarginAccount.ts b/examples/restful/portfolioMargin/portfolioMarginAccount.ts new file mode 100644 index 0000000..e0a4833 --- /dev/null +++ b/examples/restful/portfolioMargin/portfolioMarginAccount.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { portfolioMarginAccountOptions, portfolioMarginAccountResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: portfolioMarginAccountOptions = { + recvWindow: 5000, +}; + +client.portfolioMarginAccount(options).then((res: portfolioMarginAccountResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/portfolioMarginBankruptcyLoanAmount.ts b/examples/restful/portfolioMargin/portfolioMarginBankruptcyLoanAmount.ts new file mode 100644 index 0000000..66b2692 --- /dev/null +++ b/examples/restful/portfolioMargin/portfolioMarginBankruptcyLoanAmount.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { portfolioMarginBankruptcyLoanAmountOptions, portfolioMarginBankruptcyLoanAmountResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: portfolioMarginBankruptcyLoanAmountOptions = { + recvWindow: 5000, +}; + +client.portfolioMarginBankruptcyLoanAmount(options).then((res: portfolioMarginBankruptcyLoanAmountResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/portfolioMarginBankruptcyLoanRepay.ts b/examples/restful/portfolioMargin/portfolioMarginBankruptcyLoanRepay.ts new file mode 100644 index 0000000..a5d03a7 --- /dev/null +++ b/examples/restful/portfolioMargin/portfolioMarginBankruptcyLoanRepay.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { portfolioMarginBankruptcyLoanRepayOptions, portfolioMarginBankruptcyLoanRepayResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: portfolioMarginBankruptcyLoanRepayOptions = { + recvWindow: 5000, +}; + +client.portfolioMarginBankruptcyLoanRepay(options).then((res: portfolioMarginBankruptcyLoanRepayResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/portfolioMarginCollateralRate.ts b/examples/restful/portfolioMargin/portfolioMarginCollateralRate.ts new file mode 100644 index 0000000..577f777 --- /dev/null +++ b/examples/restful/portfolioMargin/portfolioMarginCollateralRate.ts @@ -0,0 +1,16 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { portfolioMarginCollateralRateResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, '', { baseURL: baseURL }); + + + +client.portfolioMarginCollateralRate().then((res: portfolioMarginCollateralRateResponse[]) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/restful/portfolioMargin/repayFuturesNegativeBalance.ts b/examples/restful/portfolioMargin/repayFuturesNegativeBalance.ts new file mode 100644 index 0000000..4563cb4 --- /dev/null +++ b/examples/restful/portfolioMargin/repayFuturesNegativeBalance.ts @@ -0,0 +1,19 @@ +import { Spot } from '../../../src/index'; +import dotenv from 'dotenv'; +import { repayFuturesNegativeBalanceOptions, repayFuturesNegativeBalanceResponse } from '../../../src/modules/restful/portfolioMargin/types'; + + +dotenv.config(); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; +const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + +const options: repayFuturesNegativeBalanceOptions = { + recvWindow: 5000, +}; + +client.repayFuturesNegativeBalance(options).then((res: repayFuturesNegativeBalanceResponse) => { + console.log(res); +}).catch(err => { console.log(err); }); diff --git a/examples/websocketAPI/market/exchangeInfo.ts b/examples/websocketAPI/market/exchangeInfo.ts index d70c124..973b845 100644 --- a/examples/websocketAPI/market/exchangeInfo.ts +++ b/examples/websocketAPI/market/exchangeInfo.ts @@ -41,4 +41,4 @@ const callbackSymbols = { const websocketAPIClientSymbols = new WebsocketAPI('', '', { callbacks: callbackSymbols }); -setTimeout(() => websocketAPIClientSymbols.disconnect(), 20000); \ No newline at end of file +setTimeout(() => websocketAPIClientSymbols.disconnect(), 20000); diff --git a/examples/websocketAPI/market/historicalTrades.ts b/examples/websocketAPI/market/historicalTrades.ts index 57d5509..d131cb9 100644 --- a/examples/websocketAPI/market/historicalTrades.ts +++ b/examples/websocketAPI/market/historicalTrades.ts @@ -24,7 +24,7 @@ const callbacks = { const apiKey = ''; // wsURL is optional, by default it's set to the production site: 'wss://ws-api.binance.com:443/ws-api/v3'. -const websocketAPIClient = new WebsocketAPI(apiKey, '', { callbacks, wsURL: 'wss://testnet.binance.vision/ws-api/v3' }); +const websocketAPIClient = new WebsocketAPI(apiKey, '', { callbacks, wsURL: 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3' }); // disconnect after 20 seconds setTimeout(() => websocketAPIClient.disconnect(), 20000); diff --git a/examples/websocketAPI/trade/cancelOCOOrder.ts b/examples/websocketAPI/trade/cancelOCOOrder.ts index 1bc640b..65a3a52 100644 --- a/examples/websocketAPI/trade/cancelOCOOrder.ts +++ b/examples/websocketAPI/trade/cancelOCOOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const callbacks = { open: (client: WebsocketAPI) => { console.debug('Connected to WebSocket server'); diff --git a/examples/websocketAPI/trade/cancelOpenOrders.ts b/examples/websocketAPI/trade/cancelOpenOrders.ts index 263ab9c..a839ace 100644 --- a/examples/websocketAPI/trade/cancelOpenOrders.ts +++ b/examples/websocketAPI/trade/cancelOpenOrders.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const callbacks = { open: (client: WebsocketAPI) => { console.debug('Connected to WebSocket server'); diff --git a/examples/websocketAPI/trade/cancelOrder.ts b/examples/websocketAPI/trade/cancelOrder.ts index 5aa732e..82eec87 100644 --- a/examples/websocketAPI/trade/cancelOrder.ts +++ b/examples/websocketAPI/trade/cancelOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const options: WsTradeTypes.cancelOrderOptions = { newClientOrderId: 'cancel_order_id_3283713' }; diff --git a/examples/websocketAPI/trade/cancelReplaceOrder.ts b/examples/websocketAPI/trade/cancelReplaceOrder.ts index 995d495..2712f81 100644 --- a/examples/websocketAPI/trade/cancelReplaceOrder.ts +++ b/examples/websocketAPI/trade/cancelReplaceOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const options: WsTradeTypes.cancelReplaceOrderOptions = { timeInForce: TimeInForce.GTC, price: 300, diff --git a/examples/websocketAPI/trade/getOCOOpenOrders.ts b/examples/websocketAPI/trade/getOCOOpenOrders.ts index d68b821..12b5e56 100644 --- a/examples/websocketAPI/trade/getOCOOpenOrders.ts +++ b/examples/websocketAPI/trade/getOCOOpenOrders.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const callbacks = { open: (client: WebsocketAPI) => { console.debug('Connected to WebSocket server'); diff --git a/examples/websocketAPI/trade/getOCOOrder.ts b/examples/websocketAPI/trade/getOCOOrder.ts index cc8111d..cab1203 100644 --- a/examples/websocketAPI/trade/getOCOOrder.ts +++ b/examples/websocketAPI/trade/getOCOOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const callbacks = { open: (client: WebsocketAPI) => { console.debug('Connected to WebSocket server'); diff --git a/examples/websocketAPI/trade/getOrder.ts b/examples/websocketAPI/trade/getOrder.ts index ad0f271..c01d075 100644 --- a/examples/websocketAPI/trade/getOrder.ts +++ b/examples/websocketAPI/trade/getOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const callbacks = { open: (client: WebsocketAPI) => { console.debug('Connected to WebSocket server'); diff --git a/examples/websocketAPI/trade/newOCOOrder.ts b/examples/websocketAPI/trade/newOCOOrder.ts index 51c3be6..e6e0a49 100644 --- a/examples/websocketAPI/trade/newOCOOrder.ts +++ b/examples/websocketAPI/trade/newOCOOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const options: WsTradeTypes.newOCOOrderOptions = { listClientOrderId: 'my_list_order', stopPrice: 330, diff --git a/examples/websocketAPI/trade/newOrder.ts b/examples/websocketAPI/trade/newOrder.ts index d4c4def..f93ef3d 100644 --- a/examples/websocketAPI/trade/newOrder.ts +++ b/examples/websocketAPI/trade/newOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const options: WsTradeTypes.newOrderOptions = { timeInForce: TimeInForce.GTC, price: 300, diff --git a/examples/websocketAPI/trade/openOrders.ts b/examples/websocketAPI/trade/openOrders.ts index 938d7eb..d67ed55 100644 --- a/examples/websocketAPI/trade/openOrders.ts +++ b/examples/websocketAPI/trade/openOrders.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const options: WsTradeTypes.openOrdersOptions = { symbol: 'BNBUSDT' }; diff --git a/examples/websocketAPI/trade/testNewOrder.ts b/examples/websocketAPI/trade/testNewOrder.ts index 6d3e21c..e147f12 100644 --- a/examples/websocketAPI/trade/testNewOrder.ts +++ b/examples/websocketAPI/trade/testNewOrder.ts @@ -5,7 +5,7 @@ dotenv.config(); const apiKey = process.env.BINANCE_API_KEY || ''; const apiSecret = process.env.BINANCE_API_SECRET || ''; -const wsURL = 'wss://testnet.binance.vision/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 +const wsURL = 'wss://ws-api.testnet.binance.vision:9443/ws-api/v3'; // we setup wsURL to testnet. The default value set to production site: wss://ws-api.binance.com/ws-api/v3 const options: WsTradeTypes.testNewOrderOptions = { timeInForce: TimeInForce.GTC, price: 300, diff --git a/examples/websocketStream/multiSubscription.ts b/examples/websocketStream/multiSubscription.ts index 97f4d7f..8b44db2 100644 --- a/examples/websocketStream/multiSubscription.ts +++ b/examples/websocketStream/multiSubscription.ts @@ -6,7 +6,7 @@ const callbacks = { message: (data: string) => console.info(data) }; -const websocketStreamClient = new WebsocketStream({ callbacks }); +const websocketStreamClient = new WebsocketStream({ callbacks, combinedStreams: true }); websocketStreamClient.subscribe(['bnbusdt@depth', 'btcusdt@depth']); diff --git a/package-lock.json b/package-lock.json index ea74bcd..014c6f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@binance/connector-typescript", - "version": "0.3.7", + "version": "0.3.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@binance/connector-typescript", - "version": "0.3.7", + "version": "0.3.8", "license": "MIT", "dependencies": { "axios": "^1.6.0", @@ -27,15 +27,6 @@ "typescript": "^5.2.2" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -50,12 +41,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" }, "engines": { @@ -63,30 +54,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -111,12 +102,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -126,13 +117,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -151,62 +142,62 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -216,86 +207,85 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -376,9 +366,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -448,12 +438,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz", + "integrity": "sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -550,12 +540,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz", + "integrity": "sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -565,33 +555,33 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -609,13 +599,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1791,9 +1781,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -1849,9 +1839,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", - "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", + "version": "20.12.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz", + "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2232,9 +2222,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2385,12 +2375,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2456,9 +2446,9 @@ "dev": true }, "node_modules/bundle-require": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.2.tgz", - "integrity": "sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.1.0.tgz", + "integrity": "sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==", "dev": true, "dependencies": { "load-tsconfig": "^0.2.3" @@ -2498,9 +2488,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001605", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", - "integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", + "version": "1.0.30001625", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz", + "integrity": "sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==", "dev": true, "funding": [ { @@ -2594,9 +2584,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, "node_modules/cliui": { @@ -2738,9 +2728,9 @@ } }, "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -2844,9 +2834,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.726", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.726.tgz", - "integrity": "sha512-xtjfBXn53RORwkbyKvDfTajtnTp0OJoPOIBzXvkNbb7+YYvCHJflba3L7Txyx/6Fov3ov2bGPr/n5MTixmPhdQ==", + "version": "1.4.786", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.786.tgz", + "integrity": "sha512-i/A2UB0sxYViMN0M2zIotQFRIOt1jLuVXudACHBDiJ5gGuAUzf/crZxwlBTdA0O52Hy4CNtTzS7AKRAacs/08Q==", "dev": true }, "node_modules/emittery": { @@ -3236,9 +3226,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -3415,6 +3405,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3605,6 +3596,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -3789,9 +3781,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -4591,12 +4583,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -4647,9 +4639,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -4745,17 +4737,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -4864,25 +4856,25 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -4898,9 +4890,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -5122,9 +5114,9 @@ ] }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/readdirp": { @@ -5218,6 +5210,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -5269,13 +5262,10 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5283,24 +5273,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5509,20 +5481,35 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { "node": ">=16 || 14 >=14.17" }, @@ -5681,9 +5668,9 @@ "dev": true }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.4.tgz", + "integrity": "sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -5699,10 +5686,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -5712,6 +5700,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -5866,9 +5857,9 @@ } }, "node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5885,9 +5876,9 @@ "dev": true }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -5904,8 +5895,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -5984,6 +5975,15 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6039,9 +6039,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -6074,9 +6074,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "dev": true, "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index b74d4d2..06d2060 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@binance/connector-typescript", - "version": "0.3.7", + "version": "0.3.8", "description": "This is a lightweight library that works as a connector to the Binance public API.", "main": "./dist/index.js", "module": "./dist/index.mjs", diff --git a/src/index.ts b/src/index.ts index 315daca..591ef47 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ +import * as RestConvertTypes from './modules/restful/convert/types'; import * as RestMarginTypes from './modules/restful/margin/types'; import * as RestMarketTypes from './modules/restful/market/types'; +import * as RestPortfolioMarginTypes from './modules/restful/portfolioMargin/types'; import * as RestSimpleEarnTypes from './modules/restful/simpleEarn/types'; import * as RestStreamTypes from './modules/restful/stream/types'; import * as RestSubAccountTypes from './modules/restful/subAccount/types'; @@ -22,6 +24,9 @@ import { CancelReplaceMode, CancelResult, CancelRestrictions, + ConvertExpiredType, + ConvertOrderStatus, + ConvertSide, CrossMarginAccountTransferType, CrossMarginAccountType, CrossMarginTrans, @@ -69,6 +74,9 @@ import { OrderStatus, OrderType, Permissions, + PortfolioAccountStatus, + PortfolioAccountType, + PortfolioMarginFrom, PositionSide, PositionStatus, QueryConvertTransfer, @@ -96,12 +104,14 @@ import { ToAccountType, TradeType, TransFrom, + TransferSide, TransTo, TransactionType, UnivStatus, UnivTransferType, Urgency, ValidTime, + WalletType, WithdrawHistory, WorkingFloor } from './modules/enum'; @@ -113,6 +123,9 @@ export { AccountSnapshotType, CancelReplaceMode, CancelResult, CancelRestrictions, + ConvertExpiredType, + ConvertOrderStatus, + ConvertSide, CrossMarginAccountTransferType, CrossMarginAccountType, CrossMarginTrans, @@ -161,6 +174,9 @@ export { AccountSnapshotType, OrderStatus, OrderType, Permissions, + PortfolioAccountStatus, + PortfolioAccountType, + PortfolioMarginFrom, PositionSide, PositionStatus, QueryConvertTransfer, @@ -189,18 +205,22 @@ export { AccountSnapshotType, ToAccountType, TradeType, TransFrom, + TransferSide, TransTo, TransactionType, UnivStatus, UnivTransferType, Urgency, ValidTime, + WalletType, WebsocketAPI, WebsocketStream, WithdrawHistory, WorkingFloor, + RestConvertTypes, RestMarginTypes, RestMarketTypes, + RestPortfolioMarginTypes, RestSimpleEarnTypes, RestStreamTypes, RestSubAccountTypes, diff --git a/src/modules/enum.ts b/src/modules/enum.ts index bc2df9b..b75e25c 100644 --- a/src/modules/enum.ts +++ b/src/modules/enum.ts @@ -35,6 +35,25 @@ export enum CancelRestrictions { ONLY_PARTIALLY_FILLED = 'ONLY_PARTIALLY_FILLED' } +export enum ConvertExpiredType { + One_Day = '1_D', + Three_Day = '3_D', + Seven_Day = '7_D', + Thirty_Day = '30_D', +} + +export enum ConvertOrderStatus { + PROCESS = 'PROCESS', + ACCEPT_SUCCESS = 'ACCEPT_SUCCESS', + SUCCESS = 'SUCCESS', + FAIL = 'FAIL', +} + +export enum ConvertSide { + BUY = 'BUY', + SELL = 'SELL', +} + export enum CrossMarginAccountTransferType { TransferFromMainAccountToMarginAccount = 1, TransferFromMarginAccountToMainAccount = 2, @@ -348,7 +367,28 @@ export enum Permissions { TRD_GRP_010 = 'TRD_GRP_010', TRD_GRP_011 = 'TRD_GRP_011', TRD_GRP_012 = 'TRD_GRP_012', - TRD_GRP_013 = 'TRD_GRP_013' + TRD_GRP_013 = 'TRD_GRP_013', +} + +export enum PortfolioAccountStatus { + NORMAL = 'NORMAL', + MARGIN_CALL = 'MARGIN_CALL', + SUPPLY_MARGIN = 'SUPPLY_MARGIN', + REDUCE_ONLY = 'REDUCE_ONLY', + ACTIVE_LIQUIDATION = 'ACTIVE_LIQUIDATION', + FORCE_LIQUIDATION = 'FORCE_LIQUIDATION', + BANKRUPTED = 'BANKRUPTED', +} + +export enum PortfolioAccountType { + PM_1 = 'PM_1', + PM_2 = 'PM_2', + PM_3 = 'PM_3', +} + +export enum PortfolioMarginFrom { + SPOT = 'SPOT', + MARGIN = 'MARGIN', } export enum PositionSide { @@ -513,6 +553,11 @@ export enum TransFrom { ISOLATED_MARGIN = 'ISOLATED_MARGIN', } +export enum TransferSide { + TO_UM = 'TO_UM', + FROM_UM = 'FROM_UM', +} + export enum TransTo { SPOT = 'SPOT', ISOLATED_MARGIN = 'ISOLATED_MARGIN', @@ -564,6 +609,11 @@ export enum ValidTime { '2m' = '2m', } +export enum WalletType { + SPOT = 'SPOT', + FUNDING = 'FUNDING', +} + export enum WithdrawHistory { EmailSent = 0, Cancelled = 1, diff --git a/src/modules/restful/convert/convert.ts b/src/modules/restful/convert/convert.ts new file mode 100644 index 0000000..33d02dc --- /dev/null +++ b/src/modules/restful/convert/convert.ts @@ -0,0 +1,211 @@ +import { Constructor } from '../../../setters/types'; +import { validateRequiredParameters } from '../../../helpers/utils'; +import { + acceptQuoteOptions, + acceptQuoteResponse, + cancelLimitOrderOptions, + cancelLimitOrderResponse, + getConvertTradeHistoryOptions, + getConvertTradeHistoryResponse, + getOrderQuantityPrecisionPerAssetOptions, + getOrderQuantityPrecisionPerAssetResponse, + listAllConvertPairsOptions, + listAllConvertPairsResponse, + orderStatusOptions, + orderStatusResponse, + placeLimitOrderOptions, + placeLimitOrderResponse, + queryLimitOpenOrdersOptions, + queryLimitOpenOrdersResponse, + sendQuoteRequestOptions, + sendQuoteRequestResponse, +} from './types'; +import { ConvertMethods } from './methods'; +import { ConvertExpiredType, ConvertSide } from '../../enum'; + +export function mixinConvert(base: T): Constructor & T { + return class extends base { + /** + * List All Convert Pairs (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#list-all-convert-pairs} + * + * @param {object} [options] + * @param {string} [options.fromAsset] - User spends coin + * @param {string} [options.toAsset] - User receives coin + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async listAllConvertPairs(options?: listAllConvertPairsOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/convert/exchangeInfo', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Query order quantity precision per asset (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#query-order-quantity-precision-per-asset-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async getOrderQuantityPrecisionPerAsset(options?: getOrderQuantityPrecisionPerAssetOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/convert/assetInfo', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Send quote request (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#send-quote-request-user_data} + * + * @param {string} fromAsset + * @param {string} toAsset + * @param {object} [options] + * @param {number} [options.fromAmount] - When specified, it is the amount you will be debited after the conversion + * @param {number} [options.toAmount] - When specified, it is the amount you will be debited after the conversion + * @param {WalletType} [options.walletType] - SPOT or FUNDING. Default is SPOT + * @param {ValidTime} [options.validTime] - 10s, 30s, 1m, 2m, default 10s + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async sendQuoteRequest(fromAsset: string, toAsset: string, options?: sendQuoteRequestOptions): Promise { + validateRequiredParameters({ fromAsset, toAsset }); + const url = this.prepareSignedPath('/sapi/v1/convert/getQuote', + Object.assign( + options ? options : {}, + { + fromAsset: fromAsset, + toAsset: toAsset + } + ) + ); + return await this.makeRequest('POST', url); + } + + + /** + * Accept Quote (TRADE) {@link https://binance-docs.github.io/apidocs/spot/en/#accept-quote-trade} + * + * @param {string} quoteId + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async acceptQuote(quoteId: string, options?: acceptQuoteOptions): Promise { + validateRequiredParameters({ quoteId }); + const url = this.prepareSignedPath('/sapi/v1/convert/acceptQuote', + Object.assign( + options ? options : {}, + { + quoteId: quoteId + } + ) + ); + return await this.makeRequest('POST', url); + } + + + /** + * Order status (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#order-status-user_data} + * + * @param {object} [options] + * @param {string} [options.orderId] - Either orderId or quoteId is required + * @param {string} [options.quoteId] - Either orderId or quoteId is required + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async orderStatus(options?: orderStatusOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/convert/orderStatus', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Place limit order (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#place-limit-order-user_data} + * + * @param {string} baseAsset - base asset (use the response fromIsBase from GET /sapi/v1/convert/exchangeInfo api to check which one is baseAsset) + * @param {string} quoteAsset - quote asset + * @param {number} limitPrice - Symbol limit price (from baseAsset to quoteAsset) + * @param {ConvertSide} side - BUY or SELL + * @param {ConvertExpiredType} expiredType - 1_D, 3_D, 7_D, 30_D (D means day) + * @param {object} [options] + * @param {number} [options.baseAmount] - Base asset amount. (One of baseAmount or quoteAmount is required) + * @param {number} [options.quoteAmount] - Quote asset amount. (One of baseAmount or quoteAmount is required) + * @param {WalletType} [options.walletType] - SPOT or FUNDING or SPOT_FUNDING. It is to use which type of assets. Default is SPOT. + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async placeLimitOrder(baseAsset: string, quoteAsset: string, limitPrice: number, side: ConvertSide, expiredType: ConvertExpiredType, options?: placeLimitOrderOptions): Promise { + validateRequiredParameters({ baseAsset, quoteAsset, limitPrice, side, expiredType }); + const url = this.prepareSignedPath('/sapi/v1/convert/limit/placeOrder', + Object.assign( + options ? options : {}, + { + baseAsset: baseAsset, + quoteAsset: quoteAsset, + limitPrice: limitPrice, + side: side, + expiredType: expiredType + } + ) + ); + return await this.makeRequest('POST', url); + } + + + /** + * Cancel limit order (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#cancel-limit-order-user_data} + * + * @param {number} orderId - The orderId from placeOrder api + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async cancelLimitOrder(orderId: number, options?: cancelLimitOrderOptions): Promise { + validateRequiredParameters({ orderId }); + const url = this.prepareSignedPath('/sapi/v1/convert/limit/cancelOrder', + Object.assign( + options ? options : {}, + { + orderId: orderId + } + ) + ); + return await this.makeRequest('POST', url); + } + + /** + * Query limit open orders (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#query-limit-open-orders-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - default 100, max 1000 + */ + async queryLimitOpenOrders(options?: queryLimitOpenOrdersOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/convert/limit/queryOpenOrders', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Get Convert Trade History (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#get-convert-trade-history-user_data} + * + * @param {number} startTime - UTC timestamp in ms + * @param {number} endTime - UTC timestamp in ms + * @param {object} [options] + * @param {number} [options.limit] - default 100, max 1000 + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async getConvertTradeHistory(startTime: number, endTime: number, options?: getConvertTradeHistoryOptions): Promise { + validateRequiredParameters({ startTime, endTime }); + const url = this.prepareSignedPath('/sapi/v1/convert/tradeFlow', + Object.assign( + options ? options : {}, + { + startTime: startTime, + endTime: endTime + } + ) + ); + return await this.makeRequest('GET', url); + } + }; +} diff --git a/src/modules/restful/convert/methods.ts b/src/modules/restful/convert/methods.ts new file mode 100644 index 0000000..855932d --- /dev/null +++ b/src/modules/restful/convert/methods.ts @@ -0,0 +1,33 @@ +import { + acceptQuoteOptions, + acceptQuoteResponse, + cancelLimitOrderOptions, + cancelLimitOrderResponse, + getConvertTradeHistoryOptions, + getConvertTradeHistoryResponse, + getOrderQuantityPrecisionPerAssetOptions, + getOrderQuantityPrecisionPerAssetResponse, + listAllConvertPairsOptions, + listAllConvertPairsResponse, + orderStatusOptions, + orderStatusResponse, + placeLimitOrderOptions, + placeLimitOrderResponse, + queryLimitOpenOrdersOptions, + queryLimitOpenOrdersResponse, + sendQuoteRequestOptions, + sendQuoteRequestResponse, +} from './types'; +import { ConvertExpiredType, ConvertSide } from '../../enum'; + +export interface ConvertMethods { + listAllConvertPairs(options?: listAllConvertPairsOptions): Promise; + getOrderQuantityPrecisionPerAsset(options?: getOrderQuantityPrecisionPerAssetOptions): Promise; + sendQuoteRequest(fromAsset: string, toAsset: string, options?: sendQuoteRequestOptions): Promise; + acceptQuote(quoteId: string, options?: acceptQuoteOptions): Promise; + orderStatus(options?: orderStatusOptions): Promise; + placeLimitOrder(baseAsset: string, quoteAsset: string, limitPrice: number, side: ConvertSide, expiredType: ConvertExpiredType, options?: placeLimitOrderOptions): Promise; + cancelLimitOrder(orderId: number, options?: cancelLimitOrderOptions): Promise; + queryLimitOpenOrders(options?: queryLimitOpenOrdersOptions): Promise; + getConvertTradeHistory(startTime: number, endTime: number, options?: getConvertTradeHistoryOptions): Promise; +} diff --git a/src/modules/restful/convert/types.ts b/src/modules/restful/convert/types.ts new file mode 100644 index 0000000..c44618f --- /dev/null +++ b/src/modules/restful/convert/types.ts @@ -0,0 +1,139 @@ +import { ConvertOrderStatus, ValidTime, WalletType } from '../../enum'; + +export interface listAllConvertPairsOptions { + fromAsset?: string; + toAsset?: string; + recvWindow?: number; +} + +export interface listAllConvertPairsResponse { + fromAsset: string; + toAsset: string; + fromAssetMinAmount: string; + fromAssetMaxAmount: string; + toAssetMinAmount: string; + toAssetMaxAmount: string; +} + +export interface getOrderQuantityPrecisionPerAssetOptions { + recvWindow?: number; +} + +export interface getOrderQuantityPrecisionPerAssetResponse { + asset: string; + fraction: number; +} + +export interface sendQuoteRequestOptions { + fromAmount?: number; + toAmount?: number; + walletType?: WalletType; + validTime?: ValidTime; + recvWindow?: number; +} + +export interface sendQuoteRequestResponse { + quoteId: string; + ratio: string; + inverseRatio: string; + validTimestamp: number; + toAmount: string; + fromAmount: string; +} + +export interface acceptQuoteOptions { + recvWindow?: number; +} + +export interface acceptQuoteResponse { + orderId: string; + createTime: number; + orderStatus: ConvertOrderStatus; +} + +export interface orderStatusOptions { + orderId?: string; + quoteId?: string; + recvWindow?: number; +} + +export interface orderStatusResponse { + orderId: bigint; + orderStatus: ConvertOrderStatus; + fromAsset: string; + fromAmount: string; + toAsset: string; + toAmount: string; + ratio: string; + inverseRatio: string; + createTime: number; +} + +export interface getConvertTradeHistoryOptions { + limit?: number; + recvWindow?: number; +} + +export interface getConvertTradeHistoryResponse { + list: getConvertTradeHistoryList[]; + startTime: number; + endTime: number; + limit: number; + moreData: boolean; +} + +export interface getConvertTradeHistoryList { + quoteId: string; + orderId: bigint; + orderStatus: string; + fromAsset: string; + fromAmount: string; + toAsset: string; + toAmount: string; + ratio: string; + inverseRatio: string; + createTime: number; +} + +export interface queryLimitOpenOrdersOptions { + recvWindow?: number; +} + +export interface queryLimitOpenOrdersResponse { + list: queryLimitOpenOrdersList[]; +} + +export interface queryLimitOpenOrdersList { + quoteId: string; + orderId: number; + orderStatus: ConvertOrderStatus; + fromAsset: string; + fromAmount: string; + toAsset: string; + toAmount: string; + ratio: string; + inverseRatio: string; + createTime: number; + expiredTimestamp: number; +} + +export interface placeLimitOrderOptions { + baseAmount?: number; + quoteAmount?: number; + walletType?: WalletType; + recvWindow?: number; +} + +export interface placeLimitOrderResponse { + orderId: number; + status: string; +} + +export interface cancelLimitOrderOptions { + recvWindow?: number; +} + +export interface cancelLimitOrderResponse { + orderId: number; + status: string; +} diff --git a/src/modules/restful/index.ts b/src/modules/restful/index.ts index 4227c32..1b3011c 100644 --- a/src/modules/restful/index.ts +++ b/src/modules/restful/index.ts @@ -1,5 +1,7 @@ +import { mixinConvert } from './convert/convert'; import { mixinMargin } from './margin/margin'; import { mixinMarket } from './market/market'; +import { mixinPortfolioMargin } from './portfolioMargin/portfolioMargin'; import { mixinSimpleEarn } from './simpleEarn/simpleEarn'; import { mixinStream } from './stream/stream'; import { mixinSubAccount } from './subAccount/subAccount'; @@ -7,8 +9,10 @@ import { mixinTrade } from './trade/trade'; import { mixinWallet } from './wallet/wallet'; export { + mixinConvert, mixinMargin, mixinMarket, + mixinPortfolioMargin, mixinSimpleEarn, mixinStream, mixinSubAccount, diff --git a/src/modules/restful/market/methods.ts b/src/modules/restful/market/methods.ts index b6016f1..b5cdf04 100644 --- a/src/modules/restful/market/methods.ts +++ b/src/modules/restful/market/methods.ts @@ -1,5 +1,5 @@ import { Interval } from '../../enum'; -import { +import { checkServerTimeResponse, compressedAggregateTradesListOptions, compressedAggregateTradesListResponse, diff --git a/src/modules/restful/market/types.ts b/src/modules/restful/market/types.ts index ffc2677..e69a8e1 100644 --- a/src/modules/restful/market/types.ts +++ b/src/modules/restful/market/types.ts @@ -40,12 +40,15 @@ export interface exchangeInformationSymbols { orderTypes: string[]; icebergAllowed: boolean; ocoAllowed: boolean; + otoAllowed: boolean; quoteOrderQtyMarketAllowed: boolean; allowTrailingStop: boolean; + cancelReplaceAllowed: boolean; isSpotTradingAllowed: boolean; isMarginTradingAllowed: boolean; filters: filters[]; permissions: string[]; + permissionSets: string[][]; defaultSelfTradePreventionMode: string; allowedSelfTradePreventionModes: string[]; } diff --git a/src/modules/restful/portfolioMargin/methods.ts b/src/modules/restful/portfolioMargin/methods.ts new file mode 100644 index 0000000..cb32113 --- /dev/null +++ b/src/modules/restful/portfolioMargin/methods.ts @@ -0,0 +1,43 @@ +import { TransferSide } from '../../enum'; +import { + bnbTransferOptions, + bnbTransferResponse, + changeAutorepayfuturesStatusOptions, + changeAutorepayfuturesStatusResponse, + fundAutocollectionOptions, + fundAutocollectionResponse, + fundCollectionByAssetOptions, + fundCollectionByAssetResponse, + getAutorepayfuturesStatusOptions, + getAutorepayfuturesStatusResponse, + getClassicPortfolioMarginNegativeBalanceInterestHistoryOptions, + getClassicPortfolioMarginNegativeBalanceInterestHistoryResponse, + getPortfolioMarginAssetIndexPriceOptions, + getPortfolioMarginAssetIndexPriceResponse, + getPortfolioMarginAssetLeverageResponse, + portfolioMarginAccountOptions, + portfolioMarginAccountResponse, + portfolioMarginBankruptcyLoanAmountOptions, + portfolioMarginBankruptcyLoanAmountResponse, + portfolioMarginBankruptcyLoanRepayOptions, + portfolioMarginBankruptcyLoanRepayResponse, + portfolioMarginCollateralRateResponse, + repayFuturesNegativeBalanceOptions, + repayFuturesNegativeBalanceResponse +} from './types'; + +export interface PortfolioMarginMethods { + portfolioMarginAccount(options?: portfolioMarginAccountOptions): Promise; + portfolioMarginCollateralRate(): Promise; + portfolioMarginBankruptcyLoanAmount(options?: portfolioMarginBankruptcyLoanAmountOptions): Promise; + portfolioMarginBankruptcyLoanRepay(options?: portfolioMarginBankruptcyLoanRepayOptions): Promise; + getClassicPortfolioMarginNegativeBalanceInterestHistory(options?: getClassicPortfolioMarginNegativeBalanceInterestHistoryOptions): Promise; + getPortfolioMarginAssetIndexPrice(options?: getPortfolioMarginAssetIndexPriceOptions): Promise; + fundAutocollection(options?: fundAutocollectionOptions): Promise; + fundCollectionByAsset(asset: string, options?: fundCollectionByAssetOptions): Promise; + bnbTransfer(amount: number, transferSide: TransferSide, options?: bnbTransferOptions): Promise; + changeAutorepayfuturesStatus(autoRepay: boolean, options?: changeAutorepayfuturesStatusOptions): Promise; + getAutorepayfuturesStatus(options?: getAutorepayfuturesStatusOptions): Promise; + repayFuturesNegativeBalance(options?: repayFuturesNegativeBalanceOptions): Promise; + getPortfolioMarginAssetLeverage(): Promise; +} diff --git a/src/modules/restful/portfolioMargin/portfolioMargin.ts b/src/modules/restful/portfolioMargin/portfolioMargin.ts new file mode 100644 index 0000000..c8517ea --- /dev/null +++ b/src/modules/restful/portfolioMargin/portfolioMargin.ts @@ -0,0 +1,230 @@ +import { Constructor } from '../../../setters/types'; +import { validateRequiredParameters } from '../../../helpers/utils'; +import { + bnbTransferOptions, + bnbTransferResponse, + changeAutorepayfuturesStatusOptions, + changeAutorepayfuturesStatusResponse, + fundAutocollectionOptions, + fundAutocollectionResponse, + fundCollectionByAssetOptions, + fundCollectionByAssetResponse, + getAutorepayfuturesStatusOptions, + getAutorepayfuturesStatusResponse, + getClassicPortfolioMarginNegativeBalanceInterestHistoryOptions, + getClassicPortfolioMarginNegativeBalanceInterestHistoryResponse, + getPortfolioMarginAssetIndexPriceOptions, + getPortfolioMarginAssetIndexPriceResponse, + getPortfolioMarginAssetLeverageResponse, + portfolioMarginAccountOptions, + portfolioMarginAccountResponse, + portfolioMarginBankruptcyLoanAmountOptions, + portfolioMarginBankruptcyLoanAmountResponse, + portfolioMarginBankruptcyLoanRepayOptions, + portfolioMarginBankruptcyLoanRepayResponse, + portfolioMarginCollateralRateResponse, + repayFuturesNegativeBalanceOptions, + repayFuturesNegativeBalanceResponse +} from './types'; +import { TransferSide } from '../../enum'; +import { PortfolioMarginMethods } from './methods'; + +export function mixinPortfolioMargin(base: T): Constructor & T { + return class extends base { + /** + * Get Portfolio Margin Pro Account Info (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#get-portfolio-margin-pro-account-info-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async portfolioMarginAccount(options?: portfolioMarginAccountOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/portfolio/account', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Portfolio Margin Pro Collateral Rate (MARKET_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#portfolio-margin-pro-collateral-rate-market_data} + */ + async portfolioMarginCollateralRate(): Promise { + return await this.makeRequest('GET', '/sapi/v1/portfolio/collateralRate'); + } + + + /** + * Query Portfolio Margin Pro Bankruptcy Loan Amount (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#query-portfolio-margin-pro-bankruptcy-loan-amount-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async portfolioMarginBankruptcyLoanAmount(options?: portfolioMarginBankruptcyLoanAmountOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/portfolio/pmLoan', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Portfolio Margin Bankruptcy Loan Repay (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#portfolio-margin-pro-bankruptcy-loan-repay} + * + * @param {object} [options] + * @param {PortfolioMarginFrom} [options.from] - SPOT or MARGIN,default SPOT + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async portfolioMarginBankruptcyLoanRepay(options?: portfolioMarginBankruptcyLoanRepayOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/portfolio/repay', + options ? options : {} + ); + return await this.makeRequest('POST', url); + } + + + /** + * Query Portfolio Margin Pro Negative Balance Interest History (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#query-portfolio-margin-pro-negative-balance-interest-history-user_data} + * + * @param {object} [options] + * @param {string} [options.asset] + * @param {number} [options.startTime] - UTC timestamp in ms + * @param {number} [options.endTime] - UTC timestamp in ms + * @param {number} [options.size] - Default:10 Max:100 + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async getClassicPortfolioMarginNegativeBalanceInterestHistory(options?: getClassicPortfolioMarginNegativeBalanceInterestHistoryOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/portfolio/interest-history', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Query Portfolio Margin Asset Index Price (MARKET_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#query-portfolio-margin-asset-index-price-market_data} + * + * @param {object} [options] + * @param {string} [options.asset] + */ + async getPortfolioMarginAssetIndexPrice(options?: getPortfolioMarginAssetIndexPriceOptions): Promise { + const url = this.preparePath('/sapi/v1/portfolio/asset-index-price', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Fund Auto-collection (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#fund-auto-collection-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async fundAutocollection(options?: fundAutocollectionOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/portfolio/auto-collection', + options ? options : {} + ); + return await this.makeRequest('POST', url); + } + + + /** + * Fund Collection by Asset (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#fund-collection-by-asset-user_data} + * + * @param {string} asset + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async fundCollectionByAsset(asset: string, options?: fundCollectionByAssetOptions): Promise { + validateRequiredParameters({ asset }); + const url = this.prepareSignedPath('/sapi/v1/portfolio/asset-collection', + Object.assign( + options ? options : {}, + { + asset: asset.toUpperCase() + } + ) + ); + return await this.makeRequest('POST', url); + } + + + /** + * BNB transfer (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#bnb-transfer-user_data} + * + * @param {number} amount + * @param {TransferSide} transferSide + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async bnbTransfer(amount: number, transferSide: TransferSide, options?: bnbTransferOptions): Promise { + validateRequiredParameters({ transferSide, amount }); + const url = this.prepareSignedPath('/sapi/v1/portfolio/bnb-transfer', + Object.assign( + options ? options : {}, + { + transferSide: transferSide, + amount: amount + } + ) + ); + return await this.makeRequest('POST', url); + } + + + /** + * Change Auto-repay-futures Status (TRADE) {@link https://binance-docs.github.io/apidocs/spot/en/#change-auto-repay-futures-status-trade} + * + * @param {boolean} autoRepay + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async changeAutorepayfuturesStatus(autoRepay: boolean, options?: changeAutorepayfuturesStatusOptions): Promise { + validateRequiredParameters({ autoRepay }); + const url = this.prepareSignedPath('/sapi/v1/portfolio/repay-futures-switch', + Object.assign( + options ? options : {}, + { + autoRepay: autoRepay + } + ) + ); + return await this.makeRequest('POST', url); + } + + + /** + * Get Auto-repay-futures Status (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#get-auto-repay-futures-status-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async getAutorepayfuturesStatus(options?: getAutorepayfuturesStatusOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/portfolio/repay-futures-switch', + options ? options : {} + ); + return await this.makeRequest('GET', url); + } + + + /** + * Repay futures Negative Balance (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#repay-futures-negative-balance-user_data} + * + * @param {object} [options] + * @param {number} [options.recvWindow] - The value cannot be greater than 60000 + */ + async repayFuturesNegativeBalance(options?: repayFuturesNegativeBalanceOptions): Promise { + const url = this.prepareSignedPath('/sapi/v1/portfolio/repay-futures-negative-balance', + options ? options : {} + ); + return await this.makeRequest('POST', url); + } + + /** + * Get Portfolio Margin Asset Leverage (USER_DATA) {@link https://binance-docs.github.io/apidocs/spot/en/#get-portfolio-margin-asset-leverage-user_data} + */ + async getPortfolioMarginAssetLeverage(): Promise { + return await this.makeRequest('GET', '/sapi/v1/portfolio/margin-asset-leverage'); + } + }; +} diff --git a/src/modules/restful/portfolioMargin/types.ts b/src/modules/restful/portfolioMargin/types.ts new file mode 100644 index 0000000..52b9dcf --- /dev/null +++ b/src/modules/restful/portfolioMargin/types.ts @@ -0,0 +1,116 @@ +import { PortfolioAccountStatus, PortfolioAccountType, PortfolioMarginFrom } from '../../enum'; + +export interface portfolioMarginAccountOptions { + recvWindow?: number; +} + +export interface portfolioMarginAccountResponse { + uniMMR: string; + accountEquity: string; + actualEquity: string; + accountMaintMargin: string; + accountStatus: PortfolioAccountStatus; + accountType: PortfolioAccountType; +} + +export interface portfolioMarginCollateralRateResponse { + asset: string; + collateralRate: string; +} + +export interface portfolioMarginBankruptcyLoanAmountOptions { + recvWindow?: number; +} + +export interface portfolioMarginBankruptcyLoanAmountResponse { + asset: string; + amount: string; +} + +export interface portfolioMarginBankruptcyLoanRepayOptions { + from?: PortfolioMarginFrom; + recvWindow?: number; +} + +export interface portfolioMarginBankruptcyLoanRepayResponse { + tranId: number; +} + +export interface getClassicPortfolioMarginNegativeBalanceInterestHistoryOptions { + asset?: string; + startTime?: number; + endTime?: number; + size?: number; + recvWindow?: number; +} + +export interface getClassicPortfolioMarginNegativeBalanceInterestHistoryResponse { + asset: string; + interest: string; + interestAccruedTime: number; + interestRate: string; + principal: string; +} + +export interface getPortfolioMarginAssetIndexPriceOptions{ + asset: string; +} + +export interface getPortfolioMarginAssetIndexPriceResponse { + asset: string; + assetIndexPrice: string; + time: number; +} + +export interface fundAutocollectionOptions { + recvWindow?: number; +} + +export interface fundAutocollectionResponse { + msg: string; +} + +export interface fundCollectionByAssetOptions { + recvWindow?: number; +} + +export interface fundCollectionByAssetResponse { + msg: string; +} + +export interface bnbTransferOptions { + recvWindow?: number; +} + +export interface bnbTransferResponse { + tranId: number; +} + +export interface changeAutorepayfuturesStatusOptions { + recvWindow?: number; +} + +export interface changeAutorepayfuturesStatusResponse { + msg: string; +} + +export interface getAutorepayfuturesStatusOptions { + recvWindow?: number; +} + +export interface getAutorepayfuturesStatusResponse { + autoRepay: boolean; +} + +export interface repayFuturesNegativeBalanceOptions { + recvWindow?: number; +} + +export interface repayFuturesNegativeBalanceResponse { + msg: string; +} + +export interface getPortfolioMarginAssetLeverageResponse { + asset: string; + leverage: number; +} diff --git a/src/modules/restful/stream/stream.ts b/src/modules/restful/stream/stream.ts index 1b72102..1ec40dc 100644 --- a/src/modules/restful/stream/stream.ts +++ b/src/modules/restful/stream/stream.ts @@ -41,7 +41,7 @@ export function mixinStream(base: T): Constructor { - return await this.makeRequest('POST', '/api/v1/userDataStream'); + return await this.makeRequest('POST', '/sapi/v1/userDataStream'); } @@ -52,7 +52,7 @@ export function mixinStream(base: T): Constructor> { validateRequiredParameters({ listenKey }); - const url = this.preparePath('/api/v1/userDataStream', { listenKey: listenKey }); + const url = this.preparePath('/sapi/v1/userDataStream', { listenKey: listenKey }); return await this.makeRequest('PUT', url); } @@ -64,7 +64,7 @@ export function mixinStream(base: T): Constructor> { validateRequiredParameters({ listenKey }); - const url = this.preparePath('/api/v1/userDataStream', { listenKey: listenKey }); + const url = this.preparePath('/sapi/v1/userDataStream', { listenKey: listenKey }); return await this.makeRequest('DELETE', url); } diff --git a/src/setters/mixinBase.ts b/src/setters/mixinBase.ts index 14f3592..0836f4c 100644 --- a/src/setters/mixinBase.ts +++ b/src/setters/mixinBase.ts @@ -2,8 +2,10 @@ import { AxiosProxyConfig } from 'axios'; import { httpRequest, buildQueryString, removeEmptyValue } from '../helpers/utils'; import * as crypto from 'crypto'; import { + mixinConvert, mixinMargin, mixinMarket, + mixinPortfolioMargin, mixinSimpleEarn, mixinStream, mixinSubAccount, @@ -17,7 +19,7 @@ import { SpotOptions, WebsocketAPIOptions, WebsocketStreamAPIOptions } from './t import { Logger } from '../helpers/logger'; -export const SpotBase = mixinMargin(mixinMarket(mixinSimpleEarn(mixinStream(mixinSubAccount(mixinTrade(mixinWallet(class { +export const SpotBase = mixinConvert(mixinMargin(mixinMarket(mixinPortfolioMargin(mixinSimpleEarn(mixinStream(mixinSubAccount(mixinTrade(mixinWallet(class { apiKey: string; apiSecret: string; baseURL: string; @@ -88,7 +90,7 @@ export const SpotBase = mixinMargin(mixinMarket(mixinSimpleEarn(mixinStream(mixi } return `${path}?${params}&signature=${signature}`; } -}))))))); +}))))))))); export const WebsocketFeaturesBase = mixinWsAccount(mixinWsMarket(mixinWsTrade(mixinWsUserData(WebsocketBase(class { apiKey: string; diff --git a/src/websocketStream.ts b/src/websocketStream.ts index 1c64cc8..31cda06 100644 --- a/src/websocketStream.ts +++ b/src/websocketStream.ts @@ -20,7 +20,7 @@ export class WebsocketStream extends WebsocketStreamFeaturesBase { subscribe(stream: string | string[]) { if (!this.isConnected()) { - if (Array.isArray(stream)) stream = stream.toString().replace(',', '/'); + if (Array.isArray(stream)) stream = stream.join('/'); const url = this._prepareURL(stream); this.initConnect(url); } else { diff --git a/tests/mock_values/restful/convert/acceptQuote.ts b/tests/mock_values/restful/convert/acceptQuote.ts new file mode 100644 index 0000000..399116b --- /dev/null +++ b/tests/mock_values/restful/convert/acceptQuote.ts @@ -0,0 +1,7 @@ +import { ConvertOrderStatus, RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.acceptQuoteResponse = { + 'orderId':'933256278426274426', + 'createTime':1623381330472, + 'orderStatus':ConvertOrderStatus.PROCESS +}; diff --git a/tests/mock_values/restful/convert/cancelLimitOrder.ts b/tests/mock_values/restful/convert/cancelLimitOrder.ts new file mode 100644 index 0000000..e4a7195 --- /dev/null +++ b/tests/mock_values/restful/convert/cancelLimitOrder.ts @@ -0,0 +1,6 @@ +import { RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.cancelLimitOrderResponse = { + 'orderId': 1603680255057330400, + 'status': 'CANCELED' +}; diff --git a/tests/mock_values/restful/convert/getConvertTradeHistory.ts b/tests/mock_values/restful/convert/getConvertTradeHistory.ts new file mode 100644 index 0000000..fa3288f --- /dev/null +++ b/tests/mock_values/restful/convert/getConvertTradeHistory.ts @@ -0,0 +1,22 @@ +import { RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.getConvertTradeHistoryResponse = { + 'list': [ + { + 'quoteId': 'f3b91c525b2644c7bc1e1cd31b6e1aa6', + 'orderId': 940708407462087195n, + 'orderStatus': 'SUCCESS', + 'fromAsset': 'USDT', + 'fromAmount': '20', + 'toAsset': 'BNB', + 'toAmount': '0.06154036', + 'ratio': '0.00307702', + 'inverseRatio': '324.99', + 'createTime': 1624248872184 + } + ], + 'startTime': 1623824139000, + 'endTime': 1626416139000, + 'limit': 100, + 'moreData': false +}; diff --git a/tests/mock_values/restful/convert/getOrderQuantityPrecisionPerAsset.ts b/tests/mock_values/restful/convert/getOrderQuantityPrecisionPerAsset.ts new file mode 100644 index 0000000..4eb2ebe --- /dev/null +++ b/tests/mock_values/restful/convert/getOrderQuantityPrecisionPerAsset.ts @@ -0,0 +1,12 @@ +import { RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.getOrderQuantityPrecisionPerAssetResponse[] = [ + { + 'asset': 'BTC', + 'fraction': 8 + }, + { + 'asset': 'SHIB', + 'fraction': 2 + } +]; diff --git a/tests/mock_values/restful/convert/listAllConvertPairs.ts b/tests/mock_values/restful/convert/listAllConvertPairs.ts new file mode 100644 index 0000000..033374b --- /dev/null +++ b/tests/mock_values/restful/convert/listAllConvertPairs.ts @@ -0,0 +1,12 @@ +import { RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.listAllConvertPairsResponse[] = [ + { + 'fromAsset':'BTC', + 'toAsset':'USDT', + 'fromAssetMinAmount':'0.0004', + 'fromAssetMaxAmount':'50', + 'toAssetMinAmount':'20', + 'toAssetMaxAmount':'2500000' + } +]; diff --git a/tests/mock_values/restful/convert/orderStatus.ts b/tests/mock_values/restful/convert/orderStatus.ts new file mode 100644 index 0000000..aacc6fb --- /dev/null +++ b/tests/mock_values/restful/convert/orderStatus.ts @@ -0,0 +1,13 @@ +import { ConvertOrderStatus, RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.orderStatusResponse = { + 'orderId': 933256278426274426n, + 'orderStatus': ConvertOrderStatus.SUCCESS, + 'fromAsset': 'BTC', + 'fromAmount': '0.00054414', + 'toAsset': 'USDT', + 'toAmount': '20', + 'ratio': '36755', + 'inverseRatio': '0.00002721', + 'createTime': 1623381330472 +}; diff --git a/tests/mock_values/restful/convert/placeLimitOrder.ts b/tests/mock_values/restful/convert/placeLimitOrder.ts new file mode 100644 index 0000000..d963bab --- /dev/null +++ b/tests/mock_values/restful/convert/placeLimitOrder.ts @@ -0,0 +1,6 @@ +import { RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.placeLimitOrderResponse = { + 'orderId': 1603680255057330400, + 'status': 'PROCESS' +}; diff --git a/tests/mock_values/restful/convert/queryLimitOpenOrders.ts b/tests/mock_values/restful/convert/queryLimitOpenOrders.ts new file mode 100644 index 0000000..6077baf --- /dev/null +++ b/tests/mock_values/restful/convert/queryLimitOpenOrders.ts @@ -0,0 +1,19 @@ +import { ConvertOrderStatus, RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.queryLimitOpenOrdersResponse = { + 'list': [ + { + 'quoteId': '18sdf87kh9df', + 'orderId': 1150901289839, + 'orderStatus': ConvertOrderStatus.SUCCESS, + 'fromAsset': 'BNB', + 'fromAmount': '10', + 'toAsset': 'USDT', + 'toAmount': '2317.89', + 'ratio': '231.789', + 'inverseRatio': '0.00431427', + 'createTime': 1614089498000, + 'expiredTimestamp': 1614099498000 + } + ] +}; diff --git a/tests/mock_values/restful/convert/sendQuoteRequest.ts b/tests/mock_values/restful/convert/sendQuoteRequest.ts new file mode 100644 index 0000000..f36eea6 --- /dev/null +++ b/tests/mock_values/restful/convert/sendQuoteRequest.ts @@ -0,0 +1,10 @@ +import { RestConvertTypes } from '../../../../src/index'; + +export const mockResponse: RestConvertTypes.sendQuoteRequestResponse = { + 'quoteId':'12415572564', + 'ratio':'38163.7', + 'inverseRatio':'0.0000262', + 'validTimestamp':1623319461670, + 'toAmount':'3816.37', + 'fromAmount':'0.1' +}; diff --git a/tests/mock_values/restful/market/exchangeInformation.ts b/tests/mock_values/restful/market/exchangeInformation.ts index 59910c5..91457fa 100644 --- a/tests/mock_values/restful/market/exchangeInformation.ts +++ b/tests/mock_values/restful/market/exchangeInformation.ts @@ -25,8 +25,10 @@ export const mockResponse: RestMarketTypes.exchangeInformationResponse = { 'orderTypes': ['LIMIT'], 'icebergAllowed': true, 'ocoAllowed': true, + 'otoAllowed': false, 'quoteOrderQtyMarketAllowed': true, 'allowTrailingStop': false, + 'cancelReplaceAllowed': false, 'isSpotTradingAllowed': true, 'isMarginTradingAllowed': true, 'filters': [ @@ -37,7 +39,34 @@ export const mockResponse: RestMarketTypes.exchangeInformationResponse = { 'tickSize': '0.00000100' } ], - 'permissions': ['SPOT'], + 'permissions': [], + 'permissionSets': [ + [ + 'SPOT', + 'MARGIN', + 'TRD_GRP_004', + 'TRD_GRP_005', + 'TRD_GRP_006', + 'TRD_GRP_008', + 'TRD_GRP_009', + 'TRD_GRP_010', + 'TRD_GRP_011', + 'TRD_GRP_012', + 'TRD_GRP_013', + 'TRD_GRP_014', + 'TRD_GRP_015', + 'TRD_GRP_016', + 'TRD_GRP_017', + 'TRD_GRP_018', + 'TRD_GRP_019', + 'TRD_GRP_020', + 'TRD_GRP_021', + 'TRD_GRP_022', + 'TRD_GRP_023', + 'TRD_GRP_024', + 'TRD_GRP_025' + ] + ], 'defaultSelfTradePreventionMode': 'NONE', 'allowedSelfTradePreventionModes': ['NONE'] } diff --git a/tests/mock_values/restful/portfolioMargin/bnbTransfer.ts b/tests/mock_values/restful/portfolioMargin/bnbTransfer.ts new file mode 100644 index 0000000..864c283 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/bnbTransfer.ts @@ -0,0 +1,5 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.bnbTransferResponse = { + 'tranId': 100000001 +}; diff --git a/tests/mock_values/restful/portfolioMargin/changeAutorepayfuturesStatus.ts b/tests/mock_values/restful/portfolioMargin/changeAutorepayfuturesStatus.ts new file mode 100644 index 0000000..8349766 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/changeAutorepayfuturesStatus.ts @@ -0,0 +1,5 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.changeAutorepayfuturesStatusResponse = { + 'msg': 'success' +}; diff --git a/tests/mock_values/restful/portfolioMargin/fundAutocollection.ts b/tests/mock_values/restful/portfolioMargin/fundAutocollection.ts new file mode 100644 index 0000000..f996fd3 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/fundAutocollection.ts @@ -0,0 +1,5 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.fundAutocollectionResponse = { + 'msg': 'success' +}; diff --git a/tests/mock_values/restful/portfolioMargin/fundCollectionByAsset.ts b/tests/mock_values/restful/portfolioMargin/fundCollectionByAsset.ts new file mode 100644 index 0000000..0ac9fab --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/fundCollectionByAsset.ts @@ -0,0 +1,5 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.fundCollectionByAssetResponse = { + 'msg': 'success' +}; diff --git a/tests/mock_values/restful/portfolioMargin/getAutorepayfuturesStatus.ts b/tests/mock_values/restful/portfolioMargin/getAutorepayfuturesStatus.ts new file mode 100644 index 0000000..42e6a6a --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/getAutorepayfuturesStatus.ts @@ -0,0 +1,5 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.getAutorepayfuturesStatusResponse = { + 'autoRepay': true +}; diff --git a/tests/mock_values/restful/portfolioMargin/getClassicPortfolioMarginNegativeBalanceInterestHistory.ts b/tests/mock_values/restful/portfolioMargin/getClassicPortfolioMarginNegativeBalanceInterestHistory.ts new file mode 100644 index 0000000..fcb34a5 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/getClassicPortfolioMarginNegativeBalanceInterestHistory.ts @@ -0,0 +1,11 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.getClassicPortfolioMarginNegativeBalanceInterestHistoryResponse[] = [ + { + 'asset': 'USDT', + 'interest': '24.4440', + 'interestAccruedTime': 1670227200000, + 'interestRate': '0.0001164', + 'principal': '210000' + } +]; diff --git a/tests/mock_values/restful/portfolioMargin/getPortfolioMarginAssetIndexPrice.ts b/tests/mock_values/restful/portfolioMargin/getPortfolioMarginAssetIndexPrice.ts new file mode 100644 index 0000000..0faa43f --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/getPortfolioMarginAssetIndexPrice.ts @@ -0,0 +1,9 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.getPortfolioMarginAssetIndexPriceResponse[] = [ + { + 'asset': 'BTC', + 'assetIndexPrice': '28251.9136906', + 'time': 1683518338121 + } +]; diff --git a/tests/mock_values/restful/portfolioMargin/getPortfolioMarginAssetLeverage.ts b/tests/mock_values/restful/portfolioMargin/getPortfolioMarginAssetLeverage.ts new file mode 100644 index 0000000..eaf9eb4 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/getPortfolioMarginAssetLeverage.ts @@ -0,0 +1,12 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.getPortfolioMarginAssetLeverageResponse[] = [ + { + 'asset': 'USDC', + 'leverage': 10 + }, + { + 'asset': 'USDT', + 'leverage': 10 + } +]; diff --git a/tests/mock_values/restful/portfolioMargin/portfolioMarginAccount.ts b/tests/mock_values/restful/portfolioMargin/portfolioMarginAccount.ts new file mode 100644 index 0000000..3df6f02 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/portfolioMarginAccount.ts @@ -0,0 +1,10 @@ +import { PortfolioAccountStatus, PortfolioAccountType, RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.portfolioMarginAccountResponse = { + 'uniMMR': '5167.92171923', + 'accountEquity': '122607.35137903', + 'actualEquity': '142607.35137903', + 'accountMaintMargin': '23.72469206', + 'accountStatus': PortfolioAccountStatus.NORMAL, + 'accountType': PortfolioAccountType.PM_1 +}; diff --git a/tests/mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanAmount.ts b/tests/mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanAmount.ts new file mode 100644 index 0000000..464cc0d --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanAmount.ts @@ -0,0 +1,6 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.portfolioMarginBankruptcyLoanAmountResponse = { + 'asset': 'BUSD', + 'amount': '579.45' +}; diff --git a/tests/mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanRepay.ts b/tests/mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanRepay.ts new file mode 100644 index 0000000..083dce7 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanRepay.ts @@ -0,0 +1,5 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.portfolioMarginBankruptcyLoanRepayResponse = { + 'tranId': 58203331886213504 +}; diff --git a/tests/mock_values/restful/portfolioMargin/portfolioMarginCollateralRate.ts b/tests/mock_values/restful/portfolioMargin/portfolioMarginCollateralRate.ts new file mode 100644 index 0000000..42642a2 --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/portfolioMarginCollateralRate.ts @@ -0,0 +1,13 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.portfolioMarginCollateralRateResponse[] = [ + { + 'asset': 'USDC', + 'collateralRate': '1.0000' + }, + { + 'asset': 'BUSD', + 'collateralRate': '1.0000' + } +]; + \ No newline at end of file diff --git a/tests/mock_values/restful/portfolioMargin/repayFuturesNegativeBalance.ts b/tests/mock_values/restful/portfolioMargin/repayFuturesNegativeBalance.ts new file mode 100644 index 0000000..014788b --- /dev/null +++ b/tests/mock_values/restful/portfolioMargin/repayFuturesNegativeBalance.ts @@ -0,0 +1,5 @@ +import { RestPortfolioMarginTypes } from '../../../../src/index'; + +export const mockResponse: RestPortfolioMarginTypes.repayFuturesNegativeBalanceResponse = { + 'msg': 'success' +}; diff --git a/tests/mock_values/websocket/market/exchangeInfo.ts b/tests/mock_values/websocket/market/exchangeInfo.ts index 9febfd0..1993506 100644 --- a/tests/mock_values/websocket/market/exchangeInfo.ts +++ b/tests/mock_values/websocket/market/exchangeInfo.ts @@ -43,8 +43,10 @@ export const mockExchangeInformation: RestMarketTypes.exchangeInformationRespons ], 'icebergAllowed': true, 'ocoAllowed': true, + 'otoAllowed': false, 'quoteOrderQtyMarketAllowed': true, 'allowTrailingStop': true, + 'cancelReplaceAllowed': true, 'isSpotTradingAllowed': true, 'isMarginTradingAllowed': true, 'filters': [ @@ -61,10 +63,22 @@ export const mockExchangeInformation: RestMarketTypes.exchangeInformationRespons 'stepSize': '0.00100000' } ], - 'permissions': [ - 'SPOT', - 'MARGIN', - 'TRD_GRP_004' + 'permissions': [], + 'permissionSets': [ + [ + 'SPOT', 'MARGIN', + 'TRD_GRP_004', 'TRD_GRP_005', + 'TRD_GRP_006', 'TRD_GRP_008', + 'TRD_GRP_009', 'TRD_GRP_010', + 'TRD_GRP_011', 'TRD_GRP_012', + 'TRD_GRP_013', 'TRD_GRP_014', + 'TRD_GRP_015', 'TRD_GRP_016', + 'TRD_GRP_017', 'TRD_GRP_018', + 'TRD_GRP_019', 'TRD_GRP_020', + 'TRD_GRP_021', 'TRD_GRP_022', + 'TRD_GRP_023', 'TRD_GRP_024', + 'TRD_GRP_025' + ] ], 'defaultSelfTradePreventionMode': 'NONE', 'allowedSelfTradePreventionModes': [ diff --git a/tests/restful/convert/acceptQuote.test.ts b/tests/restful/convert/acceptQuote.test.ts new file mode 100644 index 0000000..b4121c5 --- /dev/null +++ b/tests/restful/convert/acceptQuote.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/acceptQuote'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Accept Quote', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should accept the offered quote by quote ID', async () => { + const spy = jest.spyOn(client, 'acceptQuote').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.acceptQuote('12415572564'); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/cancelLimitOrder.test.ts b/tests/restful/convert/cancelLimitOrder.test.ts new file mode 100644 index 0000000..586acfb --- /dev/null +++ b/tests/restful/convert/cancelLimitOrder.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/cancelLimitOrder'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Cancel limit order', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should cancel a limit order ', async () => { + const spy = jest.spyOn(client, 'cancelLimitOrder').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.cancelLimitOrder(1603680255057330400); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/getConvertTradeHistory.test.ts b/tests/restful/convert/getConvertTradeHistory.test.ts new file mode 100644 index 0000000..5db7a05 --- /dev/null +++ b/tests/restful/convert/getConvertTradeHistory.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/getConvertTradeHistory'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Get Convert Trade History', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should return convert trade history ', async () => { + const spy = jest.spyOn(client, 'getConvertTradeHistory').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.getConvertTradeHistory(1623824139000, 1626416139000); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/getOrderQuantityPrecisionPerAsset.test.ts b/tests/restful/convert/getOrderQuantityPrecisionPerAsset.test.ts new file mode 100644 index 0000000..881a5cf --- /dev/null +++ b/tests/restful/convert/getOrderQuantityPrecisionPerAsset.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/getOrderQuantityPrecisionPerAsset'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Query order quantity precision per asset', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should return supported asset`s precision information', async () => { + const spy = jest.spyOn(client, 'getOrderQuantityPrecisionPerAsset').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.getOrderQuantityPrecisionPerAsset(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/listAllConvertPairs.test.ts b/tests/restful/convert/listAllConvertPairs.test.ts new file mode 100644 index 0000000..4baa743 --- /dev/null +++ b/tests/restful/convert/listAllConvertPairs.test.ts @@ -0,0 +1,27 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/listAllConvertPairs'; +import { RestConvertTypes } from '../../../src/index'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('List All Convert Pairs', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should return all convertible token pairs and the tokens respective upper/lower limits', async () => { + const options: RestConvertTypes.listAllConvertPairsOptions = { + fromAsset: 'BTC' + }; + const spy = jest.spyOn(client, 'listAllConvertPairs').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.listAllConvertPairs(options); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/orderStatus.test.ts b/tests/restful/convert/orderStatus.test.ts new file mode 100644 index 0000000..11307ac --- /dev/null +++ b/tests/restful/convert/orderStatus.test.ts @@ -0,0 +1,27 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/orderStatus'; +import { RestConvertTypes } from '../../../src/index'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Order status', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should return order status by order ID', async () => { + const options: RestConvertTypes.orderStatusOptions = { + quoteId: '12415572564' + }; + const spy = jest.spyOn(client, 'orderStatus').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.orderStatus(options); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/placeLimitOrder.test.ts b/tests/restful/convert/placeLimitOrder.test.ts new file mode 100644 index 0000000..ffb99ff --- /dev/null +++ b/tests/restful/convert/placeLimitOrder.test.ts @@ -0,0 +1,24 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/placeLimitOrder'; +import { ConvertExpiredType, ConvertSide } from '../../../src/index'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Place Limit Order', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should enable users to place a limit order', async () => { + const spy = jest.spyOn(client, 'placeLimitOrder').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.placeLimitOrder('BNB', 'USDT', 1, ConvertSide.BUY, ConvertExpiredType.One_Day); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/queryLimitOpenOrders.test.ts b/tests/restful/convert/queryLimitOpenOrders.test.ts new file mode 100644 index 0000000..e2fe04c --- /dev/null +++ b/tests/restful/convert/queryLimitOpenOrders.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/queryLimitOpenOrders'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Query limit open orders', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should enable users to query for all existing limit orders', async () => { + const spy = jest.spyOn(client, 'queryLimitOpenOrders').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.queryLimitOpenOrders(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/convert/sendQuoteRequest.test.ts b/tests/restful/convert/sendQuoteRequest.test.ts new file mode 100644 index 0000000..60d5c16 --- /dev/null +++ b/tests/restful/convert/sendQuoteRequest.test.ts @@ -0,0 +1,26 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/convert/sendQuoteRequest'; +import { RestConvertTypes } from '../../../src/index'; + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Send quote request', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should request a quote for the requested token pairs', async () => { + const options: RestConvertTypes.sendQuoteRequestOptions = { + fromAmount: 0.1 + }; + const spy = jest.spyOn(client, 'sendQuoteRequest').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.sendQuoteRequest('BTC', 'USDT', options); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/bnbTransfer.test.ts b/tests/restful/portfolio_margin/bnbTransfer.test.ts new file mode 100644 index 0000000..ec54008 --- /dev/null +++ b/tests/restful/portfolio_margin/bnbTransfer.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/bnbTransfer'; +import { TransferSide } from '../../../src/modules/enum'; + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('BNB Transfer', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should transfer BNB Margin or USDM Account', async () => { + const spy = jest.spyOn(client, 'bnbTransfer').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.bnbTransfer(1.01, TransferSide.TO_UM); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/changeAutorepayfuturesStatus.test.ts b/tests/restful/portfolio_margin/changeAutorepayfuturesStatus.test.ts new file mode 100644 index 0000000..ff07443 --- /dev/null +++ b/tests/restful/portfolio_margin/changeAutorepayfuturesStatus.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/changeAutorepayfuturesStatus'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Change Auto-repay-futures Status', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should change Auto-repay-futures Status ', async () => { + const spy = jest.spyOn(client, 'changeAutorepayfuturesStatus').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.changeAutorepayfuturesStatus(true); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/fundAutocollection.test.ts b/tests/restful/portfolio_margin/fundAutocollection.test.ts new file mode 100644 index 0000000..a5daac3 --- /dev/null +++ b/tests/restful/portfolio_margin/fundAutocollection.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/fundAutocollection'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Fund Auto-collection', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should transfers all assets from Futures Account to Margin account', async () => { + const spy = jest.spyOn(client, 'fundAutocollection').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.fundAutocollection(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/fundCollectionByAsset.test.ts b/tests/restful/portfolio_margin/fundCollectionByAsset.test.ts new file mode 100644 index 0000000..2b3a591 --- /dev/null +++ b/tests/restful/portfolio_margin/fundCollectionByAsset.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/fundCollectionByAsset'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Fund Collection by Asset', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should transfers specific asset from Futures Account to Margin account', async () => { + const spy = jest.spyOn(client, 'fundCollectionByAsset').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.fundCollectionByAsset('BTC'); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/getAutorepayfuturesStatus.test.ts b/tests/restful/portfolio_margin/getAutorepayfuturesStatus.test.ts new file mode 100644 index 0000000..8d2d3e7 --- /dev/null +++ b/tests/restful/portfolio_margin/getAutorepayfuturesStatus.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/getAutorepayfuturesStatus'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Get Auto-repay-futures Status', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should query Auto-repay-futures Status', async () => { + const spy = jest.spyOn(client, 'getAutorepayfuturesStatus').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.getAutorepayfuturesStatus(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/getClassicPortfolioMarginNegativeBalanceInterestHistory.test.ts b/tests/restful/portfolio_margin/getClassicPortfolioMarginNegativeBalanceInterestHistory.test.ts new file mode 100644 index 0000000..1aa460d --- /dev/null +++ b/tests/restful/portfolio_margin/getClassicPortfolioMarginNegativeBalanceInterestHistory.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/getClassicPortfolioMarginNegativeBalanceInterestHistory'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Query Classic Portfolio Margin Negative Balance Interest History', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should query interest history of negative balance for portfolio margin', async () => { + const spy = jest.spyOn(client, 'getClassicPortfolioMarginNegativeBalanceInterestHistory').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.getClassicPortfolioMarginNegativeBalanceInterestHistory(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/getPortfolioMarginAssetIndexPrice.test.ts b/tests/restful/portfolio_margin/getPortfolioMarginAssetIndexPrice.test.ts new file mode 100644 index 0000000..5c7bf45 --- /dev/null +++ b/tests/restful/portfolio_margin/getPortfolioMarginAssetIndexPrice.test.ts @@ -0,0 +1,22 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/getPortfolioMarginAssetIndexPrice'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Query Portfolio Margin Asset Index Price', () => { + const client = new Spot(apiKey, '', { baseURL: baseURL }); + + it('should query Portfolio Margin Asset Index Price', async () => { + const spy = jest.spyOn(client, 'getPortfolioMarginAssetIndexPrice').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.getPortfolioMarginAssetIndexPrice(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/getPortfolioMarginAssetLeverage.test.ts b/tests/restful/portfolio_margin/getPortfolioMarginAssetLeverage.test.ts new file mode 100644 index 0000000..e50eb39 --- /dev/null +++ b/tests/restful/portfolio_margin/getPortfolioMarginAssetLeverage.test.ts @@ -0,0 +1,22 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/getPortfolioMarginAssetLeverage'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Get Portfolio Margin Asset Leverage', () => { + const client = new Spot(apiKey, '', { baseURL: baseURL }); + + it('should return portfolio margin asset leverage ', async () => { + const spy = jest.spyOn(client, 'getPortfolioMarginAssetLeverage').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.getPortfolioMarginAssetLeverage(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/portfolioMarginAccount.test.ts b/tests/restful/portfolio_margin/portfolioMarginAccount.test.ts new file mode 100644 index 0000000..6a11471 --- /dev/null +++ b/tests/restful/portfolio_margin/portfolioMarginAccount.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/portfolioMarginAccount'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Portfolio Margin Account', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should get portfolio margin pro account info', async () => { + const spy = jest.spyOn(client, 'portfolioMarginAccount').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.portfolioMarginAccount(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/portfolioMarginBankruptcyLoanAmount.test.ts b/tests/restful/portfolio_margin/portfolioMarginBankruptcyLoanAmount.test.ts new file mode 100644 index 0000000..238dcb0 --- /dev/null +++ b/tests/restful/portfolio_margin/portfolioMarginBankruptcyLoanAmount.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanAmount'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Portfolio Margin Bankruptcy Loan Amount', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should query Portfolio Margin Pro Bankruptcy Loan Amount', async () => { + const spy = jest.spyOn(client, 'portfolioMarginBankruptcyLoanAmount').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.portfolioMarginBankruptcyLoanAmount(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/portfolioMarginBankruptcyLoanRepay.test.ts b/tests/restful/portfolio_margin/portfolioMarginBankruptcyLoanRepay.test.ts new file mode 100644 index 0000000..da47fa0 --- /dev/null +++ b/tests/restful/portfolio_margin/portfolioMarginBankruptcyLoanRepay.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/portfolioMarginBankruptcyLoanRepay'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Portfolio Margin Bankruptcy Loan Repay', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should repay Portfolio Margin Pro Bankruptcy Loan', async () => { + const spy = jest.spyOn(client, 'portfolioMarginBankruptcyLoanRepay').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.portfolioMarginBankruptcyLoanRepay(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/portfolioMarginCollateralRate.test.ts b/tests/restful/portfolio_margin/portfolioMarginCollateralRate.test.ts new file mode 100644 index 0000000..f03604d --- /dev/null +++ b/tests/restful/portfolio_margin/portfolioMarginCollateralRate.test.ts @@ -0,0 +1,22 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/portfolioMarginCollateralRate'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Portfolio Margin Collateral Rate', () => { + const client = new Spot(apiKey, '', { baseURL: baseURL }); + + it('should return Portfolio Margin Pro Collateral Rate ', async () => { + const spy = jest.spyOn(client, 'portfolioMarginCollateralRate').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.portfolioMarginCollateralRate(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +}); diff --git a/tests/restful/portfolio_margin/repayFuturesNegativeBalance.test.ts b/tests/restful/portfolio_margin/repayFuturesNegativeBalance.test.ts new file mode 100644 index 0000000..f3780f3 --- /dev/null +++ b/tests/restful/portfolio_margin/repayFuturesNegativeBalance.test.ts @@ -0,0 +1,23 @@ + +import { expect } from '@jest/globals'; +import { Spot } from '../../../src/index'; +import { mockResponse } from '../../mock_values/restful/portfolioMargin/repayFuturesNegativeBalance'; + + +jest.mock('../../../src/index'); + +const apiKey = process.env.BINANCE_API_KEY || ''; +const apiSecret = process.env.BINANCE_API_SECRET || ''; +const baseURL = process.env.BINANCE_BASE_URL || ''; + +describe('Repay futures Negative Balance', () => { + const client = new Spot(apiKey, apiSecret, { baseURL: baseURL }); + + it('should repay futures Negative Balance', async () => { + const spy = jest.spyOn(client, 'repayFuturesNegativeBalance').mockReturnValue(Promise.resolve(mockResponse)); + const res = await client.repayFuturesNegativeBalance(); + expect(res).toBeDefined(); + expect(res).toBe(mockResponse); + spy.mockRestore(); + }); +});