diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e44658d..f5596a2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,16 @@ API documentation [Changelog](https://www.kucoin.com/docs-new/change-log) -Current synchronized API documentation version [20250313](https://www.kucoin.com/docs-new/change-log#20250313) +Current synchronized API documentation version [20250529](https://www.kucoin.com/docs-new/change-log#20250529) + +## 2025-06-11(1.3.0) +- Update the latest APIs, documentation, etc +- Introduced a new testing framework for all SDKs +- Expanded regression-test coverage for Python components +- Updated Node.js dependencies to address security vulnerabilities + +## 2025-06-11(PHP 0.1.2-alpha) +- Update the latest APIs, documentation, etc ## 2025-05-29(PHP 0.1.1-alpha) - Fix compatibility issues on non-macOS systems by enforcing case-sensitive PSR-4 autoloading. diff --git a/Makefile b/Makefile index 73a0955b..992598b9 100644 --- a/Makefile +++ b/Makefile @@ -99,10 +99,10 @@ $(SUBDIRS): .PHONY: generate generate: setup-logs $(call generate-postman) - $(call generate-code,golang,/pkg/generate,1.2.1) + $(call generate-code,golang,/pkg/generate) $(call generate-code,python,/kucoin_universal_sdk/generate) $(call generate-code,node,/src/generate) - $(call generate-code,php,/src/Generate,0.1.1-alpha) + $(call generate-code,php,/src/Generate,0.1.2-alpha) .PHONY: gen-postman gen-postman: preprocessor diff --git a/README.md b/README.md index 6b66c3cb..16eb8b23 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,15 @@ The **KuCoin Universal SDK** is the official SDK provided by KuCoin, offering a ## 🛠️ Installation -### Latest Version: `1.2.0`(Global API version) +### Latest Version: `1.3.0`(Global API version) -### Python Installation(1.2.1.post1) +### Python Installation ```bash pip install kucoin-universal-sdk ``` -### Golang Installation(1.2.1) +### Golang Installation ```bash go get github.com/Kucoin/kucoin-universal-sdk/sdk/golang @@ -52,10 +52,10 @@ go mod tidy npm install kucoin-universal-sdk ``` -### PHP Installation(0.1.1-alpha) +### PHP Installation(0.1.2-alpha) **Note**: This SDK is currently in the Alpha phase. We are actively iterating and improving its features, stability, and documentation. Feedback and contributions are highly encouraged to help us refine the SDK. ```bash -composer require kucoin/kucoin-universal-sdk=0.1.1-alpha +composer require kucoin/kucoin-universal-sdk=0.1.2-alpha ``` ### Postman Installation diff --git a/VERSION b/VERSION index 0408c30b..8b3a0227 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.2.0 \ No newline at end of file +v1.3.0 \ No newline at end of file diff --git a/generator/plugin/src/main/resources/php-sdk/model_ws.mustache b/generator/plugin/src/main/resources/php-sdk/model_ws.mustache index 1ed5e653..5541dcae 100644 --- a/generator/plugin/src/main/resources/php-sdk/model_ws.mustache +++ b/generator/plugin/src/main/resources/php-sdk/model_ws.mustache @@ -55,19 +55,20 @@ class {{classname}} implements Serializable{ return $serializer->serialize($this, 'json'); } + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ public static function jsonDeserialize($json , $serializer) { + if ($json === null) { + return new self(); + } {{#vars}} - {{#isPrimitiveType}} - $obj = new self(); - $obj->data = $json; - return $obj; - {{/isPrimitiveType}} - {{^isPrimitiveType}} - $item = $serializer->deserialize($json, 'array<{{modelPackage}}\{{complexType}}>', 'json'); - $obj = new self(); - $obj->data = $item; - return $obj; - {{/isPrimitiveType}} + $data = $serializer->deserialize($json, '{{{vendorExtensions.annotationType}}}', 'json'); + $obj = new self(); + $obj->data = $data; + return $obj; {{/vars}} } diff --git a/generator/plugin/src/main/resources/python-sdk/model_ws.mustache b/generator/plugin/src/main/resources/python-sdk/model_ws.mustache index 23cca25a..8d621e49 100644 --- a/generator/plugin/src/main/resources/python-sdk/model_ws.mustache +++ b/generator/plugin/src/main/resources/python-sdk/model_ws.mustache @@ -168,6 +168,10 @@ class {{classname}}(BaseModel): if obj is None: return None + {{#vendorExtensions.x-original-response}} + # original response + obj = {'data':obj} + {{/vendorExtensions.x-original-response}} if not isinstance(obj, dict): return cls.model_validate(obj) diff --git a/generator/plugin/src/test/java/com/kucoin/universal/sdk/plugin/SdkGeneratorTest.java b/generator/plugin/src/test/java/com/kucoin/universal/sdk/plugin/SdkGeneratorTest.java index fe95b13f..1a654d96 100644 --- a/generator/plugin/src/test/java/com/kucoin/universal/sdk/plugin/SdkGeneratorTest.java +++ b/generator/plugin/src/test/java/com/kucoin/universal/sdk/plugin/SdkGeneratorTest.java @@ -10,7 +10,7 @@ public class SdkGeneratorTest { private static final String SDK_NAME = "php-sdk"; private static final String SPEC_NAME = "../../spec/rest/api/openapi-account-subaccount.json"; private static final String SPEC_ENTRY_NAME = "../../spec/rest/entry/openapi-account.json"; - private static final String WS_SPEC_NAME = "../../spec/ws/openapi-margin-private.json"; + private static final String WS_SPEC_NAME = "../../spec/ws/openapi-futures-private.json"; private static final String OUTPUT_DIR = "./out"; private static final String CSV_PATH = "../../spec"; diff --git a/generator/postman/collection.py b/generator/postman/collection.py index 11fcd19c..00483321 100644 --- a/generator/postman/collection.py +++ b/generator/postman/collection.py @@ -98,12 +98,24 @@ def gen_api(self, item): index = path.index(path_var_name_ext) path[index] = "{{" + path_var_name + "}}" + + + # update request req_body = {} if 'type' in request and request['type'] == 'application/json': + + example_data = None + if 'examples' in request: + examples = request['examples'] + if len(examples) > 0: + example = examples[0] + if isinstance(example, dict): + example_data = example['value'] + req_body = { "mode": "raw", - "raw": request['example'], + "raw": example_data, "options": { "raw": { "language": "json" diff --git a/generator/preprocessor/api_meta.py b/generator/preprocessor/api_meta.py index 1ab2d214..defc3702 100644 --- a/generator/preprocessor/api_meta.py +++ b/generator/preprocessor/api_meta.py @@ -293,18 +293,28 @@ def generate_path_operation(api): body_data = api_data['requestBody'] + example_data = None + if 'examples' in body_data: + examples = body_data['examples'] + if len(examples) > 0: + example = examples[0] + if isinstance(example, dict): + example_data = example['value'] + + + ApiMetaUtil.update_schema(body_data['jsonSchema']) # ApiMetaUtil.update_response_schema_required(body_data) path_operation['requestBody'] = { 'content': { 'application/json': { 'schema': body_data['jsonSchema'], - 'example': body_data['example'], + 'example': example_data, } } } try: - example_raw = body_data['example'] + example_raw = example_data filtered_data = "\n".join( line for line in example_raw.splitlines() if not line.strip().startswith("//")) diff --git a/generator/preprocessor/meta_tools.py b/generator/preprocessor/meta_tools.py index b87f34a4..99bc507b 100644 --- a/generator/preprocessor/meta_tools.py +++ b/generator/preprocessor/meta_tools.py @@ -28,6 +28,15 @@ def clear_field(obj): for o in obj: MetaTools.clear_field(o) + @staticmethod + def clear_developing(obj): + if 'apiCollection' in obj: + api_collection = obj['apiCollection'] + if isinstance(api_collection,list) and 'items' in api_collection[0]: + for item in api_collection[0]['items']: + if 'name' in item and item['name'] == 'Developing': + item['items'] = [] + @staticmethod def clear_api_collection(data): if type(data) is list: @@ -99,6 +108,7 @@ def __init__(self, file_path:str): def clean(self): self.clear_garbage() + MetaTools.clear_developing(self.data) MetaTools.clear_field(self.data) def write(self): diff --git a/sdk/golang/CHANGELOG.md b/sdk/golang/CHANGELOG.md index eeac5bcb..f5596a2a 100644 --- a/sdk/golang/CHANGELOG.md +++ b/sdk/golang/CHANGELOG.md @@ -2,7 +2,19 @@ API documentation [Changelog](https://www.kucoin.com/docs-new/change-log) -Current synchronized API documentation version [20250313](https://www.kucoin.com/docs-new/change-log#20250313) +Current synchronized API documentation version [20250529](https://www.kucoin.com/docs-new/change-log#20250529) + +## 2025-06-11(1.3.0) +- Update the latest APIs, documentation, etc +- Introduced a new testing framework for all SDKs +- Expanded regression-test coverage for Python components +- Updated Node.js dependencies to address security vulnerabilities + +## 2025-06-11(PHP 0.1.2-alpha) +- Update the latest APIs, documentation, etc + +## 2025-05-29(PHP 0.1.1-alpha) +- Fix compatibility issues on non-macOS systems by enforcing case-sensitive PSR-4 autoloading. ## 2025-05-27(GO 1.2.1) - Fix the Golang type mapping: map OpenAPI number type to float64 to prevent overflow diff --git a/sdk/golang/README.md b/sdk/golang/README.md index 8f7b2954..ab2e909b 100644 --- a/sdk/golang/README.md +++ b/sdk/golang/README.md @@ -9,7 +9,7 @@ For an overview of the project and SDKs in other languages, refer to the [Main R ## 📦 Installation -### Latest Version: `1.2.1` +### Latest Version: `1.3.0` Install the Golang SDK using `go get`: ```bash diff --git a/sdk/golang/pkg/generate/account/account/api_account_test.go b/sdk/golang/pkg/generate/account/account/api_account_test.go index 8c9c94b1..09dd7919 100644 --- a/sdk/golang/pkg/generate/account/account/api_account_test.go +++ b/sdk/golang/pkg/generate/account/account/api_account_test.go @@ -149,7 +149,7 @@ func TestAccountGetCrossMarginAccountRespModel(t *testing.T) { // Get Account - Cross Margin // /api/v3/margin/accounts - data := "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.02\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"0.02\",\n \"available\": \"0.02\",\n \"hold\": \"0\",\n \"liability\": \"0\",\n \"maxBorrowSize\": \"0\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}" + data := "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"40.8648372\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"38.68855864\",\n \"available\": \"20.01916691\",\n \"hold\": \"18.66939173\",\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"maxBorrowSize\": \"163\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}" commonResp := &types.RestResponse{} err := json.Unmarshal([]byte(data), commonResp) assert.Nil(t, err) @@ -165,7 +165,7 @@ func TestAccountGetIsolatedMarginAccountReqModel(t *testing.T) { // Get Account - Isolated Margin // /api/v3/isolated/accounts - data := "{\"symbol\": \"example_string_default_value\", \"quoteCurrency\": \"USDT\", \"queryType\": \"ISOLATED\"}" + data := "{\"symbol\": \"BTC-USDT\", \"quoteCurrency\": \"USDT\", \"queryType\": \"ISOLATED\"}" req := &GetIsolatedMarginAccountReq{} err := json.Unmarshal([]byte(data), req) req.ToMap() @@ -177,7 +177,7 @@ func TestAccountGetIsolatedMarginAccountRespModel(t *testing.T) { // Get Account - Isolated Margin // /api/v3/isolated/accounts - data := "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.01\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"timestamp\": 1728725465994,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0.01\",\n \"available\": \"0.01\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n }\n }\n ]\n }\n}" + data := "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"4.97047372\",\n \"totalLiabilityOfQuoteCurrency\": \"0.00038891\",\n \"timestamp\": 1747303659773,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0.00038891\",\n \"liabilityPrincipal\": \"0.00038888\",\n \"liabilityInterest\": \"0.00000003\",\n \"total\": \"4.97047372\",\n \"available\": \"4.97047372\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"44\"\n }\n }\n ]\n }\n}" commonResp := &types.RestResponse{} err := json.Unmarshal([]byte(data), commonResp) assert.Nil(t, err) diff --git a/sdk/golang/pkg/generate/account/account/types_get_cross_margin_account_accounts.go b/sdk/golang/pkg/generate/account/account/types_get_cross_margin_account_accounts.go index 37d669da..f209508b 100644 --- a/sdk/golang/pkg/generate/account/account/types_get_cross_margin_account_accounts.go +++ b/sdk/golang/pkg/generate/account/account/types_get_cross_margin_account_accounts.go @@ -20,11 +20,15 @@ type GetCrossMarginAccountAccounts struct { BorrowEnabled bool `json:"borrowEnabled,omitempty"` // Support transfer or not TransferInEnabled bool `json:"transferInEnabled,omitempty"` + // Outstanding principal – the unpaid loan amount + LiabilityPrincipal string `json:"liabilityPrincipal,omitempty"` + // Accrued interest – the unpaid interest amount + LiabilityInterest string `json:"liabilityInterest,omitempty"` } // NewGetCrossMarginAccountAccounts instantiates a new GetCrossMarginAccountAccounts object // This constructor will assign default values to properties that have it defined -func NewGetCrossMarginAccountAccounts(currency string, total string, available string, hold string, liability string, maxBorrowSize string, borrowEnabled bool, transferInEnabled bool) *GetCrossMarginAccountAccounts { +func NewGetCrossMarginAccountAccounts(currency string, total string, available string, hold string, liability string, maxBorrowSize string, borrowEnabled bool, transferInEnabled bool, liabilityPrincipal string, liabilityInterest string) *GetCrossMarginAccountAccounts { this := GetCrossMarginAccountAccounts{} this.Currency = currency this.Total = total @@ -34,6 +38,8 @@ func NewGetCrossMarginAccountAccounts(currency string, total string, available s this.MaxBorrowSize = maxBorrowSize this.BorrowEnabled = borrowEnabled this.TransferInEnabled = transferInEnabled + this.LiabilityPrincipal = liabilityPrincipal + this.LiabilityInterest = liabilityInterest return &this } @@ -54,5 +60,7 @@ func (o *GetCrossMarginAccountAccounts) ToMap() map[string]interface{} { toSerialize["maxBorrowSize"] = o.MaxBorrowSize toSerialize["borrowEnabled"] = o.BorrowEnabled toSerialize["transferInEnabled"] = o.TransferInEnabled + toSerialize["liabilityPrincipal"] = o.LiabilityPrincipal + toSerialize["liabilityInterest"] = o.LiabilityInterest return toSerialize } diff --git a/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets.go b/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets.go index 36f8b41e..18917c4d 100644 --- a/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets.go +++ b/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets.go @@ -5,24 +5,19 @@ package account // GetIsolatedMarginAccountAssets struct for GetIsolatedMarginAccountAssets type GetIsolatedMarginAccountAssets struct { // Symbol - Symbol string `json:"symbol,omitempty"` + Symbol *string `json:"symbol,omitempty"` // Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing - Status string `json:"status,omitempty"` + Status *string `json:"status,omitempty"` // debt ratio - DebtRatio string `json:"debtRatio,omitempty"` - BaseAsset GetIsolatedMarginAccountAssetsBaseAsset `json:"baseAsset,omitempty"` - QuoteAsset GetIsolatedMarginAccountAssetsQuoteAsset `json:"quoteAsset,omitempty"` + DebtRatio *string `json:"debtRatio,omitempty"` + BaseAsset *GetIsolatedMarginAccountAssetsBaseAsset `json:"baseAsset,omitempty"` + QuoteAsset *GetIsolatedMarginAccountAssetsQuoteAsset `json:"quoteAsset,omitempty"` } // NewGetIsolatedMarginAccountAssets instantiates a new GetIsolatedMarginAccountAssets object // This constructor will assign default values to properties that have it defined -func NewGetIsolatedMarginAccountAssets(symbol string, status string, debtRatio string, baseAsset GetIsolatedMarginAccountAssetsBaseAsset, quoteAsset GetIsolatedMarginAccountAssetsQuoteAsset) *GetIsolatedMarginAccountAssets { +func NewGetIsolatedMarginAccountAssets() *GetIsolatedMarginAccountAssets { this := GetIsolatedMarginAccountAssets{} - this.Symbol = symbol - this.Status = status - this.DebtRatio = debtRatio - this.BaseAsset = baseAsset - this.QuoteAsset = quoteAsset return &this } diff --git a/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_base_asset.go b/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_base_asset.go index 8411bc99..c0638e69 100644 --- a/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_base_asset.go +++ b/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_base_asset.go @@ -20,11 +20,15 @@ type GetIsolatedMarginAccountAssetsBaseAsset struct { Hold string `json:"hold,omitempty"` // The user's remaining maximum loan amount MaxBorrowSize string `json:"maxBorrowSize,omitempty"` + // Outstanding principal + LiabilityPrincipal string `json:"liabilityPrincipal,omitempty"` + // Outstanding interest + LiabilityInterest string `json:"liabilityInterest,omitempty"` } // NewGetIsolatedMarginAccountAssetsBaseAsset instantiates a new GetIsolatedMarginAccountAssetsBaseAsset object // This constructor will assign default values to properties that have it defined -func NewGetIsolatedMarginAccountAssetsBaseAsset(currency string, borrowEnabled bool, transferInEnabled bool, liability string, total string, available string, hold string, maxBorrowSize string) *GetIsolatedMarginAccountAssetsBaseAsset { +func NewGetIsolatedMarginAccountAssetsBaseAsset(currency string, borrowEnabled bool, transferInEnabled bool, liability string, total string, available string, hold string, maxBorrowSize string, liabilityPrincipal string, liabilityInterest string) *GetIsolatedMarginAccountAssetsBaseAsset { this := GetIsolatedMarginAccountAssetsBaseAsset{} this.Currency = currency this.BorrowEnabled = borrowEnabled @@ -34,6 +38,8 @@ func NewGetIsolatedMarginAccountAssetsBaseAsset(currency string, borrowEnabled b this.Available = available this.Hold = hold this.MaxBorrowSize = maxBorrowSize + this.LiabilityPrincipal = liabilityPrincipal + this.LiabilityInterest = liabilityInterest return &this } @@ -54,5 +60,7 @@ func (o *GetIsolatedMarginAccountAssetsBaseAsset) ToMap() map[string]interface{} toSerialize["available"] = o.Available toSerialize["hold"] = o.Hold toSerialize["maxBorrowSize"] = o.MaxBorrowSize + toSerialize["liabilityPrincipal"] = o.LiabilityPrincipal + toSerialize["liabilityInterest"] = o.LiabilityInterest return toSerialize } diff --git a/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_quote_asset.go b/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_quote_asset.go index a63d179d..7afbb217 100644 --- a/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_quote_asset.go +++ b/sdk/golang/pkg/generate/account/account/types_get_isolated_margin_account_assets_quote_asset.go @@ -19,12 +19,14 @@ type GetIsolatedMarginAccountAssetsQuoteAsset struct { // Account frozen assets Hold string `json:"hold,omitempty"` // The user's remaining maximum loan amount - MaxBorrowSize string `json:"maxBorrowSize,omitempty"` + MaxBorrowSize string `json:"maxBorrowSize,omitempty"` + LiabilityPrincipal string `json:"liabilityPrincipal,omitempty"` + LiabilityInterest string `json:"liabilityInterest,omitempty"` } // NewGetIsolatedMarginAccountAssetsQuoteAsset instantiates a new GetIsolatedMarginAccountAssetsQuoteAsset object // This constructor will assign default values to properties that have it defined -func NewGetIsolatedMarginAccountAssetsQuoteAsset(currency string, borrowEnabled bool, transferInEnabled bool, liability string, total string, available string, hold string, maxBorrowSize string) *GetIsolatedMarginAccountAssetsQuoteAsset { +func NewGetIsolatedMarginAccountAssetsQuoteAsset(currency string, borrowEnabled bool, transferInEnabled bool, liability string, total string, available string, hold string, maxBorrowSize string, liabilityPrincipal string, liabilityInterest string) *GetIsolatedMarginAccountAssetsQuoteAsset { this := GetIsolatedMarginAccountAssetsQuoteAsset{} this.Currency = currency this.BorrowEnabled = borrowEnabled @@ -34,6 +36,8 @@ func NewGetIsolatedMarginAccountAssetsQuoteAsset(currency string, borrowEnabled this.Available = available this.Hold = hold this.MaxBorrowSize = maxBorrowSize + this.LiabilityPrincipal = liabilityPrincipal + this.LiabilityInterest = liabilityInterest return &this } @@ -54,5 +58,7 @@ func (o *GetIsolatedMarginAccountAssetsQuoteAsset) ToMap() map[string]interface{ toSerialize["available"] = o.Available toSerialize["hold"] = o.Hold toSerialize["maxBorrowSize"] = o.MaxBorrowSize + toSerialize["liabilityPrincipal"] = o.LiabilityPrincipal + toSerialize["liabilityInterest"] = o.LiabilityInterest return toSerialize } diff --git a/sdk/golang/pkg/generate/account/deposit/api_deposit_test.go b/sdk/golang/pkg/generate/account/deposit/api_deposit_test.go index 5ac26707..88c850d9 100644 --- a/sdk/golang/pkg/generate/account/deposit/api_deposit_test.go +++ b/sdk/golang/pkg/generate/account/deposit/api_deposit_test.go @@ -180,7 +180,7 @@ func TestDepositAddDepositAddressV1ReqModel(t *testing.T) { // Add Deposit Address - V1 // /api/v1/deposit-addresses - data := "{\"currency\": \"ETH\", \"chain\": \"eth\"}" + data := "{\"currency\": \"ETH\", \"chain\": \"eth\", \"to\": \"MAIN\"}" req := &AddDepositAddressV1Req{} err := json.Unmarshal([]byte(data), req) req.ToMap() diff --git a/sdk/golang/pkg/generate/account/deposit/types_add_deposit_address_v1_req.go b/sdk/golang/pkg/generate/account/deposit/types_add_deposit_address_v1_req.go index 239e1d3a..de015267 100644 --- a/sdk/golang/pkg/generate/account/deposit/types_add_deposit_address_v1_req.go +++ b/sdk/golang/pkg/generate/account/deposit/types_add_deposit_address_v1_req.go @@ -19,7 +19,7 @@ func NewAddDepositAddressV1Req(currency string) *AddDepositAddressV1Req { this.Currency = currency var chain string = "eth" this.Chain = &chain - var to string = "main" + var to string = "MAIN" this.To = &to return &this } @@ -30,7 +30,7 @@ func NewAddDepositAddressV1ReqWithDefaults() *AddDepositAddressV1Req { this := AddDepositAddressV1Req{} var chain string = "eth" this.Chain = &chain - var to string = "main" + var to string = "MAIN" this.To = &to return &this } diff --git a/sdk/golang/pkg/generate/account/subaccount/api_sub_account_test.go b/sdk/golang/pkg/generate/account/subaccount/api_sub_account_test.go index 6ecd0469..6adf04f8 100644 --- a/sdk/golang/pkg/generate/account/subaccount/api_sub_account_test.go +++ b/sdk/golang/pkg/generate/account/subaccount/api_sub_account_test.go @@ -12,7 +12,7 @@ func TestSubAccountAddSubAccountReqModel(t *testing.T) { // Add sub-account // /api/v2/sub/user/created - data := "{\"password\": \"1234567\", \"remarks\": \"TheRemark\", \"subName\": \"Name1234567\", \"access\": \"Spot\"}" + data := "{\"password\": \"q1234567\", \"access\": \"Spot\", \"subName\": \"subNameTest1\", \"remarks\": \"TheRemark\"}" req := &AddSubAccountReq{} err := json.Unmarshal([]byte(data), req) req.ToMap() @@ -24,7 +24,7 @@ func TestSubAccountAddSubAccountRespModel(t *testing.T) { // Add sub-account // /api/v2/sub/user/created - data := "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 10,\n \"totalNum\": 1,\n \"totalPage\": 1,\n \"items\": [\n {\n \"userId\": \"63743f07e0c5230001761d08\",\n \"uid\": 169579801,\n \"subName\": \"testapi6\",\n \"status\": 2,\n \"type\": 0,\n \"access\": \"All\",\n \"createdAt\": 1668562696000,\n \"remarks\": \"remarks\",\n \"tradeTypes\": [\n \"Spot\",\n \"Futures\",\n \"Margin\"\n ],\n \"openedTradeTypes\": [\n \"Spot\"\n ],\n \"hostedStatus\": null\n }\n ]\n }\n}" + data := "{\n \"code\": \"200000\",\n \"data\": {\n \"uid\": 245730746,\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\",\n \"access\": \"Spot\"\n }\n}" commonResp := &types.RestResponse{} err := json.Unmarshal([]byte(data), commonResp) assert.Nil(t, err) diff --git a/sdk/golang/pkg/generate/account/subaccount/types_add_sub_account_resp.go b/sdk/golang/pkg/generate/account/subaccount/types_add_sub_account_resp.go index 22442427..640e3d80 100644 --- a/sdk/golang/pkg/generate/account/subaccount/types_add_sub_account_resp.go +++ b/sdk/golang/pkg/generate/account/subaccount/types_add_sub_account_resp.go @@ -10,13 +10,13 @@ import ( type AddSubAccountResp struct { // common response CommonResponse *types.RestResponse - // Sub-account UID + // Sub account user id Uid int32 `json:"uid,omitempty"` - // Sub-account name + // Sub account name SubName string `json:"subName,omitempty"` - // Remarks + // Sub account name Remarks string `json:"remarks,omitempty"` - // Permission + // permission Access string `json:"access,omitempty"` } diff --git a/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.go b/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.go index 1048f952..3d0ddcef 100644 --- a/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.go +++ b/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.go @@ -65,6 +65,20 @@ type WithdrawalAPI interface { // +-----------------------+------------+ GetWithdrawalHistory(req *GetWithdrawalHistoryReq, ctx context.Context) (*GetWithdrawalHistoryResp, error) + // GetWithdrawalHistoryById Get Withdrawal History By ID + // Description: Request a withdrawal history by id via this endpoint. + // Documentation: https://www.kucoin.com/docs-new/api-3471890 + // +-----------------------+------------+ + // | Extra API Info | Value | + // +-----------------------+------------+ + // | API-DOMAIN | SPOT | + // | API-CHANNEL | PRIVATE | + // | API-PERMISSION | GENERAL | + // | API-RATE-LIMIT-POOL | MANAGEMENT | + // | API-RATE-LIMIT-WEIGHT | 20 | + // +-----------------------+------------+ + GetWithdrawalHistoryById(req *GetWithdrawalHistoryByIdReq, ctx context.Context) (*GetWithdrawalHistoryByIdResp, error) + // GetWithdrawalHistoryOld Get Withdrawal History - Old // Description: Request a deposit list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page. // Documentation: https://www.kucoin.com/docs-new/api-3470308 @@ -128,6 +142,12 @@ func (impl *WithdrawalAPIImpl) GetWithdrawalHistory(req *GetWithdrawalHistoryReq return resp, err } +func (impl *WithdrawalAPIImpl) GetWithdrawalHistoryById(req *GetWithdrawalHistoryByIdReq, ctx context.Context) (*GetWithdrawalHistoryByIdResp, error) { + resp := &GetWithdrawalHistoryByIdResp{} + err := impl.transport.Call(ctx, "spot", false, "Get", "/api/v1/withdrawals/{withdrawalId}", req, resp, false) + return resp, err +} + func (impl *WithdrawalAPIImpl) GetWithdrawalHistoryOld(req *GetWithdrawalHistoryOldReq, ctx context.Context) (*GetWithdrawalHistoryOldResp, error) { resp := &GetWithdrawalHistoryOldResp{} err := impl.transport.Call(ctx, "spot", false, "Get", "/api/v1/hist-withdrawals", req, resp, false) diff --git a/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.template b/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.template index a7be2edc..3e5aea82 100644 --- a/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.template +++ b/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal.template @@ -93,6 +93,29 @@ func TestWithdrawalGetWithdrawalHistoryReq(t *testing.T) { } +func TestWithdrawalGetWithdrawalHistoryByIdReq(t *testing.T) { + // GetWithdrawalHistoryById + // Get Withdrawal History By ID + // /api/v1/withdrawals/{withdrawalId} + + builder := withdrawal.NewGetWithdrawalHistoryByIdReqBuilder() + builder.SetWithdrawalId(?) + req := builder.Build() + + resp, err := withdrawalApi.GetWithdrawalHistoryById(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + + func TestWithdrawalGetWithdrawalHistoryOldReq(t *testing.T) { // GetWithdrawalHistoryOld // Get Withdrawal History - Old diff --git a/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal_test.go b/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal_test.go index 281dbb9d..7d68c20f 100644 --- a/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal_test.go +++ b/sdk/golang/pkg/generate/account/withdrawal/api_withdrawal_test.go @@ -40,7 +40,7 @@ func TestWithdrawalWithdrawalV3ReqModel(t *testing.T) { // Withdraw (V3) // /api/v3/withdrawals - data := "{\"currency\": \"USDT\", \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\", \"amount\": 3, \"withdrawType\": \"ADDRESS\", \"chain\": \"trx\", \"isInner\": true, \"remark\": \"this is Remark\"}" + data := "{\"currency\": \"USDT\", \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\", \"amount\": \"3\", \"withdrawType\": \"ADDRESS\", \"chain\": \"trx\", \"isInner\": true, \"remark\": \"this is Remark\"}" req := &WithdrawalV3Req{} err := json.Unmarshal([]byte(data), req) req.ToMap() @@ -119,6 +119,34 @@ func TestWithdrawalGetWithdrawalHistoryRespModel(t *testing.T) { assert.Nil(t, err) } +func TestWithdrawalGetWithdrawalHistoryByIdReqModel(t *testing.T) { + // GetWithdrawalHistoryById + // Get Withdrawal History By ID + // /api/v1/withdrawals/{withdrawalId} + + data := "{\"withdrawalId\": \"67e6515f7960ba0007b42025\"}" + req := &GetWithdrawalHistoryByIdReq{} + err := json.Unmarshal([]byte(data), req) + req.ToMap() + assert.Nil(t, err) +} + +func TestWithdrawalGetWithdrawalHistoryByIdRespModel(t *testing.T) { + // GetWithdrawalHistoryById + // Get Withdrawal History By ID + // /api/v1/withdrawals/{withdrawalId} + + data := "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"67e6515f7960ba0007b42025\",\n \"uid\": 165111215,\n \"currency\": \"USDT\",\n \"chainId\": \"trx\",\n \"chainName\": \"TRC20\",\n \"currencyName\": \"USDT\",\n \"status\": \"SUCCESS\",\n \"failureReason\": \"\",\n \"failureReasonMsg\": null,\n \"address\": \"TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"3.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"addressRemark\": null,\n \"remark\": \"this is Remark\",\n \"createdAt\": 1743147359000,\n \"cancelType\": \"NON_CANCELABLE\",\n \"taxes\": null,\n \"taxDescription\": null,\n \"returnStatus\": \"NOT_RETURN\",\n \"returnAmount\": null,\n \"returnCurrency\": \"KCS\"\n }\n}" + commonResp := &types.RestResponse{} + err := json.Unmarshal([]byte(data), commonResp) + assert.Nil(t, err) + assert.NotNil(t, commonResp.Data) + resp := &GetWithdrawalHistoryByIdResp{} + err = json.Unmarshal([]byte(commonResp.Data), resp) + resp.ToMap() + assert.Nil(t, err) +} + func TestWithdrawalGetWithdrawalHistoryOldReqModel(t *testing.T) { // GetWithdrawalHistoryOld // Get Withdrawal History - Old diff --git a/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_by_id_req.go b/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_by_id_req.go new file mode 100644 index 00000000..01b681c8 --- /dev/null +++ b/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_by_id_req.go @@ -0,0 +1,47 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package withdrawal + +// GetWithdrawalHistoryByIdReq struct for GetWithdrawalHistoryByIdReq +type GetWithdrawalHistoryByIdReq struct { + // withdrawal ID + WithdrawalId *string `json:"withdrawalId,omitempty" path:"withdrawalId" url:"-"` +} + +// NewGetWithdrawalHistoryByIdReq instantiates a new GetWithdrawalHistoryByIdReq object +// This constructor will assign default values to properties that have it defined +func NewGetWithdrawalHistoryByIdReq() *GetWithdrawalHistoryByIdReq { + this := GetWithdrawalHistoryByIdReq{} + return &this +} + +// NewGetWithdrawalHistoryByIdReqWithDefaults instantiates a new GetWithdrawalHistoryByIdReq object +// This constructor will only assign default values to properties that have it defined, +func NewGetWithdrawalHistoryByIdReqWithDefaults() *GetWithdrawalHistoryByIdReq { + this := GetWithdrawalHistoryByIdReq{} + return &this +} + +func (o *GetWithdrawalHistoryByIdReq) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["withdrawalId"] = o.WithdrawalId + return toSerialize +} + +type GetWithdrawalHistoryByIdReqBuilder struct { + obj *GetWithdrawalHistoryByIdReq +} + +func NewGetWithdrawalHistoryByIdReqBuilder() *GetWithdrawalHistoryByIdReqBuilder { + return &GetWithdrawalHistoryByIdReqBuilder{obj: NewGetWithdrawalHistoryByIdReqWithDefaults()} +} + +// withdrawal ID +func (builder *GetWithdrawalHistoryByIdReqBuilder) SetWithdrawalId(value string) *GetWithdrawalHistoryByIdReqBuilder { + builder.obj.WithdrawalId = &value + return builder +} + +func (builder *GetWithdrawalHistoryByIdReqBuilder) Build() *GetWithdrawalHistoryByIdReq { + return builder.obj +} diff --git a/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_by_id_resp.go b/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_by_id_resp.go new file mode 100644 index 00000000..234252fb --- /dev/null +++ b/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_by_id_resp.go @@ -0,0 +1,125 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package withdrawal + +import ( + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" +) + +// GetWithdrawalHistoryByIdResp struct for GetWithdrawalHistoryByIdResp +type GetWithdrawalHistoryByIdResp struct { + // common response + CommonResponse *types.RestResponse + // Unique ID + Id string `json:"id,omitempty"` + // User ID + Uid int32 `json:"uid,omitempty"` + // A unique currency code that will never change + Currency string `json:"currency,omitempty"` + // The chain id of currency + ChainId string `json:"chainId,omitempty"` + // Chain name of currency + ChainName string `json:"chainName,omitempty"` + // Currency name; will change after renaming + CurrencyName string `json:"currencyName,omitempty"` + // Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE + Status string `json:"status,omitempty"` + // Failure reason code + FailureReason string `json:"failureReason,omitempty"` + // Failure reason message + FailureReasonMsg *string `json:"failureReasonMsg,omitempty"` + // Withwrawal address + Address string `json:"address,omitempty"` + // Address remark. If there’s no remark, it is empty. + Memo string `json:"memo,omitempty"` + // Internal withdrawal or not. + IsInner bool `json:"isInner,omitempty"` + // Withwrawal amount + Amount string `json:"amount,omitempty"` + // Fees charged for withwrawal + Fee string `json:"fee,omitempty"` + // Wallet Transaction ID + WalletTxId *string `json:"walletTxId,omitempty"` + // Address remark + AddressRemark *string `json:"addressRemark,omitempty"` + // Remark + Remark string `json:"remark,omitempty"` + // Creation Time (milliseconds) + CreatedAt int64 `json:"createdAt,omitempty"` + CancelType string `json:"cancelType,omitempty"` + // Users in some regions need query this field + Taxes []string `json:"taxes,omitempty"` + // Tax description + TaxDescription *string `json:"taxDescription,omitempty"` + // Return status + ReturnStatus string `json:"returnStatus,omitempty"` + // Return amount + ReturnAmount *string `json:"returnAmount,omitempty"` + // Return currency + ReturnCurrency string `json:"returnCurrency,omitempty"` +} + +// NewGetWithdrawalHistoryByIdResp instantiates a new GetWithdrawalHistoryByIdResp object +// This constructor will assign default values to properties that have it defined +func NewGetWithdrawalHistoryByIdResp(id string, uid int32, currency string, chainId string, chainName string, currencyName string, status string, failureReason string, address string, memo string, isInner bool, amount string, fee string, remark string, createdAt int64, cancelType string, returnStatus string, returnCurrency string) *GetWithdrawalHistoryByIdResp { + this := GetWithdrawalHistoryByIdResp{} + this.Id = id + this.Uid = uid + this.Currency = currency + this.ChainId = chainId + this.ChainName = chainName + this.CurrencyName = currencyName + this.Status = status + this.FailureReason = failureReason + this.Address = address + this.Memo = memo + this.IsInner = isInner + this.Amount = amount + this.Fee = fee + this.Remark = remark + this.CreatedAt = createdAt + this.CancelType = cancelType + this.ReturnStatus = returnStatus + this.ReturnCurrency = returnCurrency + return &this +} + +// NewGetWithdrawalHistoryByIdRespWithDefaults instantiates a new GetWithdrawalHistoryByIdResp object +// This constructor will only assign default values to properties that have it defined, +func NewGetWithdrawalHistoryByIdRespWithDefaults() *GetWithdrawalHistoryByIdResp { + this := GetWithdrawalHistoryByIdResp{} + return &this +} + +func (o *GetWithdrawalHistoryByIdResp) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["id"] = o.Id + toSerialize["uid"] = o.Uid + toSerialize["currency"] = o.Currency + toSerialize["chainId"] = o.ChainId + toSerialize["chainName"] = o.ChainName + toSerialize["currencyName"] = o.CurrencyName + toSerialize["status"] = o.Status + toSerialize["failureReason"] = o.FailureReason + toSerialize["failureReasonMsg"] = o.FailureReasonMsg + toSerialize["address"] = o.Address + toSerialize["memo"] = o.Memo + toSerialize["isInner"] = o.IsInner + toSerialize["amount"] = o.Amount + toSerialize["fee"] = o.Fee + toSerialize["walletTxId"] = o.WalletTxId + toSerialize["addressRemark"] = o.AddressRemark + toSerialize["remark"] = o.Remark + toSerialize["createdAt"] = o.CreatedAt + toSerialize["cancelType"] = o.CancelType + toSerialize["taxes"] = o.Taxes + toSerialize["taxDescription"] = o.TaxDescription + toSerialize["returnStatus"] = o.ReturnStatus + toSerialize["returnAmount"] = o.ReturnAmount + toSerialize["returnCurrency"] = o.ReturnCurrency + return toSerialize +} + +func (o *GetWithdrawalHistoryByIdResp) SetCommonResponse(response *types.RestResponse) { + o.CommonResponse = response +} diff --git a/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_items.go b/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_items.go index c20b3984..a1858899 100644 --- a/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_items.go +++ b/sdk/golang/pkg/generate/account/withdrawal/types_get_withdrawal_history_items.go @@ -8,21 +8,21 @@ type GetWithdrawalHistoryItems struct { Id *string `json:"id,omitempty"` // Currency Currency *string `json:"currency,omitempty"` - // The id of currency + // The chain id of currency Chain *string `json:"chain,omitempty"` // Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE Status *string `json:"status,omitempty"` - // Deposit address + // Withwrawal address Address *string `json:"address,omitempty"` // Address remark. If there’s no remark, it is empty. Memo *string `json:"memo,omitempty"` // Internal deposit or not IsInner *bool `json:"isInner,omitempty"` - // Deposit amount + // Withwrawal amount Amount *string `json:"amount,omitempty"` - // Fees charged for deposit + // Fees charged for withwrawal Fee *string `json:"fee,omitempty"` - // Wallet Txid + // Wallet Txid, If this is an internal withdrawal, it is empty. WalletTxId *string `json:"walletTxId,omitempty"` // Database record creation time CreatedAt *int64 `json:"createdAt,omitempty"` diff --git a/sdk/golang/pkg/generate/account/withdrawal/types_withdrawal_v3_req.go b/sdk/golang/pkg/generate/account/withdrawal/types_withdrawal_v3_req.go index bb13040e..7e0126bc 100644 --- a/sdk/golang/pkg/generate/account/withdrawal/types_withdrawal_v3_req.go +++ b/sdk/golang/pkg/generate/account/withdrawal/types_withdrawal_v3_req.go @@ -9,7 +9,7 @@ type WithdrawalV3Req struct { // The chainId of currency, For a currency with multiple chains, it is recommended to specify the chain parameter instead of using the default chain; you can query the chainId through the response of the GET /api/v3/currencies/{currency} interface. Chain *string `json:"chain,omitempty"` // Withdrawal amount, a positive number which is a multiple of the amount precision - Amount int64 `json:"amount,omitempty"` + Amount string `json:"amount,omitempty"` // Address remark. If there’s no remark, it is empty. When you withdraw from other platforms to KuCoin, you need to fill in memo(tag). Be careful: If you do not fill in memo(tag), your deposit may not be available. Memo *string `json:"memo,omitempty"` // Internal withdrawal or not. Default: False @@ -26,7 +26,7 @@ type WithdrawalV3Req struct { // NewWithdrawalV3Req instantiates a new WithdrawalV3Req object // This constructor will assign default values to properties that have it defined -func NewWithdrawalV3Req(currency string, amount int64, toAddress string, withdrawType string) *WithdrawalV3Req { +func NewWithdrawalV3Req(currency string, amount string, toAddress string, withdrawType string) *WithdrawalV3Req { this := WithdrawalV3Req{} this.Currency = currency var chain string = "eth" @@ -85,7 +85,7 @@ func (builder *WithdrawalV3ReqBuilder) SetChain(value string) *WithdrawalV3ReqBu } // Withdrawal amount, a positive number which is a multiple of the amount precision -func (builder *WithdrawalV3ReqBuilder) SetAmount(value int64) *WithdrawalV3ReqBuilder { +func (builder *WithdrawalV3ReqBuilder) SetAmount(value string) *WithdrawalV3ReqBuilder { builder.obj.Amount = value return builder } diff --git a/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.go b/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.go index 8daf0540..7307b678 100644 --- a/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.go +++ b/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.go @@ -9,6 +9,48 @@ import ( type NDBrokerAPI interface { + // SubmitKYC Submit KYC + // Description: This endpointcan submit kyc information for a sub-account of nd broker + // Documentation: https://www.kucoin.com/docs-new/api-3472406 + // +-----------------------+---------+ + // | Extra API Info | Value | + // +-----------------------+---------+ + // | API-DOMAIN | BROKER | + // | API-CHANNEL | PRIVATE | + // | API-PERMISSION | GENERAL | + // | API-RATE-LIMIT-POOL | BROKER | + // | API-RATE-LIMIT-WEIGHT | NULL | + // +-----------------------+---------+ + SubmitKYC(req *SubmitKYCReq, ctx context.Context) (*SubmitKYCResp, error) + + // GetKYCStatus Get KYC Status + // Description: This endpoint can query the specified Kyc status + // Documentation: https://www.kucoin.com/docs-new/api-3472407 + // +-----------------------+---------+ + // | Extra API Info | Value | + // +-----------------------+---------+ + // | API-DOMAIN | BROKER | + // | API-CHANNEL | PRIVATE | + // | API-PERMISSION | GENERAL | + // | API-RATE-LIMIT-POOL | BROKER | + // | API-RATE-LIMIT-WEIGHT | NULL | + // +-----------------------+---------+ + GetKYCStatus(req *GetKYCStatusReq, ctx context.Context) (*GetKYCStatusResp, error) + + // GetKYCStatusList Get KYC Status List + // Description: This endpoint can query the specified Kyc status list + // Documentation: https://www.kucoin.com/docs-new/api-3472408 + // +-----------------------+---------+ + // | Extra API Info | Value | + // +-----------------------+---------+ + // | API-DOMAIN | BROKER | + // | API-CHANNEL | PRIVATE | + // | API-PERMISSION | GENERAL | + // | API-RATE-LIMIT-POOL | BROKER | + // | API-RATE-LIMIT-WEIGHT | NULL | + // +-----------------------+---------+ + GetKYCStatusList(req *GetKYCStatusListReq, ctx context.Context) (*GetKYCStatusListResp, error) + // GetBrokerInfo Get Broker Info // Description: This endpoint supports querying the basic information of the current Broker. // Documentation: https://www.kucoin.com/docs-new/api-3470282 @@ -200,6 +242,24 @@ func NewNDBrokerAPIImp(transport interfaces.Transport) *NDBrokerAPIImpl { return &NDBrokerAPIImpl{transport: transport} } +func (impl *NDBrokerAPIImpl) SubmitKYC(req *SubmitKYCReq, ctx context.Context) (*SubmitKYCResp, error) { + resp := &SubmitKYCResp{} + err := impl.transport.Call(ctx, "broker", true, "Post", "/api/kyc/ndBroker/proxyClient/submit", req, resp, false) + return resp, err +} + +func (impl *NDBrokerAPIImpl) GetKYCStatus(req *GetKYCStatusReq, ctx context.Context) (*GetKYCStatusResp, error) { + resp := &GetKYCStatusResp{} + err := impl.transport.Call(ctx, "broker", true, "Get", "/api/kyc/ndBroker/proxyClient/status/list", req, resp, false) + return resp, err +} + +func (impl *NDBrokerAPIImpl) GetKYCStatusList(req *GetKYCStatusListReq, ctx context.Context) (*GetKYCStatusListResp, error) { + resp := &GetKYCStatusListResp{} + err := impl.transport.Call(ctx, "broker", true, "Get", "/api/kyc/ndBroker/proxyClient/status/page", req, resp, false) + return resp, err +} + func (impl *NDBrokerAPIImpl) GetBrokerInfo(req *GetBrokerInfoReq, ctx context.Context) (*GetBrokerInfoResp, error) { resp := &GetBrokerInfoResp{} err := impl.transport.Call(ctx, "broker", true, "Get", "/api/v1/broker/nd/info", req, resp, false) diff --git a/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.template b/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.template index bb5ac27b..41ab1484 100644 --- a/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.template +++ b/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker.template @@ -1,6 +1,75 @@ # API FUNCTION TEMPLATE +func TestNDBrokerSubmitKYCReq(t *testing.T) { + // SubmitKYC + // Submit KYC + // /api/kyc/ndBroker/proxyClient/submit + + builder := ndbroker.NewSubmitKYCReqBuilder() + builder.SetClientUid(?).SetFirstName(?).SetLastName(?).SetIssueCountry(?).SetBirthDate(?).SetIdentityType(?).SetIdentityNumber(?).SetExpireDate(?).SetFrontPhoto(?).SetBackendPhoto(?).SetFacePhoto(?) + req := builder.Build() + + resp, err := ndbrokerApi.SubmitKYC(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + + +func TestNDBrokerGetKYCStatusReq(t *testing.T) { + // GetKYCStatus + // Get KYC Status + // /api/kyc/ndBroker/proxyClient/status/list + + builder := ndbroker.NewGetKYCStatusReqBuilder() + builder.SetClientUids(?) + req := builder.Build() + + resp, err := ndbrokerApi.GetKYCStatus(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + + +func TestNDBrokerGetKYCStatusListReq(t *testing.T) { + // GetKYCStatusList + // Get KYC Status List + // /api/kyc/ndBroker/proxyClient/status/page + + builder := ndbroker.NewGetKYCStatusListReqBuilder() + builder.SetPageNumber(?).SetPageSize(?) + req := builder.Build() + + resp, err := ndbrokerApi.GetKYCStatusList(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + + func TestNDBrokerGetBrokerInfoReq(t *testing.T) { // GetBrokerInfo // Get Broker Info diff --git a/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker_test.go b/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker_test.go index f783b4fe..d86aef96 100644 --- a/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker_test.go +++ b/sdk/golang/pkg/generate/broker/ndbroker/api_nd_broker_test.go @@ -7,6 +7,90 @@ import ( "testing" ) +func TestNDBrokerSubmitKYCReqModel(t *testing.T) { + // SubmitKYC + // Submit KYC + // /api/kyc/ndBroker/proxyClient/submit + + data := "{\"clientUid\": \"226383154\", \"firstName\": \"Kaylah\", \"lastName\": \"Padberg\", \"issueCountry\": \"JP\", \"birthDate\": \"2000-01-01\", \"expireDate\": \"2030-01-01\", \"identityType\": \"passport\", \"identityNumber\": \"55\", \"facePhoto\": \"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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\", \"frontPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\", \"backendPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\"}" + req := &SubmitKYCReq{} + err := json.Unmarshal([]byte(data), req) + req.ToMap() + assert.Nil(t, err) +} + +func TestNDBrokerSubmitKYCRespModel(t *testing.T) { + // SubmitKYC + // Submit KYC + // /api/kyc/ndBroker/proxyClient/submit + + data := "{\"code\":\"200000\",\"data\":null}" + commonResp := &types.RestResponse{} + err := json.Unmarshal([]byte(data), commonResp) + assert.Nil(t, err) + assert.NotNil(t, commonResp.Data) + resp := &SubmitKYCResp{} + err = json.Unmarshal([]byte(commonResp.Data), resp) + resp.ToMap() + assert.Nil(t, err) +} + +func TestNDBrokerGetKYCStatusReqModel(t *testing.T) { + // GetKYCStatus + // Get KYC Status + // /api/kyc/ndBroker/proxyClient/status/list + + data := "{\"clientUids\": \"226383154\"}" + req := &GetKYCStatusReq{} + err := json.Unmarshal([]byte(data), req) + req.ToMap() + assert.Nil(t, err) +} + +func TestNDBrokerGetKYCStatusRespModel(t *testing.T) { + // GetKYCStatus + // Get KYC Status + // /api/kyc/ndBroker/proxyClient/status/list + + data := "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n }\n ]\n}" + commonResp := &types.RestResponse{} + err := json.Unmarshal([]byte(data), commonResp) + assert.Nil(t, err) + assert.NotNil(t, commonResp.Data) + resp := &GetKYCStatusResp{} + err = json.Unmarshal([]byte(commonResp.Data), resp) + resp.ToMap() + assert.Nil(t, err) +} + +func TestNDBrokerGetKYCStatusListReqModel(t *testing.T) { + // GetKYCStatusList + // Get KYC Status List + // /api/kyc/ndBroker/proxyClient/status/page + + data := "{\"pageNumber\": 1, \"pageSize\": 100}" + req := &GetKYCStatusListReq{} + err := json.Unmarshal([]byte(data), req) + req.ToMap() + assert.Nil(t, err) +} + +func TestNDBrokerGetKYCStatusListRespModel(t *testing.T) { + // GetKYCStatusList + // Get KYC Status List + // /api/kyc/ndBroker/proxyClient/status/page + + data := "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 100,\n \"totalNum\": 9,\n \"totalPage\": 1,\n \"items\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n },\n {\n \"clientUid\": 232772137,\n \"status\": \"REJECT\",\n \"rejectReason\": \"frontPhoto:Picture is not clear/covered/incomplete\"\n }\n ]\n }\n}" + commonResp := &types.RestResponse{} + err := json.Unmarshal([]byte(data), commonResp) + assert.Nil(t, err) + assert.NotNil(t, commonResp.Data) + resp := &GetKYCStatusListResp{} + err = json.Unmarshal([]byte(commonResp.Data), resp) + resp.ToMap() + assert.Nil(t, err) +} + func TestNDBrokerGetBrokerInfoReqModel(t *testing.T) { // GetBrokerInfo // Get Broker Info diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_data.go b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_data.go new file mode 100644 index 00000000..e7c510f3 --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_data.go @@ -0,0 +1,37 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +// GetKYCStatusData struct for GetKYCStatusData +type GetKYCStatusData struct { + // client uid + ClientUid int32 `json:"clientUid,omitempty"` + // KYC status + Status string `json:"status,omitempty"` + // Reject Reason + RejectReason *string `json:"rejectReason,omitempty"` +} + +// NewGetKYCStatusData instantiates a new GetKYCStatusData object +// This constructor will assign default values to properties that have it defined +func NewGetKYCStatusData(clientUid int32, status string) *GetKYCStatusData { + this := GetKYCStatusData{} + this.ClientUid = clientUid + this.Status = status + return &this +} + +// NewGetKYCStatusDataWithDefaults instantiates a new GetKYCStatusData object +// This constructor will only assign default values to properties that have it defined, +func NewGetKYCStatusDataWithDefaults() *GetKYCStatusData { + this := GetKYCStatusData{} + return &this +} + +func (o *GetKYCStatusData) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["clientUid"] = o.ClientUid + toSerialize["status"] = o.Status + toSerialize["rejectReason"] = o.RejectReason + return toSerialize +} diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_items.go b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_items.go new file mode 100644 index 00000000..660dd0c0 --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_items.go @@ -0,0 +1,37 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +// GetKYCStatusListItems struct for GetKYCStatusListItems +type GetKYCStatusListItems struct { + // client uid + ClientUid int32 `json:"clientUid,omitempty"` + // KYC status + Status string `json:"status,omitempty"` + // Reject Reason + RejectReason *string `json:"rejectReason,omitempty"` +} + +// NewGetKYCStatusListItems instantiates a new GetKYCStatusListItems object +// This constructor will assign default values to properties that have it defined +func NewGetKYCStatusListItems(clientUid int32, status string) *GetKYCStatusListItems { + this := GetKYCStatusListItems{} + this.ClientUid = clientUid + this.Status = status + return &this +} + +// NewGetKYCStatusListItemsWithDefaults instantiates a new GetKYCStatusListItems object +// This constructor will only assign default values to properties that have it defined, +func NewGetKYCStatusListItemsWithDefaults() *GetKYCStatusListItems { + this := GetKYCStatusListItems{} + return &this +} + +func (o *GetKYCStatusListItems) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["clientUid"] = o.ClientUid + toSerialize["status"] = o.Status + toSerialize["rejectReason"] = o.RejectReason + return toSerialize +} diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_req.go b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_req.go new file mode 100644 index 00000000..6986234d --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_req.go @@ -0,0 +1,64 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +// GetKYCStatusListReq struct for GetKYCStatusListReq +type GetKYCStatusListReq struct { + // Page Number + PageNumber *int32 `json:"pageNumber,omitempty" url:"pageNumber,omitempty"` + // Page Size + PageSize *int32 `json:"pageSize,omitempty" url:"pageSize,omitempty"` +} + +// NewGetKYCStatusListReq instantiates a new GetKYCStatusListReq object +// This constructor will assign default values to properties that have it defined +func NewGetKYCStatusListReq() *GetKYCStatusListReq { + this := GetKYCStatusListReq{} + var pageNumber int32 = 1 + this.PageNumber = &pageNumber + var pageSize int32 = 100 + this.PageSize = &pageSize + return &this +} + +// NewGetKYCStatusListReqWithDefaults instantiates a new GetKYCStatusListReq object +// This constructor will only assign default values to properties that have it defined, +func NewGetKYCStatusListReqWithDefaults() *GetKYCStatusListReq { + this := GetKYCStatusListReq{} + var pageNumber int32 = 1 + this.PageNumber = &pageNumber + var pageSize int32 = 100 + this.PageSize = &pageSize + return &this +} + +func (o *GetKYCStatusListReq) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["pageNumber"] = o.PageNumber + toSerialize["pageSize"] = o.PageSize + return toSerialize +} + +type GetKYCStatusListReqBuilder struct { + obj *GetKYCStatusListReq +} + +func NewGetKYCStatusListReqBuilder() *GetKYCStatusListReqBuilder { + return &GetKYCStatusListReqBuilder{obj: NewGetKYCStatusListReqWithDefaults()} +} + +// Page Number +func (builder *GetKYCStatusListReqBuilder) SetPageNumber(value int32) *GetKYCStatusListReqBuilder { + builder.obj.PageNumber = &value + return builder +} + +// Page Size +func (builder *GetKYCStatusListReqBuilder) SetPageSize(value int32) *GetKYCStatusListReqBuilder { + builder.obj.PageSize = &value + return builder +} + +func (builder *GetKYCStatusListReqBuilder) Build() *GetKYCStatusListReq { + return builder.obj +} diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_resp.go b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_resp.go new file mode 100644 index 00000000..72252163 --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_list_resp.go @@ -0,0 +1,51 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +import ( + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" +) + +// GetKYCStatusListResp struct for GetKYCStatusListResp +type GetKYCStatusListResp struct { + // common response + CommonResponse *types.RestResponse + CurrentPage int32 `json:"currentPage,omitempty"` + PageSize int32 `json:"pageSize,omitempty"` + TotalNum int32 `json:"totalNum,omitempty"` + TotalPage int32 `json:"totalPage,omitempty"` + Items []GetKYCStatusListItems `json:"items,omitempty"` +} + +// NewGetKYCStatusListResp instantiates a new GetKYCStatusListResp object +// This constructor will assign default values to properties that have it defined +func NewGetKYCStatusListResp(currentPage int32, pageSize int32, totalNum int32, totalPage int32, items []GetKYCStatusListItems) *GetKYCStatusListResp { + this := GetKYCStatusListResp{} + this.CurrentPage = currentPage + this.PageSize = pageSize + this.TotalNum = totalNum + this.TotalPage = totalPage + this.Items = items + return &this +} + +// NewGetKYCStatusListRespWithDefaults instantiates a new GetKYCStatusListResp object +// This constructor will only assign default values to properties that have it defined, +func NewGetKYCStatusListRespWithDefaults() *GetKYCStatusListResp { + this := GetKYCStatusListResp{} + return &this +} + +func (o *GetKYCStatusListResp) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["currentPage"] = o.CurrentPage + toSerialize["pageSize"] = o.PageSize + toSerialize["totalNum"] = o.TotalNum + toSerialize["totalPage"] = o.TotalPage + toSerialize["items"] = o.Items + return toSerialize +} + +func (o *GetKYCStatusListResp) SetCommonResponse(response *types.RestResponse) { + o.CommonResponse = response +} diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_req.go b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_req.go new file mode 100644 index 00000000..89e3de94 --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_req.go @@ -0,0 +1,47 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +// GetKYCStatusReq struct for GetKYCStatusReq +type GetKYCStatusReq struct { + // Client uid, Use commas to separate multiple UIDs + ClientUids *string `json:"clientUids,omitempty" url:"clientUids,omitempty"` +} + +// NewGetKYCStatusReq instantiates a new GetKYCStatusReq object +// This constructor will assign default values to properties that have it defined +func NewGetKYCStatusReq() *GetKYCStatusReq { + this := GetKYCStatusReq{} + return &this +} + +// NewGetKYCStatusReqWithDefaults instantiates a new GetKYCStatusReq object +// This constructor will only assign default values to properties that have it defined, +func NewGetKYCStatusReqWithDefaults() *GetKYCStatusReq { + this := GetKYCStatusReq{} + return &this +} + +func (o *GetKYCStatusReq) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["clientUids"] = o.ClientUids + return toSerialize +} + +type GetKYCStatusReqBuilder struct { + obj *GetKYCStatusReq +} + +func NewGetKYCStatusReqBuilder() *GetKYCStatusReqBuilder { + return &GetKYCStatusReqBuilder{obj: NewGetKYCStatusReqWithDefaults()} +} + +// Client uid, Use commas to separate multiple UIDs +func (builder *GetKYCStatusReqBuilder) SetClientUids(value string) *GetKYCStatusReqBuilder { + builder.obj.ClientUids = &value + return builder +} + +func (builder *GetKYCStatusReqBuilder) Build() *GetKYCStatusReq { + return builder.obj +} diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_resp.go b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_resp.go new file mode 100644 index 00000000..45a5136b --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_get_kyc_status_resp.go @@ -0,0 +1,45 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +import ( + "encoding/json" + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" +) + +// GetKYCStatusResp struct for GetKYCStatusResp +type GetKYCStatusResp struct { + // common response + CommonResponse *types.RestResponse + Data []GetKYCStatusData `json:"data,omitempty"` +} + +// NewGetKYCStatusResp instantiates a new GetKYCStatusResp object +// This constructor will assign default values to properties that have it defined +func NewGetKYCStatusResp(data []GetKYCStatusData) *GetKYCStatusResp { + this := GetKYCStatusResp{} + this.Data = data + return &this +} + +// NewGetKYCStatusRespWithDefaults instantiates a new GetKYCStatusResp object +// This constructor will only assign default values to properties that have it defined, +func NewGetKYCStatusRespWithDefaults() *GetKYCStatusResp { + this := GetKYCStatusResp{} + return &this +} + +func (o *GetKYCStatusResp) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["data"] = o.Data + return toSerialize +} + +func (o *GetKYCStatusResp) UnmarshalJSON(b []byte) error { + err := json.Unmarshal(b, &o.Data) + return err +} + +func (o *GetKYCStatusResp) SetCommonResponse(response *types.RestResponse) { + o.CommonResponse = response +} diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_submit_kyc_req.go b/sdk/golang/pkg/generate/broker/ndbroker/types_submit_kyc_req.go new file mode 100644 index 00000000..87f54992 --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_submit_kyc_req.go @@ -0,0 +1,148 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +// SubmitKYCReq struct for SubmitKYCReq +type SubmitKYCReq struct { + // client uid + ClientUid string `json:"clientUid,omitempty"` + // first Name + FirstName string `json:"firstName,omitempty"` + // last Name + LastName string `json:"lastName,omitempty"` + // ISO country code + IssueCountry string `json:"issueCountry,omitempty"` + // Birth Date + BirthDate string `json:"birthDate,omitempty"` + // Identity type + IdentityType string `json:"identityType,omitempty"` + // Identity Number + IdentityNumber string `json:"identityNumber,omitempty"` + // expire Date. If there is no expiration date, please fill in: 2099-01-01 + ExpireDate string `json:"expireDate,omitempty"` + // **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + FrontPhoto string `json:"frontPhoto,omitempty"` + // **Optional when identityType=passport/bvn,** Back photo of ID, same as above + BackendPhoto string `json:"backendPhoto,omitempty"` + // Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + FacePhoto string `json:"facePhoto,omitempty"` +} + +// NewSubmitKYCReq instantiates a new SubmitKYCReq object +// This constructor will assign default values to properties that have it defined +func NewSubmitKYCReq(clientUid string, firstName string, lastName string, issueCountry string, birthDate string, identityType string, identityNumber string, expireDate string, frontPhoto string, backendPhoto string, facePhoto string) *SubmitKYCReq { + this := SubmitKYCReq{} + this.ClientUid = clientUid + this.FirstName = firstName + this.LastName = lastName + this.IssueCountry = issueCountry + this.BirthDate = birthDate + this.IdentityType = identityType + this.IdentityNumber = identityNumber + this.ExpireDate = expireDate + this.FrontPhoto = frontPhoto + this.BackendPhoto = backendPhoto + this.FacePhoto = facePhoto + return &this +} + +// NewSubmitKYCReqWithDefaults instantiates a new SubmitKYCReq object +// This constructor will only assign default values to properties that have it defined, +func NewSubmitKYCReqWithDefaults() *SubmitKYCReq { + this := SubmitKYCReq{} + return &this +} + +func (o *SubmitKYCReq) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["clientUid"] = o.ClientUid + toSerialize["firstName"] = o.FirstName + toSerialize["lastName"] = o.LastName + toSerialize["issueCountry"] = o.IssueCountry + toSerialize["birthDate"] = o.BirthDate + toSerialize["identityType"] = o.IdentityType + toSerialize["identityNumber"] = o.IdentityNumber + toSerialize["expireDate"] = o.ExpireDate + toSerialize["frontPhoto"] = o.FrontPhoto + toSerialize["backendPhoto"] = o.BackendPhoto + toSerialize["facePhoto"] = o.FacePhoto + return toSerialize +} + +type SubmitKYCReqBuilder struct { + obj *SubmitKYCReq +} + +func NewSubmitKYCReqBuilder() *SubmitKYCReqBuilder { + return &SubmitKYCReqBuilder{obj: NewSubmitKYCReqWithDefaults()} +} + +// client uid +func (builder *SubmitKYCReqBuilder) SetClientUid(value string) *SubmitKYCReqBuilder { + builder.obj.ClientUid = value + return builder +} + +// first Name +func (builder *SubmitKYCReqBuilder) SetFirstName(value string) *SubmitKYCReqBuilder { + builder.obj.FirstName = value + return builder +} + +// last Name +func (builder *SubmitKYCReqBuilder) SetLastName(value string) *SubmitKYCReqBuilder { + builder.obj.LastName = value + return builder +} + +// ISO country code +func (builder *SubmitKYCReqBuilder) SetIssueCountry(value string) *SubmitKYCReqBuilder { + builder.obj.IssueCountry = value + return builder +} + +// Birth Date +func (builder *SubmitKYCReqBuilder) SetBirthDate(value string) *SubmitKYCReqBuilder { + builder.obj.BirthDate = value + return builder +} + +// Identity type +func (builder *SubmitKYCReqBuilder) SetIdentityType(value string) *SubmitKYCReqBuilder { + builder.obj.IdentityType = value + return builder +} + +// Identity Number +func (builder *SubmitKYCReqBuilder) SetIdentityNumber(value string) *SubmitKYCReqBuilder { + builder.obj.IdentityNumber = value + return builder +} + +// expire Date. If there is no expiration date, please fill in: 2099-01-01 +func (builder *SubmitKYCReqBuilder) SetExpireDate(value string) *SubmitKYCReqBuilder { + builder.obj.ExpireDate = value + return builder +} + +// **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB +func (builder *SubmitKYCReqBuilder) SetFrontPhoto(value string) *SubmitKYCReqBuilder { + builder.obj.FrontPhoto = value + return builder +} + +// **Optional when identityType=passport/bvn,** Back photo of ID, same as above +func (builder *SubmitKYCReqBuilder) SetBackendPhoto(value string) *SubmitKYCReqBuilder { + builder.obj.BackendPhoto = value + return builder +} + +// Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB +func (builder *SubmitKYCReqBuilder) SetFacePhoto(value string) *SubmitKYCReqBuilder { + builder.obj.FacePhoto = value + return builder +} + +func (builder *SubmitKYCReqBuilder) Build() *SubmitKYCReq { + return builder.obj +} diff --git a/sdk/golang/pkg/generate/broker/ndbroker/types_submit_kyc_resp.go b/sdk/golang/pkg/generate/broker/ndbroker/types_submit_kyc_resp.go new file mode 100644 index 00000000..c8153fc3 --- /dev/null +++ b/sdk/golang/pkg/generate/broker/ndbroker/types_submit_kyc_resp.go @@ -0,0 +1,44 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package ndbroker + +import ( + "encoding/json" + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" +) + +// SubmitKYCResp struct for SubmitKYCResp +type SubmitKYCResp struct { + // common response + CommonResponse *types.RestResponse + Data *string `json:"data,omitempty"` +} + +// NewSubmitKYCResp instantiates a new SubmitKYCResp object +// This constructor will assign default values to properties that have it defined +func NewSubmitKYCResp() *SubmitKYCResp { + this := SubmitKYCResp{} + return &this +} + +// NewSubmitKYCRespWithDefaults instantiates a new SubmitKYCResp object +// This constructor will only assign default values to properties that have it defined, +func NewSubmitKYCRespWithDefaults() *SubmitKYCResp { + this := SubmitKYCResp{} + return &this +} + +func (o *SubmitKYCResp) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["data"] = o.Data + return toSerialize +} + +func (o *SubmitKYCResp) UnmarshalJSON(b []byte) error { + err := json.Unmarshal(b, &o.Data) + return err +} + +func (o *SubmitKYCResp) SetCommonResponse(response *types.RestResponse) { + o.CommonResponse = response +} diff --git a/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.go b/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.go index faba5d7d..c8acf788 100644 --- a/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.go +++ b/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.go @@ -9,7 +9,7 @@ import ( type FundingFeesAPI interface { - // GetCurrentFundingRate Get Current Funding Rate. + // GetCurrentFundingRate Get Current Funding Rate // Description: Get Current Funding Rate. // Documentation: https://www.kucoin.com/docs-new/api-3470265 // +-----------------------+---------+ diff --git a/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.template b/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.template index 9f048fba..fb56b4da 100644 --- a/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.template +++ b/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees.template @@ -3,7 +3,7 @@ func TestFundingFeesGetCurrentFundingRateReq(t *testing.T) { // GetCurrentFundingRate - // Get Current Funding Rate. + // Get Current Funding Rate // /api/v1/funding-rate/{symbol}/current builder := fundingfees.NewGetCurrentFundingRateReqBuilder() diff --git a/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees_test.go b/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees_test.go index 9ff3ff07..dc51af61 100644 --- a/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees_test.go +++ b/sdk/golang/pkg/generate/futures/fundingfees/api_funding_fees_test.go @@ -9,7 +9,7 @@ import ( func TestFundingFeesGetCurrentFundingRateReqModel(t *testing.T) { // GetCurrentFundingRate - // Get Current Funding Rate. + // Get Current Funding Rate // /api/v1/funding-rate/{symbol}/current data := "{\"symbol\": \"XBTUSDTM\"}" @@ -21,10 +21,10 @@ func TestFundingFeesGetCurrentFundingRateReqModel(t *testing.T) { func TestFundingFeesGetCurrentFundingRateRespModel(t *testing.T) { // GetCurrentFundingRate - // Get Current Funding Rate. + // Get Current Funding Rate // /api/v1/funding-rate/{symbol}/current - data := "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1731441600000,\n \"value\": 6.41E-4,\n \"predictedValue\": 5.2E-5,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003\n }\n}" + data := "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1748462400000,\n \"value\": 6.1E-5,\n \"predictedValue\": 1.09E-4,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003,\n \"period\": 0,\n \"fundingTime\": 1748491200000\n }\n}" commonResp := &types.RestResponse{} err := json.Unmarshal([]byte(data), commonResp) assert.Nil(t, err) diff --git a/sdk/golang/pkg/generate/futures/fundingfees/types_get_current_funding_rate_resp.go b/sdk/golang/pkg/generate/futures/fundingfees/types_get_current_funding_rate_resp.go index f4d64f81..fa9b2bdb 100644 --- a/sdk/golang/pkg/generate/futures/fundingfees/types_get_current_funding_rate_resp.go +++ b/sdk/golang/pkg/generate/futures/fundingfees/types_get_current_funding_rate_resp.go @@ -14,7 +14,7 @@ type GetCurrentFundingRateResp struct { Symbol string `json:"symbol,omitempty"` // Granularity (milliseconds) Granularity int32 `json:"granularity,omitempty"` - // The funding rate settlement time point of the previous cycle (milliseconds) + // The funding rate settlement time point of the previous cycle (milliseconds) Before going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched. The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled. The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live. TimePoint int64 `json:"timePoint,omitempty"` // Current cycle funding rate Value float64 `json:"value,omitempty"` @@ -24,11 +24,15 @@ type GetCurrentFundingRateResp struct { FundingRateCap float64 `json:"fundingRateCap,omitempty"` // Minimum Funding Rate FundingRateFloor float64 `json:"fundingRateFloor,omitempty"` + // Indicates whether the current funding fee is charged within this cycle + Period int32 `json:"period,omitempty"` + // Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing. + FundingTime int64 `json:"fundingTime,omitempty"` } // NewGetCurrentFundingRateResp instantiates a new GetCurrentFundingRateResp object // This constructor will assign default values to properties that have it defined -func NewGetCurrentFundingRateResp(symbol string, granularity int32, timePoint int64, value float64, predictedValue float64, fundingRateCap float64, fundingRateFloor float64) *GetCurrentFundingRateResp { +func NewGetCurrentFundingRateResp(symbol string, granularity int32, timePoint int64, value float64, predictedValue float64, fundingRateCap float64, fundingRateFloor float64, period int32, fundingTime int64) *GetCurrentFundingRateResp { this := GetCurrentFundingRateResp{} this.Symbol = symbol this.Granularity = granularity @@ -37,6 +41,8 @@ func NewGetCurrentFundingRateResp(symbol string, granularity int32, timePoint in this.PredictedValue = predictedValue this.FundingRateCap = fundingRateCap this.FundingRateFloor = fundingRateFloor + this.Period = period + this.FundingTime = fundingTime return &this } @@ -56,6 +62,8 @@ func (o *GetCurrentFundingRateResp) ToMap() map[string]interface{} { toSerialize["predictedValue"] = o.PredictedValue toSerialize["fundingRateCap"] = o.FundingRateCap toSerialize["fundingRateFloor"] = o.FundingRateFloor + toSerialize["period"] = o.Period + toSerialize["fundingTime"] = o.FundingTime return toSerialize } diff --git a/sdk/golang/pkg/generate/futures/futuresprivate/types_all_order_event.go b/sdk/golang/pkg/generate/futures/futuresprivate/types_all_order_event.go index 329c8afd..e798ae1e 100644 --- a/sdk/golang/pkg/generate/futures/futuresprivate/types_all_order_event.go +++ b/sdk/golang/pkg/generate/futures/futuresprivate/types_all_order_event.go @@ -25,7 +25,7 @@ type AllOrderEvent struct { MarginMode string `json:"marginMode,omitempty"` // Order Type Type string `json:"type,omitempty"` - // Order time (nanoseconds) + // Gateway received the message time (milliseconds) OrderTime int64 `json:"orderTime,omitempty"` // User-specified order size Size string `json:"size,omitempty"` @@ -37,7 +37,7 @@ type AllOrderEvent struct { RemainSize string `json:"remainSize,omitempty"` // Order Status Status string `json:"status,omitempty"` - // Push time (nanoseconds) + // Match engine received the message time (nanoseconds) Ts int64 `json:"ts,omitempty"` // Actual transaction order type, If the counterparty order is an [Hidden/Iceberg Order](https://www.kucoin.com/docs-new/doc-338146), even if it is a maker order, this param will be displayed as taker. For actual trading fee, please refer to the **feeType** Liquidity *string `json:"liquidity,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/futuresprivate/types_all_position_event.go b/sdk/golang/pkg/generate/futures/futuresprivate/types_all_position_event.go index 74ac251a..17619d22 100644 --- a/sdk/golang/pkg/generate/futures/futuresprivate/types_all_position_event.go +++ b/sdk/golang/pkg/generate/futures/futuresprivate/types_all_position_event.go @@ -71,7 +71,7 @@ type AllPositionEvent struct { Leverage float64 `json:"leverage,omitempty"` // Auto deposit margin or not **Only applicable to Isolated Margin** AutoDeposit *bool `json:"autoDeposit,omitempty"` - // Maintenance margin requirement **Only applicable to Isolated Margin** + // Maintenance margin requirement MaintMarginReq *float64 `json:"maintMarginReq,omitempty"` // Risk limit **Only applicable to Isolated Margin** RiskLimit *int32 `json:"riskLimit,omitempty"` @@ -85,7 +85,7 @@ type AllPositionEvent struct { PosLoss *float64 `json:"posLoss,omitempty"` // The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** PosFunding *float64 `json:"posFunding,omitempty"` - // Maintenance margin **Only applicable to Isolated Margin** + // Maintenance margin PosMaint *float64 `json:"posMaint,omitempty"` // Position margin **Only applicable to Isolated Margin** MaintMargin *float64 `json:"maintMargin,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/futuresprivate/types_margin_mode_event.go b/sdk/golang/pkg/generate/futures/futuresprivate/types_margin_mode_event.go index 22f55c51..6b34fc2b 100644 --- a/sdk/golang/pkg/generate/futures/futuresprivate/types_margin_mode_event.go +++ b/sdk/golang/pkg/generate/futures/futuresprivate/types_margin_mode_event.go @@ -12,14 +12,14 @@ type MarginModeEvent struct { // common response CommonResponse *types.WsMessage // The SYMBOL is the key with value \"CROSS\" or \"ISOLATED\" - SYMBOL string `json:"SYMBOL,omitempty"` + Data map[string]string `json:"data,omitempty"` } // NewMarginModeEvent instantiates a new MarginModeEvent object // This constructor will assign default values to properties that have it defined -func NewMarginModeEvent(sYMBOL string) *MarginModeEvent { +func NewMarginModeEvent(data map[string]string) *MarginModeEvent { this := MarginModeEvent{} - this.SYMBOL = sYMBOL + this.Data = data return &this } @@ -32,10 +32,15 @@ func NewMarginModeEventWithDefaults() *MarginModeEvent { func (o *MarginModeEvent) ToMap() map[string]interface{} { toSerialize := map[string]interface{}{} - toSerialize["SYMBOL"] = o.SYMBOL + toSerialize["data"] = o.Data return toSerialize } +func (o *MarginModeEvent) UnmarshalJSON(b []byte) error { + err := json.Unmarshal(b, &o.Data) + return err +} + type MarginModeEventCallback func(topic string, subject string, data *MarginModeEvent) error type MarginModeEventCallbackWrapper struct { diff --git a/sdk/golang/pkg/generate/futures/futuresprivate/types_order_event.go b/sdk/golang/pkg/generate/futures/futuresprivate/types_order_event.go index 946dec2a..80c69554 100644 --- a/sdk/golang/pkg/generate/futures/futuresprivate/types_order_event.go +++ b/sdk/golang/pkg/generate/futures/futuresprivate/types_order_event.go @@ -25,7 +25,7 @@ type OrderEvent struct { MarginMode string `json:"marginMode,omitempty"` // Order Type Type string `json:"type,omitempty"` - // Order time (nanoseconds) + // Gateway received the message time (milliseconds) OrderTime int64 `json:"orderTime,omitempty"` // User-specified order size Size string `json:"size,omitempty"` @@ -37,7 +37,7 @@ type OrderEvent struct { RemainSize string `json:"remainSize,omitempty"` // Order Status Status string `json:"status,omitempty"` - // Push time (nanoseconds) + // Match engine received the message time (nanoseconds) Ts int64 `json:"ts,omitempty"` // Actual transaction order type, If the counterparty order is an [Hidden/Iceberg Order](https://www.kucoin.com/docs-new/doc-338146), even if it is a maker order, this param will be displayed as taker. For actual trading fee, please refer to the **feeType** Liquidity *string `json:"liquidity,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/futuresprivate/types_position_event.go b/sdk/golang/pkg/generate/futures/futuresprivate/types_position_event.go index e0c70468..b8be559f 100644 --- a/sdk/golang/pkg/generate/futures/futuresprivate/types_position_event.go +++ b/sdk/golang/pkg/generate/futures/futuresprivate/types_position_event.go @@ -71,7 +71,7 @@ type PositionEvent struct { Leverage float64 `json:"leverage,omitempty"` // Auto deposit margin or not **Only applicable to Isolated Margin** AutoDeposit *bool `json:"autoDeposit,omitempty"` - // Maintenance margin requirement **Only applicable to Isolated Margin** + // Maintenance margin requirement MaintMarginReq *float64 `json:"maintMarginReq,omitempty"` // Risk limit **Only applicable to Isolated Margin** RiskLimit *int32 `json:"riskLimit,omitempty"` @@ -85,7 +85,7 @@ type PositionEvent struct { PosLoss *float64 `json:"posLoss,omitempty"` // The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** PosFunding *float64 `json:"posFunding,omitempty"` - // Maintenance margin **Only applicable to Isolated Margin** + // Maintenance margin PosMaint *float64 `json:"posMaint,omitempty"` // Position margin **Only applicable to Isolated Margin** MaintMargin *float64 `json:"maintMargin,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/market/types_get_all_symbols_data.go b/sdk/golang/pkg/generate/futures/market/types_get_all_symbols_data.go index 9b554b85..754cacfd 100644 --- a/sdk/golang/pkg/generate/futures/market/types_get_all_symbols_data.go +++ b/sdk/golang/pkg/generate/futures/market/types_get_all_symbols_data.go @@ -53,7 +53,7 @@ type GetAllSymbolsData struct { // Deprecated param MakerFixFee float64 `json:"makerFixFee,omitempty"` // Settlement fee - SettlementFee float64 `json:"settlementFee,omitempty"` + SettlementFee *float64 `json:"settlementFee,omitempty"` // Enabled ADL or not IsDeleverage bool `json:"isDeleverage,omitempty"` // Deprecated param @@ -63,13 +63,13 @@ type GetAllSymbolsData struct { // Marking method MarkMethod string `json:"markMethod,omitempty"` // Fair price marking method; the Futures contract is null - FairMethod string `json:"fairMethod,omitempty"` + FairMethod *string `json:"fairMethod,omitempty"` // Ticker symbol of the base currency - FundingBaseSymbol string `json:"fundingBaseSymbol,omitempty"` + FundingBaseSymbol *string `json:"fundingBaseSymbol,omitempty"` // Ticker symbol of the quote currency - FundingQuoteSymbol string `json:"fundingQuoteSymbol,omitempty"` + FundingQuoteSymbol *string `json:"fundingQuoteSymbol,omitempty"` // Funding rate symbol - FundingRateSymbol string `json:"fundingRateSymbol,omitempty"` + FundingRateSymbol *string `json:"fundingRateSymbol,omitempty"` // Index symbol IndexSymbol string `json:"indexSymbol,omitempty"` // Settlement symbol @@ -131,7 +131,7 @@ type GetAllSymbolsData struct { // NewGetAllSymbolsData instantiates a new GetAllSymbolsData object // This constructor will assign default values to properties that have it defined -func NewGetAllSymbolsData(symbol string, rootSymbol string, Type_ string, firstOpenDate int64, baseCurrency string, quoteCurrency string, settleCurrency string, maxOrderQty int32, maxPrice float64, lotSize int32, tickSize float64, indexPriceTickSize float64, multiplier float64, initialMargin float64, maintainMargin float64, maxRiskLimit int32, minRiskLimit int32, riskStep int32, makerFeeRate float64, takerFeeRate float64, takerFixFee float64, makerFixFee float64, settlementFee float64, isDeleverage bool, isQuanto bool, isInverse bool, markMethod string, fairMethod string, fundingBaseSymbol string, fundingQuoteSymbol string, fundingRateSymbol string, indexSymbol string, settlementSymbol string, status string, fundingFeeRate float64, predictedFundingFeeRate float64, fundingRateGranularity int32, openInterest string, turnoverOf24h float64, volumeOf24h float64, markPrice float64, indexPrice float64, lastTradePrice float64, nextFundingRateTime int32, maxLeverage int32, sourceExchanges []string, premiumsSymbol1M string, premiumsSymbol8H string, fundingBaseSymbol1M string, fundingQuoteSymbol1M string, lowPrice float64, highPrice float64, priceChgPct float64, priceChg float64, k float64, m float64, f float64, mmrLimit float64, mmrLevConstant float64, supportCross bool, buyLimit float64, sellLimit float64) *GetAllSymbolsData { +func NewGetAllSymbolsData(symbol string, rootSymbol string, Type_ string, firstOpenDate int64, baseCurrency string, quoteCurrency string, settleCurrency string, maxOrderQty int32, maxPrice float64, lotSize int32, tickSize float64, indexPriceTickSize float64, multiplier float64, initialMargin float64, maintainMargin float64, maxRiskLimit int32, minRiskLimit int32, riskStep int32, makerFeeRate float64, takerFeeRate float64, takerFixFee float64, makerFixFee float64, isDeleverage bool, isQuanto bool, isInverse bool, markMethod string, indexSymbol string, settlementSymbol string, status string, fundingFeeRate float64, predictedFundingFeeRate float64, fundingRateGranularity int32, openInterest string, turnoverOf24h float64, volumeOf24h float64, markPrice float64, indexPrice float64, lastTradePrice float64, nextFundingRateTime int32, maxLeverage int32, sourceExchanges []string, premiumsSymbol1M string, premiumsSymbol8H string, fundingBaseSymbol1M string, fundingQuoteSymbol1M string, lowPrice float64, highPrice float64, priceChgPct float64, priceChg float64, k float64, m float64, f float64, mmrLimit float64, mmrLevConstant float64, supportCross bool, buyLimit float64, sellLimit float64) *GetAllSymbolsData { this := GetAllSymbolsData{} this.Symbol = symbol this.RootSymbol = rootSymbol @@ -155,15 +155,10 @@ func NewGetAllSymbolsData(symbol string, rootSymbol string, Type_ string, firstO this.TakerFeeRate = takerFeeRate this.TakerFixFee = takerFixFee this.MakerFixFee = makerFixFee - this.SettlementFee = settlementFee this.IsDeleverage = isDeleverage this.IsQuanto = isQuanto this.IsInverse = isInverse this.MarkMethod = markMethod - this.FairMethod = fairMethod - this.FundingBaseSymbol = fundingBaseSymbol - this.FundingQuoteSymbol = fundingQuoteSymbol - this.FundingRateSymbol = fundingRateSymbol this.IndexSymbol = indexSymbol this.SettlementSymbol = settlementSymbol this.Status = status diff --git a/sdk/golang/pkg/generate/futures/order/api_order.go b/sdk/golang/pkg/generate/futures/order/api_order.go index 42da76de..eb346ae3 100644 --- a/sdk/golang/pkg/generate/futures/order/api_order.go +++ b/sdk/golang/pkg/generate/futures/order/api_order.go @@ -257,7 +257,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | FUTURES | // | API-RATE-LIMIT-POOL | FUTURES | - // | API-RATE-LIMIT-WEIGHT | 200 | + // | API-RATE-LIMIT-WEIGHT | 800 | // +-----------------------+---------+ // Deprecated CancelAllOrdersV1(req *CancelAllOrdersV1Req, ctx context.Context) (*CancelAllOrdersV1Resp, error) diff --git a/sdk/golang/pkg/generate/futures/order/types_get_order_by_client_oid_resp.go b/sdk/golang/pkg/generate/futures/order/types_get_order_by_client_oid_resp.go index 4eee93ad..d227bb5c 100644 --- a/sdk/golang/pkg/generate/futures/order/types_get_order_by_client_oid_resp.go +++ b/sdk/golang/pkg/generate/futures/order/types_get_order_by_client_oid_resp.go @@ -30,7 +30,7 @@ type GetOrderByClientOidResp struct { DealSize int32 `json:"dealSize,omitempty"` // [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. DC not currently supported. Stp string `json:"stp,omitempty"` - // Stop order type (stop limit or stop market) + // A mark to the stop order type Stop string `json:"stop,omitempty"` // Trigger price type of stop orders StopPriceType string `json:"stopPriceType,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/order/types_get_order_by_order_id_resp.go b/sdk/golang/pkg/generate/futures/order/types_get_order_by_order_id_resp.go index b3030aa1..5a2705f8 100644 --- a/sdk/golang/pkg/generate/futures/order/types_get_order_by_order_id_resp.go +++ b/sdk/golang/pkg/generate/futures/order/types_get_order_by_order_id_resp.go @@ -30,7 +30,7 @@ type GetOrderByOrderIdResp struct { DealSize int32 `json:"dealSize,omitempty"` // [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. Not supported DC at the moment. Stp string `json:"stp,omitempty"` - // Stop order type (stop limit or stop market) + // A mark to the stop order type Stop string `json:"stop,omitempty"` // Trigger price type of stop orders StopPriceType string `json:"stopPriceType,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/order/types_get_order_list_items.go b/sdk/golang/pkg/generate/futures/order/types_get_order_list_items.go index ce8a878a..cc1ea214 100644 --- a/sdk/golang/pkg/generate/futures/order/types_get_order_list_items.go +++ b/sdk/golang/pkg/generate/futures/order/types_get_order_list_items.go @@ -24,7 +24,7 @@ type GetOrderListItems struct { DealSize int32 `json:"dealSize,omitempty"` // self trade prevention Stp string `json:"stp,omitempty"` - // Stop order type (stop limit or stop market) + // A mark to the stop order type Stop string `json:"stop,omitempty"` // Trigger price type of stop orders StopPriceType string `json:"stopPriceType,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/order/types_get_recent_closed_orders_data.go b/sdk/golang/pkg/generate/futures/order/types_get_recent_closed_orders_data.go index 57425cca..86834b6b 100644 --- a/sdk/golang/pkg/generate/futures/order/types_get_recent_closed_orders_data.go +++ b/sdk/golang/pkg/generate/futures/order/types_get_recent_closed_orders_data.go @@ -24,7 +24,7 @@ type GetRecentClosedOrdersData struct { DealSize int32 `json:"dealSize,omitempty"` // self trade prevention Stp string `json:"stp,omitempty"` - // Stop order type (stop limit or stop market) + // A mark to the stop order type Stop string `json:"stop,omitempty"` // Trigger price type of stop orders StopPriceType string `json:"stopPriceType,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/order/types_get_stop_order_list_items.go b/sdk/golang/pkg/generate/futures/order/types_get_stop_order_list_items.go index 0720b7f8..cf3741a9 100644 --- a/sdk/golang/pkg/generate/futures/order/types_get_stop_order_list_items.go +++ b/sdk/golang/pkg/generate/futures/order/types_get_stop_order_list_items.go @@ -24,7 +24,7 @@ type GetStopOrderListItems struct { DealSize int32 `json:"dealSize,omitempty"` // self trade prevention Stp string `json:"stp,omitempty"` - // Stop order type (stop limit or stop market) + // A mark to the stop order type Stop string `json:"stop,omitempty"` // Trigger price type of stop orders StopPriceType string `json:"stopPriceType,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/positions/api_positions.go b/sdk/golang/pkg/generate/futures/positions/api_positions.go index 022323ea..2762a858 100644 --- a/sdk/golang/pkg/generate/futures/positions/api_positions.go +++ b/sdk/golang/pkg/generate/futures/positions/api_positions.go @@ -37,6 +37,20 @@ type PositionsAPI interface { // +-----------------------+---------+ SwitchMarginMode(req *SwitchMarginModeReq, ctx context.Context) (*SwitchMarginModeResp, error) + // BatchSwitchMarginMode Batch Switch Margin Mode + // Description: Batch modify the margin mode of the symbols. + // Documentation: https://www.kucoin.com/docs-new/api-3472403 + // +-----------------------+---------+ + // | Extra API Info | Value | + // +-----------------------+---------+ + // | API-DOMAIN | FUTURES | + // | API-CHANNEL | PRIVATE | + // | API-PERMISSION | FUTURES | + // | API-RATE-LIMIT-POOL | FUTURES | + // | API-RATE-LIMIT-WEIGHT | 2 | + // +-----------------------+---------+ + BatchSwitchMarginMode(req *BatchSwitchMarginModeReq, ctx context.Context) (*BatchSwitchMarginModeResp, error) + // GetMaxOpenSize Get Max Open Size // Description: Get Maximum Open Position Size. // Documentation: https://www.kucoin.com/docs-new/api-3470251 @@ -163,6 +177,20 @@ type PositionsAPI interface { // +-----------------------+---------+ RemoveIsolatedMargin(req *RemoveIsolatedMarginReq, ctx context.Context) (*RemoveIsolatedMarginResp, error) + // GetCrossMarginRiskLimit Get Cross Margin Risk Limit + // Description: Batch get cross margin risk limit. + // Documentation: https://www.kucoin.com/docs-new/api-3472655 + // +-----------------------+---------+ + // | Extra API Info | Value | + // +-----------------------+---------+ + // | API-DOMAIN | FUTURES | + // | API-CHANNEL | PRIVATE | + // | API-PERMISSION | FUTURES | + // | API-RATE-LIMIT-POOL | FUTURES | + // | API-RATE-LIMIT-WEIGHT | 2 | + // +-----------------------+---------+ + GetCrossMarginRiskLimit(req *GetCrossMarginRiskLimitReq, ctx context.Context) (*GetCrossMarginRiskLimitResp, error) + // GetIsolatedMarginRiskLimit Get Isolated Margin Risk Limit // Description: This interface can be used to obtain information about risk limit level of a specific contract (only valid for Isolated Margin). // Documentation: https://www.kucoin.com/docs-new/api-3470263 @@ -227,6 +255,12 @@ func (impl *PositionsAPIImpl) SwitchMarginMode(req *SwitchMarginModeReq, ctx con return resp, err } +func (impl *PositionsAPIImpl) BatchSwitchMarginMode(req *BatchSwitchMarginModeReq, ctx context.Context) (*BatchSwitchMarginModeResp, error) { + resp := &BatchSwitchMarginModeResp{} + err := impl.transport.Call(ctx, "futures", false, "Post", "/api/v2/position/batchChangeMarginMode", req, resp, false) + return resp, err +} + func (impl *PositionsAPIImpl) GetMaxOpenSize(req *GetMaxOpenSizeReq, ctx context.Context) (*GetMaxOpenSizeResp, error) { resp := &GetMaxOpenSizeResp{} err := impl.transport.Call(ctx, "futures", false, "Get", "/api/v2/getMaxOpenSize", req, resp, false) @@ -281,6 +315,12 @@ func (impl *PositionsAPIImpl) RemoveIsolatedMargin(req *RemoveIsolatedMarginReq, return resp, err } +func (impl *PositionsAPIImpl) GetCrossMarginRiskLimit(req *GetCrossMarginRiskLimitReq, ctx context.Context) (*GetCrossMarginRiskLimitResp, error) { + resp := &GetCrossMarginRiskLimitResp{} + err := impl.transport.Call(ctx, "futures", false, "Get", "/api/v2/batchGetCrossOrderLimit", req, resp, false) + return resp, err +} + func (impl *PositionsAPIImpl) GetIsolatedMarginRiskLimit(req *GetIsolatedMarginRiskLimitReq, ctx context.Context) (*GetIsolatedMarginRiskLimitResp, error) { resp := &GetIsolatedMarginRiskLimitResp{} err := impl.transport.Call(ctx, "futures", false, "Get", "/api/v1/contracts/risk-limit/{symbol}", req, resp, false) diff --git a/sdk/golang/pkg/generate/futures/positions/api_positions.template b/sdk/golang/pkg/generate/futures/positions/api_positions.template index 434af491..e8746b47 100644 --- a/sdk/golang/pkg/generate/futures/positions/api_positions.template +++ b/sdk/golang/pkg/generate/futures/positions/api_positions.template @@ -47,6 +47,29 @@ func TestPositionsSwitchMarginModeReq(t *testing.T) { } +func TestPositionsBatchSwitchMarginModeReq(t *testing.T) { + // BatchSwitchMarginMode + // Batch Switch Margin Mode + // /api/v2/position/batchChangeMarginMode + + builder := positions.NewBatchSwitchMarginModeReqBuilder() + builder.SetMarginMode(?).SetSymbols(?) + req := builder.Build() + + resp, err := positionsApi.BatchSwitchMarginMode(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + + func TestPositionsGetMaxOpenSizeReq(t *testing.T) { // GetMaxOpenSize // Get Max Open Size @@ -254,6 +277,29 @@ func TestPositionsRemoveIsolatedMarginReq(t *testing.T) { } +func TestPositionsGetCrossMarginRiskLimitReq(t *testing.T) { + // GetCrossMarginRiskLimit + // Get Cross Margin Risk Limit + // /api/v2/batchGetCrossOrderLimit + + builder := positions.NewGetCrossMarginRiskLimitReqBuilder() + builder.SetSymbol(?).SetTotalMargin(?).SetLeverage(?) + req := builder.Build() + + resp, err := positionsApi.GetCrossMarginRiskLimit(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + + func TestPositionsGetIsolatedMarginRiskLimitReq(t *testing.T) { // GetIsolatedMarginRiskLimit // Get Isolated Margin Risk Limit diff --git a/sdk/golang/pkg/generate/futures/positions/api_positions_test.go b/sdk/golang/pkg/generate/futures/positions/api_positions_test.go index 353815a9..751504cc 100644 --- a/sdk/golang/pkg/generate/futures/positions/api_positions_test.go +++ b/sdk/golang/pkg/generate/futures/positions/api_positions_test.go @@ -63,6 +63,34 @@ func TestPositionsSwitchMarginModeRespModel(t *testing.T) { assert.Nil(t, err) } +func TestPositionsBatchSwitchMarginModeReqModel(t *testing.T) { + // BatchSwitchMarginMode + // Batch Switch Margin Mode + // /api/v2/position/batchChangeMarginMode + + data := "{\"marginMode\": \"ISOLATED\", \"symbols\": [\"XBTUSDTM\", \"ETHUSDTM\"]}" + req := &BatchSwitchMarginModeReq{} + err := json.Unmarshal([]byte(data), req) + req.ToMap() + assert.Nil(t, err) +} + +func TestPositionsBatchSwitchMarginModeRespModel(t *testing.T) { + // BatchSwitchMarginMode + // Batch Switch Margin Mode + // /api/v2/position/batchChangeMarginMode + + data := "{\n \"code\": \"200000\",\n \"data\": {\n \"marginMode\": {\n \"ETHUSDTM\": \"ISOLATED\",\n \"XBTUSDTM\": \"CROSS\"\n },\n \"errors\": [\n {\n \"code\": \"50002\",\n \"msg\": \"exist.order.or.position\",\n \"symbol\": \"XBTUSDTM\"\n }\n ]\n }\n}" + commonResp := &types.RestResponse{} + err := json.Unmarshal([]byte(data), commonResp) + assert.Nil(t, err) + assert.NotNil(t, commonResp.Data) + resp := &BatchSwitchMarginModeResp{} + err = json.Unmarshal([]byte(commonResp.Data), resp) + resp.ToMap() + assert.Nil(t, err) +} + func TestPositionsGetMaxOpenSizeReqModel(t *testing.T) { // GetMaxOpenSize // Get Max Open Size @@ -315,6 +343,34 @@ func TestPositionsRemoveIsolatedMarginRespModel(t *testing.T) { assert.Nil(t, err) } +func TestPositionsGetCrossMarginRiskLimitReqModel(t *testing.T) { + // GetCrossMarginRiskLimit + // Get Cross Margin Risk Limit + // /api/v2/batchGetCrossOrderLimit + + data := "{\"symbol\": \"XBTUSDTM\", \"totalMargin\": \"example_string_default_value\", \"leverage\": 123456}" + req := &GetCrossMarginRiskLimitReq{} + err := json.Unmarshal([]byte(data), req) + req.ToMap() + assert.Nil(t, err) +} + +func TestPositionsGetCrossMarginRiskLimitRespModel(t *testing.T) { + // GetCrossMarginRiskLimit + // Get Cross Margin Risk Limit + // /api/v2/batchGetCrossOrderLimit + + data := "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"symbol\": \"XBTUSDTM\",\n \"maxOpenSize\": 12102,\n \"maxOpenValue\": \"1234549.2240000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"102012\",\n \"leverage\": \"125.00\",\n \"mmr\": \"0.00416136\",\n \"imr\": \"0.008\",\n \"currency\": \"USDT\"\n },\n {\n \"symbol\": \"ETHUSDTM\",\n \"maxOpenSize\": 38003,\n \"maxOpenValue\": \"971508.6920000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"2556.4\",\n \"leverage\": \"100.00\",\n \"mmr\": \"0.0054623236\",\n \"imr\": \"0.01\",\n \"currency\": \"USDT\"\n }\n ]\n}" + commonResp := &types.RestResponse{} + err := json.Unmarshal([]byte(data), commonResp) + assert.Nil(t, err) + assert.NotNil(t, commonResp.Data) + resp := &GetCrossMarginRiskLimitResp{} + err = json.Unmarshal([]byte(commonResp.Data), resp) + resp.ToMap() + assert.Nil(t, err) +} + func TestPositionsGetIsolatedMarginRiskLimitReqModel(t *testing.T) { // GetIsolatedMarginRiskLimit // Get Isolated Margin Risk Limit diff --git a/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_errors.go b/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_errors.go new file mode 100644 index 00000000..6acbd7df --- /dev/null +++ b/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_errors.go @@ -0,0 +1,35 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package positions + +// BatchSwitchMarginModeErrors struct for BatchSwitchMarginModeErrors +type BatchSwitchMarginModeErrors struct { + // Error code + Code *string `json:"code,omitempty"` + // Error message + Msg *string `json:"msg,omitempty"` + // Symbol + Symbol *string `json:"symbol,omitempty"` +} + +// NewBatchSwitchMarginModeErrors instantiates a new BatchSwitchMarginModeErrors object +// This constructor will assign default values to properties that have it defined +func NewBatchSwitchMarginModeErrors() *BatchSwitchMarginModeErrors { + this := BatchSwitchMarginModeErrors{} + return &this +} + +// NewBatchSwitchMarginModeErrorsWithDefaults instantiates a new BatchSwitchMarginModeErrors object +// This constructor will only assign default values to properties that have it defined, +func NewBatchSwitchMarginModeErrorsWithDefaults() *BatchSwitchMarginModeErrors { + this := BatchSwitchMarginModeErrors{} + return &this +} + +func (o *BatchSwitchMarginModeErrors) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["code"] = o.Code + toSerialize["msg"] = o.Msg + toSerialize["symbol"] = o.Symbol + return toSerialize +} diff --git a/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_req.go b/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_req.go new file mode 100644 index 00000000..35ba3d3c --- /dev/null +++ b/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_req.go @@ -0,0 +1,58 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package positions + +// BatchSwitchMarginModeReq struct for BatchSwitchMarginModeReq +type BatchSwitchMarginModeReq struct { + // Modified margin model: ISOLATED (isolated), CROSS (cross margin). + MarginMode string `json:"marginMode,omitempty"` + // Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + Symbols []string `json:"symbols,omitempty"` +} + +// NewBatchSwitchMarginModeReq instantiates a new BatchSwitchMarginModeReq object +// This constructor will assign default values to properties that have it defined +func NewBatchSwitchMarginModeReq(marginMode string, symbols []string) *BatchSwitchMarginModeReq { + this := BatchSwitchMarginModeReq{} + this.MarginMode = marginMode + this.Symbols = symbols + return &this +} + +// NewBatchSwitchMarginModeReqWithDefaults instantiates a new BatchSwitchMarginModeReq object +// This constructor will only assign default values to properties that have it defined, +func NewBatchSwitchMarginModeReqWithDefaults() *BatchSwitchMarginModeReq { + this := BatchSwitchMarginModeReq{} + return &this +} + +func (o *BatchSwitchMarginModeReq) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["marginMode"] = o.MarginMode + toSerialize["symbols"] = o.Symbols + return toSerialize +} + +type BatchSwitchMarginModeReqBuilder struct { + obj *BatchSwitchMarginModeReq +} + +func NewBatchSwitchMarginModeReqBuilder() *BatchSwitchMarginModeReqBuilder { + return &BatchSwitchMarginModeReqBuilder{obj: NewBatchSwitchMarginModeReqWithDefaults()} +} + +// Modified margin model: ISOLATED (isolated), CROSS (cross margin). +func (builder *BatchSwitchMarginModeReqBuilder) SetMarginMode(value string) *BatchSwitchMarginModeReqBuilder { + builder.obj.MarginMode = value + return builder +} + +// Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) +func (builder *BatchSwitchMarginModeReqBuilder) SetSymbols(value []string) *BatchSwitchMarginModeReqBuilder { + builder.obj.Symbols = value + return builder +} + +func (builder *BatchSwitchMarginModeReqBuilder) Build() *BatchSwitchMarginModeReq { + return builder.obj +} diff --git a/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_resp.go b/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_resp.go new file mode 100644 index 00000000..e45b20f2 --- /dev/null +++ b/sdk/golang/pkg/generate/futures/positions/types_batch_switch_margin_mode_resp.go @@ -0,0 +1,44 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package positions + +import ( + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" +) + +// BatchSwitchMarginModeResp struct for BatchSwitchMarginModeResp +type BatchSwitchMarginModeResp struct { + // common response + CommonResponse *types.RestResponse + // Target Margin Model, Symbols that failed to be modified will also be included + MarginMode map[string]string `json:"marginMode,omitempty"` + // Symbol which modification failed + Errors []BatchSwitchMarginModeErrors `json:"errors,omitempty"` +} + +// NewBatchSwitchMarginModeResp instantiates a new BatchSwitchMarginModeResp object +// This constructor will assign default values to properties that have it defined +func NewBatchSwitchMarginModeResp(marginMode map[string]string, errors []BatchSwitchMarginModeErrors) *BatchSwitchMarginModeResp { + this := BatchSwitchMarginModeResp{} + this.MarginMode = marginMode + this.Errors = errors + return &this +} + +// NewBatchSwitchMarginModeRespWithDefaults instantiates a new BatchSwitchMarginModeResp object +// This constructor will only assign default values to properties that have it defined, +func NewBatchSwitchMarginModeRespWithDefaults() *BatchSwitchMarginModeResp { + this := BatchSwitchMarginModeResp{} + return &this +} + +func (o *BatchSwitchMarginModeResp) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["marginMode"] = o.MarginMode + toSerialize["errors"] = o.Errors + return toSerialize +} + +func (o *BatchSwitchMarginModeResp) SetCommonResponse(response *types.RestResponse) { + o.CommonResponse = response +} diff --git a/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_data.go b/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_data.go new file mode 100644 index 00000000..c612ba4b --- /dev/null +++ b/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_data.go @@ -0,0 +1,62 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package positions + +// GetCrossMarginRiskLimitData struct for GetCrossMarginRiskLimitData +type GetCrossMarginRiskLimitData struct { + // Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + Symbol string `json:"symbol,omitempty"` + // Maximum amount of open position(Unit is **lots**) + MaxOpenSize int32 `json:"maxOpenSize,omitempty"` + // Maximum value of open position(Unit is **quoteCcy**) + MaxOpenValue string `json:"maxOpenValue,omitempty"` + // Margin amount used for max position calculation. + TotalMargin string `json:"totalMargin,omitempty"` + // Price used for max position calculation. Defaults to latest transaction price + Price string `json:"price,omitempty"` + // Leverage used for max position calculation. + Leverage string `json:"leverage,omitempty"` + // Maintenance Margin Rate + Mmr string `json:"mmr,omitempty"` + // Initial Margin Rate + Imr string `json:"imr,omitempty"` + // Margin Currency + Currency string `json:"currency,omitempty"` +} + +// NewGetCrossMarginRiskLimitData instantiates a new GetCrossMarginRiskLimitData object +// This constructor will assign default values to properties that have it defined +func NewGetCrossMarginRiskLimitData(symbol string, maxOpenSize int32, maxOpenValue string, totalMargin string, price string, leverage string, mmr string, imr string, currency string) *GetCrossMarginRiskLimitData { + this := GetCrossMarginRiskLimitData{} + this.Symbol = symbol + this.MaxOpenSize = maxOpenSize + this.MaxOpenValue = maxOpenValue + this.TotalMargin = totalMargin + this.Price = price + this.Leverage = leverage + this.Mmr = mmr + this.Imr = imr + this.Currency = currency + return &this +} + +// NewGetCrossMarginRiskLimitDataWithDefaults instantiates a new GetCrossMarginRiskLimitData object +// This constructor will only assign default values to properties that have it defined, +func NewGetCrossMarginRiskLimitDataWithDefaults() *GetCrossMarginRiskLimitData { + this := GetCrossMarginRiskLimitData{} + return &this +} + +func (o *GetCrossMarginRiskLimitData) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["symbol"] = o.Symbol + toSerialize["maxOpenSize"] = o.MaxOpenSize + toSerialize["maxOpenValue"] = o.MaxOpenValue + toSerialize["totalMargin"] = o.TotalMargin + toSerialize["price"] = o.Price + toSerialize["leverage"] = o.Leverage + toSerialize["mmr"] = o.Mmr + toSerialize["imr"] = o.Imr + toSerialize["currency"] = o.Currency + return toSerialize +} diff --git a/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_req.go b/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_req.go new file mode 100644 index 00000000..643eb023 --- /dev/null +++ b/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_req.go @@ -0,0 +1,65 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package positions + +// GetCrossMarginRiskLimitReq struct for GetCrossMarginRiskLimitReq +type GetCrossMarginRiskLimitReq struct { + // Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) + Symbol *string `json:"symbol,omitempty" url:"symbol,omitempty"` + // The position opening amount, in the contract's settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price. + TotalMargin *string `json:"totalMargin,omitempty" url:"totalMargin,omitempty"` + // Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. + Leverage *int32 `json:"leverage,omitempty" url:"leverage,omitempty"` +} + +// NewGetCrossMarginRiskLimitReq instantiates a new GetCrossMarginRiskLimitReq object +// This constructor will assign default values to properties that have it defined +func NewGetCrossMarginRiskLimitReq() *GetCrossMarginRiskLimitReq { + this := GetCrossMarginRiskLimitReq{} + return &this +} + +// NewGetCrossMarginRiskLimitReqWithDefaults instantiates a new GetCrossMarginRiskLimitReq object +// This constructor will only assign default values to properties that have it defined, +func NewGetCrossMarginRiskLimitReqWithDefaults() *GetCrossMarginRiskLimitReq { + this := GetCrossMarginRiskLimitReq{} + return &this +} + +func (o *GetCrossMarginRiskLimitReq) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["symbol"] = o.Symbol + toSerialize["totalMargin"] = o.TotalMargin + toSerialize["leverage"] = o.Leverage + return toSerialize +} + +type GetCrossMarginRiskLimitReqBuilder struct { + obj *GetCrossMarginRiskLimitReq +} + +func NewGetCrossMarginRiskLimitReqBuilder() *GetCrossMarginRiskLimitReqBuilder { + return &GetCrossMarginRiskLimitReqBuilder{obj: NewGetCrossMarginRiskLimitReqWithDefaults()} +} + +// Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) +func (builder *GetCrossMarginRiskLimitReqBuilder) SetSymbol(value string) *GetCrossMarginRiskLimitReqBuilder { + builder.obj.Symbol = &value + return builder +} + +// The position opening amount, in the contract's settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price. +func (builder *GetCrossMarginRiskLimitReqBuilder) SetTotalMargin(value string) *GetCrossMarginRiskLimitReqBuilder { + builder.obj.TotalMargin = &value + return builder +} + +// Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. +func (builder *GetCrossMarginRiskLimitReqBuilder) SetLeverage(value int32) *GetCrossMarginRiskLimitReqBuilder { + builder.obj.Leverage = &value + return builder +} + +func (builder *GetCrossMarginRiskLimitReqBuilder) Build() *GetCrossMarginRiskLimitReq { + return builder.obj +} diff --git a/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_resp.go b/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_resp.go new file mode 100644 index 00000000..234b485b --- /dev/null +++ b/sdk/golang/pkg/generate/futures/positions/types_get_cross_margin_risk_limit_resp.go @@ -0,0 +1,45 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +package positions + +import ( + "encoding/json" + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" +) + +// GetCrossMarginRiskLimitResp struct for GetCrossMarginRiskLimitResp +type GetCrossMarginRiskLimitResp struct { + // common response + CommonResponse *types.RestResponse + Data []GetCrossMarginRiskLimitData `json:"data,omitempty"` +} + +// NewGetCrossMarginRiskLimitResp instantiates a new GetCrossMarginRiskLimitResp object +// This constructor will assign default values to properties that have it defined +func NewGetCrossMarginRiskLimitResp(data []GetCrossMarginRiskLimitData) *GetCrossMarginRiskLimitResp { + this := GetCrossMarginRiskLimitResp{} + this.Data = data + return &this +} + +// NewGetCrossMarginRiskLimitRespWithDefaults instantiates a new GetCrossMarginRiskLimitResp object +// This constructor will only assign default values to properties that have it defined, +func NewGetCrossMarginRiskLimitRespWithDefaults() *GetCrossMarginRiskLimitResp { + this := GetCrossMarginRiskLimitResp{} + return &this +} + +func (o *GetCrossMarginRiskLimitResp) ToMap() map[string]interface{} { + toSerialize := map[string]interface{}{} + toSerialize["data"] = o.Data + return toSerialize +} + +func (o *GetCrossMarginRiskLimitResp) UnmarshalJSON(b []byte) error { + err := json.Unmarshal(b, &o.Data) + return err +} + +func (o *GetCrossMarginRiskLimitResp) SetCommonResponse(response *types.RestResponse) { + o.CommonResponse = response +} diff --git a/sdk/golang/pkg/generate/futures/positions/types_get_position_details_resp.go b/sdk/golang/pkg/generate/futures/positions/types_get_position_details_resp.go index 4f03e1f7..d222002e 100644 --- a/sdk/golang/pkg/generate/futures/positions/types_get_position_details_resp.go +++ b/sdk/golang/pkg/generate/futures/positions/types_get_position_details_resp.go @@ -18,7 +18,7 @@ type GetPositionDetailsResp struct { CrossMode bool `json:"crossMode,omitempty"` // ADL ranking percentile DelevPercentage float64 `json:"delevPercentage,omitempty"` - // Open time + // First opening time OpeningTimestamp int64 `json:"openingTimestamp,omitempty"` // Current timestamp CurrentTimestamp int64 `json:"currentTimestamp,omitempty"` @@ -74,7 +74,7 @@ type GetPositionDetailsResp struct { Leverage float64 `json:"leverage,omitempty"` // Auto deposit margin or not **Only applicable to Isolated Margin** AutoDeposit *bool `json:"autoDeposit,omitempty"` - // Maintenance margin requirement **Only applicable to Isolated Margin** + // Maintenance margin requirement MaintMarginReq *float64 `json:"maintMarginReq,omitempty"` // Risk limit **Only applicable to Isolated Margin** RiskLimit *int32 `json:"riskLimit,omitempty"` @@ -92,7 +92,7 @@ type GetPositionDetailsResp struct { PosLoss *float64 `json:"posLoss,omitempty"` // The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** PosFunding *float64 `json:"posFunding,omitempty"` - // Maintenance margin **Only applicable to Isolated Margin** + // Maintenance margin PosMaint *float64 `json:"posMaint,omitempty"` // Position margin **Only applicable to Isolated Margin** MaintMargin *float64 `json:"maintMargin,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/positions/types_get_position_list_data.go b/sdk/golang/pkg/generate/futures/positions/types_get_position_list_data.go index fb887ad5..dfb02d24 100644 --- a/sdk/golang/pkg/generate/futures/positions/types_get_position_list_data.go +++ b/sdk/golang/pkg/generate/futures/positions/types_get_position_list_data.go @@ -12,7 +12,7 @@ type GetPositionListData struct { CrossMode bool `json:"crossMode,omitempty"` // ADL ranking percentile DelevPercentage float64 `json:"delevPercentage,omitempty"` - // Open time + // First opening time OpeningTimestamp int64 `json:"openingTimestamp,omitempty"` // Current timestamp CurrentTimestamp int64 `json:"currentTimestamp,omitempty"` @@ -68,7 +68,7 @@ type GetPositionListData struct { Leverage float64 `json:"leverage,omitempty"` // Auto deposit margin or not **Only applicable to Isolated Margin** AutoDeposit *bool `json:"autoDeposit,omitempty"` - // Maintenance margin requirement **Only applicable to Isolated Margin** + // Maintenance margin requirement MaintMarginReq *float64 `json:"maintMarginReq,omitempty"` // Risk limit **Only applicable to Isolated Margin** RiskLimit *float64 `json:"riskLimit,omitempty"` @@ -86,7 +86,7 @@ type GetPositionListData struct { PosLoss *float64 `json:"posLoss,omitempty"` // The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** PosFunding *float64 `json:"posFunding,omitempty"` - // Maintenance margin **Only applicable to Isolated Margin** + // Maintenance margin PosMaint *float64 `json:"posMaint,omitempty"` // Position margin **Only applicable to Isolated Margin** MaintMargin *float64 `json:"maintMargin,omitempty"` diff --git a/sdk/golang/pkg/generate/futures/positions/types_get_position_list_req.go b/sdk/golang/pkg/generate/futures/positions/types_get_position_list_req.go index 69d261d6..d0550c42 100644 --- a/sdk/golang/pkg/generate/futures/positions/types_get_position_list_req.go +++ b/sdk/golang/pkg/generate/futures/positions/types_get_position_list_req.go @@ -4,7 +4,7 @@ package positions // GetPositionListReq struct for GetPositionListReq type GetPositionListReq struct { - // Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + // Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty Currency *string `json:"currency,omitempty" url:"currency,omitempty"` } @@ -36,7 +36,7 @@ func NewGetPositionListReqBuilder() *GetPositionListReqBuilder { return &GetPositionListReqBuilder{obj: NewGetPositionListReqWithDefaults()} } -// Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty +// Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty func (builder *GetPositionListReqBuilder) SetCurrency(value string) *GetPositionListReqBuilder { builder.obj.Currency = &value return builder diff --git a/sdk/golang/pkg/generate/margin/order/api_order.go b/sdk/golang/pkg/generate/margin/order/api_order.go index ebb30bda..9e3ec524 100644 --- a/sdk/golang/pkg/generate/margin/order/api_order.go +++ b/sdk/golang/pkg/generate/margin/order/api_order.go @@ -19,7 +19,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | MARGIN | // | API-RATE-LIMIT-POOL | SPOT | - // | API-RATE-LIMIT-WEIGHT | 5 | + // | API-RATE-LIMIT-WEIGHT | 2 | // +-----------------------+---------+ AddOrder(req *AddOrderReq, ctx context.Context) (*AddOrderResp, error) @@ -33,7 +33,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | MARGIN | // | API-RATE-LIMIT-POOL | SPOT | - // | API-RATE-LIMIT-WEIGHT | 5 | + // | API-RATE-LIMIT-WEIGHT | 2 | // +-----------------------+---------+ AddOrderTest(req *AddOrderTestReq, ctx context.Context) (*AddOrderTestResp, error) @@ -47,7 +47,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | MARGIN | // | API-RATE-LIMIT-POOL | SPOT | - // | API-RATE-LIMIT-WEIGHT | 5 | + // | API-RATE-LIMIT-WEIGHT | 2 | // +-----------------------+---------+ CancelOrderByOrderId(req *CancelOrderByOrderIdReq, ctx context.Context) (*CancelOrderByOrderIdResp, error) @@ -61,7 +61,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | MARGIN | // | API-RATE-LIMIT-POOL | SPOT | - // | API-RATE-LIMIT-WEIGHT | 5 | + // | API-RATE-LIMIT-WEIGHT | 2 | // +-----------------------+---------+ CancelOrderByClientOid(req *CancelOrderByClientOidReq, ctx context.Context) (*CancelOrderByClientOidResp, error) @@ -75,7 +75,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | MARGIN | // | API-RATE-LIMIT-POOL | SPOT | - // | API-RATE-LIMIT-WEIGHT | 10 | + // | API-RATE-LIMIT-WEIGHT | 5 | // +-----------------------+---------+ CancelAllOrdersBySymbol(req *CancelAllOrdersBySymbolReq, ctx context.Context) (*CancelAllOrdersBySymbolResp, error) @@ -89,7 +89,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | MARGIN | // | API-RATE-LIMIT-POOL | SPOT | - // | API-RATE-LIMIT-WEIGHT | NULL | + // | API-RATE-LIMIT-WEIGHT | 4 | // +-----------------------+---------+ GetSymbolsWithOpenOrder(req *GetSymbolsWithOpenOrderReq, ctx context.Context) (*GetSymbolsWithOpenOrderResp, error) diff --git a/sdk/golang/pkg/generate/margin/order/api_order.template b/sdk/golang/pkg/generate/margin/order/api_order.template index 067a586a..61b36ffd 100644 --- a/sdk/golang/pkg/generate/margin/order/api_order.template +++ b/sdk/golang/pkg/generate/margin/order/api_order.template @@ -53,7 +53,7 @@ func TestOrderCancelOrderByOrderIdReq(t *testing.T) { // /api/v3/hf/margin/orders/{orderId} builder := order.NewCancelOrderByOrderIdReqBuilder() - builder.SetOrderId(?).SetSymbol(?) + builder.SetSymbol(?).SetOrderId(?) req := builder.Build() resp, err := orderApi.CancelOrderByOrderId(req, context.TODO()) @@ -76,7 +76,7 @@ func TestOrderCancelOrderByClientOidReq(t *testing.T) { // /api/v3/hf/margin/orders/client-order/{clientOid} builder := order.NewCancelOrderByClientOidReqBuilder() - builder.SetClientOid(?).SetSymbol(?) + builder.SetSymbol(?).SetClientOid(?) req := builder.Build() resp, err := orderApi.CancelOrderByClientOid(req, context.TODO()) @@ -214,7 +214,7 @@ func TestOrderGetOrderByOrderIdReq(t *testing.T) { // /api/v3/hf/margin/orders/{orderId} builder := order.NewGetOrderByOrderIdReqBuilder() - builder.SetOrderId(?).SetSymbol(?) + builder.SetSymbol(?).SetOrderId(?) req := builder.Build() resp, err := orderApi.GetOrderByOrderId(req, context.TODO()) @@ -237,7 +237,7 @@ func TestOrderGetOrderByClientOidReq(t *testing.T) { // /api/v3/hf/margin/orders/client-order/{clientOid} builder := order.NewGetOrderByClientOidReqBuilder() - builder.SetClientOid(?).SetSymbol(?) + builder.SetSymbol(?).SetClientOid(?) req := builder.Build() resp, err := orderApi.GetOrderByClientOid(req, context.TODO()) diff --git a/sdk/golang/pkg/generate/margin/order/api_order_test.go b/sdk/golang/pkg/generate/margin/order/api_order_test.go index baebac6f..ff3be337 100644 --- a/sdk/golang/pkg/generate/margin/order/api_order_test.go +++ b/sdk/golang/pkg/generate/margin/order/api_order_test.go @@ -68,7 +68,7 @@ func TestOrderCancelOrderByOrderIdReqModel(t *testing.T) { // Cancel Order By OrderId // /api/v3/hf/margin/orders/{orderId} - data := "{\"orderId\": \"671663e02188630007e21c9c\", \"symbol\": \"BTC-USDT\"}" + data := "{\"symbol\": \"BTC-USDT\", \"orderId\": \"671663e02188630007e21c9c\"}" req := &CancelOrderByOrderIdReq{} err := json.Unmarshal([]byte(data), req) req.ToMap() @@ -96,7 +96,7 @@ func TestOrderCancelOrderByClientOidReqModel(t *testing.T) { // Cancel Order By ClientOid // /api/v3/hf/margin/orders/client-order/{clientOid} - data := "{\"clientOid\": \"5c52e11203aa677f33e1493fb\", \"symbol\": \"BTC-USDT\"}" + data := "{\"symbol\": \"BTC-USDT\", \"clientOid\": \"5c52e11203aa677f33e1493fb\"}" req := &CancelOrderByClientOidReq{} err := json.Unmarshal([]byte(data), req) req.ToMap() @@ -264,7 +264,7 @@ func TestOrderGetOrderByOrderIdReqModel(t *testing.T) { // Get Order By OrderId // /api/v3/hf/margin/orders/{orderId} - data := "{\"orderId\": \"671667306afcdb000723107f\", \"symbol\": \"BTC-USDT\"}" + data := "{\"symbol\": \"BTC-USDT\", \"orderId\": \"671667306afcdb000723107f\"}" req := &GetOrderByOrderIdReq{} err := json.Unmarshal([]byte(data), req) req.ToMap() @@ -292,7 +292,7 @@ func TestOrderGetOrderByClientOidReqModel(t *testing.T) { // Get Order By ClientOid // /api/v3/hf/margin/orders/client-order/{clientOid} - data := "{\"clientOid\": \"5c52e11203aa677f33e493fb\", \"symbol\": \"BTC-USDT\"}" + data := "{\"symbol\": \"BTC-USDT\", \"clientOid\": \"5c52e11203aa677f33e493fb\"}" req := &GetOrderByClientOidReq{} err := json.Unmarshal([]byte(data), req) req.ToMap() diff --git a/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_client_oid_req.go b/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_client_oid_req.go index 473e5266..fbe28cb3 100644 --- a/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_client_oid_req.go +++ b/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_client_oid_req.go @@ -4,10 +4,10 @@ package order // CancelOrderByClientOidReq struct for CancelOrderByClientOidReq type CancelOrderByClientOidReq struct { - // Client Order Id, unique identifier created by the user - ClientOid *string `json:"clientOid,omitempty" path:"clientOid" url:"-"` // symbol Symbol *string `json:"symbol,omitempty" url:"symbol,omitempty"` + // Client Order Id, unique identifier created by the user + ClientOid *string `json:"clientOid,omitempty" path:"clientOid" url:"-"` } // NewCancelOrderByClientOidReq instantiates a new CancelOrderByClientOidReq object @@ -26,8 +26,8 @@ func NewCancelOrderByClientOidReqWithDefaults() *CancelOrderByClientOidReq { func (o *CancelOrderByClientOidReq) ToMap() map[string]interface{} { toSerialize := map[string]interface{}{} - toSerialize["clientOid"] = o.ClientOid toSerialize["symbol"] = o.Symbol + toSerialize["clientOid"] = o.ClientOid return toSerialize } @@ -39,18 +39,18 @@ func NewCancelOrderByClientOidReqBuilder() *CancelOrderByClientOidReqBuilder { return &CancelOrderByClientOidReqBuilder{obj: NewCancelOrderByClientOidReqWithDefaults()} } -// Client Order Id, unique identifier created by the user -func (builder *CancelOrderByClientOidReqBuilder) SetClientOid(value string) *CancelOrderByClientOidReqBuilder { - builder.obj.ClientOid = &value - return builder -} - // symbol func (builder *CancelOrderByClientOidReqBuilder) SetSymbol(value string) *CancelOrderByClientOidReqBuilder { builder.obj.Symbol = &value return builder } +// Client Order Id, unique identifier created by the user +func (builder *CancelOrderByClientOidReqBuilder) SetClientOid(value string) *CancelOrderByClientOidReqBuilder { + builder.obj.ClientOid = &value + return builder +} + func (builder *CancelOrderByClientOidReqBuilder) Build() *CancelOrderByClientOidReq { return builder.obj } diff --git a/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_order_id_req.go b/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_order_id_req.go index 4ad3b8ca..1fe52188 100644 --- a/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_order_id_req.go +++ b/sdk/golang/pkg/generate/margin/order/types_cancel_order_by_order_id_req.go @@ -4,10 +4,10 @@ package order // CancelOrderByOrderIdReq struct for CancelOrderByOrderIdReq type CancelOrderByOrderIdReq struct { - // The unique order id generated by the trading system - OrderId *string `json:"orderId,omitempty" path:"orderId" url:"-"` // symbol Symbol *string `json:"symbol,omitempty" url:"symbol,omitempty"` + // The unique order id generated by the trading system + OrderId *string `json:"orderId,omitempty" path:"orderId" url:"-"` } // NewCancelOrderByOrderIdReq instantiates a new CancelOrderByOrderIdReq object @@ -26,8 +26,8 @@ func NewCancelOrderByOrderIdReqWithDefaults() *CancelOrderByOrderIdReq { func (o *CancelOrderByOrderIdReq) ToMap() map[string]interface{} { toSerialize := map[string]interface{}{} - toSerialize["orderId"] = o.OrderId toSerialize["symbol"] = o.Symbol + toSerialize["orderId"] = o.OrderId return toSerialize } @@ -39,18 +39,18 @@ func NewCancelOrderByOrderIdReqBuilder() *CancelOrderByOrderIdReqBuilder { return &CancelOrderByOrderIdReqBuilder{obj: NewCancelOrderByOrderIdReqWithDefaults()} } -// The unique order id generated by the trading system -func (builder *CancelOrderByOrderIdReqBuilder) SetOrderId(value string) *CancelOrderByOrderIdReqBuilder { - builder.obj.OrderId = &value - return builder -} - // symbol func (builder *CancelOrderByOrderIdReqBuilder) SetSymbol(value string) *CancelOrderByOrderIdReqBuilder { builder.obj.Symbol = &value return builder } +// The unique order id generated by the trading system +func (builder *CancelOrderByOrderIdReqBuilder) SetOrderId(value string) *CancelOrderByOrderIdReqBuilder { + builder.obj.OrderId = &value + return builder +} + func (builder *CancelOrderByOrderIdReqBuilder) Build() *CancelOrderByOrderIdReq { return builder.obj } diff --git a/sdk/golang/pkg/generate/margin/order/types_get_order_by_client_oid_req.go b/sdk/golang/pkg/generate/margin/order/types_get_order_by_client_oid_req.go index 93447959..f19b8a34 100644 --- a/sdk/golang/pkg/generate/margin/order/types_get_order_by_client_oid_req.go +++ b/sdk/golang/pkg/generate/margin/order/types_get_order_by_client_oid_req.go @@ -4,10 +4,10 @@ package order // GetOrderByClientOidReq struct for GetOrderByClientOidReq type GetOrderByClientOidReq struct { - // Client Order Id, unique identifier created by the user - ClientOid *string `json:"clientOid,omitempty" path:"clientOid" url:"-"` // symbol Symbol *string `json:"symbol,omitempty" url:"symbol,omitempty"` + // Client Order Id, unique identifier created by the user + ClientOid *string `json:"clientOid,omitempty" path:"clientOid" url:"-"` } // NewGetOrderByClientOidReq instantiates a new GetOrderByClientOidReq object @@ -26,8 +26,8 @@ func NewGetOrderByClientOidReqWithDefaults() *GetOrderByClientOidReq { func (o *GetOrderByClientOidReq) ToMap() map[string]interface{} { toSerialize := map[string]interface{}{} - toSerialize["clientOid"] = o.ClientOid toSerialize["symbol"] = o.Symbol + toSerialize["clientOid"] = o.ClientOid return toSerialize } @@ -39,18 +39,18 @@ func NewGetOrderByClientOidReqBuilder() *GetOrderByClientOidReqBuilder { return &GetOrderByClientOidReqBuilder{obj: NewGetOrderByClientOidReqWithDefaults()} } -// Client Order Id, unique identifier created by the user -func (builder *GetOrderByClientOidReqBuilder) SetClientOid(value string) *GetOrderByClientOidReqBuilder { - builder.obj.ClientOid = &value - return builder -} - // symbol func (builder *GetOrderByClientOidReqBuilder) SetSymbol(value string) *GetOrderByClientOidReqBuilder { builder.obj.Symbol = &value return builder } +// Client Order Id, unique identifier created by the user +func (builder *GetOrderByClientOidReqBuilder) SetClientOid(value string) *GetOrderByClientOidReqBuilder { + builder.obj.ClientOid = &value + return builder +} + func (builder *GetOrderByClientOidReqBuilder) Build() *GetOrderByClientOidReq { return builder.obj } diff --git a/sdk/golang/pkg/generate/margin/order/types_get_order_by_order_id_req.go b/sdk/golang/pkg/generate/margin/order/types_get_order_by_order_id_req.go index e5846476..b4b1adb9 100644 --- a/sdk/golang/pkg/generate/margin/order/types_get_order_by_order_id_req.go +++ b/sdk/golang/pkg/generate/margin/order/types_get_order_by_order_id_req.go @@ -4,10 +4,10 @@ package order // GetOrderByOrderIdReq struct for GetOrderByOrderIdReq type GetOrderByOrderIdReq struct { - // The unique order id generated by the trading system - OrderId *string `json:"orderId,omitempty" path:"orderId" url:"-"` // symbol Symbol *string `json:"symbol,omitempty" url:"symbol,omitempty"` + // The unique order id generated by the trading system + OrderId *string `json:"orderId,omitempty" path:"orderId" url:"-"` } // NewGetOrderByOrderIdReq instantiates a new GetOrderByOrderIdReq object @@ -26,8 +26,8 @@ func NewGetOrderByOrderIdReqWithDefaults() *GetOrderByOrderIdReq { func (o *GetOrderByOrderIdReq) ToMap() map[string]interface{} { toSerialize := map[string]interface{}{} - toSerialize["orderId"] = o.OrderId toSerialize["symbol"] = o.Symbol + toSerialize["orderId"] = o.OrderId return toSerialize } @@ -39,18 +39,18 @@ func NewGetOrderByOrderIdReqBuilder() *GetOrderByOrderIdReqBuilder { return &GetOrderByOrderIdReqBuilder{obj: NewGetOrderByOrderIdReqWithDefaults()} } -// The unique order id generated by the trading system -func (builder *GetOrderByOrderIdReqBuilder) SetOrderId(value string) *GetOrderByOrderIdReqBuilder { - builder.obj.OrderId = &value - return builder -} - // symbol func (builder *GetOrderByOrderIdReqBuilder) SetSymbol(value string) *GetOrderByOrderIdReqBuilder { builder.obj.Symbol = &value return builder } +// The unique order id generated by the trading system +func (builder *GetOrderByOrderIdReqBuilder) SetOrderId(value string) *GetOrderByOrderIdReqBuilder { + builder.obj.OrderId = &value + return builder +} + func (builder *GetOrderByOrderIdReqBuilder) Build() *GetOrderByOrderIdReq { return builder.obj } diff --git a/sdk/golang/pkg/generate/spot/market/api_market.template b/sdk/golang/pkg/generate/spot/market/api_market.template index 14f41e11..27badb23 100644 --- a/sdk/golang/pkg/generate/spot/market/api_market.template +++ b/sdk/golang/pkg/generate/spot/market/api_market.template @@ -30,7 +30,7 @@ func TestMarketGetCurrencyReq(t *testing.T) { // /api/v3/currencies/{currency} builder := market.NewGetCurrencyReqBuilder() - builder.SetCurrency(?).SetChain(?) + builder.SetChain(?).SetCurrency(?) req := builder.Build() resp, err := marketApi.GetCurrency(req, context.TODO()) diff --git a/sdk/golang/pkg/generate/spot/market/api_market_test.go b/sdk/golang/pkg/generate/spot/market/api_market_test.go index be5f62ae..6d4505f6 100644 --- a/sdk/golang/pkg/generate/spot/market/api_market_test.go +++ b/sdk/golang/pkg/generate/spot/market/api_market_test.go @@ -40,7 +40,7 @@ func TestMarketGetCurrencyReqModel(t *testing.T) { // Get Currency // /api/v3/currencies/{currency} - data := "{\"currency\": \"BTC\", \"chain\": \"eth\"}" + data := "{\"chain\": \"eth\", \"currency\": \"BTC\"}" req := &GetCurrencyReq{} err := json.Unmarshal([]byte(data), req) req.ToMap() diff --git a/sdk/golang/pkg/generate/spot/market/types_get_all_currencies_data_chains.go b/sdk/golang/pkg/generate/spot/market/types_get_all_currencies_data_chains.go index d284c344..d2e85512 100644 --- a/sdk/golang/pkg/generate/spot/market/types_get_all_currencies_data_chains.go +++ b/sdk/golang/pkg/generate/spot/market/types_get_all_currencies_data_chains.go @@ -9,7 +9,7 @@ type GetAllCurrenciesDataChains struct { // Minimum withdrawal amount WithdrawalMinSize string `json:"withdrawalMinSize,omitempty"` // Minimum deposit amount - DepositMinSize string `json:"depositMinSize,omitempty"` + DepositMinSize *string `json:"depositMinSize,omitempty"` // Withdraw fee rate WithdrawFeeRate string `json:"withdrawFeeRate,omitempty"` // Minimum fees charged for withdrawal @@ -27,9 +27,9 @@ type GetAllCurrenciesDataChains struct { // Withdrawal precision bit, indicating the maximum supported length after the decimal point of the withdrawal amount WithdrawPrecision int32 `json:"withdrawPrecision,omitempty"` // Maximum amount of single withdrawal - MaxWithdraw string `json:"maxWithdraw,omitempty"` + MaxWithdraw *string `json:"maxWithdraw,omitempty"` // Maximum amount of single deposit (only applicable to Lightning Network) - MaxDeposit string `json:"maxDeposit,omitempty"` + MaxDeposit *string `json:"maxDeposit,omitempty"` // Need for memo/tag or not NeedTag bool `json:"needTag,omitempty"` // Chain id of currency @@ -43,11 +43,10 @@ type GetAllCurrenciesDataChains struct { // NewGetAllCurrenciesDataChains instantiates a new GetAllCurrenciesDataChains object // This constructor will assign default values to properties that have it defined -func NewGetAllCurrenciesDataChains(chainName string, withdrawalMinSize string, depositMinSize string, withdrawFeeRate string, withdrawalMinFee string, isWithdrawEnabled bool, isDepositEnabled bool, confirms int32, preConfirms int32, contractAddress string, withdrawPrecision int32, maxWithdraw string, maxDeposit string, needTag bool, chainId string) *GetAllCurrenciesDataChains { +func NewGetAllCurrenciesDataChains(chainName string, withdrawalMinSize string, withdrawFeeRate string, withdrawalMinFee string, isWithdrawEnabled bool, isDepositEnabled bool, confirms int32, preConfirms int32, contractAddress string, withdrawPrecision int32, needTag bool, chainId string) *GetAllCurrenciesDataChains { this := GetAllCurrenciesDataChains{} this.ChainName = chainName this.WithdrawalMinSize = withdrawalMinSize - this.DepositMinSize = depositMinSize this.WithdrawFeeRate = withdrawFeeRate this.WithdrawalMinFee = withdrawalMinFee this.IsWithdrawEnabled = isWithdrawEnabled @@ -56,8 +55,6 @@ func NewGetAllCurrenciesDataChains(chainName string, withdrawalMinSize string, d this.PreConfirms = preConfirms this.ContractAddress = contractAddress this.WithdrawPrecision = withdrawPrecision - this.MaxWithdraw = maxWithdraw - this.MaxDeposit = maxDeposit this.NeedTag = needTag this.ChainId = chainId return &this diff --git a/sdk/golang/pkg/generate/spot/market/types_get_all_symbols_data.go b/sdk/golang/pkg/generate/spot/market/types_get_all_symbols_data.go index 426a455b..c1a920a0 100644 --- a/sdk/golang/pkg/generate/spot/market/types_get_all_symbols_data.go +++ b/sdk/golang/pkg/generate/spot/market/types_get_all_symbols_data.go @@ -49,22 +49,22 @@ type GetAllSymbolsData struct { // The [call auction](https://www.kucoin.com/support/40999744334105) status returns true/false CallauctionIsEnabled bool `json:"callauctionIsEnabled,omitempty"` // The lowest price declared in the call auction - CallauctionPriceFloor string `json:"callauctionPriceFloor,omitempty"` + CallauctionPriceFloor *string `json:"callauctionPriceFloor,omitempty"` // The highest bid price in the call auction - CallauctionPriceCeiling string `json:"callauctionPriceCeiling,omitempty"` + CallauctionPriceCeiling *string `json:"callauctionPriceCeiling,omitempty"` // The first phase of the call auction starts at (Allow add orders, allow cancel orders) - CallauctionFirstStageStartTime int64 `json:"callauctionFirstStageStartTime,omitempty"` + CallauctionFirstStageStartTime *int64 `json:"callauctionFirstStageStartTime,omitempty"` // The second phase of the call auction starts at (Allow add orders, don't allow cancel orders) - CallauctionSecondStageStartTime int64 `json:"callauctionSecondStageStartTime,omitempty"` + CallauctionSecondStageStartTime *int64 `json:"callauctionSecondStageStartTime,omitempty"` // The third phase of the call auction starts at (Don't allow add orders, don't allow cancel orders) - CallauctionThirdStageStartTime int64 `json:"callauctionThirdStageStartTime,omitempty"` + CallauctionThirdStageStartTime *int64 `json:"callauctionThirdStageStartTime,omitempty"` // Official opening time (end time of the third phase of call auction) - TradingStartTime int64 `json:"tradingStartTime,omitempty"` + TradingStartTime *int64 `json:"tradingStartTime,omitempty"` } // NewGetAllSymbolsData instantiates a new GetAllSymbolsData object // This constructor will assign default values to properties that have it defined -func NewGetAllSymbolsData(symbol string, name string, baseCurrency string, quoteCurrency string, feeCurrency string, market string, baseMinSize string, quoteMinSize string, baseMaxSize string, quoteMaxSize string, baseIncrement string, quoteIncrement string, priceIncrement string, priceLimitRate string, minFunds string, isMarginEnabled bool, enableTrading bool, feeCategory int32, makerFeeCoefficient string, takerFeeCoefficient string, st bool, callauctionIsEnabled bool, callauctionPriceFloor string, callauctionPriceCeiling string, callauctionFirstStageStartTime int64, callauctionSecondStageStartTime int64, callauctionThirdStageStartTime int64, tradingStartTime int64) *GetAllSymbolsData { +func NewGetAllSymbolsData(symbol string, name string, baseCurrency string, quoteCurrency string, feeCurrency string, market string, baseMinSize string, quoteMinSize string, baseMaxSize string, quoteMaxSize string, baseIncrement string, quoteIncrement string, priceIncrement string, priceLimitRate string, minFunds string, isMarginEnabled bool, enableTrading bool, feeCategory int32, makerFeeCoefficient string, takerFeeCoefficient string, st bool, callauctionIsEnabled bool) *GetAllSymbolsData { this := GetAllSymbolsData{} this.Symbol = symbol this.Name = name @@ -88,12 +88,6 @@ func NewGetAllSymbolsData(symbol string, name string, baseCurrency string, quote this.TakerFeeCoefficient = takerFeeCoefficient this.St = st this.CallauctionIsEnabled = callauctionIsEnabled - this.CallauctionPriceFloor = callauctionPriceFloor - this.CallauctionPriceCeiling = callauctionPriceCeiling - this.CallauctionFirstStageStartTime = callauctionFirstStageStartTime - this.CallauctionSecondStageStartTime = callauctionSecondStageStartTime - this.CallauctionThirdStageStartTime = callauctionThirdStageStartTime - this.TradingStartTime = tradingStartTime return &this } diff --git a/sdk/golang/pkg/generate/spot/market/types_get_currency_chains.go b/sdk/golang/pkg/generate/spot/market/types_get_currency_chains.go index 3e00414f..f0df6fd8 100644 --- a/sdk/golang/pkg/generate/spot/market/types_get_currency_chains.go +++ b/sdk/golang/pkg/generate/spot/market/types_get_currency_chains.go @@ -9,7 +9,7 @@ type GetCurrencyChains struct { // Minimum withdrawal amount WithdrawalMinSize string `json:"withdrawalMinSize,omitempty"` // Minimum deposit amount - DepositMinSize string `json:"depositMinSize,omitempty"` + DepositMinSize *string `json:"depositMinSize,omitempty"` // Withdraw fee rate WithdrawFeeRate string `json:"withdrawFeeRate,omitempty"` // Minimum fees charged for withdrawal @@ -27,9 +27,9 @@ type GetCurrencyChains struct { // Withdrawal precision bit, indicating the maximum supported length after the decimal point of the withdrawal amount WithdrawPrecision int32 `json:"withdrawPrecision,omitempty"` // Maximum amount of single withdrawal - MaxWithdraw float64 `json:"maxWithdraw,omitempty"` + MaxWithdraw *float64 `json:"maxWithdraw,omitempty"` // Maximum amount of single deposit (only applicable to Lightning Network) - MaxDeposit string `json:"maxDeposit,omitempty"` + MaxDeposit *string `json:"maxDeposit,omitempty"` // Need for memo/tag or not NeedTag bool `json:"needTag,omitempty"` // Chain id of currency @@ -38,11 +38,10 @@ type GetCurrencyChains struct { // NewGetCurrencyChains instantiates a new GetCurrencyChains object // This constructor will assign default values to properties that have it defined -func NewGetCurrencyChains(chainName string, withdrawalMinSize string, depositMinSize string, withdrawFeeRate string, withdrawalMinFee string, isWithdrawEnabled bool, isDepositEnabled bool, confirms int32, preConfirms int32, contractAddress string, withdrawPrecision int32, maxWithdraw float64, maxDeposit string, needTag bool, chainId string) *GetCurrencyChains { +func NewGetCurrencyChains(chainName string, withdrawalMinSize string, withdrawFeeRate string, withdrawalMinFee string, isWithdrawEnabled bool, isDepositEnabled bool, confirms int32, preConfirms int32, contractAddress string, withdrawPrecision int32, needTag bool, chainId string) *GetCurrencyChains { this := GetCurrencyChains{} this.ChainName = chainName this.WithdrawalMinSize = withdrawalMinSize - this.DepositMinSize = depositMinSize this.WithdrawFeeRate = withdrawFeeRate this.WithdrawalMinFee = withdrawalMinFee this.IsWithdrawEnabled = isWithdrawEnabled @@ -51,8 +50,6 @@ func NewGetCurrencyChains(chainName string, withdrawalMinSize string, depositMin this.PreConfirms = preConfirms this.ContractAddress = contractAddress this.WithdrawPrecision = withdrawPrecision - this.MaxWithdraw = maxWithdraw - this.MaxDeposit = maxDeposit this.NeedTag = needTag this.ChainId = chainId return &this diff --git a/sdk/golang/pkg/generate/spot/market/types_get_currency_req.go b/sdk/golang/pkg/generate/spot/market/types_get_currency_req.go index 28ac3b0b..c701b577 100644 --- a/sdk/golang/pkg/generate/spot/market/types_get_currency_req.go +++ b/sdk/golang/pkg/generate/spot/market/types_get_currency_req.go @@ -4,10 +4,10 @@ package market // GetCurrencyReq struct for GetCurrencyReq type GetCurrencyReq struct { - // Path parameter, Currency - Currency *string `json:"currency,omitempty" path:"currency" url:"-"` // Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. Chain *string `json:"chain,omitempty" url:"chain,omitempty"` + // Path parameter, Currency + Currency *string `json:"currency,omitempty" path:"currency" url:"-"` } // NewGetCurrencyReq instantiates a new GetCurrencyReq object @@ -26,8 +26,8 @@ func NewGetCurrencyReqWithDefaults() *GetCurrencyReq { func (o *GetCurrencyReq) ToMap() map[string]interface{} { toSerialize := map[string]interface{}{} - toSerialize["currency"] = o.Currency toSerialize["chain"] = o.Chain + toSerialize["currency"] = o.Currency return toSerialize } @@ -39,18 +39,18 @@ func NewGetCurrencyReqBuilder() *GetCurrencyReqBuilder { return &GetCurrencyReqBuilder{obj: NewGetCurrencyReqWithDefaults()} } -// Path parameter, Currency -func (builder *GetCurrencyReqBuilder) SetCurrency(value string) *GetCurrencyReqBuilder { - builder.obj.Currency = &value - return builder -} - // Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. func (builder *GetCurrencyReqBuilder) SetChain(value string) *GetCurrencyReqBuilder { builder.obj.Chain = &value return builder } +// Path parameter, Currency +func (builder *GetCurrencyReqBuilder) SetCurrency(value string) *GetCurrencyReqBuilder { + builder.obj.Currency = &value + return builder +} + func (builder *GetCurrencyReqBuilder) Build() *GetCurrencyReq { return builder.obj } diff --git a/sdk/golang/pkg/generate/spot/market/types_get_currency_resp.go b/sdk/golang/pkg/generate/spot/market/types_get_currency_resp.go index 0f41e3ad..44629651 100644 --- a/sdk/golang/pkg/generate/spot/market/types_get_currency_resp.go +++ b/sdk/golang/pkg/generate/spot/market/types_get_currency_resp.go @@ -19,9 +19,9 @@ type GetCurrencyResp struct { // Currency precision Precision int32 `json:"precision,omitempty"` // Number of block confirmations - Confirms int32 `json:"confirms,omitempty"` + Confirms *int32 `json:"confirms,omitempty"` // Contract address - ContractAddress string `json:"contractAddress,omitempty"` + ContractAddress *string `json:"contractAddress,omitempty"` // Margin support or not IsMarginEnabled bool `json:"isMarginEnabled,omitempty"` // Debit support or not @@ -32,14 +32,12 @@ type GetCurrencyResp struct { // NewGetCurrencyResp instantiates a new GetCurrencyResp object // This constructor will assign default values to properties that have it defined -func NewGetCurrencyResp(currency string, name string, fullName string, precision int32, confirms int32, contractAddress string, isMarginEnabled bool, isDebitEnabled bool, chains []GetCurrencyChains) *GetCurrencyResp { +func NewGetCurrencyResp(currency string, name string, fullName string, precision int32, isMarginEnabled bool, isDebitEnabled bool, chains []GetCurrencyChains) *GetCurrencyResp { this := GetCurrencyResp{} this.Currency = currency this.Name = name this.FullName = fullName this.Precision = precision - this.Confirms = confirms - this.ContractAddress = contractAddress this.IsMarginEnabled = isMarginEnabled this.IsDebitEnabled = isDebitEnabled this.Chains = chains diff --git a/sdk/golang/pkg/generate/spot/market/types_get_symbol_resp.go b/sdk/golang/pkg/generate/spot/market/types_get_symbol_resp.go index 2a54b78d..862f98ed 100644 --- a/sdk/golang/pkg/generate/spot/market/types_get_symbol_resp.go +++ b/sdk/golang/pkg/generate/spot/market/types_get_symbol_resp.go @@ -55,22 +55,22 @@ type GetSymbolResp struct { // The [call auction](https://www.kucoin.com/support/40999744334105) status returns true/false CallauctionIsEnabled bool `json:"callauctionIsEnabled,omitempty"` // The lowest price declared in the call auction - CallauctionPriceFloor string `json:"callauctionPriceFloor,omitempty"` + CallauctionPriceFloor *string `json:"callauctionPriceFloor,omitempty"` // The highest bid price in the call auction - CallauctionPriceCeiling string `json:"callauctionPriceCeiling,omitempty"` + CallauctionPriceCeiling *string `json:"callauctionPriceCeiling,omitempty"` // The first phase of the call auction starts at (Allow add orders, allow cancel orders) - CallauctionFirstStageStartTime int64 `json:"callauctionFirstStageStartTime,omitempty"` + CallauctionFirstStageStartTime *int64 `json:"callauctionFirstStageStartTime,omitempty"` // The second phase of the call auction starts at (Allow add orders, don't allow cancel orders) - CallauctionSecondStageStartTime int64 `json:"callauctionSecondStageStartTime,omitempty"` + CallauctionSecondStageStartTime *int64 `json:"callauctionSecondStageStartTime,omitempty"` // The third phase of the call auction starts at (Don't allow add orders, don't allow cancel orders) - CallauctionThirdStageStartTime int64 `json:"callauctionThirdStageStartTime,omitempty"` + CallauctionThirdStageStartTime *int64 `json:"callauctionThirdStageStartTime,omitempty"` // Official opening time (end time of the third phase of call auction) - TradingStartTime int64 `json:"tradingStartTime,omitempty"` + TradingStartTime *int64 `json:"tradingStartTime,omitempty"` } // NewGetSymbolResp instantiates a new GetSymbolResp object // This constructor will assign default values to properties that have it defined -func NewGetSymbolResp(symbol string, name string, baseCurrency string, quoteCurrency string, feeCurrency string, market string, baseMinSize string, quoteMinSize string, baseMaxSize string, quoteMaxSize string, baseIncrement string, quoteIncrement string, priceIncrement string, priceLimitRate string, minFunds string, isMarginEnabled bool, enableTrading bool, feeCategory int32, makerFeeCoefficient string, takerFeeCoefficient string, st bool, callauctionIsEnabled bool, callauctionPriceFloor string, callauctionPriceCeiling string, callauctionFirstStageStartTime int64, callauctionSecondStageStartTime int64, callauctionThirdStageStartTime int64, tradingStartTime int64) *GetSymbolResp { +func NewGetSymbolResp(symbol string, name string, baseCurrency string, quoteCurrency string, feeCurrency string, market string, baseMinSize string, quoteMinSize string, baseMaxSize string, quoteMaxSize string, baseIncrement string, quoteIncrement string, priceIncrement string, priceLimitRate string, minFunds string, isMarginEnabled bool, enableTrading bool, feeCategory int32, makerFeeCoefficient string, takerFeeCoefficient string, st bool, callauctionIsEnabled bool) *GetSymbolResp { this := GetSymbolResp{} this.Symbol = symbol this.Name = name @@ -94,12 +94,6 @@ func NewGetSymbolResp(symbol string, name string, baseCurrency string, quoteCurr this.TakerFeeCoefficient = takerFeeCoefficient this.St = st this.CallauctionIsEnabled = callauctionIsEnabled - this.CallauctionPriceFloor = callauctionPriceFloor - this.CallauctionPriceCeiling = callauctionPriceCeiling - this.CallauctionFirstStageStartTime = callauctionFirstStageStartTime - this.CallauctionSecondStageStartTime = callauctionSecondStageStartTime - this.CallauctionThirdStageStartTime = callauctionThirdStageStartTime - this.TradingStartTime = tradingStartTime return &this } diff --git a/sdk/golang/pkg/generate/spot/order/api_order.go b/sdk/golang/pkg/generate/spot/order/api_order.go index 9f580b07..ef8d8c18 100644 --- a/sdk/golang/pkg/generate/spot/order/api_order.go +++ b/sdk/golang/pkg/generate/spot/order/api_order.go @@ -187,7 +187,7 @@ type OrderAPI interface { // | API-CHANNEL | PRIVATE | // | API-PERMISSION | SPOT | // | API-RATE-LIMIT-POOL | SPOT | - // | API-RATE-LIMIT-WEIGHT | 3 | + // | API-RATE-LIMIT-WEIGHT | 1 | // +-----------------------+---------+ ModifyOrder(req *ModifyOrderReq, ctx context.Context) (*ModifyOrderResp, error) diff --git a/sdk/golang/pkg/generate/spot/order/types_add_order_req.go b/sdk/golang/pkg/generate/spot/order/types_add_order_req.go index 4c0154f8..3c429dc6 100644 --- a/sdk/golang/pkg/generate/spot/order/types_add_order_req.go +++ b/sdk/golang/pkg/generate/spot/order/types_add_order_req.go @@ -36,9 +36,9 @@ type AddOrderReq struct { CancelAfter *int64 `json:"cancelAfter,omitempty"` // When **type** is market, select one out of two: size or funds When placing a market order, the funds field refers to the funds for the priced asset (the asset name written latter) of the trading pair. The funds must be based on the quoteIncrement of the trading pair. The quoteIncrement represents the precision of the trading pair. The funds value for an order must be a multiple of quoteIncrement and must be between quoteMinSize and quoteMaxSize. Funds *string `json:"funds,omitempty"` - // Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + // Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. AllowMaxTimeWindow *int64 `json:"allowMaxTimeWindow,omitempty"` - // Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + // Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. ClientTimestamp *int64 `json:"clientTimestamp,omitempty"` } @@ -206,13 +206,13 @@ func (builder *AddOrderReqBuilder) SetFunds(value string) *AddOrderReqBuilder { return builder } -// Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. +// Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. func (builder *AddOrderReqBuilder) SetAllowMaxTimeWindow(value int64) *AddOrderReqBuilder { builder.obj.AllowMaxTimeWindow = &value return builder } -// Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. +// Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. func (builder *AddOrderReqBuilder) SetClientTimestamp(value int64) *AddOrderReqBuilder { builder.obj.ClientTimestamp = &value return builder diff --git a/sdk/golang/pkg/generate/spot/order/types_add_order_sync_req.go b/sdk/golang/pkg/generate/spot/order/types_add_order_sync_req.go index 7438acbc..42fb37b4 100644 --- a/sdk/golang/pkg/generate/spot/order/types_add_order_sync_req.go +++ b/sdk/golang/pkg/generate/spot/order/types_add_order_sync_req.go @@ -36,9 +36,9 @@ type AddOrderSyncReq struct { CancelAfter *int64 `json:"cancelAfter,omitempty"` // When **type** is market, select one out of two: size or funds Funds *string `json:"funds,omitempty"` - // The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + // Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. AllowMaxTimeWindow *int64 `json:"allowMaxTimeWindow,omitempty"` - // Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + // Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. ClientTimestamp *int64 `json:"clientTimestamp,omitempty"` } @@ -206,13 +206,13 @@ func (builder *AddOrderSyncReqBuilder) SetFunds(value string) *AddOrderSyncReqBu return builder } -// The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. +// Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. func (builder *AddOrderSyncReqBuilder) SetAllowMaxTimeWindow(value int64) *AddOrderSyncReqBuilder { builder.obj.AllowMaxTimeWindow = &value return builder } -// Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. +// Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. func (builder *AddOrderSyncReqBuilder) SetClientTimestamp(value int64) *AddOrderSyncReqBuilder { builder.obj.ClientTimestamp = &value return builder diff --git a/sdk/golang/pkg/generate/spot/order/types_add_order_test_req.go b/sdk/golang/pkg/generate/spot/order/types_add_order_test_req.go index 5626d0bc..ccb4ba54 100644 --- a/sdk/golang/pkg/generate/spot/order/types_add_order_test_req.go +++ b/sdk/golang/pkg/generate/spot/order/types_add_order_test_req.go @@ -36,9 +36,9 @@ type AddOrderTestReq struct { CancelAfter *int64 `json:"cancelAfter,omitempty"` // When **type** is market, select one out of two: size or funds Funds *string `json:"funds,omitempty"` - // Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + // Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. AllowMaxTimeWindow *int64 `json:"allowMaxTimeWindow,omitempty"` - // Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + // Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. ClientTimestamp *int64 `json:"clientTimestamp,omitempty"` } @@ -206,13 +206,13 @@ func (builder *AddOrderTestReqBuilder) SetFunds(value string) *AddOrderTestReqBu return builder } -// Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. +// Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. func (builder *AddOrderTestReqBuilder) SetAllowMaxTimeWindow(value int64) *AddOrderTestReqBuilder { builder.obj.AllowMaxTimeWindow = &value return builder } -// Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. +// Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. func (builder *AddOrderTestReqBuilder) SetClientTimestamp(value int64) *AddOrderTestReqBuilder { builder.obj.ClientTimestamp = &value return builder diff --git a/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_order_list.go b/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_order_list.go index d74f1f7a..b2b93cd2 100644 --- a/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_order_list.go +++ b/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_order_list.go @@ -36,9 +36,9 @@ type BatchAddOrdersOrderList struct { Remark *string `json:"remark,omitempty"` // When **type** is market, select one out of two: size or funds Funds *string `json:"funds,omitempty"` - // Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + // Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. ClientTimestamp *int64 `json:"clientTimestamp,omitempty"` - // The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + // Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. AllowMaxTimeWindow *int64 `json:"allowMaxTimeWindow,omitempty"` } @@ -207,13 +207,13 @@ func (builder *BatchAddOrdersOrderListBuilder) SetFunds(value string) *BatchAddO return builder } -// Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. +// Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. func (builder *BatchAddOrdersOrderListBuilder) SetClientTimestamp(value int64) *BatchAddOrdersOrderListBuilder { builder.obj.ClientTimestamp = &value return builder } -// The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. +// Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. func (builder *BatchAddOrdersOrderListBuilder) SetAllowMaxTimeWindow(value int64) *BatchAddOrdersOrderListBuilder { builder.obj.AllowMaxTimeWindow = &value return builder diff --git a/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_sync_order_list.go b/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_sync_order_list.go index 6dbceafb..a77ed06e 100644 --- a/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_sync_order_list.go +++ b/sdk/golang/pkg/generate/spot/order/types_batch_add_orders_sync_order_list.go @@ -36,9 +36,9 @@ type BatchAddOrdersSyncOrderList struct { Remark *string `json:"remark,omitempty"` // When **type** is market, select one out of two: size or funds Funds *string `json:"funds,omitempty"` - // The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + // Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. AllowMaxTimeWindow *int64 `json:"allowMaxTimeWindow,omitempty"` - // Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + // Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. ClientTimestamp *int64 `json:"clientTimestamp,omitempty"` } @@ -207,13 +207,13 @@ func (builder *BatchAddOrdersSyncOrderListBuilder) SetFunds(value string) *Batch return builder } -// The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. +// Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. func (builder *BatchAddOrdersSyncOrderListBuilder) SetAllowMaxTimeWindow(value int64) *BatchAddOrdersSyncOrderListBuilder { builder.obj.AllowMaxTimeWindow = &value return builder } -// Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. +// Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. func (builder *BatchAddOrdersSyncOrderListBuilder) SetClientTimestamp(value int64) *BatchAddOrdersSyncOrderListBuilder { builder.obj.ClientTimestamp = &value return builder diff --git a/sdk/golang/pkg/generate/spot/spotprivate/types_order_v1_event.go b/sdk/golang/pkg/generate/spot/spotprivate/types_order_v1_event.go index 77e76cc1..122a8c92 100644 --- a/sdk/golang/pkg/generate/spot/spotprivate/types_order_v1_event.go +++ b/sdk/golang/pkg/generate/spot/spotprivate/types_order_v1_event.go @@ -19,7 +19,7 @@ type OrderV1Event struct { FilledSize *string `json:"filledSize,omitempty"` // The unique order id generated by the trading system OrderId string `json:"orderId,omitempty"` - // Order time (milliseconds) + // Gateway received the message time (milliseconds) OrderTime int64 `json:"orderTime,omitempty"` // User-specified order type OrderType string `json:"orderType,omitempty"` @@ -39,7 +39,7 @@ type OrderV1Event struct { Status string `json:"status,omitempty"` // Symbol Symbol string `json:"symbol,omitempty"` - // Push time (nanoseconds) + // Match engine received the message time (nanoseconds) Ts int64 `json:"ts,omitempty"` // Order Type Type string `json:"type,omitempty"` diff --git a/sdk/golang/pkg/generate/spot/spotprivate/types_order_v2_event.go b/sdk/golang/pkg/generate/spot/spotprivate/types_order_v2_event.go index 6c283f0e..fb25a0a7 100644 --- a/sdk/golang/pkg/generate/spot/spotprivate/types_order_v2_event.go +++ b/sdk/golang/pkg/generate/spot/spotprivate/types_order_v2_event.go @@ -19,7 +19,7 @@ type OrderV2Event struct { FilledSize *string `json:"filledSize,omitempty"` // The unique order id generated by the trading system OrderId string `json:"orderId,omitempty"` - // Order time (milliseconds) + // Gateway received the message time (milliseconds) OrderTime int64 `json:"orderTime,omitempty"` // User-specified order type OrderType string `json:"orderType,omitempty"` @@ -39,7 +39,7 @@ type OrderV2Event struct { Status string `json:"status,omitempty"` // Symbol Symbol string `json:"symbol,omitempty"` - // Push time (nanoseconds) + // Match engine received the message time (nanoseconds) Ts int64 `json:"ts,omitempty"` // Order Type Type string `json:"type,omitempty"` diff --git a/sdk/golang/pkg/generate/spot/spotprivate/types_stop_order_event.go b/sdk/golang/pkg/generate/spot/spotprivate/types_stop_order_event.go index 045f36f5..c16d0df9 100644 --- a/sdk/golang/pkg/generate/spot/spotprivate/types_stop_order_event.go +++ b/sdk/golang/pkg/generate/spot/spotprivate/types_stop_order_event.go @@ -23,7 +23,7 @@ type StopOrderEvent struct { Side string `json:"side,omitempty"` // User-specified order size Size string `json:"size,omitempty"` - // Order type: loss: stop loss order, oco: oco order + // Order type Stop string `json:"stop,omitempty"` // Stop Price StopPrice string `json:"stopPrice,omitempty"` diff --git a/sdk/golang/pkg/generate/version.go b/sdk/golang/pkg/generate/version.go index ed73bc87..396523ba 100644 --- a/sdk/golang/pkg/generate/version.go +++ b/sdk/golang/pkg/generate/version.go @@ -1,6 +1,6 @@ package generate const ( - SdkVersion = "1.2.1" - SdkGenerateDate = "2025-05-27" + SdkVersion = "v1.3.0" + SdkGenerateDate = "2025-06-11" ) diff --git a/sdk/golang/pkg/generate/viplending/viplending/api_vip_lending.go b/sdk/golang/pkg/generate/viplending/viplending/api_vip_lending.go index 984728ca..ffdeb6c2 100644 --- a/sdk/golang/pkg/generate/viplending/viplending/api_vip_lending.go +++ b/sdk/golang/pkg/generate/viplending/viplending/api_vip_lending.go @@ -31,7 +31,7 @@ type VIPLendingAPI interface { // +-----------------------+------------+ // | API-DOMAIN | SPOT | // | API-CHANNEL | PRIVATE | - // | API-PERMISSION | GENERAL | + // | API-PERMISSION | SPOT | // | API-RATE-LIMIT-POOL | MANAGEMENT | // | API-RATE-LIMIT-WEIGHT | 5 | // +-----------------------+------------+ @@ -45,7 +45,7 @@ type VIPLendingAPI interface { // +-----------------------+------------+ // | API-DOMAIN | SPOT | // | API-CHANNEL | PRIVATE | - // | API-PERMISSION | GENERAL | + // | API-PERMISSION | SPOT | // | API-RATE-LIMIT-POOL | MANAGEMENT | // | API-RATE-LIMIT-WEIGHT | 20 | // +-----------------------+------------+ diff --git a/sdk/golang/tests/e2e/rest/account_test/account_withdrawal_api_test.go b/sdk/golang/tests/e2e/rest/account_test/account_withdrawal_api_test.go index a4e904f0..2b827d1e 100644 --- a/sdk/golang/tests/e2e/rest/account_test/account_withdrawal_api_test.go +++ b/sdk/golang/tests/e2e/rest/account_test/account_withdrawal_api_test.go @@ -4,13 +4,14 @@ import ( "context" "encoding/json" "fmt" + "os" + "testing" + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/extension/interceptor" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/api" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/common/logger" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/generate/account/withdrawal" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" - "os" - "testing" ) var withdrawalApi withdrawal.WithdrawalAPI @@ -87,6 +88,29 @@ func TestWithdrawalGetWithdrawalHistoryReq(t *testing.T) { fmt.Println("message:", resp.CommonResponse.Message) fmt.Println("data:", string(data)) } + +func TestWithdrawalGetWithdrawalHistoryByIdReq(t *testing.T) { + // GetWithdrawalHistoryById + // Get Withdrawal History By ID + // /api/v1/withdrawals/{withdrawalId} + + builder := withdrawal.NewGetWithdrawalHistoryByIdReqBuilder() + builder.SetWithdrawalId("674576dc74b2bb000778452c") + req := builder.Build() + + resp, err := withdrawalApi.GetWithdrawalHistoryById(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + func TestWithdrawalWithdrawalV1Req(t *testing.T) { // WithdrawalV1 // Withdraw(V1) @@ -162,7 +186,7 @@ func TestWithdrawalWithdrawalV3Req(t *testing.T) { builder := withdrawal.NewWithdrawalV3ReqBuilder() builder.SetCurrency("USDT").SetChain("bsc").SetWithdrawType("ADDRESS"). - SetToAddress("********").SetAmount(20). + SetToAddress("********").SetAmount("20"). SetIsInner(false) req := builder.Build() diff --git a/sdk/golang/tests/e2e/rest/broker_test/ndbroker_test.go b/sdk/golang/tests/e2e/rest/broker_test/ndbroker_test.go index 10154d91..65e680c9 100644 --- a/sdk/golang/tests/e2e/rest/broker_test/ndbroker_test.go +++ b/sdk/golang/tests/e2e/rest/broker_test/ndbroker_test.go @@ -4,14 +4,15 @@ import ( "context" "encoding/json" "fmt" + "os" + "testing" + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/extension/interceptor" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/api" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/common/logger" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/generate/broker/ndbroker" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" "github.com/google/uuid" - "os" - "testing" ) var ndbrokerApi ndbroker.NDBrokerAPI @@ -50,6 +51,77 @@ func init() { ndbrokerApi = client.RestService().GetBrokerService().GetNDBrokerAPI() } +func TestNDBrokerSubmitKYCReq(t *testing.T) { + // SubmitKYC + // Submit KYC + // /api/kyc/ndBroker/proxyClient/submit + + builder := ndbroker.NewSubmitKYCReqBuilder() + builder.SetClientUid("226383154").SetFirstName("Kaylah").SetLastName("Padberg"). + SetIssueCountry("JP").SetBirthDate("2000-01-01").SetIdentityType("passport"). + SetIdentityNumber("55").SetExpireDate("2030-01-01"). + SetFrontPhoto("*****"). + SetBackendPhoto("*****"). + SetFacePhoto("******") + req := builder.Build() + + resp, err := ndbrokerApi.SubmitKYC(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + +func TestNDBrokerGetKYCStatusReq(t *testing.T) { + // GetKYCStatus + // Get KYC Status + // /api/kyc/ndBroker/proxyClient/status/list + + builder := ndbroker.NewGetKYCStatusReqBuilder() + builder.SetClientUids("226383154") + req := builder.Build() + + resp, err := ndbrokerApi.GetKYCStatus(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + +func TestNDBrokerGetKYCStatusListReq(t *testing.T) { + // GetKYCStatusList + // Get KYC Status List + // /api/kyc/ndBroker/proxyClient/status/page + + builder := ndbroker.NewGetKYCStatusListReqBuilder() + builder.SetPageNumber(1).SetPageSize(100) + req := builder.Build() + + resp, err := ndbrokerApi.GetKYCStatusList(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + func TestNDBrokerGetDepositListReq(t *testing.T) { // GetDepositList // Get Deposit List diff --git a/sdk/golang/tests/e2e/rest/futures_test/futures_position_test.go b/sdk/golang/tests/e2e/rest/futures_test/futures_position_test.go index ed891ca2..761049f5 100644 --- a/sdk/golang/tests/e2e/rest/futures_test/futures_position_test.go +++ b/sdk/golang/tests/e2e/rest/futures_test/futures_position_test.go @@ -4,13 +4,14 @@ import ( "context" "encoding/json" "fmt" + "os" + "testing" + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/extension/interceptor" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/api" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/common/logger" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/generate/futures/positions" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" - "os" - "testing" ) var positionsApi positions.PositionsAPI @@ -130,6 +131,28 @@ func TestPositionsRemoveIsolatedMarginReq(t *testing.T) { fmt.Println("data:", string(data)) } +func TestPositionsGetCrossMarginRiskLimitReq(t *testing.T) { + // GetCrossMarginRiskLimit + // Get Cross Margin Risk Limit + // /api/v2/batchGetCrossOrderLimit + + builder := positions.NewGetCrossMarginRiskLimitReqBuilder() + builder.SetSymbol("XBTUSDTM").SetTotalMargin("10000").SetLeverage(1) + req := builder.Build() + + resp, err := positionsApi.GetCrossMarginRiskLimit(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + func TestPositionsGetPositionDetailsReq(t *testing.T) { // GetPositionDetails // Get Position Details @@ -325,6 +348,28 @@ func TestPositionsSwitchMarginModeReq(t *testing.T) { fmt.Println("data:", string(data)) } +func TestPositionsBatchSwitchMarginModeReq(t *testing.T) { + // BatchSwitchMarginMode + // Batch Switch Margin Mode + // /api/v2/position/batchChangeMarginMode + + builder := positions.NewBatchSwitchMarginModeReqBuilder() + builder.SetMarginMode("ISOLATED").SetSymbols([]string{"XBTUSDTM", "DOGEUSDTM"}) + req := builder.Build() + + resp, err := positionsApi.BatchSwitchMarginMode(req, context.TODO()) + if err != nil { + panic(err) + } + data, err := json.Marshal(resp.ToMap()) + if err != nil { + panic(err) + } + fmt.Println("code:", resp.CommonResponse.Code) + fmt.Println("message:", resp.CommonResponse.Message) + fmt.Println("data:", string(data)) +} + func TestPositionsGetMarginModeReq(t *testing.T) { // GetMarginMode // Get Margin Mode diff --git a/sdk/golang/tests/e2e/rest/viplending_test/viplending_api_test.go b/sdk/golang/tests/e2e/rest/viplending_test/viplending_api_test.go index 2adf2fa5..c7dc3e88 100644 --- a/sdk/golang/tests/e2e/rest/viplending_test/viplending_api_test.go +++ b/sdk/golang/tests/e2e/rest/viplending_test/viplending_api_test.go @@ -4,13 +4,14 @@ import ( "context" "encoding/json" "fmt" + "os" + "testing" + "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/extension/interceptor" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/api" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/common/logger" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/generate/viplending/viplending" "github.com/Kucoin/kucoin-universal-sdk/sdk/golang/pkg/types" - "os" - "testing" ) var viplendingApi viplending.VIPLendingAPI @@ -60,22 +61,3 @@ func TestVIPLendingGetAccountsReq(t *testing.T) { fmt.Println("message:", resp.CommonResponse.Message) fmt.Println("data:", string(data)) } - -// TODO no permission -func TestVIPLendingGetAccountDetailReq(t *testing.T) { - // GetAccountDetail - // Get Account Detail - // /api/v1/otc-loan/loan - - resp, err := viplendingApi.GetAccountDetail(context.TODO()) - if err != nil { - panic(err) - } - data, err := json.Marshal(resp.ToMap()) - if err != nil { - panic(err) - } - fmt.Println("code:", resp.CommonResponse.Code) - fmt.Println("message:", resp.CommonResponse.Message) - fmt.Println("data:", string(data)) -} diff --git a/sdk/node/.eslintrc b/sdk/node/.eslintrc index 19a13ecf..603b7cfa 100644 --- a/sdk/node/.eslintrc +++ b/sdk/node/.eslintrc @@ -17,6 +17,13 @@ "plugins": ["@typescript-eslint", "prettier"], "rules": { "prettier/prettier": "error", - "@typescript-eslint/no-unused-vars": "warn" + "@typescript-eslint/no-unused-vars": "warn", + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "ts-ignore": false, + "prefer-const": "off" + } + ] } } diff --git a/sdk/node/CHANGELOG.md b/sdk/node/CHANGELOG.md index 421cd2f9..f5596a2a 100644 --- a/sdk/node/CHANGELOG.md +++ b/sdk/node/CHANGELOG.md @@ -2,7 +2,31 @@ API documentation [Changelog](https://www.kucoin.com/docs-new/change-log) -Current synchronized API documentation version [20250313](https://www.kucoin.com/docs-new/change-log#20250313) +Current synchronized API documentation version [20250529](https://www.kucoin.com/docs-new/change-log#20250529) + +## 2025-06-11(1.3.0) +- Update the latest APIs, documentation, etc +- Introduced a new testing framework for all SDKs +- Expanded regression-test coverage for Python components +- Updated Node.js dependencies to address security vulnerabilities + +## 2025-06-11(PHP 0.1.2-alpha) +- Update the latest APIs, documentation, etc + +## 2025-05-29(PHP 0.1.1-alpha) +- Fix compatibility issues on non-macOS systems by enforcing case-sensitive PSR-4 autoloading. + +## 2025-05-27(GO 1.2.1) +- Fix the Golang type mapping: map OpenAPI number type to float64 to prevent overflow + +## 2025-05-26(PHP 0.1.0-alpha) +- Release PHP implementation + +## 2025-04-04(Python 1.2.1.post1) +- Bug Fixes + +## 2025-03-31(Python 1.2.1) +- Optimize WebSocket reconnection logic ## 2025-03-21(1.2.0) - Update the latest APIs, documentation, etc diff --git a/sdk/node/README.md b/sdk/node/README.md index 83107d2b..b2c444cd 100644 --- a/sdk/node/README.md +++ b/sdk/node/README.md @@ -8,7 +8,7 @@ For an overview of the project and SDKs in other languages, refer to the [Main R ## 📦 Installation -### Latest Version: `1.2.0` +### Latest Version: `1.3.0` Install the SDK using `npm`: ```bash diff --git a/sdk/node/example/package-lock.json b/sdk/node/example/package-lock.json index ac9b1dad..e2615567 100644 --- a/sdk/node/example/package-lock.json +++ b/sdk/node/example/package-lock.json @@ -1,42 +1,75 @@ { "name": "kucoin-universal-sdk-example", "version": "0.1.1-alpha", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@ampproject/remapping": { + "packages": { + "": { + "name": "kucoin-universal-sdk-example", + "version": "0.1.1-alpha", + "license": "MIT", + "dependencies": { + "kucoin-universal-sdk": "file:../kucoin-universal-sdk-1.3.0.tgz" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "@typescript-eslint/eslint-plugin": "^8.19.0", + "@typescript-eslint/parser": "^8.19.0", + "eslint": "^9.17.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "prettier": "^3.4.2", + "ts-jest": "^29.2.5", + "tsc-alias": "^1.8.10", + "typescript": "^5.7.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/code-frame": { + "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/compat-data": { + "node_modules/@babel/compat-data": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dev": true, - "requires": { + "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.9", @@ -53,283 +86,400 @@ "json5": "^2.2.3", "semver": "^6.3.1" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "@babel/generator": { + "node_modules/@babel/generator": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-compilation-targets": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, - "requires": { + "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, - "requires": { + "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-string-parser": { + "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-option": { + "node_modules/@babel/helper-validator-option": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.26.9" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/plugin-syntax-async-generators": { + "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-properties": { + "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-static-block": { + "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-import-attributes": { + "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-import-meta": { + "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-json-strings": { + "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-jsx": { + "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-numeric-separator": { + "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-catch-binding": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-chaining": { + "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-private-property-in-object": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-top-level-await": { + "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-typescript": { + "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.9", "@babel/parser": "^7.26.9", @@ -338,101 +488,131 @@ "debug": "^4.3.1", "globals": "^11.1.0" }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" } }, - "@babel/types": { + "node_modules/@babel/types": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@bcoe/v8-coverage": { + "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@eslint-community/eslint-utils": { + "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, - "requires": { + "dependencies": { "eslint-visitor-keys": "^3.4.3" }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@eslint-community/regexpp": { + "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, - "@eslint/config-array": { + "node_modules/@eslint/config-array": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", "dev": true, - "requires": { + "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "@eslint/core": { + "node_modules/@eslint/core": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, - "requires": { + "dependencies": { "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "@eslint/eslintrc": { + "node_modules/@eslint/eslintrc": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", "dev": true, - "requires": { + "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", @@ -443,189 +623,258 @@ "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "@eslint/js": { + "node_modules/@eslint/js": { "version": "9.21.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz", "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "@eslint/object-schema": { + "node_modules/@eslint/object-schema": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "@eslint/plugin-kit": { + "node_modules/@eslint/plugin-kit": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", "dev": true, - "requires": { + "dependencies": { "@eslint/core": "^0.12.0", "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "@humanfs/core": { + "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true + "dev": true, + "engines": { + "node": ">=18.18.0" + } }, - "@humanfs/node": { + "node_modules/@humanfs/node": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, - "requires": { + "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, - "dependencies": { - "@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true - } + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "@humanwhocodes/module-importer": { + "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "@humanwhocodes/retry": { + "node_modules/@humanwhocodes/retry": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "@istanbuljs/load-nyc-config": { + "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "@istanbuljs/schema": { + "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@jest/console": { + "node_modules/@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/core": { + "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -654,71 +903,97 @@ "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "@jest/environment": { + "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "requires": { + "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/expect": { + "node_modules/@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "requires": { + "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/expect-utils": { + "node_modules/@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "requires": { + "dependencies": { "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/fake-timers": { + "node_modules/@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/globals": { + "node_modules/@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/reporters": { + "node_modules/@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "requires": { + "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -743,58 +1018,81 @@ "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "@jest/schemas": { + "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "requires": { + "dependencies": { "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/source-map": { + "node_modules/@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/test-result": { + "node_modules/@jest/test-result": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/test-sequencer": { + "node_modules/@jest/test-sequencer": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/transform": { + "node_modules/@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", @@ -810,123 +1108,153 @@ "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/types": { + "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "requires": { + "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jridgewell/gen-mapping": { + "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@jridgewell/resolve-uri": { + "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/set-array": { + "node_modules/@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/sourcemap-codec": { + "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, - "@jridgewell/trace-mapping": { + "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@pkgr/core": { + "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, - "@sinclair/typebox": { + "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "@sinonjs/commons": { + "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "requires": { + "dependencies": { "type-detect": "4.0.8" } }, - "@sinonjs/fake-timers": { + "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^3.0.0" } }, - "@types/babel__core": { + "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", @@ -934,125 +1262,125 @@ "@types/babel__traverse": "*" } }, - "@types/babel__generator": { + "node_modules/@types/babel__generator": { "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0" } }, - "@types/babel__template": { + "node_modules/@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, - "@types/babel__traverse": { + "node_modules/@types/babel__traverse": { "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, - "requires": { + "dependencies": { "@babel/types": "^7.20.7" } }, - "@types/estree": { + "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, - "@types/graceful-fs": { + "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/istanbul-lib-coverage": { + "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, - "@types/istanbul-lib-report": { + "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "*" } }, - "@types/istanbul-reports": { + "node_modules/@types/istanbul-reports": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-report": "*" } }, - "@types/jest": { + "node_modules/@types/jest": { "version": "29.5.14", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, - "requires": { + "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, - "@types/json-schema": { + "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "@types/node": { + "node_modules/@types/node": { "version": "22.13.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", "dev": true, - "requires": { + "dependencies": { "undici-types": "~6.20.0" } }, - "@types/stack-utils": { + "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, - "@types/yargs": { + "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, - "requires": { + "dependencies": { "@types/yargs-parser": "*" } }, - "@types/yargs-parser": { + "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "@typescript-eslint/eslint-plugin": { + "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz", "integrity": "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/type-utils": "8.25.0", @@ -1062,55 +1390,103 @@ "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/parser": { + "node_modules/@typescript-eslint/parser": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.25.0.tgz", "integrity": "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz", "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/type-utils": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz", "integrity": "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/utils": "8.25.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz", "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz", "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4", @@ -1119,112 +1495,191 @@ "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/utils": { + "node_modules/@typescript-eslint/utils": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.25.0.tgz", "integrity": "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "8.25.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz", "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "8.25.0", "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "acorn": { + "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-jsx": { + "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ansi-escapes": { + "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "requires": { + "dependencies": { "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "argparse": { + "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "async": { + "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, - "babel-jest": { + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "requires": { + "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", @@ -1232,60 +1687,76 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "babel-plugin-istanbul": { + "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "babel-plugin-jest-hoist": { + "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "babel-preset-current-node-syntax": { + "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, - "requires": { + "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1301,208 +1772,333 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "babel-preset-jest": { + "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "requires": { + "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0" } }, - "braces": { + "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { + "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "bs-logger": { + "node_modules/bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "requires": { + "dependencies": { "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" } }, - "bser": { + "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "requires": { + "dependencies": { "node-int64": "^0.4.0" } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "callsites": { + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "caniuse-lite": { + "node_modules/caniuse-lite": { "version": "1.0.30001701", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz", "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==", - "dev": true + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "chalk": { + "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "char-regex": { + "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "ci-info": { + "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, - "cjs-module-lexer": { + "node_modules/cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true }, - "cliui": { + "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "co": { + "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "collect-v8-coverage": { + "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "create-jest": { + "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", @@ -1510,121 +2106,244 @@ "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "debug": { + "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "requires": { + "dependencies": { "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "dedent": { + "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, - "deep-is": { + "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "deepmerge": { + "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } }, - "detect-newline": { + "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "diff-sequences": { + "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "dir-glob": { + "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "ejs": { + "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "requires": { + "dependencies": { "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "electron-to-chromium": { + "node_modules/electron-to-chromium": { "version": "1.5.105", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.105.tgz", "integrity": "sha512-ccp7LocdXx3yBhwiG0qTQ7XFrK48Ua2pxIxBdJO8cbddp/MvbBtPFzvnTchtyHQTsgqqczO8cdmAIbpMa0u2+g==", "dev": true }, - "emittery": { + "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escalade": { + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "eslint": { + "node_modules/eslint": { "version": "9.21.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", @@ -1660,128 +2379,218 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true } } }, - "eslint-config-prettier": { + "node_modules/eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } }, - "eslint-plugin-prettier": { + "node_modules/eslint-plugin-prettier": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", "dev": true, - "requires": { + "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" - } - }, - "eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "eslint-visitor-keys": { + "node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "espree": { + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, - "requires": { + "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "esquery": { + "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "execa": { + "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", @@ -1791,195 +2600,324 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "exit": { + "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "expect": { + "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, - "requires": { + "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-diff": { + "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" } }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { + "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "fastq": { + "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "fb-watchman": { + "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "requires": { + "dependencies": { "bser": "2.1.1" } }, - "file-entry-cache": { + "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "requires": { + "dependencies": { "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "filelist": { + "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, - "requires": { + "dependencies": { "minimatch": "^5.0.1" - }, + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, "dependencies": { - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-up": { + "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "flat-cache": { + "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "requires": { + "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "flatted": { + "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, - "fs.realpath": { + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { + "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "get-package-type": { + "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "get-stream": { + "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "glob": { + "node_modules/glob": { "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, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", @@ -1987,347 +2925,486 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "globals": { + "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "globby": { + "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "graceful-fs": { + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "graphemer": { + "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "hasown": { + "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "human-signals": { + "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.17.0" + } }, - "ignore": { + "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "import-fresh": { + "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "import-local": { + "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "requires": { + "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "inflight": { + "node_modules/inflight": { "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, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-core-module": { + "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, - "requires": { + "dependencies": { "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-generator-fn": { + "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "istanbul-lib-coverage": { + "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" } }, - "istanbul-reports": { + "node_modules/istanbul-reports": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "jake": { + "node_modules/jake": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, - "requires": { + "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "jest": { + "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "requires": { + "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, - "dependencies": { - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true } } }, - "jest-changed-files": { + "node_modules/jest-changed-files": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "requires": { + "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-circus": { + "node_modules/jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -2348,14 +3425,17 @@ "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-config": { + "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", @@ -2378,110 +3458,151 @@ "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "jest-diff": { + "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-docblock": { + "node_modules/jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "requires": { + "dependencies": { "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-each": { + "node_modules/jest-each": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-environment-node": { + "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-get-type": { + "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "jest-haste-map": { + "node_modules/jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "jest-leak-detector": { + "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "requires": { + "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-matcher-utils": { + "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-message-util": { + "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", @@ -2491,37 +3612,57 @@ "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-mock": { + "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-pnp-resolver": { + "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } }, - "jest-regex-util": { + "node_modules/jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "jest-resolve": { + "node_modules/jest-resolve": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", @@ -2531,24 +3672,30 @@ "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-resolve-dependencies": { + "node_modules/jest-resolve-dependencies": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "requires": { + "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-runner": { + "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -2570,14 +3717,17 @@ "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-runtime": { + "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", @@ -2600,14 +3750,17 @@ "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-snapshot": { + "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", @@ -2628,28 +3781,34 @@ "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-util": { + "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-validate": { + "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", @@ -2657,21 +3816,28 @@ "leven": "^3.1.0", "pretty-format": "^29.7.0" }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-watcher": { + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", @@ -2680,4145 +3846,1241 @@ "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-worker": { + "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true } } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { + "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { + "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsesc": { + "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } }, - "json-buffer": { + "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "json-parse-even-better-errors": { + "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify-without-jsonify": { + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "keyv": { + "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "requires": { + "dependencies": { "json-buffer": "3.0.1" } }, - "kleur": { + "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "kucoin-universal-sdk": { - "version": "0.1.1-alpha", - "requires": { - "axios": "^1.7.9", + "node_modules/kucoin-universal-sdk": { + "version": "1.3.0", + "resolved": "file:../kucoin-universal-sdk-1.3.0.tgz", + "integrity": "sha512-pFbWXarmvqNdBYnwDcrgrfbYtfEa8bJPHEprTAbp1NFFfy0wcU85iij6v8wbzCDm9SiHikTBB5eNguqO7sWBLQ==", + "license": "MIT", + "dependencies": { + "axios": "^1.8.2", "axios-retry": "^4.5.0", "class-transformer": "^0.5.1", "reflect-metadata": "^0.2.2", "ws": "^8.18.0" }, + "engines": { + "node": ">=14" + } + }, + "node_modules/kucoin-universal-sdk/node_modules/axios-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", + "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", "dependencies": { - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==" - }, - "@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", - "requires": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", - "requires": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "requires": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "requires": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==" - }, - "@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" - }, - "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" - }, - "@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==" - }, - "@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "requires": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - } - }, - "@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", - "requires": { - "@babel/types": "^7.26.5" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "requires": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", - "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", - "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "requires": { - "eslint-visitor-keys": "^3.4.3" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" - } - } - }, - "@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==" - }, - "@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", - "requires": { - "@eslint/object-schema": "^2.1.5", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@eslint/core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", - "requires": { - "@types/json-schema": "^7.0.15" - } - }, - "@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@eslint/js": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==" - }, - "@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==" - }, - "@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", - "requires": { - "levn": "^0.4.1" - } - }, - "@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==" - }, - "@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "requires": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "dependencies": { - "@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==" - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" - }, - "@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==" - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==" - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", - "requires": { - "undici-types": "~6.20.0" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" - }, - "@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz", - "integrity": "sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==", - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/type-utils": "8.19.0", - "@typescript-eslint/utils": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/parser": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.0.tgz", - "integrity": "sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==", - "requires": { - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/typescript-estree": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", - "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", - "requires": { - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz", - "integrity": "sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==", - "requires": { - "@typescript-eslint/typescript-estree": "8.19.0", - "@typescript-eslint/utils": "8.19.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/types": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", - "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==" - }, - "@typescript-eslint/typescript-estree": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", - "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", - "requires": { - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/utils": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.0.tgz", - "integrity": "sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==", - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/typescript-estree": "8.19.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", - "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", - "requires": { - "@typescript-eslint/types": "8.19.0", - "eslint-visitor-keys": "^4.2.0" - } - }, - "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "axios-retry": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", - "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", - "requires": { - "is-retry-allowed": "^2.2.0" - } - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "requires": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" - }, - "cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" - }, - "class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } + "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" + } + }, + "node_modules/kucoin-universal-sdk/node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/kucoin-universal-sdk/node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/kucoin-universal-sdk/node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, + "node_modules/kucoin-universal-sdk/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "requires": { - "ms": "^2.1.3" - } - }, - "dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.5.83", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", - "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==" - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "eslint": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==" - }, - "eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - } - }, - "eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==" - }, - "espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "requires": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "requires": { - "flat-cache": "^4.0.0" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - } - }, - "flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" - }, - "follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" - }, - "form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "utf-8-validate": { "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "requires": { - "hasown": "^2.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-retry-allowed": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==" - }, - "istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "dependencies": { - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - } - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==" - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==" - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "requires": { - "semver": "^7.5.3" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "requires": { - "tmpl": "1.0.5" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "mylas": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", - "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "plimit-lit": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", - "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", - "requires": { - "queue-lit": "^1.5.1" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==" - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==" - }, - "queue-lit": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", - "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "react-is": { - "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==" - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "requires": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", - "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==" - }, - "ts-jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", - "requires": { - "bs-logger": "^0.2.6", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.6.3", - "yargs-parser": "^21.1.1" - } - }, - "tsc-alias": { - "version": "1.8.10", - "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.10.tgz", - "integrity": "sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==", - "requires": { - "chokidar": "^3.5.3", - "commander": "^9.0.0", - "globby": "^11.0.4", - "mylas": "^2.1.9", - "normalize-path": "^3.0.0", - "plimit-lit": "^1.2.6" - } - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" - }, - "undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "requires": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "requires": { - "makeerror": "1.0.12" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } }, - "leven": { + "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "levn": { + "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "lines-and-columns": { + "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "locate-path": { + "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lodash.memoize": { + "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "lodash.merge": { + "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lru-cache": { + "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "requires": { + "dependencies": { "yallist": "^3.0.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "requires": { + "dependencies": { "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "make-error": { + "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "makeerror": { + "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "requires": { + "dependencies": { "tmpl": "1.0.5" } }, - "merge-stream": { + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "ms": { + "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "mylas": { + "node_modules/mylas": { "version": "2.1.13", "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", - "dev": true + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node-releases": { + "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "optionator": { + "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "requires": { + "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "p-limit": { + "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { + "dependencies": { "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { + "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picocolors": { + "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pirates": { + "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "plimit-lit": { + "node_modules/plimit-lit": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", "dev": true, - "requires": { + "dependencies": { "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "prettier": { + "node_modules/prettier": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", - "dev": true + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "prettier-linter-helpers": { + "node_modules/prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "requires": { + "dependencies": { "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "pretty-format": { + "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "requires": { + "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "prompts": { + "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "requires": { + "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "punycode": { + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "pure-rand": { + "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] }, - "queue-lit": { + "node_modules/queue-lit": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "react-is": { + "node_modules/react-is": { "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 }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "resolve": { + "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, - "requires": { + "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "resolve.exports": { + "node_modules/resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "semver": { + "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "stack-utils": { + "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "string-length": { + "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "requires": { + "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-preserve-symlinks-flag": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "synckit": { + "node_modules/synckit": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, - "requires": { + "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "ts-api-utils": { + "node_modules/ts-api-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", - "dev": true + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } }, - "ts-jest": { + "node_modules/ts-jest": { "version": "29.2.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.6.tgz", "integrity": "sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==", "dev": true, - "requires": { + "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", "fast-json-stable-stringify": "^2.1.0", @@ -6828,160 +5090,257 @@ "make-error": "^1.3.6", "semver": "^7.7.1", "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "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", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } } }, - "tsc-alias": { + "node_modules/tsc-alias": { "version": "1.8.11", "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.11.tgz", "integrity": "sha512-2DuEQ58A9Rj2NE2c1+/qaGKlshni9MCK95MJzRGhQG0CYLw0bE/ACgbhhTSf/p1svLelwqafOd8stQate2bYbg==", "dev": true, - "requires": { + "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", "globby": "^11.0.4", "mylas": "^2.1.9", "normalize-path": "^3.0.0", "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" } }, - "tslib": { + "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, - "type-check": { + "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "typescript": { + "node_modules/typescript": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "undici-types": { + "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, - "update-browserslist-db": { + "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "v8-to-istanbul": { + "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" } }, - "walker": { + "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "requires": { + "dependencies": { "makeerror": "1.0.12" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "word-wrap": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "requires": { + "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -6989,19 +5348,31 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + } }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/sdk/node/example/package.json b/sdk/node/example/package.json index a0ce330b..abde8a0a 100644 --- a/sdk/node/example/package.json +++ b/sdk/node/example/package.json @@ -33,11 +33,10 @@ "tsc-alias": "^1.8.10", "typescript": "^5.7.2" }, - "peerDependencies": {}, "engines": { "node": ">=14" }, "dependencies": { - "kucoin-universal-sdk": "1.2.0" + "kucoin-universal-sdk": "1.3.0" } } diff --git a/sdk/node/package-lock.json b/sdk/node/package-lock.json index 721c82e8..e7fe5948 100644 --- a/sdk/node/package-lock.json +++ b/sdk/node/package-lock.json @@ -1,42 +1,81 @@ { "name": "kucoin-universal-sdk", - "version": "0.1.1-alpha", - "lockfileVersion": 1, + "version": "1.2.0", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@ampproject/remapping": { + "packages": { + "": { + "name": "kucoin-universal-sdk", + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "axios": "^1.8.2", + "axios-retry": "^4.5.0", + "class-transformer": "^0.5.1", + "reflect-metadata": "^0.2.2", + "ws": "^8.18.0" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "^22.10.5", + "@types/ws": "^8.5.13", + "@typescript-eslint/eslint-plugin": "^8.19.0", + "@typescript-eslint/parser": "^8.19.0", + "eslint": "^9.17.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "prettier": "^3.4.2", + "ts-jest": "^29.2.5", + "tsc-alias": "^1.8.10", + "typescript": "^5.7.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/code-frame": { + "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/compat-data": { + "node_modules/@babel/compat-data": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, - "requires": { + "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", "@babel/generator": "^7.26.0", @@ -53,283 +92,400 @@ "json5": "^2.2.3", "semver": "^6.3.1" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "@babel/generator": { + "node_modules/@babel/generator": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-compilation-targets": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, - "requires": { + "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, - "requires": { + "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-string-parser": { + "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-option": { + "node_modules/@babel/helper-validator-option": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.26.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/plugin-syntax-async-generators": { + "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-properties": { + "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-static-block": { + "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-import-attributes": { + "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-import-meta": { + "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-json-strings": { + "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-jsx": { + "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-numeric-separator": { + "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-catch-binding": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-chaining": { + "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-private-property-in-object": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-top-level-await": { + "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-typescript": { + "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.5", @@ -337,94 +493,123 @@ "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { + "node_modules/@babel/types": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@bcoe/v8-coverage": { + "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@eslint-community/eslint-utils": { + "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, - "requires": { + "dependencies": { "eslint-visitor-keys": "^3.4.3" }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@eslint-community/regexpp": { + "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, - "@eslint/config-array": { + "node_modules/@eslint/config-array": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", "dev": true, - "requires": { + "dependencies": { "@eslint/object-schema": "^2.1.5", "debug": "^4.3.1", "minimatch": "^3.1.2" }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "@eslint/core": { + "node_modules/@eslint/core": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", "dev": true, - "requires": { + "dependencies": { "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "@eslint/eslintrc": { + "node_modules/@eslint/eslintrc": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, - "requires": { + "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", @@ -435,194 +620,269 @@ "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "@eslint/js": { + "node_modules/@eslint/js": { "version": "9.17.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "@eslint/object-schema": { + "node_modules/@eslint/object-schema": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "@eslint/plugin-kit": { + "node_modules/@eslint/plugin-kit": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", "dev": true, - "requires": { + "dependencies": { "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "@humanfs/core": { + "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true + "dev": true, + "engines": { + "node": ">=18.18.0" + } }, - "@humanfs/node": { + "node_modules/@humanfs/node": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, - "requires": { + "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, - "dependencies": { - "@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true - } + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "@humanwhocodes/module-importer": { + "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "@humanwhocodes/retry": { + "node_modules/@humanwhocodes/retry": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "@istanbuljs/load-nyc-config": { + "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "@istanbuljs/schema": { + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@jest/console": { + "node_modules/@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/core": { + "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -651,71 +911,97 @@ "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "@jest/environment": { + "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "requires": { + "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/expect": { + "node_modules/@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "requires": { + "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/expect-utils": { + "node_modules/@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "requires": { + "dependencies": { "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/fake-timers": { + "node_modules/@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/globals": { + "node_modules/@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/reporters": { + "node_modules/@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "requires": { + "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -740,58 +1026,81 @@ "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "@jest/schemas": { + "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "requires": { + "dependencies": { "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/source-map": { + "node_modules/@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/test-result": { + "node_modules/@jest/test-result": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/test-sequencer": { + "node_modules/@jest/test-sequencer": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/transform": { + "node_modules/@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", @@ -807,123 +1116,153 @@ "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jest/types": { + "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "requires": { + "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jridgewell/gen-mapping": { + "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@jridgewell/resolve-uri": { + "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/set-array": { + "node_modules/@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, - "@jridgewell/trace-mapping": { + "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@pkgr/core": { + "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, - "@sinclair/typebox": { + "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "@sinonjs/commons": { + "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "requires": { + "dependencies": { "type-detect": "4.0.8" } }, - "@sinonjs/fake-timers": { + "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^3.0.0" } }, - "@types/babel__core": { + "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", @@ -931,134 +1270,134 @@ "@types/babel__traverse": "*" } }, - "@types/babel__generator": { + "node_modules/@types/babel__generator": { "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0" } }, - "@types/babel__template": { + "node_modules/@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, - "@types/babel__traverse": { + "node_modules/@types/babel__traverse": { "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, - "requires": { + "dependencies": { "@babel/types": "^7.20.7" } }, - "@types/estree": { + "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, - "@types/graceful-fs": { + "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/istanbul-lib-coverage": { + "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, - "@types/istanbul-lib-report": { + "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "*" } }, - "@types/istanbul-reports": { + "node_modules/@types/istanbul-reports": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-report": "*" } }, - "@types/jest": { + "node_modules/@types/jest": { "version": "29.5.14", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, - "requires": { + "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, - "@types/json-schema": { + "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "@types/node": { + "node_modules/@types/node": { "version": "22.10.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, - "requires": { + "dependencies": { "undici-types": "~6.20.0" } }, - "@types/stack-utils": { + "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, - "@types/ws": { + "node_modules/@types/ws": { "version": "8.5.13", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/yargs": { + "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, - "requires": { + "dependencies": { "@types/yargs-parser": "*" } }, - "@types/yargs-parser": { + "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "@typescript-eslint/eslint-plugin": { + "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz", "integrity": "sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.19.0", "@typescript-eslint/type-utils": "8.19.0", @@ -1068,55 +1407,103 @@ "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/parser": { + "node_modules/@typescript-eslint/parser": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.0.tgz", "integrity": "sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/scope-manager": "8.19.0", "@typescript-eslint/types": "8.19.0", "@typescript-eslint/typescript-estree": "8.19.0", "@typescript-eslint/visitor-keys": "8.19.0", "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "8.19.0", "@typescript-eslint/visitor-keys": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/type-utils": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz", "integrity": "sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/typescript-estree": "8.19.0", "@typescript-eslint/utils": "8.19.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "8.19.0", "@typescript-eslint/visitor-keys": "8.19.0", "debug": "^4.3.4", @@ -1125,135 +1512,201 @@ "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/utils": { + "node_modules/@typescript-eslint/utils": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.0.tgz", "integrity": "sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.19.0", "@typescript-eslint/types": "8.19.0", "@typescript-eslint/typescript-estree": "8.19.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "8.19.0", "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "acorn": { + "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-jsx": { + "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ansi-escapes": { + "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "requires": { + "dependencies": { "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "argparse": { + "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "async": { + "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "requires": { + "node_modules/axios": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "license": "MIT", + "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, - "axios-retry": { + "node_modules/axios-retry": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", - "requires": { + "dependencies": { "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" } }, - "babel-jest": { + "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "requires": { + "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", @@ -1261,60 +1714,76 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "babel-plugin-istanbul": { + "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "babel-plugin-jest-hoist": { + "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "babel-preset-current-node-syntax": { + "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, - "requires": { + "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1330,221 +1799,324 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "babel-preset-jest": { + "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "requires": { + "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0" } }, - "braces": { + "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { + "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "bs-logger": { + "node_modules/bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "requires": { + "dependencies": { "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" } }, - "bser": { + "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "requires": { + "dependencies": { "node-int64": "^0.4.0" } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "caniuse-lite": { + "node_modules/caniuse-lite": { "version": "1.0.30001692", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "chalk": { + "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "char-regex": { + "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "ci-info": { + "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, - "cjs-module-lexer": { + "node_modules/cjs-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "dev": true }, - "class-transformer": { + "node_modules/class-transformer": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" }, - "cliui": { + "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "co": { + "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "collect-v8-coverage": { + "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "commander": { + "node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "create-jest": { + "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", @@ -1552,126 +2124,187 @@ "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "debug": { + "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "requires": { + "dependencies": { "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "dedent": { + "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, - "deep-is": { + "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "deepmerge": { + "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } }, - "detect-newline": { + "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "diff-sequences": { + "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "dir-glob": { + "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "ejs": { + "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "requires": { + "dependencies": { "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "electron-to-chromium": { + "node_modules/electron-to-chromium": { "version": "1.5.83", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==", "dev": true }, - "emittery": { + "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escalade": { + "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "eslint": { + "node_modules/eslint": { "version": "9.17.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", @@ -1707,122 +2340,206 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true } } }, - "eslint-config-prettier": { + "node_modules/eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } }, - "eslint-plugin-prettier": { + "node_modules/eslint-plugin-prettier": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, - "requires": { + "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "eslint-scope": { + "node_modules/eslint-scope": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, - "requires": { + "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "eslint-visitor-keys": { + "node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "espree": { + "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, - "requires": { + "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "esquery": { + "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "execa": { + "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", @@ -1832,210 +2549,284 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "exit": { + "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "expect": { + "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, - "requires": { + "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-diff": { + "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { + "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "fastq": { + "node_modules/fastq": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "fb-watchman": { + "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "requires": { + "dependencies": { "bser": "2.1.1" } }, - "file-entry-cache": { + "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "requires": { + "dependencies": { "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "filelist": { + "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, - "requires": { + "dependencies": { "minimatch": "^5.0.1" - }, + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, "dependencies": { - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-up": { + "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "flat-cache": { + "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "requires": { + "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "flatted": { + "node_modules/flatted": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, - "follow-redirects": { + "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "form-data": { + "node_modules/form-data": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "requires": { + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { + "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-package-type": { + "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.0.0" + } }, - "get-stream": { + "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "glob": { + "node_modules/glob": { "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, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", @@ -2043,352 +2834,456 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "globals": { + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "globby": { + "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "graphemer": { + "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "hasown": { + "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "human-signals": { + "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.17.0" + } }, - "ignore": { + "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "import-fresh": { + "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "import-local": { + "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "requires": { + "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "inflight": { + "node_modules/inflight": { "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, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-core-module": { + "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, - "requires": { + "dependencies": { "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-generator-fn": { + "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-retry-allowed": { + "node_modules/is-retry-allowed": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==" + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "istanbul-lib-coverage": { + "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" } }, - "istanbul-reports": { + "node_modules/istanbul-reports": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "jake": { + "node_modules/jake": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, - "requires": { + "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "jest": { + "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "requires": { + "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, - "dependencies": { - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true } } }, - "jest-changed-files": { + "node_modules/jest-changed-files": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "requires": { + "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-circus": { + "node_modules/jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -2409,14 +3304,17 @@ "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-config": { + "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", @@ -2439,110 +3337,151 @@ "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "jest-diff": { + "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-docblock": { + "node_modules/jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "requires": { + "dependencies": { "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-each": { + "node_modules/jest-each": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-environment-node": { + "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-get-type": { + "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "jest-haste-map": { + "node_modules/jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "jest-leak-detector": { + "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "requires": { + "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-matcher-utils": { + "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-message-util": { + "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", @@ -2552,37 +3491,57 @@ "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-mock": { + "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-pnp-resolver": { + "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } }, - "jest-regex-util": { + "node_modules/jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "jest-resolve": { + "node_modules/jest-resolve": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", @@ -2592,24 +3551,30 @@ "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-resolve-dependencies": { + "node_modules/jest-resolve-dependencies": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "requires": { + "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-runner": { + "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -2631,14 +3596,17 @@ "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-runtime": { + "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", @@ -2661,14 +3629,17 @@ "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-snapshot": { + "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", @@ -2689,28 +3660,34 @@ "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-util": { + "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-validate": { + "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", @@ -2718,21 +3695,28 @@ "leven": "^3.1.0", "pretty-format": "^29.7.0" }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jest-watcher": { + "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", @@ -2741,820 +3725,1175 @@ "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "jest-worker": { + "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true } } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { + "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { + "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsesc": { + "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } }, - "json-buffer": { + "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "json-parse-even-better-errors": { + "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify-without-jsonify": { + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "keyv": { + "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "requires": { + "dependencies": { "json-buffer": "3.0.1" } }, - "kleur": { + "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "leven": { + "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "levn": { + "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "lines-and-columns": { + "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "locate-path": { + "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lodash.memoize": { + "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "lodash.merge": { + "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lru-cache": { + "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "requires": { + "dependencies": { "yallist": "^3.0.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "requires": { + "dependencies": { "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "make-error": { + "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "makeerror": { + "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "requires": { + "dependencies": { "tmpl": "1.0.5" } }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "ms": { + "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "mylas": { + "node_modules/mylas": { "version": "2.1.13", "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", - "dev": true + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node-releases": { + "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "optionator": { + "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "requires": { + "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "p-limit": { + "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { + "dependencies": { "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { + "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picocolors": { + "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pirates": { + "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "plimit-lit": { + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plimit-lit": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", "dev": true, - "requires": { + "dependencies": { "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "prettier": { + "node_modules/prettier": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", - "dev": true + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "prettier-linter-helpers": { + "node_modules/prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "requires": { + "dependencies": { "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "pretty-format": { + "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "requires": { + "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "prompts": { + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "requires": { + "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "proxy-from-env": { + "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "punycode": { + "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "pure-rand": { + "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] }, - "queue-lit": { + "node_modules/queue-lit": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "react-is": { + "node_modules/react-is": { "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 }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "reflect-metadata": { + "node_modules/reflect-metadata": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "resolve": { + "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, - "requires": { + "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "resolve.exports": { + "node_modules/resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "semver": { + "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "stack-utils": { + "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^2.0.0" }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" } }, - "string-length": { + "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "requires": { + "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-preserve-symlinks-flag": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "synckit": { + "node_modules/synckit": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, - "requires": { + "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "ts-api-utils": { + "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } }, - "ts-jest": { + "node_modules/ts-jest": { "version": "29.2.5", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, - "requires": { + "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", "fast-json-stable-stringify": "^2.1.0", @@ -3564,165 +4903,277 @@ "make-error": "^1.3.6", "semver": "^7.6.3", "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "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", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } } }, - "tsc-alias": { + "node_modules/tsc-alias": { "version": "1.8.10", "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.10.tgz", "integrity": "sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==", "dev": true, - "requires": { + "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", "globby": "^11.0.4", "mylas": "^2.1.9", "normalize-path": "^3.0.0", "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" } }, - "tslib": { + "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, - "type-check": { + "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "typescript": { + "node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "undici-types": { + "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, - "update-browserslist-db": { + "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "v8-to-istanbul": { + "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" } }, - "walker": { + "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "requires": { + "dependencies": { "makeerror": "1.0.12" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "word-wrap": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "ws": { + "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "requires": { + "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -3730,19 +5181,31 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + } }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/sdk/node/package.json b/sdk/node/package.json index 78d55f52..c4b820f1 100644 --- a/sdk/node/package.json +++ b/sdk/node/package.json @@ -1,6 +1,6 @@ { "name": "kucoin-universal-sdk", - "version": "1.2.0", + "version": "1.3.0", "description": "Official KuCoin Universal SDK.", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -47,7 +47,7 @@ "node": ">=14" }, "dependencies": { - "axios": "^1.7.9", + "axios": "^1.8.2", "axios-retry": "^4.5.0", "class-transformer": "^0.5.1", "reflect-metadata": "^0.2.2", diff --git a/sdk/node/src/generate/account/account/api_account.test.ts b/sdk/node/src/generate/account/account/api_account.test.ts index 17a97caa..06e142d2 100644 --- a/sdk/node/src/generate/account/account/api_account.test.ts +++ b/sdk/node/src/generate/account/account/api_account.test.ts @@ -155,7 +155,7 @@ describe('Auto Test', () => { * /api/v3/margin/accounts */ let data = - '{\n "code": "200000",\n "data": {\n "totalAssetOfQuoteCurrency": "0.02",\n "totalLiabilityOfQuoteCurrency": "0",\n "debtRatio": "0",\n "status": "EFFECTIVE",\n "accounts": [\n {\n "currency": "USDT",\n "total": "0.02",\n "available": "0.02",\n "hold": "0",\n "liability": "0",\n "maxBorrowSize": "0",\n "borrowEnabled": true,\n "transferInEnabled": true\n }\n ]\n }\n}'; + '{\n "code": "200000",\n "data": {\n "totalAssetOfQuoteCurrency": "40.8648372",\n "totalLiabilityOfQuoteCurrency": "0",\n "debtRatio": "0",\n "status": "EFFECTIVE",\n "accounts": [\n {\n "currency": "USDT",\n "total": "38.68855864",\n "available": "20.01916691",\n "hold": "18.66939173",\n "liability": "0",\n "liabilityPrincipal": "0",\n "liabilityInterest": "0",\n "maxBorrowSize": "163",\n "borrowEnabled": true,\n "transferInEnabled": true\n }\n ]\n }\n}'; let commonResp = RestResponse.fromJson(data); let resp = GetCrossMarginAccountResp.fromObject(commonResp.data); if (commonResp.data !== null) { @@ -171,8 +171,7 @@ describe('Auto Test', () => { * Get Account - Isolated Margin * /api/v3/isolated/accounts */ - let data = - '{"symbol": "example_string_default_value", "quoteCurrency": "USDT", "queryType": "ISOLATED"}'; + let data = '{"symbol": "BTC-USDT", "quoteCurrency": "USDT", "queryType": "ISOLATED"}'; let req = GetIsolatedMarginAccountReq.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, @@ -187,7 +186,7 @@ describe('Auto Test', () => { * /api/v3/isolated/accounts */ let data = - '{\n "code": "200000",\n "data": {\n "totalAssetOfQuoteCurrency": "0.01",\n "totalLiabilityOfQuoteCurrency": "0",\n "timestamp": 1728725465994,\n "assets": [\n {\n "symbol": "BTC-USDT",\n "status": "EFFECTIVE",\n "debtRatio": "0",\n "baseAsset": {\n "currency": "BTC",\n "borrowEnabled": true,\n "transferInEnabled": true,\n "liability": "0",\n "total": "0",\n "available": "0",\n "hold": "0",\n "maxBorrowSize": "0"\n },\n "quoteAsset": {\n "currency": "USDT",\n "borrowEnabled": true,\n "transferInEnabled": true,\n "liability": "0",\n "total": "0.01",\n "available": "0.01",\n "hold": "0",\n "maxBorrowSize": "0"\n }\n }\n ]\n }\n}'; + '{\n "code": "200000",\n "data": {\n "totalAssetOfQuoteCurrency": "4.97047372",\n "totalLiabilityOfQuoteCurrency": "0.00038891",\n "timestamp": 1747303659773,\n "assets": [\n {\n "symbol": "BTC-USDT",\n "status": "EFFECTIVE",\n "debtRatio": "0",\n "baseAsset": {\n "currency": "BTC",\n "borrowEnabled": true,\n "transferInEnabled": true,\n "liability": "0",\n "liabilityPrincipal": "0",\n "liabilityInterest": "0",\n "total": "0",\n "available": "0",\n "hold": "0",\n "maxBorrowSize": "0"\n },\n "quoteAsset": {\n "currency": "USDT",\n "borrowEnabled": true,\n "transferInEnabled": true,\n "liability": "0.00038891",\n "liabilityPrincipal": "0.00038888",\n "liabilityInterest": "0.00000003",\n "total": "4.97047372",\n "available": "4.97047372",\n "hold": "0",\n "maxBorrowSize": "44"\n }\n }\n ]\n }\n}'; let commonResp = RestResponse.fromJson(data); let resp = GetIsolatedMarginAccountResp.fromObject(commonResp.data); if (commonResp.data !== null) { diff --git a/sdk/node/src/generate/account/account/model_get_cross_margin_account_accounts.ts b/sdk/node/src/generate/account/account/model_get_cross_margin_account_accounts.ts index 60cb80e5..9a82964b 100644 --- a/sdk/node/src/generate/account/account/model_get_cross_margin_account_accounts.ts +++ b/sdk/node/src/generate/account/account/model_get_cross_margin_account_accounts.ts @@ -44,6 +44,16 @@ export class GetCrossMarginAccountAccounts implements Serializable { */ transferInEnabled: boolean; + /** + * Outstanding principal – the unpaid loan amount + */ + liabilityPrincipal: string; + + /** + * Accrued interest – the unpaid interest amount + */ + liabilityInterest: string; + /** * Private constructor, please use the corresponding static methods to construct the object. */ @@ -64,6 +74,10 @@ export class GetCrossMarginAccountAccounts implements Serializable { this.borrowEnabled = null; // @ts-ignore this.transferInEnabled = null; + // @ts-ignore + this.liabilityPrincipal = null; + // @ts-ignore + this.liabilityInterest = null; } /** * Convert the object to a JSON string. diff --git a/sdk/node/src/generate/account/account/model_get_cross_margin_account_resp.ts b/sdk/node/src/generate/account/account/model_get_cross_margin_account_resp.ts index e4f09cd9..102607fd 100644 --- a/sdk/node/src/generate/account/account/model_get_cross_margin_account_resp.ts +++ b/sdk/node/src/generate/account/account/model_get_cross_margin_account_resp.ts @@ -24,7 +24,7 @@ export class GetCrossMarginAccountResp implements Response { /** * Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing */ - status: GetCrossMarginAccountResp.StatusEnum; + status: string; /** * Margin account list @@ -76,28 +76,3 @@ export class GetCrossMarginAccountResp implements Response { return plainToClassFromExist(new GetCrossMarginAccountResp(), jsonObject); } } - -export namespace GetCrossMarginAccountResp { - export enum StatusEnum { - /** - * Effective - */ - EFFECTIVE = 'EFFECTIVE', - /** - * Bankruptcy liquidation - */ - BANKRUPTCY = 'BANKRUPTCY', - /** - * Closing - */ - LIQUIDATION = 'LIQUIDATION', - /** - * Repayment - */ - REPAY = 'REPAY', - /** - * Borrowing - */ - BORROW = 'BORROW', - } -} diff --git a/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets.ts b/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets.ts index cc6a2b17..abd19555 100644 --- a/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets.ts +++ b/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets.ts @@ -9,45 +9,34 @@ export class GetIsolatedMarginAccountAssets implements Serializable { /** * Symbol */ - symbol: string; + symbol?: string; /** * Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing */ - status: GetIsolatedMarginAccountAssets.StatusEnum; + status?: string; /** * debt ratio */ - debtRatio: string; + debtRatio?: string; /** * */ @Type(() => GetIsolatedMarginAccountAssetsBaseAsset) - baseAsset: GetIsolatedMarginAccountAssetsBaseAsset; + baseAsset?: GetIsolatedMarginAccountAssetsBaseAsset; /** * */ @Type(() => GetIsolatedMarginAccountAssetsQuoteAsset) - quoteAsset: GetIsolatedMarginAccountAssetsQuoteAsset; + quoteAsset?: GetIsolatedMarginAccountAssetsQuoteAsset; /** * Private constructor, please use the corresponding static methods to construct the object. */ - private constructor() { - // @ts-ignore - this.symbol = null; - // @ts-ignore - this.status = null; - // @ts-ignore - this.debtRatio = null; - // @ts-ignore - this.baseAsset = null; - // @ts-ignore - this.quoteAsset = null; - } + private constructor() {} /** * Convert the object to a JSON string. */ @@ -67,28 +56,3 @@ export class GetIsolatedMarginAccountAssets implements Serializable { return plainToClassFromExist(new GetIsolatedMarginAccountAssets(), jsonObject); } } - -export namespace GetIsolatedMarginAccountAssets { - export enum StatusEnum { - /** - * Effective - */ - EFFECTIVE = 'EFFECTIVE', - /** - * Bankruptcy liquidation - */ - BANKRUPTCY = 'BANKRUPTCY', - /** - * Closing - */ - LIQUIDATION = 'LIQUIDATION', - /** - * Repayment - */ - REPAY = 'REPAY', - /** - * Borrowing - */ - BORROW = 'BORROW', - } -} diff --git a/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_base_asset.ts b/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_base_asset.ts index 54f44384..006690c6 100644 --- a/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_base_asset.ts +++ b/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_base_asset.ts @@ -44,6 +44,16 @@ export class GetIsolatedMarginAccountAssetsBaseAsset implements Serializable { */ maxBorrowSize: string; + /** + * Outstanding principal + */ + liabilityPrincipal: string; + + /** + * Outstanding interest + */ + liabilityInterest: string; + /** * Private constructor, please use the corresponding static methods to construct the object. */ @@ -64,6 +74,10 @@ export class GetIsolatedMarginAccountAssetsBaseAsset implements Serializable { this.hold = null; // @ts-ignore this.maxBorrowSize = null; + // @ts-ignore + this.liabilityPrincipal = null; + // @ts-ignore + this.liabilityInterest = null; } /** * Convert the object to a JSON string. diff --git a/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.ts b/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.ts index d9f61bf8..b912d7d8 100644 --- a/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.ts +++ b/sdk/node/src/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.ts @@ -44,6 +44,16 @@ export class GetIsolatedMarginAccountAssetsQuoteAsset implements Serializable { */ maxBorrowSize: string; + /** + * + */ + liabilityPrincipal: string; + + /** + * + */ + liabilityInterest: string; + /** * Private constructor, please use the corresponding static methods to construct the object. */ @@ -64,6 +74,10 @@ export class GetIsolatedMarginAccountAssetsQuoteAsset implements Serializable { this.hold = null; // @ts-ignore this.maxBorrowSize = null; + // @ts-ignore + this.liabilityPrincipal = null; + // @ts-ignore + this.liabilityInterest = null; } /** * Convert the object to a JSON string. diff --git a/sdk/node/src/generate/account/account/model_get_spot_hf_ledger_req.ts b/sdk/node/src/generate/account/account/model_get_spot_hf_ledger_req.ts index e66908ee..4ba09305 100644 --- a/sdk/node/src/generate/account/account/model_get_spot_hf_ledger_req.ts +++ b/sdk/node/src/generate/account/account/model_get_spot_hf_ledger_req.ts @@ -132,23 +132,27 @@ export namespace GetSpotHFLedgerReq { } export enum BizTypeEnum { /** - * trade exchange + * Trade exchange */ TRADE_EXCHANGE = 'TRADE_EXCHANGE', /** - * transfer + * Transfer */ TRANSFER = 'TRANSFER', /** - * returned fees + * Sub transfer + */ + SUB_TRANSFER = 'SUB_TRANSFER', + /** + * Returned fees */ RETURNED_FEES = 'RETURNED_FEES', /** - * deduction fees + * Deduction fees */ DEDUCTION_FEES = 'DEDUCTION_FEES', /** - * other + * Other */ OTHER = 'OTHER', } diff --git a/sdk/node/src/generate/account/deposit/api_deposit.test.ts b/sdk/node/src/generate/account/deposit/api_deposit.test.ts index 3bb77b11..ecbbd815 100644 --- a/sdk/node/src/generate/account/deposit/api_deposit.test.ts +++ b/sdk/node/src/generate/account/deposit/api_deposit.test.ts @@ -209,7 +209,7 @@ describe('Auto Test', () => { * Add Deposit Address - V1 * /api/v1/deposit-addresses */ - let data = '{"currency": "ETH", "chain": "eth"}'; + let data = '{"currency": "ETH", "chain": "eth", "to": "MAIN"}'; let req = AddDepositAddressV1Req.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, diff --git a/sdk/node/src/generate/account/deposit/model_add_deposit_address_v1_req.ts b/sdk/node/src/generate/account/deposit/model_add_deposit_address_v1_req.ts index 3ba09744..e6c5f9ac 100644 --- a/sdk/node/src/generate/account/deposit/model_add_deposit_address_v1_req.ts +++ b/sdk/node/src/generate/account/deposit/model_add_deposit_address_v1_req.ts @@ -91,11 +91,11 @@ export namespace AddDepositAddressV1Req { /** * Funding account */ - MAIN = 'main', + MAIN = 'MAIN', /** * Spot account */ - TRADE = 'trade', + TRADE = 'TRADE', } } diff --git a/sdk/node/src/generate/account/index.ts b/sdk/node/src/generate/account/index.ts index 6153b554..4f136ea0 100644 --- a/sdk/node/src/generate/account/index.ts +++ b/sdk/node/src/generate/account/index.ts @@ -51,6 +51,8 @@ export namespace Account { export namespace Withdrawal { export type CancelWithdrawalReq = WITHDRAWAL.CancelWithdrawalReq; export type CancelWithdrawalResp = WITHDRAWAL.CancelWithdrawalResp; + export type GetWithdrawalHistoryByIdReq = WITHDRAWAL.GetWithdrawalHistoryByIdReq; + export type GetWithdrawalHistoryByIdResp = WITHDRAWAL.GetWithdrawalHistoryByIdResp; export type GetWithdrawalHistoryItems = WITHDRAWAL.GetWithdrawalHistoryItems; export type GetWithdrawalHistoryOldItems = WITHDRAWAL.GetWithdrawalHistoryOldItems; export type GetWithdrawalHistoryOldReq = WITHDRAWAL.GetWithdrawalHistoryOldReq; diff --git a/sdk/node/src/generate/account/subaccount/api_sub_account.test.ts b/sdk/node/src/generate/account/subaccount/api_sub_account.test.ts index b5086bfb..f6fa6857 100644 --- a/sdk/node/src/generate/account/subaccount/api_sub_account.test.ts +++ b/sdk/node/src/generate/account/subaccount/api_sub_account.test.ts @@ -32,7 +32,7 @@ describe('Auto Test', () => { * /api/v2/sub/user/created */ let data = - '{"password": "1234567", "remarks": "TheRemark", "subName": "Name1234567", "access": "Spot"}'; + '{"password": "q1234567", "access": "Spot", "subName": "subNameTest1", "remarks": "TheRemark"}'; let req = AddSubAccountReq.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, @@ -47,7 +47,7 @@ describe('Auto Test', () => { * /api/v2/sub/user/created */ let data = - '{\n "code": "200000",\n "data": {\n "currentPage": 1,\n "pageSize": 10,\n "totalNum": 1,\n "totalPage": 1,\n "items": [\n {\n "userId": "63743f07e0c5230001761d08",\n "uid": 169579801,\n "subName": "testapi6",\n "status": 2,\n "type": 0,\n "access": "All",\n "createdAt": 1668562696000,\n "remarks": "remarks",\n "tradeTypes": [\n "Spot",\n "Futures",\n "Margin"\n ],\n "openedTradeTypes": [\n "Spot"\n ],\n "hostedStatus": null\n }\n ]\n }\n}'; + '{\n "code": "200000",\n "data": {\n "uid": 245730746,\n "subName": "subNameTest1",\n "remarks": "TheRemark",\n "access": "Spot"\n }\n}'; let commonResp = RestResponse.fromJson(data); let resp = AddSubAccountResp.fromObject(commonResp.data); if (commonResp.data !== null) { diff --git a/sdk/node/src/generate/account/subaccount/model_add_sub_account_resp.ts b/sdk/node/src/generate/account/subaccount/model_add_sub_account_resp.ts index 004d41d1..6bf56a9a 100644 --- a/sdk/node/src/generate/account/subaccount/model_add_sub_account_resp.ts +++ b/sdk/node/src/generate/account/subaccount/model_add_sub_account_resp.ts @@ -6,22 +6,22 @@ import { Response } from '@internal/interfaces/serializable'; export class AddSubAccountResp implements Response { /** - * Sub-account UID + * Sub account user id */ uid: number; /** - * Sub-account name + * Sub account name */ subName: string; /** - * Remarks + * Sub account name */ remarks: string; /** - * Permission + * permission */ access: string; diff --git a/sdk/node/src/generate/account/withdrawal/api_withdrawal.template b/sdk/node/src/generate/account/withdrawal/api_withdrawal.template index 811b0c60..670f1cfd 100644 --- a/sdk/node/src/generate/account/withdrawal/api_withdrawal.template +++ b/sdk/node/src/generate/account/withdrawal/api_withdrawal.template @@ -88,6 +88,45 @@ describe('Auto Test', ()=> { }); }) + test('getWithdrawalHistoryById request test', ()=> { + /** + * getWithdrawalHistoryById + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + let builder = GetWithdrawalHistoryByIdReq.builder(); + builder.setWithdrawalId(?); + let req = builder.build(); + let resp = api.getWithdrawalHistoryById(req); + return resp.then(result => { + expect(result.id).toEqual(expect.anything()); + expect(result.uid).toEqual(expect.anything()); + expect(result.currency).toEqual(expect.anything()); + expect(result.chainId).toEqual(expect.anything()); + expect(result.chainName).toEqual(expect.anything()); + expect(result.currencyName).toEqual(expect.anything()); + expect(result.status).toEqual(expect.anything()); + expect(result.failureReason).toEqual(expect.anything()); + expect(result.failureReasonMsg).toEqual(expect.anything()); + expect(result.address).toEqual(expect.anything()); + expect(result.memo).toEqual(expect.anything()); + expect(result.isInner).toEqual(expect.anything()); + expect(result.amount).toEqual(expect.anything()); + expect(result.fee).toEqual(expect.anything()); + expect(result.walletTxId).toEqual(expect.anything()); + expect(result.addressRemark).toEqual(expect.anything()); + expect(result.remark).toEqual(expect.anything()); + expect(result.createdAt).toEqual(expect.anything()); + expect(result.cancelType).toEqual(expect.anything()); + expect(result.taxes).toEqual(expect.anything()); + expect(result.taxDescription).toEqual(expect.anything()); + expect(result.returnStatus).toEqual(expect.anything()); + expect(result.returnAmount).toEqual(expect.anything()); + expect(result.returnCurrency).toEqual(expect.anything()); + console.log(resp); + }); + }) + test('getWithdrawalHistoryOld request test', ()=> { /** * getWithdrawalHistoryOld diff --git a/sdk/node/src/generate/account/withdrawal/api_withdrawal.test.ts b/sdk/node/src/generate/account/withdrawal/api_withdrawal.test.ts index f6bd81ff..851f424a 100644 --- a/sdk/node/src/generate/account/withdrawal/api_withdrawal.test.ts +++ b/sdk/node/src/generate/account/withdrawal/api_withdrawal.test.ts @@ -1,14 +1,16 @@ import { WithdrawalV1Req } from './model_withdrawal_v1_req'; -import { GetWithdrawalHistoryOldResp } from './model_get_withdrawal_history_old_resp'; -import { GetWithdrawalQuotasResp } from './model_get_withdrawal_quotas_resp'; +import { GetWithdrawalHistoryByIdResp } from './model_get_withdrawal_history_by_id_resp'; import { CancelWithdrawalResp } from './model_cancel_withdrawal_resp'; import { WithdrawalV3Req } from './model_withdrawal_v3_req'; -import { GetWithdrawalHistoryOldReq } from './model_get_withdrawal_history_old_req'; import { WithdrawalV3Resp } from './model_withdrawal_v3_resp'; -import { CancelWithdrawalReq } from './model_cancel_withdrawal_req'; -import { GetWithdrawalHistoryReq } from './model_get_withdrawal_history_req'; import { GetWithdrawalQuotasReq } from './model_get_withdrawal_quotas_req'; import { WithdrawalV1Resp } from './model_withdrawal_v1_resp'; +import { GetWithdrawalHistoryOldResp } from './model_get_withdrawal_history_old_resp'; +import { GetWithdrawalQuotasResp } from './model_get_withdrawal_quotas_resp'; +import { GetWithdrawalHistoryOldReq } from './model_get_withdrawal_history_old_req'; +import { CancelWithdrawalReq } from './model_cancel_withdrawal_req'; +import { GetWithdrawalHistoryByIdReq } from './model_get_withdrawal_history_by_id_req'; +import { GetWithdrawalHistoryReq } from './model_get_withdrawal_history_req'; import { GetWithdrawalHistoryResp } from './model_get_withdrawal_history_resp'; import { RestResponse } from '@model/common'; @@ -51,7 +53,7 @@ describe('Auto Test', () => { * /api/v3/withdrawals */ let data = - '{"currency": "USDT", "toAddress": "TKFRQXSDcY****GmLrjJggwX8", "amount": 3, "withdrawType": "ADDRESS", "chain": "trx", "isInner": true, "remark": "this is Remark"}'; + '{"currency": "USDT", "toAddress": "TKFRQXSDcY****GmLrjJggwX8", "amount": "3", "withdrawType": "ADDRESS", "chain": "trx", "isInner": true, "remark": "this is Remark"}'; let req = WithdrawalV3Req.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, @@ -137,6 +139,37 @@ describe('Auto Test', () => { console.log(resp); } }); + test('getWithdrawalHistoryById request test', () => { + /** + * getWithdrawalHistoryById + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + let data = '{"withdrawalId": "67e6515f7960ba0007b42025"}'; + let req = GetWithdrawalHistoryByIdReq.fromJson(data); + expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( + false, + ); + console.log(req); + }); + + test('getWithdrawalHistoryById response test', () => { + /** + * getWithdrawalHistoryById + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + let data = + '{\n "code": "200000",\n "data": {\n "id": "67e6515f7960ba0007b42025",\n "uid": 165111215,\n "currency": "USDT",\n "chainId": "trx",\n "chainName": "TRC20",\n "currencyName": "USDT",\n "status": "SUCCESS",\n "failureReason": "",\n "failureReasonMsg": null,\n "address": "TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8",\n "memo": "",\n "isInner": true,\n "amount": "3.00000000",\n "fee": "0.00000000",\n "walletTxId": null,\n "addressRemark": null,\n "remark": "this is Remark",\n "createdAt": 1743147359000,\n "cancelType": "NON_CANCELABLE",\n "taxes": null,\n "taxDescription": null,\n "returnStatus": "NOT_RETURN",\n "returnAmount": null,\n "returnCurrency": "KCS"\n }\n}'; + let commonResp = RestResponse.fromJson(data); + let resp = GetWithdrawalHistoryByIdResp.fromObject(commonResp.data); + if (commonResp.data !== null) { + expect( + Object.values(resp).every((value) => value === null || value === undefined), + ).toBe(false); + console.log(resp); + } + }); test('getWithdrawalHistoryOld request test', () => { /** * getWithdrawalHistoryOld diff --git a/sdk/node/src/generate/account/withdrawal/api_withdrawal.ts b/sdk/node/src/generate/account/withdrawal/api_withdrawal.ts index 97523d5d..15bd4196 100644 --- a/sdk/node/src/generate/account/withdrawal/api_withdrawal.ts +++ b/sdk/node/src/generate/account/withdrawal/api_withdrawal.ts @@ -2,16 +2,18 @@ import { Transport } from '@internal/interfaces/transport'; import { WithdrawalV1Req } from './model_withdrawal_v1_req'; -import { GetWithdrawalHistoryOldResp } from './model_get_withdrawal_history_old_resp'; -import { GetWithdrawalQuotasResp } from './model_get_withdrawal_quotas_resp'; +import { GetWithdrawalHistoryByIdResp } from './model_get_withdrawal_history_by_id_resp'; import { CancelWithdrawalResp } from './model_cancel_withdrawal_resp'; import { WithdrawalV3Req } from './model_withdrawal_v3_req'; -import { GetWithdrawalHistoryOldReq } from './model_get_withdrawal_history_old_req'; import { WithdrawalV3Resp } from './model_withdrawal_v3_resp'; -import { CancelWithdrawalReq } from './model_cancel_withdrawal_req'; -import { GetWithdrawalHistoryReq } from './model_get_withdrawal_history_req'; import { GetWithdrawalQuotasReq } from './model_get_withdrawal_quotas_req'; import { WithdrawalV1Resp } from './model_withdrawal_v1_resp'; +import { GetWithdrawalHistoryOldResp } from './model_get_withdrawal_history_old_resp'; +import { GetWithdrawalQuotasResp } from './model_get_withdrawal_quotas_resp'; +import { GetWithdrawalHistoryOldReq } from './model_get_withdrawal_history_old_req'; +import { CancelWithdrawalReq } from './model_cancel_withdrawal_req'; +import { GetWithdrawalHistoryByIdReq } from './model_get_withdrawal_history_by_id_req'; +import { GetWithdrawalHistoryReq } from './model_get_withdrawal_history_req'; import { GetWithdrawalHistoryResp } from './model_get_withdrawal_history_resp'; export interface WithdrawalAPI { @@ -79,6 +81,24 @@ export interface WithdrawalAPI { */ getWithdrawalHistory(req: GetWithdrawalHistoryReq): Promise; + /** + * getWithdrawalHistoryById Get Withdrawal History By ID + * Description: Request a withdrawal history by id via this endpoint. + * Documentation: https://www.kucoin.com/docs-new/api-3471890 + * +-----------------------+------------+ + * | Extra API Info | Value | + * +-----------------------+------------+ + * | API-DOMAIN | SPOT | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | MANAGEMENT | + * | API-RATE-LIMIT-WEIGHT | 20 | + * +-----------------------+------------+ + */ + getWithdrawalHistoryById( + req: GetWithdrawalHistoryByIdReq, + ): Promise; + /** * @deprecated * getWithdrawalHistoryOld Get Withdrawal History - Old @@ -165,6 +185,20 @@ export class WithdrawalAPIImpl implements WithdrawalAPI { ); } + getWithdrawalHistoryById( + req: GetWithdrawalHistoryByIdReq, + ): Promise { + return this.transport.call( + 'spot', + false, + 'GET', + '/api/v1/withdrawals/{withdrawalId}', + req, + GetWithdrawalHistoryByIdResp, + false, + ); + } + getWithdrawalHistoryOld(req: GetWithdrawalHistoryOldReq): Promise { return this.transport.call( 'spot', diff --git a/sdk/node/src/generate/account/withdrawal/export.template b/sdk/node/src/generate/account/withdrawal/export.template index ccbf28dc..2933b9b9 100644 --- a/sdk/node/src/generate/account/withdrawal/export.template +++ b/sdk/node/src/generate/account/withdrawal/export.template @@ -1,6 +1,8 @@ export namespace Withdrawal { export type CancelWithdrawalReq = WITHDRAWAL.CancelWithdrawalReq; export type CancelWithdrawalResp = WITHDRAWAL.CancelWithdrawalResp; +export type GetWithdrawalHistoryByIdReq = WITHDRAWAL.GetWithdrawalHistoryByIdReq; +export type GetWithdrawalHistoryByIdResp = WITHDRAWAL.GetWithdrawalHistoryByIdResp; export type GetWithdrawalHistoryItems = WITHDRAWAL.GetWithdrawalHistoryItems; export type GetWithdrawalHistoryOldItems = WITHDRAWAL.GetWithdrawalHistoryOldItems; export type GetWithdrawalHistoryOldReq = WITHDRAWAL.GetWithdrawalHistoryOldReq; diff --git a/sdk/node/src/generate/account/withdrawal/index.ts b/sdk/node/src/generate/account/withdrawal/index.ts index b8c2bc89..d8f4f422 100644 --- a/sdk/node/src/generate/account/withdrawal/index.ts +++ b/sdk/node/src/generate/account/withdrawal/index.ts @@ -1,5 +1,7 @@ export * from './model_cancel_withdrawal_req'; export * from './model_cancel_withdrawal_resp'; +export * from './model_get_withdrawal_history_by_id_req'; +export * from './model_get_withdrawal_history_by_id_resp'; export * from './model_get_withdrawal_history_items'; export * from './model_get_withdrawal_history_old_items'; export * from './model_get_withdrawal_history_old_req'; diff --git a/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_by_id_req.ts b/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_by_id_req.ts new file mode 100644 index 00000000..f308b6d0 --- /dev/null +++ b/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_by_id_req.ts @@ -0,0 +1,78 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import 'reflect-metadata'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class GetWithdrawalHistoryByIdReq implements Serializable { + /** + * withdrawal ID + */ + @Reflect.metadata('path', 'withdrawalId') + withdrawalId?: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() {} + /** + * Creates a new instance of the `GetWithdrawalHistoryByIdReq` class. + * The builder pattern allows step-by-step construction of a `GetWithdrawalHistoryByIdReq` object. + */ + static builder(): GetWithdrawalHistoryByIdReqBuilder { + return new GetWithdrawalHistoryByIdReqBuilder(new GetWithdrawalHistoryByIdReq()); + } + + /** + * Creates a new instance of the `GetWithdrawalHistoryByIdReq` class with the given data. + */ + static create(data: { + /** + * withdrawal ID + */ + withdrawalId?: string; + }): GetWithdrawalHistoryByIdReq { + let obj = new GetWithdrawalHistoryByIdReq(); + obj.withdrawalId = data.withdrawalId; + return obj; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetWithdrawalHistoryByIdReq { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetWithdrawalHistoryByIdReq { + return plainToClassFromExist(new GetWithdrawalHistoryByIdReq(), jsonObject); + } +} + +export class GetWithdrawalHistoryByIdReqBuilder { + constructor(readonly obj: GetWithdrawalHistoryByIdReq) { + this.obj = obj; + } + /** + * withdrawal ID + */ + setWithdrawalId(value: string): GetWithdrawalHistoryByIdReqBuilder { + this.obj.withdrawalId = value; + return this; + } + + /** + * Get the final object. + */ + build(): GetWithdrawalHistoryByIdReq { + return this.obj; + } +} diff --git a/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_by_id_resp.ts b/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_by_id_resp.ts new file mode 100644 index 00000000..83b241eb --- /dev/null +++ b/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_by_id_resp.ts @@ -0,0 +1,228 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, Exclude, plainToClassFromExist } from 'class-transformer'; +import { RestResponse } from '@model/common'; +import { Response } from '@internal/interfaces/serializable'; + +export class GetWithdrawalHistoryByIdResp implements Response { + /** + * Unique ID + */ + id: string; + + /** + * User ID + */ + uid: number; + + /** + * A unique currency code that will never change + */ + currency: string; + + /** + * The chain id of currency + */ + chainId: string; + + /** + * Chain name of currency + */ + chainName: string; + + /** + * Currency name; will change after renaming + */ + currencyName: string; + + /** + * Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE + */ + status: string; + + /** + * Failure reason code + */ + failureReason: string; + + /** + * Failure reason message + */ + failureReasonMsg?: string; + + /** + * Withwrawal address + */ + address: string; + + /** + * Address remark. If there’s no remark, it is empty. + */ + memo: string; + + /** + * Internal withdrawal or not. + */ + isInner: boolean; + + /** + * Withwrawal amount + */ + amount: string; + + /** + * Fees charged for withwrawal + */ + fee: string; + + /** + * Wallet Transaction ID + */ + walletTxId?: string; + + /** + * Address remark + */ + addressRemark?: string; + + /** + * Remark + */ + remark: string; + + /** + * Creation Time (milliseconds) + */ + createdAt: number; + + /** + * + */ + cancelType: GetWithdrawalHistoryByIdResp.CancelTypeEnum; + + /** + * Users in some regions need query this field + */ + taxes?: Array; + + /** + * Tax description + */ + taxDescription?: string; + + /** + * Return status + */ + returnStatus: GetWithdrawalHistoryByIdResp.ReturnStatusEnum; + + /** + * Return amount + */ + returnAmount?: string; + + /** + * Return currency + */ + returnCurrency: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.id = null; + // @ts-ignore + this.uid = null; + // @ts-ignore + this.currency = null; + // @ts-ignore + this.chainId = null; + // @ts-ignore + this.chainName = null; + // @ts-ignore + this.currencyName = null; + // @ts-ignore + this.status = null; + // @ts-ignore + this.failureReason = null; + // @ts-ignore + this.address = null; + // @ts-ignore + this.memo = null; + // @ts-ignore + this.isInner = null; + // @ts-ignore + this.amount = null; + // @ts-ignore + this.fee = null; + // @ts-ignore + this.remark = null; + // @ts-ignore + this.createdAt = null; + // @ts-ignore + this.cancelType = null; + // @ts-ignore + this.returnStatus = null; + // @ts-ignore + this.returnCurrency = null; + } + /** + * common response + */ + @Exclude() + commonResponse?: RestResponse; + + setCommonResponse(response: RestResponse): void { + this.commonResponse = response; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetWithdrawalHistoryByIdResp { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetWithdrawalHistoryByIdResp { + return plainToClassFromExist(new GetWithdrawalHistoryByIdResp(), jsonObject); + } +} + +export namespace GetWithdrawalHistoryByIdResp { + export enum CancelTypeEnum { + /** + * Cancellable + */ + CANCELABLE = 'CANCELABLE', + /** + * Cancelling + */ + CANCELING = 'CANCELING', + /** + * Non-Cancellable + */ + NON_CANCELABLE = 'NON_CANCELABLE', + } + export enum ReturnStatusEnum { + /** + * No returned + */ + NOT_RETURN = 'NOT_RETURN', + /** + * To be returned + */ + PROCESSING = 'PROCESSING', + /** + * Returned + */ + SUCCESS = 'SUCCESS', + } +} diff --git a/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_items.ts b/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_items.ts index 74d30668..b9773494 100644 --- a/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_items.ts +++ b/sdk/node/src/generate/account/withdrawal/model_get_withdrawal_history_items.ts @@ -15,7 +15,7 @@ export class GetWithdrawalHistoryItems implements Serializable { currency?: string; /** - * The id of currency + * The chain id of currency */ chain?: string; @@ -25,7 +25,7 @@ export class GetWithdrawalHistoryItems implements Serializable { status?: GetWithdrawalHistoryItems.StatusEnum; /** - * Deposit address + * Withwrawal address */ address?: string; @@ -40,17 +40,17 @@ export class GetWithdrawalHistoryItems implements Serializable { isInner?: boolean; /** - * Deposit amount + * Withwrawal amount */ amount?: string; /** - * Fees charged for deposit + * Fees charged for withwrawal */ fee?: string; /** - * Wallet Txid + * Wallet Txid, If this is an internal withdrawal, it is empty. */ walletTxId?: string; @@ -96,23 +96,23 @@ export class GetWithdrawalHistoryItems implements Serializable { export namespace GetWithdrawalHistoryItems { export enum StatusEnum { /** - * + * REVIEW */ REVIEW = 'REVIEW', /** - * + * PROCESSING */ PROCESSING = 'PROCESSING', /** - * + * WALLET_PROCESSING */ WALLET_PROCESSING = 'WALLET_PROCESSING', /** - * + * FAILURE */ FAILURE = 'FAILURE', /** - * + * SUCCESS */ SUCCESS = 'SUCCESS', } diff --git a/sdk/node/src/generate/account/withdrawal/model_withdrawal_v3_req.ts b/sdk/node/src/generate/account/withdrawal/model_withdrawal_v3_req.ts index 403fa4cf..f57aa380 100644 --- a/sdk/node/src/generate/account/withdrawal/model_withdrawal_v3_req.ts +++ b/sdk/node/src/generate/account/withdrawal/model_withdrawal_v3_req.ts @@ -17,7 +17,7 @@ export class WithdrawalV3Req implements Serializable { /** * Withdrawal amount, a positive number which is a multiple of the amount precision */ - amount: number; + amount: string; /** * Address remark. If there’s no remark, it is empty. When you withdraw from other platforms to KuCoin, you need to fill in memo(tag). Be careful: If you do not fill in memo(tag), your deposit may not be available. @@ -85,7 +85,7 @@ export class WithdrawalV3Req implements Serializable { /** * Withdrawal amount, a positive number which is a multiple of the amount precision */ - amount: number; + amount: string; /** * Address remark. If there’s no remark, it is empty. When you withdraw from other platforms to KuCoin, you need to fill in memo(tag). Be careful: If you do not fill in memo(tag), your deposit may not be available. */ @@ -196,7 +196,7 @@ export class WithdrawalV3ReqBuilder { /** * Withdrawal amount, a positive number which is a multiple of the amount precision */ - setAmount(value: number): WithdrawalV3ReqBuilder { + setAmount(value: string): WithdrawalV3ReqBuilder { this.obj.amount = value; return this; } diff --git a/sdk/node/src/generate/broker/index.ts b/sdk/node/src/generate/broker/index.ts index 3a6d84f5..5c5b9dba 100644 --- a/sdk/node/src/generate/broker/index.ts +++ b/sdk/node/src/generate/broker/index.ts @@ -25,6 +25,12 @@ export namespace Broker { export type GetDepositListData = NDBROKER.GetDepositListData; export type GetDepositListReq = NDBROKER.GetDepositListReq; export type GetDepositListResp = NDBROKER.GetDepositListResp; + export type GetKYCStatusData = NDBROKER.GetKYCStatusData; + export type GetKYCStatusListItems = NDBROKER.GetKYCStatusListItems; + export type GetKYCStatusListReq = NDBROKER.GetKYCStatusListReq; + export type GetKYCStatusListResp = NDBROKER.GetKYCStatusListResp; + export type GetKYCStatusReq = NDBROKER.GetKYCStatusReq; + export type GetKYCStatusResp = NDBROKER.GetKYCStatusResp; export type GetRebaseReq = NDBROKER.GetRebaseReq; export type GetRebaseResp = NDBROKER.GetRebaseResp; export type GetSubAccountAPIData = NDBROKER.GetSubAccountAPIData; @@ -39,6 +45,8 @@ export namespace Broker { export type GetWithdrawDetailResp = NDBROKER.GetWithdrawDetailResp; export type ModifySubAccountApiReq = NDBROKER.ModifySubAccountApiReq; export type ModifySubAccountApiResp = NDBROKER.ModifySubAccountApiResp; + export type SubmitKYCReq = NDBROKER.SubmitKYCReq; + export type SubmitKYCResp = NDBROKER.SubmitKYCResp; export type TransferReq = NDBROKER.TransferReq; export type TransferResp = NDBROKER.TransferResp; } diff --git a/sdk/node/src/generate/broker/ndbroker/api_nd_broker.template b/sdk/node/src/generate/broker/ndbroker/api_nd_broker.template index b62b3f02..dd6a9b53 100644 --- a/sdk/node/src/generate/broker/ndbroker/api_nd_broker.template +++ b/sdk/node/src/generate/broker/ndbroker/api_nd_broker.template @@ -5,6 +5,58 @@ describe('Auto Test', ()=> { beforeAll(()=> { api = ?? }); + test('submitKYC request test', ()=> { + /** + * submitKYC + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + let builder = SubmitKYCReq.builder(); + builder.setClientUid(?).setFirstName(?).setLastName(?).setIssueCountry(?).setBirthDate(?).setIdentityType(?).setIdentityNumber(?).setExpireDate(?).setFrontPhoto(?).setBackendPhoto(?).setFacePhoto(?); + let req = builder.build(); + let resp = api.submitKYC(req); + return resp.then(result => { + expect(result.data).toEqual(expect.anything()); + console.log(resp); + }); + }) + + test('getKYCStatus request test', ()=> { + /** + * getKYCStatus + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + let builder = GetKYCStatusReq.builder(); + builder.setClientUids(?); + let req = builder.build(); + let resp = api.getKYCStatus(req); + return resp.then(result => { + expect(result.data).toEqual(expect.anything()); + console.log(resp); + }); + }) + + test('getKYCStatusList request test', ()=> { + /** + * getKYCStatusList + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + let builder = GetKYCStatusListReq.builder(); + builder.setPageNumber(?).setPageSize(?); + let req = builder.build(); + let resp = api.getKYCStatusList(req); + return resp.then(result => { + expect(result.currentPage).toEqual(expect.anything()); + expect(result.pageSize).toEqual(expect.anything()); + expect(result.totalNum).toEqual(expect.anything()); + expect(result.totalPage).toEqual(expect.anything()); + expect(result.items).toEqual(expect.anything()); + console.log(resp); + }); + }) + test('getBrokerInfo request test', ()=> { /** * getBrokerInfo diff --git a/sdk/node/src/generate/broker/ndbroker/api_nd_broker.test.ts b/sdk/node/src/generate/broker/ndbroker/api_nd_broker.test.ts index f257dfdc..47f3fbaf 100644 --- a/sdk/node/src/generate/broker/ndbroker/api_nd_broker.test.ts +++ b/sdk/node/src/generate/broker/ndbroker/api_nd_broker.test.ts @@ -2,16 +2,20 @@ import { GetSubAccountResp } from './model_get_sub_account_resp'; import { GetRebaseResp } from './model_get_rebase_resp'; import { AddSubAccountApiResp } from './model_add_sub_account_api_resp'; import { AddSubAccountApiReq } from './model_add_sub_account_api_req'; +import { SubmitKYCReq } from './model_submit_kyc_req'; import { GetSubAccountAPIReq } from './model_get_sub_account_api_req'; import { GetRebaseReq } from './model_get_rebase_req'; +import { SubmitKYCResp } from './model_submit_kyc_resp'; import { DeleteSubAccountAPIReq } from './model_delete_sub_account_api_req'; import { GetWithdrawDetailReq } from './model_get_withdraw_detail_req'; import { GetDepositDetailResp } from './model_get_deposit_detail_resp'; import { GetDepositDetailReq } from './model_get_deposit_detail_req'; +import { GetKYCStatusReq } from './model_get_kyc_status_req'; import { TransferResp } from './model_transfer_resp'; import { GetWithdrawDetailResp } from './model_get_withdraw_detail_resp'; import { DeleteSubAccountAPIResp } from './model_delete_sub_account_api_resp'; import { GetTransferHistoryResp } from './model_get_transfer_history_resp'; +import { GetKYCStatusListResp } from './model_get_kyc_status_list_resp'; import { GetDepositListResp } from './model_get_deposit_list_resp'; import { ModifySubAccountApiResp } from './model_modify_sub_account_api_resp'; import { AddSubAccountReq } from './model_add_sub_account_req'; @@ -19,6 +23,8 @@ import { GetSubAccountReq } from './model_get_sub_account_req'; import { GetSubAccountAPIResp } from './model_get_sub_account_api_resp'; import { GetBrokerInfoResp } from './model_get_broker_info_resp'; import { GetTransferHistoryReq } from './model_get_transfer_history_req'; +import { GetKYCStatusListReq } from './model_get_kyc_status_list_req'; +import { GetKYCStatusResp } from './model_get_kyc_status_resp'; import { AddSubAccountResp } from './model_add_sub_account_resp'; import { GetDepositListReq } from './model_get_deposit_list_req'; import { GetBrokerInfoReq } from './model_get_broker_info_req'; @@ -27,6 +33,99 @@ import { TransferReq } from './model_transfer_req'; import { RestResponse } from '@model/common'; describe('Auto Test', () => { + test('submitKYC request test', () => { + /** + * submitKYC + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + let data = + '{"clientUid": "226383154", "firstName": "Kaylah", "lastName": "Padberg", "issueCountry": "JP", "birthDate": "2000-01-01", "expireDate": "2030-01-01", "identityType": "passport", "identityNumber": "55", "facePhoto": "data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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", "frontPhoto": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....", "backendPhoto": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ...."}'; + let req = SubmitKYCReq.fromJson(data); + expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( + false, + ); + console.log(req); + }); + + test('submitKYC response test', () => { + /** + * submitKYC + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + let data = '{"code":"200000","data":null}'; + let commonResp = RestResponse.fromJson(data); + let resp = SubmitKYCResp.fromObject(commonResp.data); + if (commonResp.data !== null) { + expect( + Object.values(resp).every((value) => value === null || value === undefined), + ).toBe(false); + console.log(resp); + } + }); + test('getKYCStatus request test', () => { + /** + * getKYCStatus + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + let data = '{"clientUids": "226383154"}'; + let req = GetKYCStatusReq.fromJson(data); + expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( + false, + ); + console.log(req); + }); + + test('getKYCStatus response test', () => { + /** + * getKYCStatus + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + let data = + '{\n "code": "200000",\n "data": [\n {\n "clientUid": 226383154,\n "status": "PROCESS",\n "rejectReason": null\n }\n ]\n}'; + let commonResp = RestResponse.fromJson(data); + let resp = GetKYCStatusResp.fromObject(commonResp.data); + if (commonResp.data !== null) { + expect( + Object.values(resp).every((value) => value === null || value === undefined), + ).toBe(false); + console.log(resp); + } + }); + test('getKYCStatusList request test', () => { + /** + * getKYCStatusList + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + let data = '{"pageNumber": 1, "pageSize": 100}'; + let req = GetKYCStatusListReq.fromJson(data); + expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( + false, + ); + console.log(req); + }); + + test('getKYCStatusList response test', () => { + /** + * getKYCStatusList + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + let data = + '{\n "code": "200000",\n "data": {\n "currentPage": 1,\n "pageSize": 100,\n "totalNum": 9,\n "totalPage": 1,\n "items": [\n {\n "clientUid": 226383154,\n "status": "PROCESS",\n "rejectReason": null\n },\n {\n "clientUid": 232772137,\n "status": "REJECT",\n "rejectReason": "frontPhoto:Picture is not clear/covered/incomplete"\n }\n ]\n }\n}'; + let commonResp = RestResponse.fromJson(data); + let resp = GetKYCStatusListResp.fromObject(commonResp.data); + if (commonResp.data !== null) { + expect( + Object.values(resp).every((value) => value === null || value === undefined), + ).toBe(false); + console.log(resp); + } + }); test('getBrokerInfo request test', () => { /** * getBrokerInfo diff --git a/sdk/node/src/generate/broker/ndbroker/api_nd_broker.ts b/sdk/node/src/generate/broker/ndbroker/api_nd_broker.ts index a2d57ab8..9da45154 100644 --- a/sdk/node/src/generate/broker/ndbroker/api_nd_broker.ts +++ b/sdk/node/src/generate/broker/ndbroker/api_nd_broker.ts @@ -5,16 +5,20 @@ import { GetSubAccountResp } from './model_get_sub_account_resp'; import { GetRebaseResp } from './model_get_rebase_resp'; import { AddSubAccountApiResp } from './model_add_sub_account_api_resp'; import { AddSubAccountApiReq } from './model_add_sub_account_api_req'; +import { SubmitKYCReq } from './model_submit_kyc_req'; import { GetSubAccountAPIReq } from './model_get_sub_account_api_req'; import { GetRebaseReq } from './model_get_rebase_req'; +import { SubmitKYCResp } from './model_submit_kyc_resp'; import { DeleteSubAccountAPIReq } from './model_delete_sub_account_api_req'; import { GetWithdrawDetailReq } from './model_get_withdraw_detail_req'; import { GetDepositDetailResp } from './model_get_deposit_detail_resp'; import { GetDepositDetailReq } from './model_get_deposit_detail_req'; +import { GetKYCStatusReq } from './model_get_kyc_status_req'; import { TransferResp } from './model_transfer_resp'; import { GetWithdrawDetailResp } from './model_get_withdraw_detail_resp'; import { DeleteSubAccountAPIResp } from './model_delete_sub_account_api_resp'; import { GetTransferHistoryResp } from './model_get_transfer_history_resp'; +import { GetKYCStatusListResp } from './model_get_kyc_status_list_resp'; import { GetDepositListResp } from './model_get_deposit_list_resp'; import { ModifySubAccountApiResp } from './model_modify_sub_account_api_resp'; import { AddSubAccountReq } from './model_add_sub_account_req'; @@ -22,6 +26,8 @@ import { GetSubAccountReq } from './model_get_sub_account_req'; import { GetSubAccountAPIResp } from './model_get_sub_account_api_resp'; import { GetBrokerInfoResp } from './model_get_broker_info_resp'; import { GetTransferHistoryReq } from './model_get_transfer_history_req'; +import { GetKYCStatusListReq } from './model_get_kyc_status_list_req'; +import { GetKYCStatusResp } from './model_get_kyc_status_resp'; import { AddSubAccountResp } from './model_add_sub_account_resp'; import { GetDepositListReq } from './model_get_deposit_list_req'; import { GetBrokerInfoReq } from './model_get_broker_info_req'; @@ -29,6 +35,54 @@ import { ModifySubAccountApiReq } from './model_modify_sub_account_api_req'; import { TransferReq } from './model_transfer_req'; export interface NDBrokerAPI { + /** + * submitKYC Submit KYC + * Description: This endpointcan submit kyc information for a sub-account of nd broker + * Documentation: https://www.kucoin.com/docs-new/api-3472406 + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | BROKER | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | BROKER | + * | API-RATE-LIMIT-WEIGHT | NULL | + * +-----------------------+---------+ + */ + submitKYC(req: SubmitKYCReq): Promise; + + /** + * getKYCStatus Get KYC Status + * Description: This endpoint can query the specified Kyc status + * Documentation: https://www.kucoin.com/docs-new/api-3472407 + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | BROKER | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | BROKER | + * | API-RATE-LIMIT-WEIGHT | NULL | + * +-----------------------+---------+ + */ + getKYCStatus(req: GetKYCStatusReq): Promise; + + /** + * getKYCStatusList Get KYC Status List + * Description: This endpoint can query the specified Kyc status list + * Documentation: https://www.kucoin.com/docs-new/api-3472408 + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | BROKER | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | BROKER | + * | API-RATE-LIMIT-WEIGHT | NULL | + * +-----------------------+---------+ + */ + getKYCStatusList(req: GetKYCStatusListReq): Promise; + /** * getBrokerInfo Get Broker Info * Description: This endpoint supports querying the basic information of the current Broker. @@ -241,6 +295,42 @@ export interface NDBrokerAPI { export class NDBrokerAPIImpl implements NDBrokerAPI { constructor(private transport: Transport) {} + submitKYC(req: SubmitKYCReq): Promise { + return this.transport.call( + 'broker', + true, + 'POST', + '/api/kyc/ndBroker/proxyClient/submit', + req, + SubmitKYCResp, + false, + ); + } + + getKYCStatus(req: GetKYCStatusReq): Promise { + return this.transport.call( + 'broker', + true, + 'GET', + '/api/kyc/ndBroker/proxyClient/status/list', + req, + GetKYCStatusResp, + false, + ); + } + + getKYCStatusList(req: GetKYCStatusListReq): Promise { + return this.transport.call( + 'broker', + true, + 'GET', + '/api/kyc/ndBroker/proxyClient/status/page', + req, + GetKYCStatusListResp, + false, + ); + } + getBrokerInfo(req: GetBrokerInfoReq): Promise { return this.transport.call( 'broker', diff --git a/sdk/node/src/generate/broker/ndbroker/export.template b/sdk/node/src/generate/broker/ndbroker/export.template index cd411510..594e736e 100644 --- a/sdk/node/src/generate/broker/ndbroker/export.template +++ b/sdk/node/src/generate/broker/ndbroker/export.template @@ -12,6 +12,12 @@ export type GetDepositDetailResp = NDBROKER.GetDepositDetailResp; export type GetDepositListData = NDBROKER.GetDepositListData; export type GetDepositListReq = NDBROKER.GetDepositListReq; export type GetDepositListResp = NDBROKER.GetDepositListResp; +export type GetKYCStatusData = NDBROKER.GetKYCStatusData; +export type GetKYCStatusListItems = NDBROKER.GetKYCStatusListItems; +export type GetKYCStatusListReq = NDBROKER.GetKYCStatusListReq; +export type GetKYCStatusListResp = NDBROKER.GetKYCStatusListResp; +export type GetKYCStatusReq = NDBROKER.GetKYCStatusReq; +export type GetKYCStatusResp = NDBROKER.GetKYCStatusResp; export type GetRebaseReq = NDBROKER.GetRebaseReq; export type GetRebaseResp = NDBROKER.GetRebaseResp; export type GetSubAccountAPIData = NDBROKER.GetSubAccountAPIData; @@ -26,6 +32,8 @@ export type GetWithdrawDetailReq = NDBROKER.GetWithdrawDetailReq; export type GetWithdrawDetailResp = NDBROKER.GetWithdrawDetailResp; export type ModifySubAccountApiReq = NDBROKER.ModifySubAccountApiReq; export type ModifySubAccountApiResp = NDBROKER.ModifySubAccountApiResp; +export type SubmitKYCReq = NDBROKER.SubmitKYCReq; +export type SubmitKYCResp = NDBROKER.SubmitKYCResp; export type TransferReq = NDBROKER.TransferReq; export type TransferResp = NDBROKER.TransferResp; } diff --git a/sdk/node/src/generate/broker/ndbroker/index.ts b/sdk/node/src/generate/broker/ndbroker/index.ts index 18146685..9b7e4066 100644 --- a/sdk/node/src/generate/broker/ndbroker/index.ts +++ b/sdk/node/src/generate/broker/ndbroker/index.ts @@ -11,6 +11,12 @@ export * from './model_get_deposit_detail_resp'; export * from './model_get_deposit_list_data'; export * from './model_get_deposit_list_req'; export * from './model_get_deposit_list_resp'; +export * from './model_get_kyc_status_data'; +export * from './model_get_kyc_status_list_items'; +export * from './model_get_kyc_status_list_req'; +export * from './model_get_kyc_status_list_resp'; +export * from './model_get_kyc_status_req'; +export * from './model_get_kyc_status_resp'; export * from './model_get_rebase_req'; export * from './model_get_rebase_resp'; export * from './model_get_sub_account_api_data'; @@ -25,6 +31,8 @@ export * from './model_get_withdraw_detail_req'; export * from './model_get_withdraw_detail_resp'; export * from './model_modify_sub_account_api_req'; export * from './model_modify_sub_account_api_resp'; +export * from './model_submit_kyc_req'; +export * from './model_submit_kyc_resp'; export * from './model_transfer_req'; export * from './model_transfer_resp'; export * from './api_nd_broker'; diff --git a/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_data.ts b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_data.ts new file mode 100644 index 00000000..791f0c3b --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_data.ts @@ -0,0 +1,70 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class GetKYCStatusData implements Serializable { + /** + * client uid + */ + clientUid: number; + + /** + * KYC status + */ + status: GetKYCStatusData.StatusEnum; + + /** + * Reject Reason + */ + rejectReason?: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.clientUid = null; + // @ts-ignore + this.status = null; + } + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetKYCStatusData { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetKYCStatusData { + return plainToClassFromExist(new GetKYCStatusData(), jsonObject); + } +} + +export namespace GetKYCStatusData { + export enum StatusEnum { + /** + * KYC information not submitted + */ + NONE = 'NONE', + /** + * In progress + */ + PROCESS = 'PROCESS', + /** + * Passed + */ + PASS = 'PASS', + /** + * Rejected + */ + REJECT = 'REJECT', + } +} diff --git a/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_items.ts b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_items.ts new file mode 100644 index 00000000..5f793b8d --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_items.ts @@ -0,0 +1,70 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class GetKYCStatusListItems implements Serializable { + /** + * client uid + */ + clientUid: number; + + /** + * KYC status + */ + status: GetKYCStatusListItems.StatusEnum; + + /** + * Reject Reason + */ + rejectReason?: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.clientUid = null; + // @ts-ignore + this.status = null; + } + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetKYCStatusListItems { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetKYCStatusListItems { + return plainToClassFromExist(new GetKYCStatusListItems(), jsonObject); + } +} + +export namespace GetKYCStatusListItems { + export enum StatusEnum { + /** + * KYC information not submitted + */ + NONE = 'NONE', + /** + * In progress + */ + PROCESS = 'PROCESS', + /** + * Passed + */ + PASS = 'PASS', + /** + * Rejected + */ + REJECT = 'REJECT', + } +} diff --git a/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_req.ts b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_req.ts new file mode 100644 index 00000000..4614d351 --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_req.ts @@ -0,0 +1,102 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class GetKYCStatusListReq implements Serializable { + /** + * Page Number + */ + pageNumber?: number = 1; + + /** + * Page Size + */ + pageSize?: number = 100; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() {} + /** + * Creates a new instance of the `GetKYCStatusListReq` class. + * The builder pattern allows step-by-step construction of a `GetKYCStatusListReq` object. + */ + static builder(): GetKYCStatusListReqBuilder { + return new GetKYCStatusListReqBuilder(new GetKYCStatusListReq()); + } + + /** + * Creates a new instance of the `GetKYCStatusListReq` class with the given data. + */ + static create(data: { + /** + * Page Number + */ + pageNumber?: number; + /** + * Page Size + */ + pageSize?: number; + }): GetKYCStatusListReq { + let obj = new GetKYCStatusListReq(); + if (data.pageNumber) { + obj.pageNumber = data.pageNumber; + } else { + obj.pageNumber = 1; + } + if (data.pageSize) { + obj.pageSize = data.pageSize; + } else { + obj.pageSize = 100; + } + return obj; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetKYCStatusListReq { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetKYCStatusListReq { + return plainToClassFromExist(new GetKYCStatusListReq(), jsonObject); + } +} + +export class GetKYCStatusListReqBuilder { + constructor(readonly obj: GetKYCStatusListReq) { + this.obj = obj; + } + /** + * Page Number + */ + setPageNumber(value: number): GetKYCStatusListReqBuilder { + this.obj.pageNumber = value; + return this; + } + + /** + * Page Size + */ + setPageSize(value: number): GetKYCStatusListReqBuilder { + this.obj.pageSize = value; + return this; + } + + /** + * Get the final object. + */ + build(): GetKYCStatusListReq { + return this.obj; + } +} diff --git a/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_resp.ts b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_resp.ts new file mode 100644 index 00000000..64ee7600 --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_list_resp.ts @@ -0,0 +1,78 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { GetKYCStatusListItems } from './model_get_kyc_status_list_items'; +import { Type, instanceToPlain, Exclude, plainToClassFromExist } from 'class-transformer'; +import { RestResponse } from '@model/common'; +import { Response } from '@internal/interfaces/serializable'; + +export class GetKYCStatusListResp implements Response { + /** + * + */ + currentPage: number; + + /** + * + */ + pageSize: number; + + /** + * + */ + totalNum: number; + + /** + * + */ + totalPage: number; + + /** + * + */ + @Type(() => GetKYCStatusListItems) + items: Array; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.currentPage = null; + // @ts-ignore + this.pageSize = null; + // @ts-ignore + this.totalNum = null; + // @ts-ignore + this.totalPage = null; + // @ts-ignore + this.items = null; + } + /** + * common response + */ + @Exclude() + commonResponse?: RestResponse; + + setCommonResponse(response: RestResponse): void { + this.commonResponse = response; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetKYCStatusListResp { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetKYCStatusListResp { + return plainToClassFromExist(new GetKYCStatusListResp(), jsonObject); + } +} diff --git a/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_req.ts b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_req.ts new file mode 100644 index 00000000..3c45912c --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_req.ts @@ -0,0 +1,76 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class GetKYCStatusReq implements Serializable { + /** + * Client uid, Use commas to separate multiple UIDs + */ + clientUids?: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() {} + /** + * Creates a new instance of the `GetKYCStatusReq` class. + * The builder pattern allows step-by-step construction of a `GetKYCStatusReq` object. + */ + static builder(): GetKYCStatusReqBuilder { + return new GetKYCStatusReqBuilder(new GetKYCStatusReq()); + } + + /** + * Creates a new instance of the `GetKYCStatusReq` class with the given data. + */ + static create(data: { + /** + * Client uid, Use commas to separate multiple UIDs + */ + clientUids?: string; + }): GetKYCStatusReq { + let obj = new GetKYCStatusReq(); + obj.clientUids = data.clientUids; + return obj; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetKYCStatusReq { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetKYCStatusReq { + return plainToClassFromExist(new GetKYCStatusReq(), jsonObject); + } +} + +export class GetKYCStatusReqBuilder { + constructor(readonly obj: GetKYCStatusReq) { + this.obj = obj; + } + /** + * Client uid, Use commas to separate multiple UIDs + */ + setClientUids(value: string): GetKYCStatusReqBuilder { + this.obj.clientUids = value; + return this; + } + + /** + * Get the final object. + */ + build(): GetKYCStatusReq { + return this.obj; + } +} diff --git a/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_resp.ts b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_resp.ts new file mode 100644 index 00000000..a6ea939d --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_get_kyc_status_resp.ts @@ -0,0 +1,50 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { GetKYCStatusData } from './model_get_kyc_status_data'; +import { Type, instanceToPlain, Exclude, plainToClassFromExist } from 'class-transformer'; +import { RestResponse } from '@model/common'; +import { Response } from '@internal/interfaces/serializable'; + +export class GetKYCStatusResp implements Response { + /** + * + */ + @Type(() => GetKYCStatusData) + data: Array; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.data = null; + } + /** + * common response + */ + @Exclude() + commonResponse?: RestResponse; + + setCommonResponse(response: RestResponse): void { + this.commonResponse = response; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this.data)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetKYCStatusResp { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetKYCStatusResp { + return plainToClassFromExist(new GetKYCStatusResp(), { data: jsonObject }); + } +} diff --git a/sdk/node/src/generate/broker/ndbroker/model_submit_kyc_req.ts b/sdk/node/src/generate/broker/ndbroker/model_submit_kyc_req.ts new file mode 100644 index 00000000..60eadd4c --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_submit_kyc_req.ts @@ -0,0 +1,300 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class SubmitKYCReq implements Serializable { + /** + * client uid + */ + clientUid: string; + + /** + * first Name + */ + firstName: string; + + /** + * last Name + */ + lastName: string; + + /** + * ISO country code + */ + issueCountry: string; + + /** + * Birth Date + */ + birthDate: string; + + /** + * Identity type + */ + identityType: SubmitKYCReq.IdentityTypeEnum; + + /** + * Identity Number + */ + identityNumber: string; + + /** + * expire Date. If there is no expiration date, please fill in: 2099-01-01 + */ + expireDate: string; + + /** + * **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + */ + frontPhoto: string; + + /** + * **Optional when identityType=passport/bvn,** Back photo of ID, same as above + */ + backendPhoto: string; + + /** + * Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + */ + facePhoto: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.clientUid = null; + // @ts-ignore + this.firstName = null; + // @ts-ignore + this.lastName = null; + // @ts-ignore + this.issueCountry = null; + // @ts-ignore + this.birthDate = null; + // @ts-ignore + this.identityType = null; + // @ts-ignore + this.identityNumber = null; + // @ts-ignore + this.expireDate = null; + // @ts-ignore + this.frontPhoto = null; + // @ts-ignore + this.backendPhoto = null; + // @ts-ignore + this.facePhoto = null; + } + /** + * Creates a new instance of the `SubmitKYCReq` class. + * The builder pattern allows step-by-step construction of a `SubmitKYCReq` object. + */ + static builder(): SubmitKYCReqBuilder { + return new SubmitKYCReqBuilder(new SubmitKYCReq()); + } + + /** + * Creates a new instance of the `SubmitKYCReq` class with the given data. + */ + static create(data: { + /** + * client uid + */ + clientUid: string; + /** + * first Name + */ + firstName: string; + /** + * last Name + */ + lastName: string; + /** + * ISO country code + */ + issueCountry: string; + /** + * Birth Date + */ + birthDate: string; + /** + * Identity type + */ + identityType: SubmitKYCReq.IdentityTypeEnum; + /** + * Identity Number + */ + identityNumber: string; + /** + * expire Date. If there is no expiration date, please fill in: 2099-01-01 + */ + expireDate: string; + /** + * **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + */ + frontPhoto: string; + /** + * **Optional when identityType=passport/bvn,** Back photo of ID, same as above + */ + backendPhoto: string; + /** + * Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + */ + facePhoto: string; + }): SubmitKYCReq { + let obj = new SubmitKYCReq(); + obj.clientUid = data.clientUid; + obj.firstName = data.firstName; + obj.lastName = data.lastName; + obj.issueCountry = data.issueCountry; + obj.birthDate = data.birthDate; + obj.identityType = data.identityType; + obj.identityNumber = data.identityNumber; + obj.expireDate = data.expireDate; + obj.frontPhoto = data.frontPhoto; + obj.backendPhoto = data.backendPhoto; + obj.facePhoto = data.facePhoto; + return obj; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): SubmitKYCReq { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): SubmitKYCReq { + return plainToClassFromExist(new SubmitKYCReq(), jsonObject); + } +} + +export namespace SubmitKYCReq { + export enum IdentityTypeEnum { + /** + * id card + */ + IDCARD = 'idcard', + /** + * driving license + */ + DRIVINGLICENSE = 'drivinglicense', + /** + * passport + */ + PASSPORT = 'passport', + /** + * bvn + */ + BVN = 'bvn', + } +} + +export class SubmitKYCReqBuilder { + constructor(readonly obj: SubmitKYCReq) { + this.obj = obj; + } + /** + * client uid + */ + setClientUid(value: string): SubmitKYCReqBuilder { + this.obj.clientUid = value; + return this; + } + + /** + * first Name + */ + setFirstName(value: string): SubmitKYCReqBuilder { + this.obj.firstName = value; + return this; + } + + /** + * last Name + */ + setLastName(value: string): SubmitKYCReqBuilder { + this.obj.lastName = value; + return this; + } + + /** + * ISO country code + */ + setIssueCountry(value: string): SubmitKYCReqBuilder { + this.obj.issueCountry = value; + return this; + } + + /** + * Birth Date + */ + setBirthDate(value: string): SubmitKYCReqBuilder { + this.obj.birthDate = value; + return this; + } + + /** + * Identity type + */ + setIdentityType(value: SubmitKYCReq.IdentityTypeEnum): SubmitKYCReqBuilder { + this.obj.identityType = value; + return this; + } + + /** + * Identity Number + */ + setIdentityNumber(value: string): SubmitKYCReqBuilder { + this.obj.identityNumber = value; + return this; + } + + /** + * expire Date. If there is no expiration date, please fill in: 2099-01-01 + */ + setExpireDate(value: string): SubmitKYCReqBuilder { + this.obj.expireDate = value; + return this; + } + + /** + * **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + */ + setFrontPhoto(value: string): SubmitKYCReqBuilder { + this.obj.frontPhoto = value; + return this; + } + + /** + * **Optional when identityType=passport/bvn,** Back photo of ID, same as above + */ + setBackendPhoto(value: string): SubmitKYCReqBuilder { + this.obj.backendPhoto = value; + return this; + } + + /** + * Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + */ + setFacePhoto(value: string): SubmitKYCReqBuilder { + this.obj.facePhoto = value; + return this; + } + + /** + * Get the final object. + */ + build(): SubmitKYCReq { + return this.obj; + } +} diff --git a/sdk/node/src/generate/broker/ndbroker/model_submit_kyc_resp.ts b/sdk/node/src/generate/broker/ndbroker/model_submit_kyc_resp.ts new file mode 100644 index 00000000..a765cb6c --- /dev/null +++ b/sdk/node/src/generate/broker/ndbroker/model_submit_kyc_resp.ts @@ -0,0 +1,45 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, Exclude, plainToClassFromExist } from 'class-transformer'; +import { RestResponse } from '@model/common'; +import { Response } from '@internal/interfaces/serializable'; + +export class SubmitKYCResp implements Response { + /** + * + */ + data?: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() {} + /** + * common response + */ + @Exclude() + commonResponse?: RestResponse; + + setCommonResponse(response: RestResponse): void { + this.commonResponse = response; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this.data)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): SubmitKYCResp { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): SubmitKYCResp { + return plainToClassFromExist(new SubmitKYCResp(), { data: jsonObject }); + } +} diff --git a/sdk/node/src/generate/futures/fundingfees/api_funding_fees.template b/sdk/node/src/generate/futures/fundingfees/api_funding_fees.template index 329ba797..2b935a36 100644 --- a/sdk/node/src/generate/futures/fundingfees/api_funding_fees.template +++ b/sdk/node/src/generate/futures/fundingfees/api_funding_fees.template @@ -8,7 +8,7 @@ describe('Auto Test', ()=> { test('getCurrentFundingRate request test', ()=> { /** * getCurrentFundingRate - * Get Current Funding Rate. + * Get Current Funding Rate * /api/v1/funding-rate/{symbol}/current */ let builder = GetCurrentFundingRateReq.builder(); @@ -23,6 +23,8 @@ describe('Auto Test', ()=> { expect(result.predictedValue).toEqual(expect.anything()); expect(result.fundingRateCap).toEqual(expect.anything()); expect(result.fundingRateFloor).toEqual(expect.anything()); + expect(result.period).toEqual(expect.anything()); + expect(result.fundingTime).toEqual(expect.anything()); console.log(resp); }); }) diff --git a/sdk/node/src/generate/futures/fundingfees/api_funding_fees.test.ts b/sdk/node/src/generate/futures/fundingfees/api_funding_fees.test.ts index 66910f9a..e1d4e858 100644 --- a/sdk/node/src/generate/futures/fundingfees/api_funding_fees.test.ts +++ b/sdk/node/src/generate/futures/fundingfees/api_funding_fees.test.ts @@ -10,7 +10,7 @@ describe('Auto Test', () => { test('getCurrentFundingRate request test', () => { /** * getCurrentFundingRate - * Get Current Funding Rate. + * Get Current Funding Rate * /api/v1/funding-rate/{symbol}/current */ let data = '{"symbol": "XBTUSDTM"}'; @@ -24,11 +24,11 @@ describe('Auto Test', () => { test('getCurrentFundingRate response test', () => { /** * getCurrentFundingRate - * Get Current Funding Rate. + * Get Current Funding Rate * /api/v1/funding-rate/{symbol}/current */ let data = - '{\n "code": "200000",\n "data": {\n "symbol": ".XBTUSDTMFPI8H",\n "granularity": 28800000,\n "timePoint": 1731441600000,\n "value": 6.41E-4,\n "predictedValue": 5.2E-5,\n "fundingRateCap": 0.003,\n "fundingRateFloor": -0.003\n }\n}'; + '{\n "code": "200000",\n "data": {\n "symbol": ".XBTUSDTMFPI8H",\n "granularity": 28800000,\n "timePoint": 1748462400000,\n "value": 6.1E-5,\n "predictedValue": 1.09E-4,\n "fundingRateCap": 0.003,\n "fundingRateFloor": -0.003,\n "period": 0,\n "fundingTime": 1748491200000\n }\n}'; let commonResp = RestResponse.fromJson(data); let resp = GetCurrentFundingRateResp.fromObject(commonResp.data); if (commonResp.data !== null) { diff --git a/sdk/node/src/generate/futures/fundingfees/api_funding_fees.ts b/sdk/node/src/generate/futures/fundingfees/api_funding_fees.ts index d8a39f46..c09c0385 100644 --- a/sdk/node/src/generate/futures/fundingfees/api_funding_fees.ts +++ b/sdk/node/src/generate/futures/fundingfees/api_funding_fees.ts @@ -10,7 +10,7 @@ import { GetCurrentFundingRateReq } from './model_get_current_funding_rate_req'; export interface FundingFeesAPI { /** - * getCurrentFundingRate Get Current Funding Rate. + * getCurrentFundingRate Get Current Funding Rate * Description: Get Current Funding Rate. * Documentation: https://www.kucoin.com/docs-new/api-3470265 * +-----------------------+---------+ diff --git a/sdk/node/src/generate/futures/fundingfees/model_get_current_funding_rate_resp.ts b/sdk/node/src/generate/futures/fundingfees/model_get_current_funding_rate_resp.ts index 4eea89e9..950573b9 100644 --- a/sdk/node/src/generate/futures/fundingfees/model_get_current_funding_rate_resp.ts +++ b/sdk/node/src/generate/futures/fundingfees/model_get_current_funding_rate_resp.ts @@ -16,7 +16,7 @@ export class GetCurrentFundingRateResp implements Response { granularity: number; /** - * The funding rate settlement time point of the previous cycle (milliseconds) + * The funding rate settlement time point of the previous cycle (milliseconds) Before going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched. The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled. The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live. */ timePoint: number; @@ -40,6 +40,16 @@ export class GetCurrentFundingRateResp implements Response { */ fundingRateFloor: number; + /** + * Indicates whether the current funding fee is charged within this cycle + */ + period: GetCurrentFundingRateResp.PeriodEnum; + + /** + * Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing. + */ + fundingTime: number; + /** * Private constructor, please use the corresponding static methods to construct the object. */ @@ -58,6 +68,10 @@ export class GetCurrentFundingRateResp implements Response { this.fundingRateCap = null; // @ts-ignore this.fundingRateFloor = null; + // @ts-ignore + this.period = null; + // @ts-ignore + this.fundingTime = null; } /** * common response @@ -88,3 +102,16 @@ export class GetCurrentFundingRateResp implements Response { return plainToClassFromExist(new GetCurrentFundingRateResp(), jsonObject); } } + +export namespace GetCurrentFundingRateResp { + export enum PeriodEnum { + /** + * Indicates that funding will be charged in the current cycle + */ + _1 = 1, + /** + * Indicates a cross-cycle expense record that is not charged in the current cycle. + */ + _0 = 0, + } +} diff --git a/sdk/node/src/generate/futures/futuresprivate/model_all_order_event.ts b/sdk/node/src/generate/futures/futuresprivate/model_all_order_event.ts index 18a33c99..c898a850 100644 --- a/sdk/node/src/generate/futures/futuresprivate/model_all_order_event.ts +++ b/sdk/node/src/generate/futures/futuresprivate/model_all_order_event.ts @@ -35,7 +35,7 @@ export class AllOrderEvent implements Response { */ type: AllOrderEvent.TypeEnum; /** - * Order time (nanoseconds) + * Gateway received the message time (milliseconds) */ orderTime: number; /** @@ -59,7 +59,7 @@ export class AllOrderEvent implements Response { */ status: AllOrderEvent.StatusEnum; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) */ ts: number; /** diff --git a/sdk/node/src/generate/futures/futuresprivate/model_all_position_event.ts b/sdk/node/src/generate/futures/futuresprivate/model_all_position_event.ts index 548e12f7..0ee26343 100644 --- a/sdk/node/src/generate/futures/futuresprivate/model_all_position_event.ts +++ b/sdk/node/src/generate/futures/futuresprivate/model_all_position_event.ts @@ -127,7 +127,7 @@ export class AllPositionEvent implements Response { */ autoDeposit?: boolean; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement */ maintMarginReq?: number; /** @@ -155,7 +155,7 @@ export class AllPositionEvent implements Response { */ posFunding?: number; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin */ posMaint?: number; /** diff --git a/sdk/node/src/generate/futures/futuresprivate/model_margin_mode_event.ts b/sdk/node/src/generate/futures/futuresprivate/model_margin_mode_event.ts index 7983da6e..8b5c9243 100644 --- a/sdk/node/src/generate/futures/futuresprivate/model_margin_mode_event.ts +++ b/sdk/node/src/generate/futures/futuresprivate/model_margin_mode_event.ts @@ -9,11 +9,11 @@ export class MarginModeEvent implements Response { /** * The SYMBOL is the key with value \"CROSS\" or \"ISOLATED\" */ - SYMBOL: string; + data: { [key: string]: string }; private constructor() { // @ts-ignore - this.SYMBOL = null; + this.data = null; } /** * common response @@ -29,7 +29,7 @@ export class MarginModeEvent implements Response { * Convert the object to a JSON string. */ toJson(): string { - return JSON.stringify(instanceToPlain(this)); + return JSON.stringify(instanceToPlain(this.data)); } /** * Create an object from a JSON string. @@ -41,7 +41,7 @@ export class MarginModeEvent implements Response { * Create an object from Js Object. */ static fromObject(jsonObject: Object): MarginModeEvent { - return plainToClassFromExist(new MarginModeEvent(), jsonObject); + return plainToClassFromExist(new MarginModeEvent(), { data: jsonObject }); } } diff --git a/sdk/node/src/generate/futures/futuresprivate/model_order_event.ts b/sdk/node/src/generate/futures/futuresprivate/model_order_event.ts index 425d030f..ee5947eb 100644 --- a/sdk/node/src/generate/futures/futuresprivate/model_order_event.ts +++ b/sdk/node/src/generate/futures/futuresprivate/model_order_event.ts @@ -35,7 +35,7 @@ export class OrderEvent implements Response { */ type: OrderEvent.TypeEnum; /** - * Order time (nanoseconds) + * Gateway received the message time (milliseconds) */ orderTime: number; /** @@ -59,7 +59,7 @@ export class OrderEvent implements Response { */ status: OrderEvent.StatusEnum; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) */ ts: number; /** diff --git a/sdk/node/src/generate/futures/futuresprivate/model_position_event.ts b/sdk/node/src/generate/futures/futuresprivate/model_position_event.ts index 4ce4fe1b..8f17cf28 100644 --- a/sdk/node/src/generate/futures/futuresprivate/model_position_event.ts +++ b/sdk/node/src/generate/futures/futuresprivate/model_position_event.ts @@ -127,7 +127,7 @@ export class PositionEvent implements Response { */ autoDeposit?: boolean; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement */ maintMarginReq?: number; /** @@ -155,7 +155,7 @@ export class PositionEvent implements Response { */ posFunding?: number; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin */ posMaint?: number; /** diff --git a/sdk/node/src/generate/futures/index.ts b/sdk/node/src/generate/futures/index.ts index 346e86f2..d2dfedff 100644 --- a/sdk/node/src/generate/futures/index.ts +++ b/sdk/node/src/generate/futures/index.ts @@ -90,8 +90,14 @@ export namespace Futures { export namespace Positions { export type AddIsolatedMarginReq = POSITIONS.AddIsolatedMarginReq; export type AddIsolatedMarginResp = POSITIONS.AddIsolatedMarginResp; + export type BatchSwitchMarginModeErrors = POSITIONS.BatchSwitchMarginModeErrors; + export type BatchSwitchMarginModeReq = POSITIONS.BatchSwitchMarginModeReq; + export type BatchSwitchMarginModeResp = POSITIONS.BatchSwitchMarginModeResp; export type GetCrossMarginLeverageReq = POSITIONS.GetCrossMarginLeverageReq; export type GetCrossMarginLeverageResp = POSITIONS.GetCrossMarginLeverageResp; + export type GetCrossMarginRiskLimitData = POSITIONS.GetCrossMarginRiskLimitData; + export type GetCrossMarginRiskLimitReq = POSITIONS.GetCrossMarginRiskLimitReq; + export type GetCrossMarginRiskLimitResp = POSITIONS.GetCrossMarginRiskLimitResp; export type GetIsolatedMarginRiskLimitData = POSITIONS.GetIsolatedMarginRiskLimitData; export type GetIsolatedMarginRiskLimitReq = POSITIONS.GetIsolatedMarginRiskLimitReq; export type GetIsolatedMarginRiskLimitResp = POSITIONS.GetIsolatedMarginRiskLimitResp; diff --git a/sdk/node/src/generate/futures/market/model_get_all_symbols_data.ts b/sdk/node/src/generate/futures/market/model_get_all_symbols_data.ts index 7446f70d..50c748d4 100644 --- a/sdk/node/src/generate/futures/market/model_get_all_symbols_data.ts +++ b/sdk/node/src/generate/futures/market/model_get_all_symbols_data.ts @@ -127,7 +127,7 @@ export class GetAllSymbolsData implements Serializable { /** * Settlement fee */ - settlementFee: number; + settlementFee?: number; /** * Enabled ADL or not @@ -152,22 +152,22 @@ export class GetAllSymbolsData implements Serializable { /** * Fair price marking method; the Futures contract is null */ - fairMethod: GetAllSymbolsData.FairMethodEnum; + fairMethod?: GetAllSymbolsData.FairMethodEnum; /** * Ticker symbol of the base currency */ - fundingBaseSymbol: string; + fundingBaseSymbol?: string; /** * Ticker symbol of the quote currency */ - fundingQuoteSymbol: string; + fundingQuoteSymbol?: string; /** * Funding rate symbol */ - fundingRateSymbol: string; + fundingRateSymbol?: string; /** * Index symbol @@ -373,8 +373,6 @@ export class GetAllSymbolsData implements Serializable { // @ts-ignore this.makerFixFee = null; // @ts-ignore - this.settlementFee = null; - // @ts-ignore this.isDeleverage = null; // @ts-ignore this.isQuanto = null; @@ -383,14 +381,6 @@ export class GetAllSymbolsData implements Serializable { // @ts-ignore this.markMethod = null; // @ts-ignore - this.fairMethod = null; - // @ts-ignore - this.fundingBaseSymbol = null; - // @ts-ignore - this.fundingQuoteSymbol = null; - // @ts-ignore - this.fundingRateSymbol = null; - // @ts-ignore this.indexSymbol = null; // @ts-ignore this.settlementSymbol = null; diff --git a/sdk/node/src/generate/futures/order/api_order.ts b/sdk/node/src/generate/futures/order/api_order.ts index b7fb9326..1744ac0d 100644 --- a/sdk/node/src/generate/futures/order/api_order.ts +++ b/sdk/node/src/generate/futures/order/api_order.ts @@ -323,7 +323,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | FUTURES | * | API-RATE-LIMIT-POOL | FUTURES | - * | API-RATE-LIMIT-WEIGHT | 200 | + * | API-RATE-LIMIT-WEIGHT | 800 | * +-----------------------+---------+ */ cancelAllOrdersV1(req: CancelAllOrdersV1Req): Promise; diff --git a/sdk/node/src/generate/futures/order/model_get_order_by_client_oid_resp.ts b/sdk/node/src/generate/futures/order/model_get_order_by_client_oid_resp.ts index 1dbea7c0..cfbcc9b1 100644 --- a/sdk/node/src/generate/futures/order/model_get_order_by_client_oid_resp.ts +++ b/sdk/node/src/generate/futures/order/model_get_order_by_client_oid_resp.ts @@ -56,9 +56,9 @@ export class GetOrderByClientOidResp implements Response { stp: GetOrderByClientOidResp.StpEnum; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type */ - stop: string; + stop: GetOrderByClientOidResp.StopEnum; /** * Trigger price type of stop orders @@ -345,11 +345,21 @@ export namespace GetOrderByClientOidResp { */ CB = 'CB', } - export enum StopPriceTypeEnum { + export enum StopEnum { /** - * None + * Triggers when the price reaches or goes below the stopPrice. */ - NULL = '', + DOWN = 'down', + /** + * Triggers when the price reaches or goes above the stopPrice. + */ + UP = 'up', + /** + * Not a stop order + */ + NONE = '', + } + export enum StopPriceTypeEnum { /** * TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. */ @@ -362,6 +372,10 @@ export namespace GetOrderByClientOidResp { * IP for index price. The index price can be obtained through relevant OPEN API for index services. */ INDEX_PRICE = 'IP', + /** + * Not a stop order + */ + NONE = '', } export enum MarginModeEnum { /** diff --git a/sdk/node/src/generate/futures/order/model_get_order_by_order_id_resp.ts b/sdk/node/src/generate/futures/order/model_get_order_by_order_id_resp.ts index 5e5505dc..5fffa071 100644 --- a/sdk/node/src/generate/futures/order/model_get_order_by_order_id_resp.ts +++ b/sdk/node/src/generate/futures/order/model_get_order_by_order_id_resp.ts @@ -56,9 +56,9 @@ export class GetOrderByOrderIdResp implements Response { stp: GetOrderByOrderIdResp.StpEnum; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type */ - stop: string; + stop: GetOrderByOrderIdResp.StopEnum; /** * Trigger price type of stop orders @@ -343,11 +343,21 @@ export namespace GetOrderByOrderIdResp { */ CB = 'CB', } - export enum StopPriceTypeEnum { + export enum StopEnum { /** - * + * Triggers when the price reaches or goes below the stopPrice. */ - NULL = '', + DOWN = 'down', + /** + * Triggers when the price reaches or goes above the stopPrice. + */ + UP = 'up', + /** + * Not a stop order + */ + NONE = '', + } + export enum StopPriceTypeEnum { /** * TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. */ @@ -360,6 +370,10 @@ export namespace GetOrderByOrderIdResp { * IP for index price, The index price can be obtained through relevant OPEN API for index services */ INDEX_PRICE = 'IP', + /** + * Not a stop order + */ + NONE = '', } export enum MarginModeEnum { /** diff --git a/sdk/node/src/generate/futures/order/model_get_order_list_items.ts b/sdk/node/src/generate/futures/order/model_get_order_list_items.ts index 83c0078d..c98752e7 100644 --- a/sdk/node/src/generate/futures/order/model_get_order_list_items.ts +++ b/sdk/node/src/generate/futures/order/model_get_order_list_items.ts @@ -55,14 +55,14 @@ export class GetOrderListItems implements Serializable { stp: string; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type */ - stop: string; + stop: GetOrderListItems.StopEnum; /** * Trigger price type of stop orders */ - stopPriceType: string; + stopPriceType: GetOrderListItems.StopPriceTypeEnum; /** * Mark to show whether the stop order is triggered @@ -294,3 +294,38 @@ export class GetOrderListItems implements Serializable { return plainToClassFromExist(new GetOrderListItems(), jsonObject); } } + +export namespace GetOrderListItems { + export enum StopEnum { + /** + * Triggers when the price reaches or goes below the stopPrice. + */ + DOWN = 'down', + /** + * Triggers when the price reaches or goes above the stopPrice. + */ + UP = 'up', + /** + * Not a stop order + */ + NONE = '', + } + export enum StopPriceTypeEnum { + /** + * TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + */ + TRADE_PRICE = 'TP', + /** + * MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + */ + MARK_PRICE = 'MP', + /** + * IP for index price. The index price can be obtained through relevant OPEN API for index services. + */ + INDEX_PRICE = 'IP', + /** + * Not a stop order + */ + NONE = '', + } +} diff --git a/sdk/node/src/generate/futures/order/model_get_recent_closed_orders_data.ts b/sdk/node/src/generate/futures/order/model_get_recent_closed_orders_data.ts index bf885ece..d15157d8 100644 --- a/sdk/node/src/generate/futures/order/model_get_recent_closed_orders_data.ts +++ b/sdk/node/src/generate/futures/order/model_get_recent_closed_orders_data.ts @@ -55,14 +55,14 @@ export class GetRecentClosedOrdersData implements Serializable { stp: string; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type */ - stop: string; + stop: GetRecentClosedOrdersData.StopEnum; /** * Trigger price type of stop orders */ - stopPriceType: string; + stopPriceType: GetRecentClosedOrdersData.StopPriceTypeEnum; /** * Mark to show whether the stop order is triggered @@ -294,3 +294,38 @@ export class GetRecentClosedOrdersData implements Serializable { return plainToClassFromExist(new GetRecentClosedOrdersData(), jsonObject); } } + +export namespace GetRecentClosedOrdersData { + export enum StopEnum { + /** + * Triggers when the price reaches or goes below the stopPrice. + */ + DOWN = 'down', + /** + * Triggers when the price reaches or goes above the stopPrice. + */ + UP = 'up', + /** + * Not a stop order + */ + NONE = '', + } + export enum StopPriceTypeEnum { + /** + * TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + */ + TRADE_PRICE = 'TP', + /** + * MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + */ + MARK_PRICE = 'MP', + /** + * IP for index price. The index price can be obtained through relevant OPEN API for index services. + */ + INDEX_PRICE = 'IP', + /** + * Not a stop order + */ + NONE = '', + } +} diff --git a/sdk/node/src/generate/futures/order/model_get_recent_trade_history_data.ts b/sdk/node/src/generate/futures/order/model_get_recent_trade_history_data.ts index 019cd55a..31c3e7a0 100644 --- a/sdk/node/src/generate/futures/order/model_get_recent_trade_history_data.ts +++ b/sdk/node/src/generate/futures/order/model_get_recent_trade_history_data.ts @@ -62,7 +62,7 @@ export class GetRecentTradeHistoryData implements Serializable { /** * A mark to the stop order type */ - stop: string; + stop: GetRecentTradeHistoryData.StopEnum; /** * Fee Rate @@ -218,6 +218,20 @@ export namespace GetRecentTradeHistoryData { */ MAKER = 'maker', } + export enum StopEnum { + /** + * Triggers when the price reaches or goes below the stopPrice. + */ + DOWN = 'down', + /** + * Triggers when the price reaches or goes above the stopPrice. + */ + UP = 'up', + /** + * Not a stop order + */ + NONE = '', + } export enum MarginModeEnum { /** * Isolated Margin diff --git a/sdk/node/src/generate/futures/order/model_get_stop_order_list_items.ts b/sdk/node/src/generate/futures/order/model_get_stop_order_list_items.ts index 5cc218d6..04f46e39 100644 --- a/sdk/node/src/generate/futures/order/model_get_stop_order_list_items.ts +++ b/sdk/node/src/generate/futures/order/model_get_stop_order_list_items.ts @@ -55,14 +55,14 @@ export class GetStopOrderListItems implements Serializable { stp: string; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type */ - stop: string; + stop: GetStopOrderListItems.StopEnum; /** * Trigger price type of stop orders */ - stopPriceType: string; + stopPriceType: GetStopOrderListItems.StopPriceTypeEnum; /** * Mark to show whether the stop order is triggered @@ -294,3 +294,38 @@ export class GetStopOrderListItems implements Serializable { return plainToClassFromExist(new GetStopOrderListItems(), jsonObject); } } + +export namespace GetStopOrderListItems { + export enum StopEnum { + /** + * Triggers when the price reaches or goes below the stopPrice. + */ + DOWN = 'down', + /** + * Triggers when the price reaches or goes above the stopPrice. + */ + UP = 'up', + /** + * Not a stop order + */ + NONE = '', + } + export enum StopPriceTypeEnum { + /** + * TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + */ + TRADE_PRICE = 'TP', + /** + * MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + */ + MARK_PRICE = 'MP', + /** + * IP for index price. The index price can be obtained through relevant OPEN API for index services. + */ + INDEX_PRICE = 'IP', + /** + * Not a stop order + */ + NONE = '', + } +} diff --git a/sdk/node/src/generate/futures/order/model_get_trade_history_items.ts b/sdk/node/src/generate/futures/order/model_get_trade_history_items.ts index e999bf16..55471ddc 100644 --- a/sdk/node/src/generate/futures/order/model_get_trade_history_items.ts +++ b/sdk/node/src/generate/futures/order/model_get_trade_history_items.ts @@ -62,7 +62,7 @@ export class GetTradeHistoryItems implements Serializable { /** * A mark to the stop order type */ - stop: string; + stop: GetTradeHistoryItems.StopEnum; /** * Fee Rate @@ -232,6 +232,20 @@ export namespace GetTradeHistoryItems { */ MAKER = 'maker', } + export enum StopEnum { + /** + * Triggers when the price reaches or goes below the stopPrice. + */ + DOWN = 'down', + /** + * Triggers when the price reaches or goes above the stopPrice. + */ + UP = 'up', + /** + * Not a stop order + */ + NONE = '', + } export enum MarginModeEnum { /** * Isolated margin diff --git a/sdk/node/src/generate/futures/positions/api_positions.template b/sdk/node/src/generate/futures/positions/api_positions.template index c2faa7a5..871cec98 100644 --- a/sdk/node/src/generate/futures/positions/api_positions.template +++ b/sdk/node/src/generate/futures/positions/api_positions.template @@ -39,6 +39,23 @@ describe('Auto Test', ()=> { }); }) + test('batchSwitchMarginMode request test', ()=> { + /** + * batchSwitchMarginMode + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + let builder = BatchSwitchMarginModeReq.builder(); + builder.setMarginMode(?).setSymbols(?); + let req = builder.build(); + let resp = api.batchSwitchMarginMode(req); + return resp.then(result => { + expect(result.marginMode).toEqual(expect.anything()); + expect(result.errors).toEqual(expect.anything()); + console.log(resp); + }); + }) + test('getMaxOpenSize request test', ()=> { /** * getMaxOpenSize @@ -269,6 +286,22 @@ describe('Auto Test', ()=> { }); }) + test('getCrossMarginRiskLimit request test', ()=> { + /** + * getCrossMarginRiskLimit + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + let builder = GetCrossMarginRiskLimitReq.builder(); + builder.setSymbol(?).setTotalMargin(?).setLeverage(?); + let req = builder.build(); + let resp = api.getCrossMarginRiskLimit(req); + return resp.then(result => { + expect(result.data).toEqual(expect.anything()); + console.log(resp); + }); + }) + test('getIsolatedMarginRiskLimit request test', ()=> { /** * getIsolatedMarginRiskLimit diff --git a/sdk/node/src/generate/futures/positions/api_positions.test.ts b/sdk/node/src/generate/futures/positions/api_positions.test.ts index 7b945934..ea8de335 100644 --- a/sdk/node/src/generate/futures/positions/api_positions.test.ts +++ b/sdk/node/src/generate/futures/positions/api_positions.test.ts @@ -1,3 +1,4 @@ +import { GetCrossMarginRiskLimitReq } from './model_get_cross_margin_risk_limit_req'; import { RemoveIsolatedMarginReq } from './model_remove_isolated_margin_req'; import { AddIsolatedMarginReq } from './model_add_isolated_margin_req'; import { ModifyAutoDepositStatusReq } from './model_modify_auto_deposit_status_req'; @@ -8,16 +9,19 @@ import { GetCrossMarginLeverageResp } from './model_get_cross_margin_leverage_re import { GetMarginModeReq } from './model_get_margin_mode_req'; import { SwitchMarginModeResp } from './model_switch_margin_mode_resp'; import { GetPositionsHistoryResp } from './model_get_positions_history_resp'; +import { GetCrossMarginRiskLimitResp } from './model_get_cross_margin_risk_limit_resp'; import { GetPositionListReq } from './model_get_position_list_req'; import { GetIsolatedMarginRiskLimitReq } from './model_get_isolated_margin_risk_limit_req'; import { GetIsolatedMarginRiskLimitResp } from './model_get_isolated_margin_risk_limit_resp'; import { GetCrossMarginLeverageReq } from './model_get_cross_margin_leverage_req'; import { GetMarginModeResp } from './model_get_margin_mode_resp'; +import { BatchSwitchMarginModeReq } from './model_batch_switch_margin_mode_req'; import { ModifyMarginLeverageReq } from './model_modify_margin_leverage_req'; import { RemoveIsolatedMarginResp } from './model_remove_isolated_margin_resp'; import { ModifyMarginLeverageResp } from './model_modify_margin_leverage_resp'; import { GetPositionDetailsReq } from './model_get_position_details_req'; import { ModifyAutoDepositStatusResp } from './model_modify_auto_deposit_status_resp'; +import { BatchSwitchMarginModeResp } from './model_batch_switch_margin_mode_resp'; import { SwitchMarginModeReq } from './model_switch_margin_mode_req'; import { GetPositionListResp } from './model_get_position_list_resp'; import { GetMaxOpenSizeResp } from './model_get_max_open_size_resp'; @@ -91,6 +95,37 @@ describe('Auto Test', () => { console.log(resp); } }); + test('batchSwitchMarginMode request test', () => { + /** + * batchSwitchMarginMode + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + let data = '{"marginMode": "ISOLATED", "symbols": ["XBTUSDTM", "ETHUSDTM"]}'; + let req = BatchSwitchMarginModeReq.fromJson(data); + expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( + false, + ); + console.log(req); + }); + + test('batchSwitchMarginMode response test', () => { + /** + * batchSwitchMarginMode + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + let data = + '{\n "code": "200000",\n "data": {\n "marginMode": {\n "ETHUSDTM": "ISOLATED",\n "XBTUSDTM": "CROSS"\n },\n "errors": [\n {\n "code": "50002",\n "msg": "exist.order.or.position",\n "symbol": "XBTUSDTM"\n }\n ]\n }\n}'; + let commonResp = RestResponse.fromJson(data); + let resp = BatchSwitchMarginModeResp.fromObject(commonResp.data); + if (commonResp.data !== null) { + expect( + Object.values(resp).every((value) => value === null || value === undefined), + ).toBe(false); + console.log(resp); + } + }); test('getMaxOpenSize request test', () => { /** * getMaxOpenSize @@ -369,6 +404,38 @@ describe('Auto Test', () => { console.log(resp); } }); + test('getCrossMarginRiskLimit request test', () => { + /** + * getCrossMarginRiskLimit + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + let data = + '{"symbol": "XBTUSDTM", "totalMargin": "example_string_default_value", "leverage": 123456}'; + let req = GetCrossMarginRiskLimitReq.fromJson(data); + expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( + false, + ); + console.log(req); + }); + + test('getCrossMarginRiskLimit response test', () => { + /** + * getCrossMarginRiskLimit + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + let data = + '{\n "code": "200000",\n "data": [\n {\n "symbol": "XBTUSDTM",\n "maxOpenSize": 12102,\n "maxOpenValue": "1234549.2240000000",\n "totalMargin": "10000",\n "price": "102012",\n "leverage": "125.00",\n "mmr": "0.00416136",\n "imr": "0.008",\n "currency": "USDT"\n },\n {\n "symbol": "ETHUSDTM",\n "maxOpenSize": 38003,\n "maxOpenValue": "971508.6920000000",\n "totalMargin": "10000",\n "price": "2556.4",\n "leverage": "100.00",\n "mmr": "0.0054623236",\n "imr": "0.01",\n "currency": "USDT"\n }\n ]\n}'; + let commonResp = RestResponse.fromJson(data); + let resp = GetCrossMarginRiskLimitResp.fromObject(commonResp.data); + if (commonResp.data !== null) { + expect( + Object.values(resp).every((value) => value === null || value === undefined), + ).toBe(false); + console.log(resp); + } + }); test('getIsolatedMarginRiskLimit request test', () => { /** * getIsolatedMarginRiskLimit diff --git a/sdk/node/src/generate/futures/positions/api_positions.ts b/sdk/node/src/generate/futures/positions/api_positions.ts index cd9327c1..52b6b7b7 100644 --- a/sdk/node/src/generate/futures/positions/api_positions.ts +++ b/sdk/node/src/generate/futures/positions/api_positions.ts @@ -1,6 +1,7 @@ // Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. import { Transport } from '@internal/interfaces/transport'; +import { GetCrossMarginRiskLimitReq } from './model_get_cross_margin_risk_limit_req'; import { RemoveIsolatedMarginReq } from './model_remove_isolated_margin_req'; import { AddIsolatedMarginReq } from './model_add_isolated_margin_req'; import { ModifyAutoDepositStatusReq } from './model_modify_auto_deposit_status_req'; @@ -11,16 +12,19 @@ import { GetCrossMarginLeverageResp } from './model_get_cross_margin_leverage_re import { GetMarginModeReq } from './model_get_margin_mode_req'; import { SwitchMarginModeResp } from './model_switch_margin_mode_resp'; import { GetPositionsHistoryResp } from './model_get_positions_history_resp'; +import { GetCrossMarginRiskLimitResp } from './model_get_cross_margin_risk_limit_resp'; import { GetPositionListReq } from './model_get_position_list_req'; import { GetIsolatedMarginRiskLimitReq } from './model_get_isolated_margin_risk_limit_req'; import { GetIsolatedMarginRiskLimitResp } from './model_get_isolated_margin_risk_limit_resp'; import { GetCrossMarginLeverageReq } from './model_get_cross_margin_leverage_req'; import { GetMarginModeResp } from './model_get_margin_mode_resp'; +import { BatchSwitchMarginModeReq } from './model_batch_switch_margin_mode_req'; import { ModifyMarginLeverageReq } from './model_modify_margin_leverage_req'; import { RemoveIsolatedMarginResp } from './model_remove_isolated_margin_resp'; import { ModifyMarginLeverageResp } from './model_modify_margin_leverage_resp'; import { GetPositionDetailsReq } from './model_get_position_details_req'; import { ModifyAutoDepositStatusResp } from './model_modify_auto_deposit_status_resp'; +import { BatchSwitchMarginModeResp } from './model_batch_switch_margin_mode_resp'; import { SwitchMarginModeReq } from './model_switch_margin_mode_req'; import { GetPositionListResp } from './model_get_position_list_resp'; import { GetMaxOpenSizeResp } from './model_get_max_open_size_resp'; @@ -63,6 +67,22 @@ export interface PositionsAPI { */ switchMarginMode(req: SwitchMarginModeReq): Promise; + /** + * batchSwitchMarginMode Batch Switch Margin Mode + * Description: Batch modify the margin mode of the symbols. + * Documentation: https://www.kucoin.com/docs-new/api-3472403 + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | FUTURES | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | FUTURES | + * | API-RATE-LIMIT-POOL | FUTURES | + * | API-RATE-LIMIT-WEIGHT | 2 | + * +-----------------------+---------+ + */ + batchSwitchMarginMode(req: BatchSwitchMarginModeReq): Promise; + /** * getMaxOpenSize Get Max Open Size * Description: Get Maximum Open Position Size. @@ -207,6 +227,22 @@ export interface PositionsAPI { */ removeIsolatedMargin(req: RemoveIsolatedMarginReq): Promise; + /** + * getCrossMarginRiskLimit Get Cross Margin Risk Limit + * Description: Batch get cross margin risk limit. + * Documentation: https://www.kucoin.com/docs-new/api-3472655 + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | FUTURES | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | FUTURES | + * | API-RATE-LIMIT-POOL | FUTURES | + * | API-RATE-LIMIT-WEIGHT | 2 | + * +-----------------------+---------+ + */ + getCrossMarginRiskLimit(req: GetCrossMarginRiskLimitReq): Promise; + /** * getIsolatedMarginRiskLimit Get Isolated Margin Risk Limit * Description: This interface can be used to obtain information about risk limit level of a specific contract (only valid for Isolated Margin). @@ -288,6 +324,18 @@ export class PositionsAPIImpl implements PositionsAPI { ); } + batchSwitchMarginMode(req: BatchSwitchMarginModeReq): Promise { + return this.transport.call( + 'futures', + false, + 'POST', + '/api/v2/position/batchChangeMarginMode', + req, + BatchSwitchMarginModeResp, + false, + ); + } + getMaxOpenSize(req: GetMaxOpenSizeReq): Promise { return this.transport.call( 'futures', @@ -396,6 +444,18 @@ export class PositionsAPIImpl implements PositionsAPI { ); } + getCrossMarginRiskLimit(req: GetCrossMarginRiskLimitReq): Promise { + return this.transport.call( + 'futures', + false, + 'GET', + '/api/v2/batchGetCrossOrderLimit', + req, + GetCrossMarginRiskLimitResp, + false, + ); + } + getIsolatedMarginRiskLimit( req: GetIsolatedMarginRiskLimitReq, ): Promise { diff --git a/sdk/node/src/generate/futures/positions/export.template b/sdk/node/src/generate/futures/positions/export.template index 77218cc8..2adc3885 100644 --- a/sdk/node/src/generate/futures/positions/export.template +++ b/sdk/node/src/generate/futures/positions/export.template @@ -1,8 +1,14 @@ export namespace Positions { export type AddIsolatedMarginReq = POSITIONS.AddIsolatedMarginReq; export type AddIsolatedMarginResp = POSITIONS.AddIsolatedMarginResp; +export type BatchSwitchMarginModeErrors = POSITIONS.BatchSwitchMarginModeErrors; +export type BatchSwitchMarginModeReq = POSITIONS.BatchSwitchMarginModeReq; +export type BatchSwitchMarginModeResp = POSITIONS.BatchSwitchMarginModeResp; export type GetCrossMarginLeverageReq = POSITIONS.GetCrossMarginLeverageReq; export type GetCrossMarginLeverageResp = POSITIONS.GetCrossMarginLeverageResp; +export type GetCrossMarginRiskLimitData = POSITIONS.GetCrossMarginRiskLimitData; +export type GetCrossMarginRiskLimitReq = POSITIONS.GetCrossMarginRiskLimitReq; +export type GetCrossMarginRiskLimitResp = POSITIONS.GetCrossMarginRiskLimitResp; export type GetIsolatedMarginRiskLimitData = POSITIONS.GetIsolatedMarginRiskLimitData; export type GetIsolatedMarginRiskLimitReq = POSITIONS.GetIsolatedMarginRiskLimitReq; export type GetIsolatedMarginRiskLimitResp = POSITIONS.GetIsolatedMarginRiskLimitResp; diff --git a/sdk/node/src/generate/futures/positions/index.ts b/sdk/node/src/generate/futures/positions/index.ts index 6d10d6ac..f6ac19fc 100644 --- a/sdk/node/src/generate/futures/positions/index.ts +++ b/sdk/node/src/generate/futures/positions/index.ts @@ -1,7 +1,13 @@ export * from './model_add_isolated_margin_req'; export * from './model_add_isolated_margin_resp'; +export * from './model_batch_switch_margin_mode_errors'; +export * from './model_batch_switch_margin_mode_req'; +export * from './model_batch_switch_margin_mode_resp'; export * from './model_get_cross_margin_leverage_req'; export * from './model_get_cross_margin_leverage_resp'; +export * from './model_get_cross_margin_risk_limit_data'; +export * from './model_get_cross_margin_risk_limit_req'; +export * from './model_get_cross_margin_risk_limit_resp'; export * from './model_get_isolated_margin_risk_limit_data'; export * from './model_get_isolated_margin_risk_limit_req'; export * from './model_get_isolated_margin_risk_limit_resp'; diff --git a/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_errors.ts b/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_errors.ts new file mode 100644 index 00000000..d807bee5 --- /dev/null +++ b/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_errors.ts @@ -0,0 +1,44 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class BatchSwitchMarginModeErrors implements Serializable { + /** + * Error code + */ + code?: string; + + /** + * Error message + */ + msg?: string; + + /** + * Symbol + */ + symbol?: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() {} + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): BatchSwitchMarginModeErrors { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): BatchSwitchMarginModeErrors { + return plainToClassFromExist(new BatchSwitchMarginModeErrors(), jsonObject); + } +} diff --git a/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_req.ts b/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_req.ts new file mode 100644 index 00000000..06d7a17e --- /dev/null +++ b/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_req.ts @@ -0,0 +1,112 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class BatchSwitchMarginModeReq implements Serializable { + /** + * Modified margin model: ISOLATED (isolated), CROSS (cross margin). + */ + marginMode: BatchSwitchMarginModeReq.MarginModeEnum; + + /** + * Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + */ + symbols: Array; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.marginMode = null; + // @ts-ignore + this.symbols = null; + } + /** + * Creates a new instance of the `BatchSwitchMarginModeReq` class. + * The builder pattern allows step-by-step construction of a `BatchSwitchMarginModeReq` object. + */ + static builder(): BatchSwitchMarginModeReqBuilder { + return new BatchSwitchMarginModeReqBuilder(new BatchSwitchMarginModeReq()); + } + + /** + * Creates a new instance of the `BatchSwitchMarginModeReq` class with the given data. + */ + static create(data: { + /** + * Modified margin model: ISOLATED (isolated), CROSS (cross margin). + */ + marginMode: BatchSwitchMarginModeReq.MarginModeEnum; + /** + * Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + */ + symbols: Array; + }): BatchSwitchMarginModeReq { + let obj = new BatchSwitchMarginModeReq(); + obj.marginMode = data.marginMode; + obj.symbols = data.symbols; + return obj; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): BatchSwitchMarginModeReq { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): BatchSwitchMarginModeReq { + return plainToClassFromExist(new BatchSwitchMarginModeReq(), jsonObject); + } +} + +export namespace BatchSwitchMarginModeReq { + export enum MarginModeEnum { + /** + * Isolated Margin Mode + */ + ISOLATED = 'ISOLATED', + /** + * Cross Margin MOde + */ + CROSS = 'CROSS', + } +} + +export class BatchSwitchMarginModeReqBuilder { + constructor(readonly obj: BatchSwitchMarginModeReq) { + this.obj = obj; + } + /** + * Modified margin model: ISOLATED (isolated), CROSS (cross margin). + */ + setMarginMode(value: BatchSwitchMarginModeReq.MarginModeEnum): BatchSwitchMarginModeReqBuilder { + this.obj.marginMode = value; + return this; + } + + /** + * Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + */ + setSymbols(value: Array): BatchSwitchMarginModeReqBuilder { + this.obj.symbols = value; + return this; + } + + /** + * Get the final object. + */ + build(): BatchSwitchMarginModeReq { + return this.obj; + } +} diff --git a/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_resp.ts b/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_resp.ts new file mode 100644 index 00000000..b44b89bc --- /dev/null +++ b/sdk/node/src/generate/futures/positions/model_batch_switch_margin_mode_resp.ts @@ -0,0 +1,57 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { Type, instanceToPlain, Exclude, plainToClassFromExist } from 'class-transformer'; +import { BatchSwitchMarginModeErrors } from './model_batch_switch_margin_mode_errors'; +import { RestResponse } from '@model/common'; +import { Response } from '@internal/interfaces/serializable'; + +export class BatchSwitchMarginModeResp implements Response { + /** + * Target Margin Model, Symbols that failed to be modified will also be included + */ + marginMode: { [key: string]: string }; + + /** + * Symbol which modification failed + */ + @Type(() => BatchSwitchMarginModeErrors) + errors: Array; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.marginMode = null; + // @ts-ignore + this.errors = null; + } + /** + * common response + */ + @Exclude() + commonResponse?: RestResponse; + + setCommonResponse(response: RestResponse): void { + this.commonResponse = response; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): BatchSwitchMarginModeResp { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): BatchSwitchMarginModeResp { + return plainToClassFromExist(new BatchSwitchMarginModeResp(), jsonObject); + } +} diff --git a/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_data.ts b/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_data.ts new file mode 100644 index 00000000..2e558034 --- /dev/null +++ b/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_data.ts @@ -0,0 +1,93 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class GetCrossMarginRiskLimitData implements Serializable { + /** + * Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + */ + symbol: string; + + /** + * Maximum amount of open position(Unit is **lots**) + */ + maxOpenSize: number; + + /** + * Maximum value of open position(Unit is **quoteCcy**) + */ + maxOpenValue: string; + + /** + * Margin amount used for max position calculation. + */ + totalMargin: string; + + /** + * Price used for max position calculation. Defaults to latest transaction price + */ + price: string; + + /** + * Leverage used for max position calculation. + */ + leverage: string; + + /** + * Maintenance Margin Rate + */ + mmr: string; + + /** + * Initial Margin Rate + */ + imr: string; + + /** + * Margin Currency + */ + currency: string; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.symbol = null; + // @ts-ignore + this.maxOpenSize = null; + // @ts-ignore + this.maxOpenValue = null; + // @ts-ignore + this.totalMargin = null; + // @ts-ignore + this.price = null; + // @ts-ignore + this.leverage = null; + // @ts-ignore + this.mmr = null; + // @ts-ignore + this.imr = null; + // @ts-ignore + this.currency = null; + } + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetCrossMarginRiskLimitData { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetCrossMarginRiskLimitData { + return plainToClassFromExist(new GetCrossMarginRiskLimitData(), jsonObject); + } +} diff --git a/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_req.ts b/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_req.ts new file mode 100644 index 00000000..88599c17 --- /dev/null +++ b/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_req.ts @@ -0,0 +1,112 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { instanceToPlain, plainToClassFromExist } from 'class-transformer'; +import { Serializable } from '@internal/interfaces/serializable'; + +export class GetCrossMarginRiskLimitReq implements Serializable { + /** + * Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) + */ + symbol?: string; + + /** + * The position opening amount, in the contract\'s settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it\'s 10,000 USD; for others, it\'s 10,000 divided by the token\'s USDT price. + */ + totalMargin?: string; + + /** + * Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. + */ + leverage?: number; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() {} + /** + * Creates a new instance of the `GetCrossMarginRiskLimitReq` class. + * The builder pattern allows step-by-step construction of a `GetCrossMarginRiskLimitReq` object. + */ + static builder(): GetCrossMarginRiskLimitReqBuilder { + return new GetCrossMarginRiskLimitReqBuilder(new GetCrossMarginRiskLimitReq()); + } + + /** + * Creates a new instance of the `GetCrossMarginRiskLimitReq` class with the given data. + */ + static create(data: { + /** + * Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) + */ + symbol?: string; + /** + * The position opening amount, in the contract\'s settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it\'s 10,000 USD; for others, it\'s 10,000 divided by the token\'s USDT price. + */ + totalMargin?: string; + /** + * Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. + */ + leverage?: number; + }): GetCrossMarginRiskLimitReq { + let obj = new GetCrossMarginRiskLimitReq(); + obj.symbol = data.symbol; + obj.totalMargin = data.totalMargin; + obj.leverage = data.leverage; + return obj; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetCrossMarginRiskLimitReq { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetCrossMarginRiskLimitReq { + return plainToClassFromExist(new GetCrossMarginRiskLimitReq(), jsonObject); + } +} + +export class GetCrossMarginRiskLimitReqBuilder { + constructor(readonly obj: GetCrossMarginRiskLimitReq) { + this.obj = obj; + } + /** + * Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) + */ + setSymbol(value: string): GetCrossMarginRiskLimitReqBuilder { + this.obj.symbol = value; + return this; + } + + /** + * The position opening amount, in the contract\'s settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it\'s 10,000 USD; for others, it\'s 10,000 divided by the token\'s USDT price. + */ + setTotalMargin(value: string): GetCrossMarginRiskLimitReqBuilder { + this.obj.totalMargin = value; + return this; + } + + /** + * Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. + */ + setLeverage(value: number): GetCrossMarginRiskLimitReqBuilder { + this.obj.leverage = value; + return this; + } + + /** + * Get the final object. + */ + build(): GetCrossMarginRiskLimitReq { + return this.obj; + } +} diff --git a/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_resp.ts b/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_resp.ts new file mode 100644 index 00000000..0e6c2156 --- /dev/null +++ b/sdk/node/src/generate/futures/positions/model_get_cross_margin_risk_limit_resp.ts @@ -0,0 +1,50 @@ +// Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +import { GetCrossMarginRiskLimitData } from './model_get_cross_margin_risk_limit_data'; +import { Type, instanceToPlain, Exclude, plainToClassFromExist } from 'class-transformer'; +import { RestResponse } from '@model/common'; +import { Response } from '@internal/interfaces/serializable'; + +export class GetCrossMarginRiskLimitResp implements Response { + /** + * + */ + @Type(() => GetCrossMarginRiskLimitData) + data: Array; + + /** + * Private constructor, please use the corresponding static methods to construct the object. + */ + private constructor() { + // @ts-ignore + this.data = null; + } + /** + * common response + */ + @Exclude() + commonResponse?: RestResponse; + + setCommonResponse(response: RestResponse): void { + this.commonResponse = response; + } + + /** + * Convert the object to a JSON string. + */ + toJson(): string { + return JSON.stringify(instanceToPlain(this.data)); + } + /** + * Create an object from a JSON string. + */ + static fromJson(input: string): GetCrossMarginRiskLimitResp { + return this.fromObject(JSON.parse(input)); + } + /** + * Create an object from Js Object. + */ + static fromObject(jsonObject: Object): GetCrossMarginRiskLimitResp { + return plainToClassFromExist(new GetCrossMarginRiskLimitResp(), { data: jsonObject }); + } +} diff --git a/sdk/node/src/generate/futures/positions/model_get_position_details_resp.ts b/sdk/node/src/generate/futures/positions/model_get_position_details_resp.ts index 8882137c..21457463 100644 --- a/sdk/node/src/generate/futures/positions/model_get_position_details_resp.ts +++ b/sdk/node/src/generate/futures/positions/model_get_position_details_resp.ts @@ -26,7 +26,7 @@ export class GetPositionDetailsResp implements Response { delevPercentage: number; /** - * Open time + * First opening time */ openingTimestamp: number; @@ -166,7 +166,7 @@ export class GetPositionDetailsResp implements Response { autoDeposit?: boolean; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement */ maintMarginReq?: number; @@ -211,7 +211,7 @@ export class GetPositionDetailsResp implements Response { posFunding?: number; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin */ posMaint?: number; diff --git a/sdk/node/src/generate/futures/positions/model_get_position_list_data.ts b/sdk/node/src/generate/futures/positions/model_get_position_list_data.ts index 2efc32db..379723c1 100644 --- a/sdk/node/src/generate/futures/positions/model_get_position_list_data.ts +++ b/sdk/node/src/generate/futures/positions/model_get_position_list_data.ts @@ -25,7 +25,7 @@ export class GetPositionListData implements Serializable { delevPercentage: number; /** - * Open time + * First opening time */ openingTimestamp: number; @@ -165,7 +165,7 @@ export class GetPositionListData implements Serializable { autoDeposit?: boolean; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement */ maintMarginReq?: number; @@ -210,7 +210,7 @@ export class GetPositionListData implements Serializable { posFunding?: number; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin */ posMaint?: number; diff --git a/sdk/node/src/generate/futures/positions/model_get_position_list_req.ts b/sdk/node/src/generate/futures/positions/model_get_position_list_req.ts index fc5f142d..67bc8fc3 100644 --- a/sdk/node/src/generate/futures/positions/model_get_position_list_req.ts +++ b/sdk/node/src/generate/futures/positions/model_get_position_list_req.ts @@ -5,7 +5,7 @@ import { Serializable } from '@internal/interfaces/serializable'; export class GetPositionListReq implements Serializable { /** - * Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + * Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty */ currency?: string; @@ -26,7 +26,7 @@ export class GetPositionListReq implements Serializable { */ static create(data: { /** - * Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + * Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty */ currency?: string; }): GetPositionListReq { @@ -60,7 +60,7 @@ export class GetPositionListReqBuilder { this.obj = obj; } /** - * Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + * Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty */ setCurrency(value: string): GetPositionListReqBuilder { this.obj.currency = value; diff --git a/sdk/node/src/generate/margin/order/api_order.template b/sdk/node/src/generate/margin/order/api_order.template index 64554123..83385ad2 100644 --- a/sdk/node/src/generate/margin/order/api_order.template +++ b/sdk/node/src/generate/margin/order/api_order.template @@ -50,7 +50,7 @@ describe('Auto Test', ()=> { * /api/v3/hf/margin/orders/{orderId} */ let builder = CancelOrderByOrderIdReq.builder(); - builder.setOrderId(?).setSymbol(?); + builder.setSymbol(?).setOrderId(?); let req = builder.build(); let resp = api.cancelOrderByOrderId(req); return resp.then(result => { @@ -66,7 +66,7 @@ describe('Auto Test', ()=> { * /api/v3/hf/margin/orders/client-order/{clientOid} */ let builder = CancelOrderByClientOidReq.builder(); - builder.setClientOid(?).setSymbol(?); + builder.setSymbol(?).setClientOid(?); let req = builder.build(); let resp = api.cancelOrderByClientOid(req); return resp.then(result => { @@ -165,7 +165,7 @@ describe('Auto Test', ()=> { * /api/v3/hf/margin/orders/{orderId} */ let builder = GetOrderByOrderIdReq.builder(); - builder.setOrderId(?).setSymbol(?); + builder.setSymbol(?).setOrderId(?); let req = builder.build(); let resp = api.getOrderByOrderId(req); return resp.then(result => { @@ -217,7 +217,7 @@ describe('Auto Test', ()=> { * /api/v3/hf/margin/orders/client-order/{clientOid} */ let builder = GetOrderByClientOidReq.builder(); - builder.setClientOid(?).setSymbol(?); + builder.setSymbol(?).setClientOid(?); let req = builder.build(); let resp = api.getOrderByClientOid(req); return resp.then(result => { diff --git a/sdk/node/src/generate/margin/order/api_order.test.ts b/sdk/node/src/generate/margin/order/api_order.test.ts index 01e11a6f..6a024cb6 100644 --- a/sdk/node/src/generate/margin/order/api_order.test.ts +++ b/sdk/node/src/generate/margin/order/api_order.test.ts @@ -97,7 +97,7 @@ describe('Auto Test', () => { * Cancel Order By OrderId * /api/v3/hf/margin/orders/{orderId} */ - let data = '{"orderId": "671663e02188630007e21c9c", "symbol": "BTC-USDT"}'; + let data = '{"symbol": "BTC-USDT", "orderId": "671663e02188630007e21c9c"}'; let req = CancelOrderByOrderIdReq.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, @@ -127,7 +127,7 @@ describe('Auto Test', () => { * Cancel Order By ClientOid * /api/v3/hf/margin/orders/client-order/{clientOid} */ - let data = '{"clientOid": "5c52e11203aa677f33e1493fb", "symbol": "BTC-USDT"}'; + let data = '{"symbol": "BTC-USDT", "clientOid": "5c52e11203aa677f33e1493fb"}'; let req = CancelOrderByClientOidReq.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, @@ -313,7 +313,7 @@ describe('Auto Test', () => { * Get Order By OrderId * /api/v3/hf/margin/orders/{orderId} */ - let data = '{"orderId": "671667306afcdb000723107f", "symbol": "BTC-USDT"}'; + let data = '{"symbol": "BTC-USDT", "orderId": "671667306afcdb000723107f"}'; let req = GetOrderByOrderIdReq.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, @@ -344,7 +344,7 @@ describe('Auto Test', () => { * Get Order By ClientOid * /api/v3/hf/margin/orders/client-order/{clientOid} */ - let data = '{"clientOid": "5c52e11203aa677f33e493fb", "symbol": "BTC-USDT"}'; + let data = '{"symbol": "BTC-USDT", "clientOid": "5c52e11203aa677f33e493fb"}'; let req = GetOrderByClientOidReq.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, diff --git a/sdk/node/src/generate/margin/order/api_order.ts b/sdk/node/src/generate/margin/order/api_order.ts index f919073e..81d03509 100644 --- a/sdk/node/src/generate/margin/order/api_order.ts +++ b/sdk/node/src/generate/margin/order/api_order.ts @@ -40,7 +40,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ addOrder(req: AddOrderReq): Promise; @@ -56,7 +56,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ addOrderTest(req: AddOrderTestReq): Promise; @@ -72,7 +72,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ cancelOrderByOrderId(req: CancelOrderByOrderIdReq): Promise; @@ -88,7 +88,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ cancelOrderByClientOid(req: CancelOrderByClientOidReq): Promise; @@ -104,7 +104,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 10 | + * | API-RATE-LIMIT-WEIGHT | 5 | * +-----------------------+---------+ */ cancelAllOrdersBySymbol(req: CancelAllOrdersBySymbolReq): Promise; @@ -120,7 +120,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | NULL | + * | API-RATE-LIMIT-WEIGHT | 4 | * +-----------------------+---------+ */ getSymbolsWithOpenOrder(req: GetSymbolsWithOpenOrderReq): Promise; diff --git a/sdk/node/src/generate/margin/order/model_cancel_order_by_client_oid_req.ts b/sdk/node/src/generate/margin/order/model_cancel_order_by_client_oid_req.ts index 54c48110..f2d15250 100644 --- a/sdk/node/src/generate/margin/order/model_cancel_order_by_client_oid_req.ts +++ b/sdk/node/src/generate/margin/order/model_cancel_order_by_client_oid_req.ts @@ -6,15 +6,15 @@ import { Serializable } from '@internal/interfaces/serializable'; export class CancelOrderByClientOidReq implements Serializable { /** - * Client Order Id, unique identifier created by the user + * symbol */ - @Reflect.metadata('path', 'clientOid') - clientOid?: string; + symbol?: string; /** - * symbol + * Client Order Id, unique identifier created by the user */ - symbol?: string; + @Reflect.metadata('path', 'clientOid') + clientOid?: string; /** * Private constructor, please use the corresponding static methods to construct the object. @@ -32,18 +32,18 @@ export class CancelOrderByClientOidReq implements Serializable { * Creates a new instance of the `CancelOrderByClientOidReq` class with the given data. */ static create(data: { - /** - * Client Order Id, unique identifier created by the user - */ - clientOid?: string; /** * symbol */ symbol?: string; + /** + * Client Order Id, unique identifier created by the user + */ + clientOid?: string; }): CancelOrderByClientOidReq { let obj = new CancelOrderByClientOidReq(); - obj.clientOid = data.clientOid; obj.symbol = data.symbol; + obj.clientOid = data.clientOid; return obj; } @@ -72,18 +72,18 @@ export class CancelOrderByClientOidReqBuilder { this.obj = obj; } /** - * Client Order Id, unique identifier created by the user + * symbol */ - setClientOid(value: string): CancelOrderByClientOidReqBuilder { - this.obj.clientOid = value; + setSymbol(value: string): CancelOrderByClientOidReqBuilder { + this.obj.symbol = value; return this; } /** - * symbol + * Client Order Id, unique identifier created by the user */ - setSymbol(value: string): CancelOrderByClientOidReqBuilder { - this.obj.symbol = value; + setClientOid(value: string): CancelOrderByClientOidReqBuilder { + this.obj.clientOid = value; return this; } diff --git a/sdk/node/src/generate/margin/order/model_cancel_order_by_order_id_req.ts b/sdk/node/src/generate/margin/order/model_cancel_order_by_order_id_req.ts index 18ab4fc6..6e153c61 100644 --- a/sdk/node/src/generate/margin/order/model_cancel_order_by_order_id_req.ts +++ b/sdk/node/src/generate/margin/order/model_cancel_order_by_order_id_req.ts @@ -6,15 +6,15 @@ import { Serializable } from '@internal/interfaces/serializable'; export class CancelOrderByOrderIdReq implements Serializable { /** - * The unique order id generated by the trading system + * symbol */ - @Reflect.metadata('path', 'orderId') - orderId?: string; + symbol?: string; /** - * symbol + * The unique order id generated by the trading system */ - symbol?: string; + @Reflect.metadata('path', 'orderId') + orderId?: string; /** * Private constructor, please use the corresponding static methods to construct the object. @@ -32,18 +32,18 @@ export class CancelOrderByOrderIdReq implements Serializable { * Creates a new instance of the `CancelOrderByOrderIdReq` class with the given data. */ static create(data: { - /** - * The unique order id generated by the trading system - */ - orderId?: string; /** * symbol */ symbol?: string; + /** + * The unique order id generated by the trading system + */ + orderId?: string; }): CancelOrderByOrderIdReq { let obj = new CancelOrderByOrderIdReq(); - obj.orderId = data.orderId; obj.symbol = data.symbol; + obj.orderId = data.orderId; return obj; } @@ -72,18 +72,18 @@ export class CancelOrderByOrderIdReqBuilder { this.obj = obj; } /** - * The unique order id generated by the trading system + * symbol */ - setOrderId(value: string): CancelOrderByOrderIdReqBuilder { - this.obj.orderId = value; + setSymbol(value: string): CancelOrderByOrderIdReqBuilder { + this.obj.symbol = value; return this; } /** - * symbol + * The unique order id generated by the trading system */ - setSymbol(value: string): CancelOrderByOrderIdReqBuilder { - this.obj.symbol = value; + setOrderId(value: string): CancelOrderByOrderIdReqBuilder { + this.obj.orderId = value; return this; } diff --git a/sdk/node/src/generate/margin/order/model_get_order_by_client_oid_req.ts b/sdk/node/src/generate/margin/order/model_get_order_by_client_oid_req.ts index 07438d78..9154e45a 100644 --- a/sdk/node/src/generate/margin/order/model_get_order_by_client_oid_req.ts +++ b/sdk/node/src/generate/margin/order/model_get_order_by_client_oid_req.ts @@ -6,15 +6,15 @@ import { Serializable } from '@internal/interfaces/serializable'; export class GetOrderByClientOidReq implements Serializable { /** - * Client Order Id, unique identifier created by the user + * symbol */ - @Reflect.metadata('path', 'clientOid') - clientOid?: string; + symbol?: string; /** - * symbol + * Client Order Id, unique identifier created by the user */ - symbol?: string; + @Reflect.metadata('path', 'clientOid') + clientOid?: string; /** * Private constructor, please use the corresponding static methods to construct the object. @@ -32,18 +32,18 @@ export class GetOrderByClientOidReq implements Serializable { * Creates a new instance of the `GetOrderByClientOidReq` class with the given data. */ static create(data: { - /** - * Client Order Id, unique identifier created by the user - */ - clientOid?: string; /** * symbol */ symbol?: string; + /** + * Client Order Id, unique identifier created by the user + */ + clientOid?: string; }): GetOrderByClientOidReq { let obj = new GetOrderByClientOidReq(); - obj.clientOid = data.clientOid; obj.symbol = data.symbol; + obj.clientOid = data.clientOid; return obj; } @@ -72,18 +72,18 @@ export class GetOrderByClientOidReqBuilder { this.obj = obj; } /** - * Client Order Id, unique identifier created by the user + * symbol */ - setClientOid(value: string): GetOrderByClientOidReqBuilder { - this.obj.clientOid = value; + setSymbol(value: string): GetOrderByClientOidReqBuilder { + this.obj.symbol = value; return this; } /** - * symbol + * Client Order Id, unique identifier created by the user */ - setSymbol(value: string): GetOrderByClientOidReqBuilder { - this.obj.symbol = value; + setClientOid(value: string): GetOrderByClientOidReqBuilder { + this.obj.clientOid = value; return this; } diff --git a/sdk/node/src/generate/margin/order/model_get_order_by_order_id_req.ts b/sdk/node/src/generate/margin/order/model_get_order_by_order_id_req.ts index 35c22f0a..34a0759f 100644 --- a/sdk/node/src/generate/margin/order/model_get_order_by_order_id_req.ts +++ b/sdk/node/src/generate/margin/order/model_get_order_by_order_id_req.ts @@ -6,15 +6,15 @@ import { Serializable } from '@internal/interfaces/serializable'; export class GetOrderByOrderIdReq implements Serializable { /** - * The unique order id generated by the trading system + * symbol */ - @Reflect.metadata('path', 'orderId') - orderId?: string; + symbol?: string; /** - * symbol + * The unique order id generated by the trading system */ - symbol?: string; + @Reflect.metadata('path', 'orderId') + orderId?: string; /** * Private constructor, please use the corresponding static methods to construct the object. @@ -32,18 +32,18 @@ export class GetOrderByOrderIdReq implements Serializable { * Creates a new instance of the `GetOrderByOrderIdReq` class with the given data. */ static create(data: { - /** - * The unique order id generated by the trading system - */ - orderId?: string; /** * symbol */ symbol?: string; + /** + * The unique order id generated by the trading system + */ + orderId?: string; }): GetOrderByOrderIdReq { let obj = new GetOrderByOrderIdReq(); - obj.orderId = data.orderId; obj.symbol = data.symbol; + obj.orderId = data.orderId; return obj; } @@ -72,18 +72,18 @@ export class GetOrderByOrderIdReqBuilder { this.obj = obj; } /** - * The unique order id generated by the trading system + * symbol */ - setOrderId(value: string): GetOrderByOrderIdReqBuilder { - this.obj.orderId = value; + setSymbol(value: string): GetOrderByOrderIdReqBuilder { + this.obj.symbol = value; return this; } /** - * symbol + * The unique order id generated by the trading system */ - setSymbol(value: string): GetOrderByOrderIdReqBuilder { - this.obj.symbol = value; + setOrderId(value: string): GetOrderByOrderIdReqBuilder { + this.obj.orderId = value; return this; } diff --git a/sdk/node/src/generate/spot/market/api_market.template b/sdk/node/src/generate/spot/market/api_market.template index c97f3347..39356396 100644 --- a/sdk/node/src/generate/spot/market/api_market.template +++ b/sdk/node/src/generate/spot/market/api_market.template @@ -32,7 +32,7 @@ describe('Auto Test', ()=> { * /api/v3/currencies/{currency} */ let builder = GetCurrencyReq.builder(); - builder.setCurrency(?).setChain(?); + builder.setChain(?).setCurrency(?); let req = builder.build(); let resp = api.getCurrency(req); return resp.then(result => { diff --git a/sdk/node/src/generate/spot/market/api_market.test.ts b/sdk/node/src/generate/spot/market/api_market.test.ts index 5730d3ff..4b22f7a6 100644 --- a/sdk/node/src/generate/spot/market/api_market.test.ts +++ b/sdk/node/src/generate/spot/market/api_market.test.ts @@ -73,7 +73,7 @@ describe('Auto Test', () => { * Get Currency * /api/v3/currencies/{currency} */ - let data = '{"currency": "BTC", "chain": "eth"}'; + let data = '{"chain": "eth", "currency": "BTC"}'; let req = GetCurrencyReq.fromJson(data); expect(Object.values(req).every((value) => value === null || value === undefined)).toBe( false, diff --git a/sdk/node/src/generate/spot/market/model_get_all_currencies_data_chains.ts b/sdk/node/src/generate/spot/market/model_get_all_currencies_data_chains.ts index aefa6094..f6512249 100644 --- a/sdk/node/src/generate/spot/market/model_get_all_currencies_data_chains.ts +++ b/sdk/node/src/generate/spot/market/model_get_all_currencies_data_chains.ts @@ -17,7 +17,7 @@ export class GetAllCurrenciesDataChains implements Serializable { /** * Minimum deposit amount */ - depositMinSize: string; + depositMinSize?: string; /** * Withdraw fee rate @@ -62,12 +62,12 @@ export class GetAllCurrenciesDataChains implements Serializable { /** * Maximum amount of single withdrawal */ - maxWithdraw: string; + maxWithdraw?: string; /** * Maximum amount of single deposit (only applicable to Lightning Network) */ - maxDeposit: string; + maxDeposit?: string; /** * Need for memo/tag or not @@ -103,8 +103,6 @@ export class GetAllCurrenciesDataChains implements Serializable { // @ts-ignore this.withdrawalMinSize = null; // @ts-ignore - this.depositMinSize = null; - // @ts-ignore this.withdrawFeeRate = null; // @ts-ignore this.withdrawalMinFee = null; @@ -121,10 +119,6 @@ export class GetAllCurrenciesDataChains implements Serializable { // @ts-ignore this.withdrawPrecision = null; // @ts-ignore - this.maxWithdraw = null; - // @ts-ignore - this.maxDeposit = null; - // @ts-ignore this.needTag = null; // @ts-ignore this.chainId = null; diff --git a/sdk/node/src/generate/spot/market/model_get_all_symbols_data.ts b/sdk/node/src/generate/spot/market/model_get_all_symbols_data.ts index d36f6ed8..a2d35189 100644 --- a/sdk/node/src/generate/spot/market/model_get_all_symbols_data.ts +++ b/sdk/node/src/generate/spot/market/model_get_all_symbols_data.ts @@ -117,32 +117,32 @@ export class GetAllSymbolsData implements Serializable { /** * The lowest price declared in the call auction */ - callauctionPriceFloor: string; + callauctionPriceFloor?: string; /** * The highest bid price in the call auction */ - callauctionPriceCeiling: string; + callauctionPriceCeiling?: string; /** * The first phase of the call auction starts at (Allow add orders, allow cancel orders) */ - callauctionFirstStageStartTime: number; + callauctionFirstStageStartTime?: number; /** * The second phase of the call auction starts at (Allow add orders, don\'t allow cancel orders) */ - callauctionSecondStageStartTime: number; + callauctionSecondStageStartTime?: number; /** * The third phase of the call auction starts at (Don\'t allow add orders, don\'t allow cancel orders) */ - callauctionThirdStageStartTime: number; + callauctionThirdStageStartTime?: number; /** * Official opening time (end time of the third phase of call auction) */ - tradingStartTime: number; + tradingStartTime?: number; /** * Private constructor, please use the corresponding static methods to construct the object. @@ -192,18 +192,6 @@ export class GetAllSymbolsData implements Serializable { this.st = null; // @ts-ignore this.callauctionIsEnabled = null; - // @ts-ignore - this.callauctionPriceFloor = null; - // @ts-ignore - this.callauctionPriceCeiling = null; - // @ts-ignore - this.callauctionFirstStageStartTime = null; - // @ts-ignore - this.callauctionSecondStageStartTime = null; - // @ts-ignore - this.callauctionThirdStageStartTime = null; - // @ts-ignore - this.tradingStartTime = null; } /** * Convert the object to a JSON string. diff --git a/sdk/node/src/generate/spot/market/model_get_currency_chains.ts b/sdk/node/src/generate/spot/market/model_get_currency_chains.ts index f2748d01..027463dc 100644 --- a/sdk/node/src/generate/spot/market/model_get_currency_chains.ts +++ b/sdk/node/src/generate/spot/market/model_get_currency_chains.ts @@ -17,7 +17,7 @@ export class GetCurrencyChains implements Serializable { /** * Minimum deposit amount */ - depositMinSize: string; + depositMinSize?: string; /** * Withdraw fee rate @@ -62,12 +62,12 @@ export class GetCurrencyChains implements Serializable { /** * Maximum amount of single withdrawal */ - maxWithdraw: number; + maxWithdraw?: number; /** * Maximum amount of single deposit (only applicable to Lightning Network) */ - maxDeposit: string; + maxDeposit?: string; /** * Need for memo/tag or not @@ -88,8 +88,6 @@ export class GetCurrencyChains implements Serializable { // @ts-ignore this.withdrawalMinSize = null; // @ts-ignore - this.depositMinSize = null; - // @ts-ignore this.withdrawFeeRate = null; // @ts-ignore this.withdrawalMinFee = null; @@ -106,10 +104,6 @@ export class GetCurrencyChains implements Serializable { // @ts-ignore this.withdrawPrecision = null; // @ts-ignore - this.maxWithdraw = null; - // @ts-ignore - this.maxDeposit = null; - // @ts-ignore this.needTag = null; // @ts-ignore this.chainId = null; diff --git a/sdk/node/src/generate/spot/market/model_get_currency_req.ts b/sdk/node/src/generate/spot/market/model_get_currency_req.ts index 525fd875..e4915616 100644 --- a/sdk/node/src/generate/spot/market/model_get_currency_req.ts +++ b/sdk/node/src/generate/spot/market/model_get_currency_req.ts @@ -6,15 +6,15 @@ import { Serializable } from '@internal/interfaces/serializable'; export class GetCurrencyReq implements Serializable { /** - * Path parameter, Currency + * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. */ - @Reflect.metadata('path', 'currency') - currency?: string; + chain?: string; /** - * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. + * Path parameter, Currency */ - chain?: string; + @Reflect.metadata('path', 'currency') + currency?: string; /** * Private constructor, please use the corresponding static methods to construct the object. @@ -32,18 +32,18 @@ export class GetCurrencyReq implements Serializable { * Creates a new instance of the `GetCurrencyReq` class with the given data. */ static create(data: { - /** - * Path parameter, Currency - */ - currency?: string; /** * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. */ chain?: string; + /** + * Path parameter, Currency + */ + currency?: string; }): GetCurrencyReq { let obj = new GetCurrencyReq(); - obj.currency = data.currency; obj.chain = data.chain; + obj.currency = data.currency; return obj; } @@ -72,18 +72,18 @@ export class GetCurrencyReqBuilder { this.obj = obj; } /** - * Path parameter, Currency + * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. */ - setCurrency(value: string): GetCurrencyReqBuilder { - this.obj.currency = value; + setChain(value: string): GetCurrencyReqBuilder { + this.obj.chain = value; return this; } /** - * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. + * Path parameter, Currency */ - setChain(value: string): GetCurrencyReqBuilder { - this.obj.chain = value; + setCurrency(value: string): GetCurrencyReqBuilder { + this.obj.currency = value; return this; } diff --git a/sdk/node/src/generate/spot/market/model_get_currency_resp.ts b/sdk/node/src/generate/spot/market/model_get_currency_resp.ts index b1c6797f..6f50c197 100644 --- a/sdk/node/src/generate/spot/market/model_get_currency_resp.ts +++ b/sdk/node/src/generate/spot/market/model_get_currency_resp.ts @@ -29,12 +29,12 @@ export class GetCurrencyResp implements Response { /** * Number of block confirmations */ - confirms: number; + confirms?: number; /** * Contract address */ - contractAddress: string; + contractAddress?: string; /** * Margin support or not @@ -65,10 +65,6 @@ export class GetCurrencyResp implements Response { // @ts-ignore this.precision = null; // @ts-ignore - this.confirms = null; - // @ts-ignore - this.contractAddress = null; - // @ts-ignore this.isMarginEnabled = null; // @ts-ignore this.isDebitEnabled = null; diff --git a/sdk/node/src/generate/spot/market/model_get_symbol_resp.ts b/sdk/node/src/generate/spot/market/model_get_symbol_resp.ts index 3d9dbfaa..4ded13a1 100644 --- a/sdk/node/src/generate/spot/market/model_get_symbol_resp.ts +++ b/sdk/node/src/generate/spot/market/model_get_symbol_resp.ts @@ -118,32 +118,32 @@ export class GetSymbolResp implements Response { /** * The lowest price declared in the call auction */ - callauctionPriceFloor: string; + callauctionPriceFloor?: string; /** * The highest bid price in the call auction */ - callauctionPriceCeiling: string; + callauctionPriceCeiling?: string; /** * The first phase of the call auction starts at (Allow add orders, allow cancel orders) */ - callauctionFirstStageStartTime: number; + callauctionFirstStageStartTime?: number; /** * The second phase of the call auction starts at (Allow add orders, don\'t allow cancel orders) */ - callauctionSecondStageStartTime: number; + callauctionSecondStageStartTime?: number; /** * The third phase of the call auction starts at (Don\'t allow add orders, don\'t allow cancel orders) */ - callauctionThirdStageStartTime: number; + callauctionThirdStageStartTime?: number; /** * Official opening time (end time of the third phase of call auction) */ - tradingStartTime: number; + tradingStartTime?: number; /** * Private constructor, please use the corresponding static methods to construct the object. @@ -193,18 +193,6 @@ export class GetSymbolResp implements Response { this.st = null; // @ts-ignore this.callauctionIsEnabled = null; - // @ts-ignore - this.callauctionPriceFloor = null; - // @ts-ignore - this.callauctionPriceCeiling = null; - // @ts-ignore - this.callauctionFirstStageStartTime = null; - // @ts-ignore - this.callauctionSecondStageStartTime = null; - // @ts-ignore - this.callauctionThirdStageStartTime = null; - // @ts-ignore - this.tradingStartTime = null; } /** * common response diff --git a/sdk/node/src/generate/spot/order/api_order.ts b/sdk/node/src/generate/spot/order/api_order.ts index 50b5c870..2c90b318 100644 --- a/sdk/node/src/generate/spot/order/api_order.ts +++ b/sdk/node/src/generate/spot/order/api_order.ts @@ -303,7 +303,7 @@ export interface OrderAPI { * | API-CHANNEL | PRIVATE | * | API-PERMISSION | SPOT | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 3 | + * | API-RATE-LIMIT-WEIGHT | 1 | * +-----------------------+---------+ */ modifyOrder(req: ModifyOrderReq): Promise; diff --git a/sdk/node/src/generate/spot/order/model_add_order_req.ts b/sdk/node/src/generate/spot/order/model_add_order_req.ts index 6305af69..47ac6c89 100644 --- a/sdk/node/src/generate/spot/order/model_add_order_req.ts +++ b/sdk/node/src/generate/spot/order/model_add_order_req.ts @@ -85,12 +85,12 @@ export class AddOrderReq implements Serializable { funds?: string; /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; @@ -182,11 +182,11 @@ export class AddOrderReq implements Serializable { */ funds?: string; /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; }): AddOrderReq { @@ -444,7 +444,7 @@ export class AddOrderReqBuilder { } /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ setAllowMaxTimeWindow(value: number): AddOrderReqBuilder { this.obj.allowMaxTimeWindow = value; @@ -452,7 +452,7 @@ export class AddOrderReqBuilder { } /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. */ setClientTimestamp(value: number): AddOrderReqBuilder { this.obj.clientTimestamp = value; diff --git a/sdk/node/src/generate/spot/order/model_add_order_sync_req.ts b/sdk/node/src/generate/spot/order/model_add_order_sync_req.ts index 780cd7da..f6dd7a82 100644 --- a/sdk/node/src/generate/spot/order/model_add_order_sync_req.ts +++ b/sdk/node/src/generate/spot/order/model_add_order_sync_req.ts @@ -85,12 +85,12 @@ export class AddOrderSyncReq implements Serializable { funds?: string; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; @@ -182,11 +182,11 @@ export class AddOrderSyncReq implements Serializable { */ funds?: string; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; }): AddOrderSyncReq { @@ -444,7 +444,7 @@ export class AddOrderSyncReqBuilder { } /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ setAllowMaxTimeWindow(value: number): AddOrderSyncReqBuilder { this.obj.allowMaxTimeWindow = value; @@ -452,7 +452,7 @@ export class AddOrderSyncReqBuilder { } /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ setClientTimestamp(value: number): AddOrderSyncReqBuilder { this.obj.clientTimestamp = value; diff --git a/sdk/node/src/generate/spot/order/model_add_order_test_req.ts b/sdk/node/src/generate/spot/order/model_add_order_test_req.ts index 29fd36e3..6df9eca9 100644 --- a/sdk/node/src/generate/spot/order/model_add_order_test_req.ts +++ b/sdk/node/src/generate/spot/order/model_add_order_test_req.ts @@ -85,12 +85,12 @@ export class AddOrderTestReq implements Serializable { funds?: string; /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; @@ -182,11 +182,11 @@ export class AddOrderTestReq implements Serializable { */ funds?: string; /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; }): AddOrderTestReq { @@ -444,7 +444,7 @@ export class AddOrderTestReqBuilder { } /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ setAllowMaxTimeWindow(value: number): AddOrderTestReqBuilder { this.obj.allowMaxTimeWindow = value; @@ -452,7 +452,7 @@ export class AddOrderTestReqBuilder { } /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. */ setClientTimestamp(value: number): AddOrderTestReqBuilder { this.obj.clientTimestamp = value; diff --git a/sdk/node/src/generate/spot/order/model_batch_add_orders_order_list.ts b/sdk/node/src/generate/spot/order/model_batch_add_orders_order_list.ts index 8261e96d..6f0ad8af 100644 --- a/sdk/node/src/generate/spot/order/model_batch_add_orders_order_list.ts +++ b/sdk/node/src/generate/spot/order/model_batch_add_orders_order_list.ts @@ -86,12 +86,12 @@ export class BatchAddOrdersOrderList implements Serializable { funds?: string; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; @@ -185,11 +185,11 @@ export class BatchAddOrdersOrderList implements Serializable { */ funds?: string; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; }): BatchAddOrdersOrderList { @@ -443,7 +443,7 @@ export class BatchAddOrdersOrderListBuilder { } /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ setClientTimestamp(value: number): BatchAddOrdersOrderListBuilder { this.obj.clientTimestamp = value; @@ -451,7 +451,7 @@ export class BatchAddOrdersOrderListBuilder { } /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ setAllowMaxTimeWindow(value: number): BatchAddOrdersOrderListBuilder { this.obj.allowMaxTimeWindow = value; diff --git a/sdk/node/src/generate/spot/order/model_batch_add_orders_sync_order_list.ts b/sdk/node/src/generate/spot/order/model_batch_add_orders_sync_order_list.ts index 58336a94..231c94cf 100644 --- a/sdk/node/src/generate/spot/order/model_batch_add_orders_sync_order_list.ts +++ b/sdk/node/src/generate/spot/order/model_batch_add_orders_sync_order_list.ts @@ -86,12 +86,12 @@ export class BatchAddOrdersSyncOrderList implements Serializable { funds?: string; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; @@ -185,11 +185,11 @@ export class BatchAddOrdersSyncOrderList implements Serializable { */ funds?: string; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ allowMaxTimeWindow?: number; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ clientTimestamp?: number; }): BatchAddOrdersSyncOrderList { @@ -445,7 +445,7 @@ export class BatchAddOrdersSyncOrderListBuilder { } /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. */ setAllowMaxTimeWindow(value: number): BatchAddOrdersSyncOrderListBuilder { this.obj.allowMaxTimeWindow = value; @@ -453,7 +453,7 @@ export class BatchAddOrdersSyncOrderListBuilder { } /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. */ setClientTimestamp(value: number): BatchAddOrdersSyncOrderListBuilder { this.obj.clientTimestamp = value; diff --git a/sdk/node/src/generate/spot/spotprivate/model_order_v1_event.ts b/sdk/node/src/generate/spot/spotprivate/model_order_v1_event.ts index e59e62fe..641c3c15 100644 --- a/sdk/node/src/generate/spot/spotprivate/model_order_v1_event.ts +++ b/sdk/node/src/generate/spot/spotprivate/model_order_v1_event.ts @@ -23,7 +23,7 @@ export class OrderV1Event implements Response { */ orderId: string; /** - * Order time (milliseconds) + * Gateway received the message time (milliseconds) */ orderTime: number; /** @@ -63,7 +63,7 @@ export class OrderV1Event implements Response { */ symbol: string; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) */ ts: number; /** diff --git a/sdk/node/src/generate/spot/spotprivate/model_order_v2_event.ts b/sdk/node/src/generate/spot/spotprivate/model_order_v2_event.ts index 4019e63c..3055026a 100644 --- a/sdk/node/src/generate/spot/spotprivate/model_order_v2_event.ts +++ b/sdk/node/src/generate/spot/spotprivate/model_order_v2_event.ts @@ -23,7 +23,7 @@ export class OrderV2Event implements Response { */ orderId: string; /** - * Order time (milliseconds) + * Gateway received the message time (milliseconds) */ orderTime: number; /** @@ -63,7 +63,7 @@ export class OrderV2Event implements Response { */ symbol: string; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) */ ts: number; /** diff --git a/sdk/node/src/generate/spot/spotprivate/model_stop_order_event.ts b/sdk/node/src/generate/spot/spotprivate/model_stop_order_event.ts index ef810c0f..fb3133da 100644 --- a/sdk/node/src/generate/spot/spotprivate/model_stop_order_event.ts +++ b/sdk/node/src/generate/spot/spotprivate/model_stop_order_event.ts @@ -31,7 +31,7 @@ export class StopOrderEvent implements Response { */ size: string; /** - * Order type: loss: stop loss order, oco: oco order + * Order type */ stop: StopOrderEvent.StopEnum; /** @@ -134,9 +134,29 @@ export namespace StopOrderEvent { */ LOSS = 'loss', /** - * oco order + * Take profit order */ - OCO = 'oco', + ENTRY = 'entry', + /** + * Limit stop loss OCO order + */ + L_L_O = 'l_l_o', + /** + * Trigger stop loss OCO order + */ + L_S_O = 'l_s_o', + /** + * Limit stop profit OCO order + */ + E_L_O = 'e_l_o', + /** + * Trigger stop profit OCO order + */ + E_S_O = 'e_s_o', + /** + * Moving stop loss order + */ + TSO = 'tso', } export enum TradeTypeEnum { /** diff --git a/sdk/node/src/generate/version.ts b/sdk/node/src/generate/version.ts index be352b11..ab1d0616 100644 --- a/sdk/node/src/generate/version.ts +++ b/sdk/node/src/generate/version.ts @@ -1,2 +1,2 @@ -export const SdkVersion = 'v1.2.0'; -export const SdkGenerateDate = '2025-03-21'; +export const SdkVersion = 'v1.3.0'; +export const SdkGenerateDate = '2025-06-11'; diff --git a/sdk/node/src/generate/viplending/viplending/api_vip_lending.ts b/sdk/node/src/generate/viplending/viplending/api_vip_lending.ts index 20b0fbaf..860027ad 100644 --- a/sdk/node/src/generate/viplending/viplending/api_vip_lending.ts +++ b/sdk/node/src/generate/viplending/viplending/api_vip_lending.ts @@ -31,7 +31,7 @@ export interface VIPLendingAPI { * +-----------------------+------------+ * | API-DOMAIN | SPOT | * | API-CHANNEL | PRIVATE | - * | API-PERMISSION | GENERAL | + * | API-PERMISSION | SPOT | * | API-RATE-LIMIT-POOL | MANAGEMENT | * | API-RATE-LIMIT-WEIGHT | 5 | * +-----------------------+------------+ @@ -47,7 +47,7 @@ export interface VIPLendingAPI { * +-----------------------+------------+ * | API-DOMAIN | SPOT | * | API-CHANNEL | PRIVATE | - * | API-PERMISSION | GENERAL | + * | API-PERMISSION | SPOT | * | API-RATE-LIMIT-POOL | MANAGEMENT | * | API-RATE-LIMIT-WEIGHT | 20 | * +-----------------------+------------+ diff --git a/sdk/node/tests/e2e/rest/account_test/account_deposit.test.ts b/sdk/node/tests/e2e/rest/account_test/account_deposit.test.ts index 63a8011c..1453b59b 100644 --- a/sdk/node/tests/e2e/rest/account_test/account_deposit.test.ts +++ b/sdk/node/tests/e2e/rest/account_test/account_deposit.test.ts @@ -16,7 +16,6 @@ import { GetDepositHistoryReq, } from '@src/generate/account/deposit'; import { DefaultClient } from '@api/index'; -import ToEnum = AddDepositAddressV1Req.ToEnum; describe('Auto Test', () => { let api: DepositAPI; @@ -132,7 +131,7 @@ describe('Auto Test', () => { * /api/v2/deposit-addresses */ let builder = GetDepositAddressV2Req.builder(); - builder.setCurrency('USDT').setChain("SOL"); + builder.setCurrency('USDT').setChain('SOL'); let req = builder.build(); let resp = api.getDepositAddressV2(req); return resp.then((result) => { @@ -197,7 +196,7 @@ describe('Auto Test', () => { * /api/v1/deposit-addresses */ let builder = AddDepositAddressV1Req.builder(); - builder.setCurrency('ETH').setChain('kcc').setTo(ToEnum.TRADE); + builder.setCurrency('ETH').setChain('kcc').setTo(AddDepositAddressV1Req.ToEnum.TRADE); let req = builder.build(); let resp = api.addDepositAddressV1(req); return resp.then((result) => { diff --git a/sdk/node/tests/e2e/rest/account_test/account_withdraw.test.ts b/sdk/node/tests/e2e/rest/account_test/account_withdraw.test.ts index 92e1a073..c06e88ca 100644 --- a/sdk/node/tests/e2e/rest/account_test/account_withdraw.test.ts +++ b/sdk/node/tests/e2e/rest/account_test/account_withdraw.test.ts @@ -8,6 +8,7 @@ import { import { DefaultClient } from '@api/index'; import { CancelWithdrawalReq, + GetWithdrawalHistoryByIdReq, GetWithdrawalHistoryOldReq, GetWithdrawalHistoryReq, GetWithdrawalQuotasReq, @@ -15,6 +16,7 @@ import { WithdrawalV1Req, WithdrawalV3Req, } from '@src/generate/account/withdrawal'; +import StatusEnum = GetWithdrawalHistoryReq.StatusEnum; describe('Auto Test', () => { let api: WithdrawalAPI; @@ -89,7 +91,7 @@ describe('Auto Test', () => { builder .setCurrency('USDT') .setChain('bsc') - .setAmount(20) + .setAmount('20') .setIsInner(false) .setRemark('******') .setWithdrawType(WithdrawalV3Req.WithdrawTypeEnum.ADDRESS) @@ -125,7 +127,11 @@ describe('Auto Test', () => { * /api/v1/withdrawals */ let builder = GetWithdrawalHistoryReq.builder(); - builder.setCurrency('USDT').setStartAt(1703001600000).setEndAt(1703260800000); + builder + .setCurrency('USDT') + .setStartAt(1703001600000) + .setEndAt(1703260800000) + .setStatus(StatusEnum.FAILURE); let req = builder.build(); let resp = api.getWithdrawalHistory(req); return resp.then((result) => { @@ -138,6 +144,42 @@ describe('Auto Test', () => { }); }); + test('getWithdrawalHistoryById request test', () => { + /** + * getWithdrawalHistoryById + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + let builder = GetWithdrawalHistoryByIdReq.builder(); + builder.setWithdrawalId('674576dc74b2bb000778452c'); + let req = builder.build(); + let resp = api.getWithdrawalHistoryById(req); + return resp.then((result) => { + expect(result.id).toEqual(expect.anything()); + expect(result.uid).toEqual(expect.anything()); + expect(result.currency).toEqual(expect.anything()); + expect(result.chainId).toEqual(expect.anything()); + expect(result.chainName).toEqual(expect.anything()); + expect(result.currencyName).toEqual(expect.anything()); + expect(result.status).toEqual(expect.anything()); + expect(result.failureReason).toEqual(expect.anything()); + expect(result.failureReasonMsg).toEqual(expect.anything()); + expect(result.address).toEqual(expect.anything()); + expect(result.memo).toEqual(expect.anything()); + expect(result.isInner).toEqual(expect.anything()); + expect(result.amount).toEqual(expect.anything()); + expect(result.fee).toEqual(expect.anything()); + expect(result.walletTxId).toEqual(expect.anything()); + expect(result.addressRemark).toEqual(expect.anything()); + expect(result.remark).toEqual(expect.anything()); + expect(result.createdAt).toEqual(expect.anything()); + expect(result.cancelType).toEqual(expect.anything()); + expect(result.returnStatus).toEqual(expect.anything()); + expect(result.returnCurrency).toEqual(expect.anything()); + console.log(resp); + }); + }); + test('getWithdrawalHistoryOld request test', () => { /** * getWithdrawalHistoryOld diff --git a/sdk/node/tests/e2e/rest/broker_test/nd_broker.test.ts b/sdk/node/tests/e2e/rest/broker_test/nd_broker.test.ts index abc5a370..4e7ee4b9 100644 --- a/sdk/node/tests/e2e/rest/broker_test/nd_broker.test.ts +++ b/sdk/node/tests/e2e/rest/broker_test/nd_broker.test.ts @@ -11,14 +11,14 @@ import { DeleteSubAccountAPIReq, GetBrokerInfoReq, GetDepositDetailReq, - GetDepositListReq, + GetDepositListReq, GetKYCStatusListReq, GetKYCStatusReq, GetRebaseReq, GetSubAccountAPIReq, GetSubAccountReq, GetTransferHistoryReq, GetWithdrawDetailReq, ModifySubAccountApiReq, - NDBrokerAPI, + NDBrokerAPI, SubmitKYCReq, TransferReq, } from '@src/generate/broker/ndbroker'; import { DefaultClient } from '@api/index'; @@ -63,6 +63,61 @@ describe('Auto Test', () => { api = kucoinRestService.getBrokerService().getNDBrokerApi(); }); + + test('submitKYC request test', () => { + /** + * submitKYC + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + let builder = SubmitKYCReq.builder(); + builder.setClientUid('226383154').setFirstName('Kaylah').setLastName('Padberg').setIssueCountry("JP"). + setBirthDate("2000-01-01").setIdentityType(SubmitKYCReq.IdentityTypeEnum.PASSPORT).setIdentityNumber("55"). + setExpireDate("2030-01-01").setFrontPhoto("****").setBackendPhoto("***").setFacePhoto("***"); + let req = builder.build(); + let resp = api.submitKYC(req); + return resp.then(result => { + expect(result.data).toEqual(expect.anything()); + console.log(resp); + }); + }); + + test('getKYCStatus request test', () => { + /** + * getKYCStatus + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + let builder = GetKYCStatusReq.builder(); + builder.setClientUids("226383154"); + let req = builder.build(); + let resp = api.getKYCStatus(req); + return resp.then(result => { + expect(result.data).toEqual(expect.anything()); + console.log(resp); + }); + }); + + test('getKYCStatusList request test', () => { + /** + * getKYCStatusList + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + let builder = GetKYCStatusListReq.builder(); + builder.setPageNumber(1).setPageSize(10); + let req = builder.build(); + let resp = api.getKYCStatusList(req); + return resp.then(result => { + expect(result.currentPage).toEqual(expect.anything()); + expect(result.pageSize).toEqual(expect.anything()); + expect(result.totalNum).toEqual(expect.anything()); + expect(result.totalPage).toEqual(expect.anything()); + expect(result.items).toEqual(expect.anything()); + console.log(resp); + }); + }); + test('getBrokerInfo request test', () => { /** * getBrokerInfo @@ -292,7 +347,7 @@ describe('Auto Test', () => { expect(item.chain).toEqual(expect.any(String)); expect(item.createdAt).toEqual(expect.any(Number)); expect(item.updatedAt).toEqual(expect.any(Number)); - }) + }); console.log(resp); }); }); diff --git a/sdk/node/tests/e2e/rest/futures_test/funding_fee.test.ts b/sdk/node/tests/e2e/rest/futures_test/funding_fee.test.ts index 9599019b..ccfa5e28 100644 --- a/sdk/node/tests/e2e/rest/futures_test/funding_fee.test.ts +++ b/sdk/node/tests/e2e/rest/futures_test/funding_fee.test.ts @@ -64,6 +64,8 @@ describe('Auto Test', () => { expect(result.predictedValue).toEqual(expect.anything()); expect(result.fundingRateCap).toEqual(expect.anything()); expect(result.fundingRateFloor).toEqual(expect.anything()); + expect(result.period).toEqual(expect.anything()); + expect(result.fundingTime).toEqual(expect.anything()); console.log(resp); }); }); diff --git a/sdk/node/tests/e2e/rest/futures_test/order.test.ts b/sdk/node/tests/e2e/rest/futures_test/order.test.ts index 059fd277..f7add5c4 100644 --- a/sdk/node/tests/e2e/rest/futures_test/order.test.ts +++ b/sdk/node/tests/e2e/rest/futures_test/order.test.ts @@ -22,7 +22,7 @@ import { GetOrderByClientOidReq, GetOrderByOrderIdReq, GetOrderListReq, - GetRecentClosedOrdersReq, + GetRecentClosedOrdersReq, GetRecentTradeHistoryData, GetRecentTradeHistoryReq, GetStopOrderListReq, GetTradeHistoryReq, @@ -530,7 +530,7 @@ describe('Auto Test', () => { * /api/v1/recentFills */ let builder = GetRecentTradeHistoryReq.builder(); - builder.setSymbol('XBTUSDTM'); + // builder.setSymbol('XBTUSDTM'); let req = builder.build(); let resp = api.getRecentTradeHistory(req); return resp.then((result) => { diff --git a/sdk/node/tests/e2e/rest/futures_test/positions.test.ts b/sdk/node/tests/e2e/rest/futures_test/positions.test.ts index 3254f672..754e3b56 100644 --- a/sdk/node/tests/e2e/rest/futures_test/positions.test.ts +++ b/sdk/node/tests/e2e/rest/futures_test/positions.test.ts @@ -6,8 +6,8 @@ import { TransportOptionBuilder, } from '@model/index'; import { - AddIsolatedMarginReq, - GetCrossMarginLeverageReq, + AddIsolatedMarginReq, BatchSwitchMarginModeReq, + GetCrossMarginLeverageReq, GetCrossMarginRiskLimitReq, GetIsolatedMarginRiskLimitReq, GetMarginModeReq, GetMaxOpenSizeReq, @@ -91,6 +91,23 @@ describe('Auto Test', () => { }); }); + test('batchSwitchMarginMode request test', ()=> { + /** + * batchSwitchMarginMode + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + let builder = BatchSwitchMarginModeReq.builder(); + builder.setMarginMode(BatchSwitchMarginModeReq.MarginModeEnum.ISOLATED).setSymbols(['XBTUSDTM', 'DOGEUSDTM']); + let req = builder.build(); + let resp = api.batchSwitchMarginMode(req); + return resp.then(result => { + expect(result.marginMode).toEqual(expect.anything()); + expect(result.errors).toEqual(expect.anything()); + console.log(resp); + }); + }) + test('getMaxOpenSize request test', () => { /** * getMaxOpenSize @@ -297,7 +314,6 @@ describe('Auto Test', () => { }); }); - // TODO: fix by change schema test('modifyMarginLeverage request test', () => { /** * modifyMarginLeverage @@ -309,8 +325,7 @@ describe('Auto Test', () => { let req = builder.build(); let resp = api.modifyMarginLeverage(req); return resp.then((result) => { - expect(result.symbol).toEqual(expect.anything()); - expect(result.leverage).toEqual(expect.anything()); + expect(result.data).toEqual(expect.anything()); console.log(resp); }); }); @@ -382,6 +397,22 @@ describe('Auto Test', () => { }); }); + test('getCrossMarginRiskLimit request test', ()=> { + /** + * getCrossMarginRiskLimit + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + let builder = GetCrossMarginRiskLimitReq.builder(); + builder.setSymbol("XBTUSDTM").setTotalMargin("1000").setLeverage(1); + let req = builder.build(); + let resp = api.getCrossMarginRiskLimit(req); + return resp.then(result => { + expect(result.data).toEqual(expect.anything()); + console.log(resp); + }); + }) + test('getIsolatedMarginRiskLimit request test', () => { /** * getIsolatedMarginRiskLimit diff --git a/sdk/node/tests/e2e/rest/spot_test/market.test.ts b/sdk/node/tests/e2e/rest/spot_test/market.test.ts index 09a7ce02..f2f21dad 100644 --- a/sdk/node/tests/e2e/rest/spot_test/market.test.ts +++ b/sdk/node/tests/e2e/rest/spot_test/market.test.ts @@ -188,7 +188,6 @@ describe('Auto Test', () => { expect(item.quoteIncrement).toEqual(expect.any(String)); expect(item.priceIncrement).toEqual(expect.any(String)); expect(item.priceLimitRate).toEqual(expect.any(String)); - expect(item.minFunds).toEqual(expect.any(String)); expect(item.enableTrading).toEqual(expect.any(Boolean)); expect(item.makerFeeCoefficient).toEqual(expect.any(String)); expect(item.takerFeeCoefficient).toEqual(expect.any(String)); diff --git a/sdk/php/CHANGELOG.md b/sdk/php/CHANGELOG.md index 5e44658d..f5596a2a 100644 --- a/sdk/php/CHANGELOG.md +++ b/sdk/php/CHANGELOG.md @@ -2,7 +2,16 @@ API documentation [Changelog](https://www.kucoin.com/docs-new/change-log) -Current synchronized API documentation version [20250313](https://www.kucoin.com/docs-new/change-log#20250313) +Current synchronized API documentation version [20250529](https://www.kucoin.com/docs-new/change-log#20250529) + +## 2025-06-11(1.3.0) +- Update the latest APIs, documentation, etc +- Introduced a new testing framework for all SDKs +- Expanded regression-test coverage for Python components +- Updated Node.js dependencies to address security vulnerabilities + +## 2025-06-11(PHP 0.1.2-alpha) +- Update the latest APIs, documentation, etc ## 2025-05-29(PHP 0.1.1-alpha) - Fix compatibility issues on non-macOS systems by enforcing case-sensitive PSR-4 autoloading. diff --git a/sdk/php/README.md b/sdk/php/README.md index 5e1a83ce..6c9dbe13 100644 --- a/sdk/php/README.md +++ b/sdk/php/README.md @@ -13,14 +13,14 @@ For an overview of the project and SDKs in other languages, refer to the [Main R ## 📦 Installation -### Latest Version: `0.1.1-alpha` +### Latest Version: `0.1.2-alpha` **Note**: This SDK is currently in the Alpha phase. We are actively iterating and improving its features, stability, and documentation. Feedback and contributions are highly encouraged to help us refine the SDK. Install the SDK using `composer`: ```bash -composer require kucoin/kucoin-universal-sdk=0.1.1-alpha +composer require kucoin/kucoin-universal-sdk=0.1.2-alpha ``` ## 📖 Getting Started diff --git a/sdk/php/src/Generate/Account/Account/AccountApi.template b/sdk/php/src/Generate/Account/Account/AccountApi.template index 67c74d6d..9cbaf707 100644 --- a/sdk/php/src/Generate/Account/Account/AccountApi.template +++ b/sdk/php/src/Generate/Account/Account/AccountApi.template @@ -113,6 +113,8 @@ self::assertNotNull($item->maxBorrowSize); self::assertNotNull($item->borrowEnabled); self::assertNotNull($item->transferInEnabled); + self::assertNotNull($item->liabilityPrincipal); + self::assertNotNull($item->liabilityInterest); } Logger::info($resp->jsonSerialize($this->serializer)); diff --git a/sdk/php/src/Generate/Account/Account/AccountApiTest.php b/sdk/php/src/Generate/Account/Account/AccountApiTest.php index 24b510a3..8c0c1bbe 100644 --- a/sdk/php/src/Generate/Account/Account/AccountApiTest.php +++ b/sdk/php/src/Generate/Account/Account/AccountApiTest.php @@ -244,7 +244,7 @@ public function testGetCrossMarginAccountRequest() public function testGetCrossMarginAccountResponse() { $data = - "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.02\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"0.02\",\n \"available\": \"0.02\",\n \"hold\": \"0\",\n \"liability\": \"0\",\n \"maxBorrowSize\": \"0\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}"; + "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"40.8648372\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"38.68855864\",\n \"available\": \"20.01916691\",\n \"hold\": \"18.66939173\",\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"maxBorrowSize\": \"163\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}"; $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); $respData = $commonResp->data ? $this->serializer->serialize($commonResp->data, "json") @@ -266,7 +266,7 @@ public function testGetCrossMarginAccountResponse() public function testGetIsolatedMarginAccountRequest() { $data = - "{\"symbol\": \"example_string_default_value\", \"quoteCurrency\": \"USDT\", \"queryType\": \"ISOLATED\"}"; + "{\"symbol\": \"BTC-USDT\", \"quoteCurrency\": \"USDT\", \"queryType\": \"ISOLATED\"}"; $req = GetIsolatedMarginAccountReq::jsonDeserialize( $data, $this->serializer @@ -283,7 +283,7 @@ public function testGetIsolatedMarginAccountRequest() public function testGetIsolatedMarginAccountResponse() { $data = - "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.01\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"timestamp\": 1728725465994,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0.01\",\n \"available\": \"0.01\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n }\n }\n ]\n }\n}"; + "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"4.97047372\",\n \"totalLiabilityOfQuoteCurrency\": \"0.00038891\",\n \"timestamp\": 1747303659773,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0.00038891\",\n \"liabilityPrincipal\": \"0.00038888\",\n \"liabilityInterest\": \"0.00000003\",\n \"total\": \"4.97047372\",\n \"available\": \"4.97047372\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"44\"\n }\n }\n ]\n }\n}"; $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); $respData = $commonResp->data ? $this->serializer->serialize($commonResp->data, "json") diff --git a/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountAccounts.php b/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountAccounts.php index 5ecbeef4..e4f93a3e 100644 --- a/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountAccounts.php +++ b/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountAccounts.php @@ -67,6 +67,20 @@ class GetCrossMarginAccountAccounts implements Serializable * @SerializedName("transferInEnabled") */ public $transferInEnabled; + /** + * Outstanding principal – the unpaid loan amount + * @var string $liabilityPrincipal + * @Type("string") + * @SerializedName("liabilityPrincipal") + */ + public $liabilityPrincipal; + /** + * Accrued interest – the unpaid interest amount + * @var string $liabilityInterest + * @Type("string") + * @SerializedName("liabilityInterest") + */ + public $liabilityInterest; private function __construct() {} diff --git a/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountResp.php b/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountResp.php index 8c5520ba..090c1223 100644 --- a/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountResp.php +++ b/sdk/php/src/Generate/Account/Account/GetCrossMarginAccountResp.php @@ -35,11 +35,6 @@ class GetCrossMarginAccountResp implements Response public $debtRatio; /** * Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing - * - 'EFFECTIVE' : Effective - * - 'BANKRUPTCY' : Bankruptcy liquidation - * - 'LIQUIDATION' : Closing - * - 'REPAY' : Repayment - * - 'BORROW' : Borrowing * @var string $status * @Type("string") * @SerializedName("status") diff --git a/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssets.php b/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssets.php index f3d64558..a3434251 100644 --- a/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssets.php +++ b/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssets.php @@ -13,40 +13,35 @@ class GetIsolatedMarginAccountAssets implements Serializable { /** * Symbol - * @var string $symbol + * @var string|null $symbol * @Type("string") * @SerializedName("symbol") */ public $symbol; /** * Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing - * - 'EFFECTIVE' : Effective - * - 'BANKRUPTCY' : Bankruptcy liquidation - * - 'LIQUIDATION' : Closing - * - 'REPAY' : Repayment - * - 'BORROW' : Borrowing - * @var string $status + * @var string|null $status * @Type("string") * @SerializedName("status") */ public $status; /** * debt ratio - * @var string $debtRatio + * @var string|null $debtRatio * @Type("string") * @SerializedName("debtRatio") */ public $debtRatio; /** * - * @var GetIsolatedMarginAccountAssetsBaseAsset $baseAsset + * @var GetIsolatedMarginAccountAssetsBaseAsset|null $baseAsset * @Type("KuCoin\UniversalSDK\Generate\Account\Account\GetIsolatedMarginAccountAssetsBaseAsset") * @SerializedName("baseAsset") */ public $baseAsset; /** * - * @var GetIsolatedMarginAccountAssetsQuoteAsset $quoteAsset + * @var GetIsolatedMarginAccountAssetsQuoteAsset|null $quoteAsset * @Type("KuCoin\UniversalSDK\Generate\Account\Account\GetIsolatedMarginAccountAssetsQuoteAsset") * @SerializedName("quoteAsset") */ diff --git a/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsBaseAsset.php b/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsBaseAsset.php index 289ebf7a..4e4e0c03 100644 --- a/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsBaseAsset.php +++ b/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsBaseAsset.php @@ -67,6 +67,20 @@ class GetIsolatedMarginAccountAssetsBaseAsset implements Serializable * @SerializedName("maxBorrowSize") */ public $maxBorrowSize; + /** + * Outstanding principal + * @var string $liabilityPrincipal + * @Type("string") + * @SerializedName("liabilityPrincipal") + */ + public $liabilityPrincipal; + /** + * Outstanding interest + * @var string $liabilityInterest + * @Type("string") + * @SerializedName("liabilityInterest") + */ + public $liabilityInterest; private function __construct() {} diff --git a/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsQuoteAsset.php b/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsQuoteAsset.php index 8ec16934..b40b8010 100644 --- a/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsQuoteAsset.php +++ b/sdk/php/src/Generate/Account/Account/GetIsolatedMarginAccountAssetsQuoteAsset.php @@ -67,6 +67,20 @@ class GetIsolatedMarginAccountAssetsQuoteAsset implements Serializable * @SerializedName("maxBorrowSize") */ public $maxBorrowSize; + /** + * + * @var string $liabilityPrincipal + * @Type("string") + * @SerializedName("liabilityPrincipal") + */ + public $liabilityPrincipal; + /** + * + * @var string $liabilityInterest + * @Type("string") + * @SerializedName("liabilityInterest") + */ + public $liabilityInterest; private function __construct() {} diff --git a/sdk/php/src/Generate/Account/Account/GetSpotHFLedgerReq.php b/sdk/php/src/Generate/Account/Account/GetSpotHFLedgerReq.php index 04056013..b17b12d5 100644 --- a/sdk/php/src/Generate/Account/Account/GetSpotHFLedgerReq.php +++ b/sdk/php/src/Generate/Account/Account/GetSpotHFLedgerReq.php @@ -39,11 +39,12 @@ public function pathVarMapping() public $direction; /** * Transaction type - * - 'TRADE_EXCHANGE' : trade exchange - * - 'TRANSFER' : transfer - * - 'RETURNED_FEES' : returned fees - * - 'DEDUCTION_FEES' : deduction fees - * - 'OTHER' : other + * - 'TRADE_EXCHANGE' : Trade exchange + * - 'TRANSFER' : Transfer + * - 'SUB_TRANSFER' : Sub transfer + * - 'RETURNED_FEES' : Returned fees + * - 'DEDUCTION_FEES' : Deduction fees + * - 'OTHER' : Other * @var string|null $bizType * @Type("string") * @SerializedName("bizType") @@ -170,11 +171,12 @@ public function setDirection($value) /** * Transaction type - * - 'TRADE_EXCHANGE' : trade exchange - * - 'TRANSFER' : transfer - * - 'RETURNED_FEES' : returned fees - * - 'DEDUCTION_FEES' : deduction fees - * - 'OTHER' : other + * - 'TRADE_EXCHANGE' : Trade exchange + * - 'TRANSFER' : Transfer + * - 'SUB_TRANSFER' : Sub transfer + * - 'RETURNED_FEES' : Returned fees + * - 'DEDUCTION_FEES' : Deduction fees + * - 'OTHER' : Other * @param string $value * @return self */ diff --git a/sdk/php/src/Generate/Account/Deposit/AddDepositAddressV1Req.php b/sdk/php/src/Generate/Account/Deposit/AddDepositAddressV1Req.php index 3fa27fce..35155a32 100644 --- a/sdk/php/src/Generate/Account/Deposit/AddDepositAddressV1Req.php +++ b/sdk/php/src/Generate/Account/Deposit/AddDepositAddressV1Req.php @@ -37,13 +37,13 @@ public function pathVarMapping() public $chain = "eth"; /** * Deposit account type: main (funding account), trade (spot trading account); the default is main - * - 'main' : Funding account - * - 'trade' : Spot account + * - 'MAIN' : Funding account + * - 'TRADE' : Spot account * @var string|null $to * @Type("string") * @SerializedName("to") */ - public $to = "main"; + public $to = "MAIN"; private function __construct() {} @@ -135,8 +135,8 @@ public function setChain($value) /** * Deposit account type: main (funding account), trade (spot trading account); the default is main - * - 'main' : Funding account - * - 'trade' : Spot account + * - 'MAIN' : Funding account + * - 'TRADE' : Spot account * @param string $value * @return self */ diff --git a/sdk/php/src/Generate/Account/Deposit/DepositApiTest.php b/sdk/php/src/Generate/Account/Deposit/DepositApiTest.php index d0cfeb45..bb3687c4 100644 --- a/sdk/php/src/Generate/Account/Deposit/DepositApiTest.php +++ b/sdk/php/src/Generate/Account/Deposit/DepositApiTest.php @@ -288,7 +288,7 @@ public function testGetDepositHistoryOldResponse() */ public function testAddDepositAddressV1Request() { - $data = "{\"currency\": \"ETH\", \"chain\": \"eth\"}"; + $data = "{\"currency\": \"ETH\", \"chain\": \"eth\", \"to\": \"MAIN\"}"; $req = AddDepositAddressV1Req::jsonDeserialize( $data, $this->serializer diff --git a/sdk/php/src/Generate/Account/Subaccount/AddSubAccountResp.php b/sdk/php/src/Generate/Account/Subaccount/AddSubAccountResp.php index 528ca486..745dbffe 100644 --- a/sdk/php/src/Generate/Account/Subaccount/AddSubAccountResp.php +++ b/sdk/php/src/Generate/Account/Subaccount/AddSubAccountResp.php @@ -13,28 +13,28 @@ class AddSubAccountResp implements Response { /** - * Sub-account UID + * Sub account user id * @var int $uid * @Type("int") * @SerializedName("uid") */ public $uid; /** - * Sub-account name + * Sub account name * @var string $subName * @Type("string") * @SerializedName("subName") */ public $subName; /** - * Remarks + * Sub account name * @var string $remarks * @Type("string") * @SerializedName("remarks") */ public $remarks; /** - * Permission + * permission * @var string $access * @Type("string") * @SerializedName("access") diff --git a/sdk/php/src/Generate/Account/Subaccount/SubAccountApiTest.php b/sdk/php/src/Generate/Account/Subaccount/SubAccountApiTest.php index 2034569f..938c7734 100644 --- a/sdk/php/src/Generate/Account/Subaccount/SubAccountApiTest.php +++ b/sdk/php/src/Generate/Account/Subaccount/SubAccountApiTest.php @@ -60,7 +60,7 @@ function hasAnyNoneNull($object): bool public function testAddSubAccountRequest() { $data = - "{\"password\": \"1234567\", \"remarks\": \"TheRemark\", \"subName\": \"Name1234567\", \"access\": \"Spot\"}"; + "{\"password\": \"q1234567\", \"access\": \"Spot\", \"subName\": \"subNameTest1\", \"remarks\": \"TheRemark\"}"; $req = AddSubAccountReq::jsonDeserialize($data, $this->serializer); $this->assertTrue($this->hasAnyNoneNull($req)); echo $req->jsonSerialize($this->serializer); @@ -74,7 +74,7 @@ public function testAddSubAccountRequest() public function testAddSubAccountResponse() { $data = - "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 10,\n \"totalNum\": 1,\n \"totalPage\": 1,\n \"items\": [\n {\n \"userId\": \"63743f07e0c5230001761d08\",\n \"uid\": 169579801,\n \"subName\": \"testapi6\",\n \"status\": 2,\n \"type\": 0,\n \"access\": \"All\",\n \"createdAt\": 1668562696000,\n \"remarks\": \"remarks\",\n \"tradeTypes\": [\n \"Spot\",\n \"Futures\",\n \"Margin\"\n ],\n \"openedTradeTypes\": [\n \"Spot\"\n ],\n \"hostedStatus\": null\n }\n ]\n }\n}"; + "{\n \"code\": \"200000\",\n \"data\": {\n \"uid\": 245730746,\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\",\n \"access\": \"Spot\"\n }\n}"; $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); $respData = $commonResp->data ? $this->serializer->serialize($commonResp->data, "json") diff --git a/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryByIdReq.php b/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryByIdReq.php new file mode 100644 index 00000000..a156604d --- /dev/null +++ b/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryByIdReq.php @@ -0,0 +1,120 @@ + "withdrawalId", + ]; + + public function pathVarMapping() + { + return self::$pathVarMapping; + } + /** + * withdrawal ID + * @var string|null $withdrawalId + * @Type("string") + * @SerializedName("withdrawalId") + * @Exclude() + */ + public $withdrawalId; + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + GetWithdrawalHistoryByIdReq::class, + "json" + ); + } + /** + * Creates a new instance of the `GetWithdrawalHistoryByIdReq` class. + * The builder pattern allows step-by-step construction of a `GetWithdrawalHistoryByIdReq` object. + * @return GetWithdrawalHistoryByIdReqBuilder + */ + public static function builder() + { + return new GetWithdrawalHistoryByIdReqBuilder(new self()); + } + + /** + * Creates a new instance of the `GetWithdrawalHistoryByIdReq` class with the given data. + * Ensure that the keys in data match the target field names in the documentation, + * rather than the variable names in the class. + * @return self + */ + public static function create(array $data) + { + $obj = new self(); + foreach ($data as $key => $value) { + if (property_exists($obj, $key)) { + $obj->$key = $value; + } + } + return $obj; + } +} + +class GetWithdrawalHistoryByIdReqBuilder +{ + /** + * @var GetWithdrawalHistoryByIdReq $obj + */ + private $obj; + + public function __construct(GetWithdrawalHistoryByIdReq $obj) + { + $this->obj = $obj; + } + /** + * withdrawal ID + * @param string $value + * @return self + */ + public function setWithdrawalId($value) + { + $this->obj->withdrawalId = $value; + return $this; + } + + /** + * Get the final object. + * @return GetWithdrawalHistoryByIdReq + */ + public function build() + { + return $this->obj; + } +} diff --git a/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryByIdResp.php b/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryByIdResp.php new file mode 100644 index 00000000..866f49dc --- /dev/null +++ b/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryByIdResp.php @@ -0,0 +1,229 @@ +") + * @SerializedName("taxes") + */ + public $taxes; + /** + * Tax description + * @var string|null $taxDescription + * @Type("string") + * @SerializedName("taxDescription") + */ + public $taxDescription; + /** + * Return status + * - 'NOT_RETURN' : No returned + * - 'PROCESSING' : To be returned + * - 'SUCCESS' : Returned + * @var string $returnStatus + * @Type("string") + * @SerializedName("returnStatus") + */ + public $returnStatus; + /** + * Return amount + * @var string|null $returnAmount + * @Type("string") + * @SerializedName("returnAmount") + */ + public $returnAmount; + /** + * Return currency + * @var string $returnCurrency + * @Type("string") + * @SerializedName("returnCurrency") + */ + public $returnCurrency; + + /** + * common response + * @Exclude() + * @var RestResponse $commonResponse + */ + public $commonResponse; + + public function setCommonResponse($response): void + { + $this->commonResponse = $response; + } + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + GetWithdrawalHistoryByIdResp::class, + "json" + ); + } +} diff --git a/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryItems.php b/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryItems.php index f8931f9b..36dc48b0 100644 --- a/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryItems.php +++ b/sdk/php/src/Generate/Account/Withdrawal/GetWithdrawalHistoryItems.php @@ -26,7 +26,7 @@ class GetWithdrawalHistoryItems implements Serializable */ public $currency; /** - * The id of currency + * The chain id of currency * @var string|null $chain * @Type("string") * @SerializedName("chain") @@ -34,18 +34,18 @@ class GetWithdrawalHistoryItems implements Serializable public $chain; /** * Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE - * - 'REVIEW' : - * - 'PROCESSING' : - * - 'WALLET_PROCESSING' : - * - 'FAILURE' : - * - 'SUCCESS' : + * - 'REVIEW' : REVIEW + * - 'PROCESSING' : PROCESSING + * - 'WALLET_PROCESSING' : WALLET_PROCESSING + * - 'FAILURE' : FAILURE + * - 'SUCCESS' : SUCCESS * @var string|null $status * @Type("string") * @SerializedName("status") */ public $status; /** - * Deposit address + * Withwrawal address * @var string|null $address * @Type("string") * @SerializedName("address") @@ -66,21 +66,21 @@ class GetWithdrawalHistoryItems implements Serializable */ public $isInner; /** - * Deposit amount + * Withwrawal amount * @var string|null $amount * @Type("string") * @SerializedName("amount") */ public $amount; /** - * Fees charged for deposit + * Fees charged for withwrawal * @var string|null $fee * @Type("string") * @SerializedName("fee") */ public $fee; /** - * Wallet Txid + * Wallet Txid, If this is an internal withdrawal, it is empty. * @var string|null $walletTxId * @Type("string") * @SerializedName("walletTxId") diff --git a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.php b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.php index caed08b0..ac5dc60e 100644 --- a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.php +++ b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.php @@ -83,6 +83,26 @@ public function getWithdrawalHistory( GetWithdrawalHistoryReq $req ): GetWithdrawalHistoryResp; + /** + * Get Withdrawal History By ID + * + * Request a withdrawal history by id via this endpoint. + * @see: https://www.kucoin.com/docs-new/api-3471890 + * + * +-----------------------+------------+ + * | Extra API Info | Value | + * +-----------------------+------------+ + * | API-DOMAIN | SPOT | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | MANAGEMENT | + * | API-RATE-LIMIT-WEIGHT | 20 | + * +-----------------------+------------+ + */ + public function getWithdrawalHistoryById( + GetWithdrawalHistoryByIdReq $req + ): GetWithdrawalHistoryByIdResp; + /** * Get Withdrawal History - Old * diff --git a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.template b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.template index a544fead..2098166e 100644 --- a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.template +++ b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApi.template @@ -89,6 +89,45 @@ Logger::info($resp->jsonSerialize($this->serializer)); } + /** + * getWithdrawalHistoryById + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + public function testGetWithdrawalHistoryById() { + $builder = GetWithdrawalHistoryByIdReq::builder(); + $builder->setWithdrawalId(?); + $req = $builder->build(); + $resp = $this->api->getWithdrawalHistoryById($req); + self::assertNotNull($resp->id); + self::assertNotNull($resp->uid); + self::assertNotNull($resp->currency); + self::assertNotNull($resp->chainId); + self::assertNotNull($resp->chainName); + self::assertNotNull($resp->currencyName); + self::assertNotNull($resp->status); + self::assertNotNull($resp->failureReason); + self::assertNotNull($resp->failureReasonMsg); + self::assertNotNull($resp->address); + self::assertNotNull($resp->memo); + self::assertNotNull($resp->isInner); + self::assertNotNull($resp->amount); + self::assertNotNull($resp->fee); + self::assertNotNull($resp->walletTxId); + self::assertNotNull($resp->addressRemark); + self::assertNotNull($resp->remark); + self::assertNotNull($resp->createdAt); + self::assertNotNull($resp->cancelType); + foreach($resp->taxes as $item) { + } + + self::assertNotNull($resp->taxDescription); + self::assertNotNull($resp->returnStatus); + self::assertNotNull($resp->returnAmount); + self::assertNotNull($resp->returnCurrency); + Logger::info($resp->jsonSerialize($this->serializer)); + } + /** * getWithdrawalHistoryOld * Get Withdrawal History - Old diff --git a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiImpl.php b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiImpl.php index b859b951..ab421d78 100644 --- a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiImpl.php +++ b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiImpl.php @@ -68,6 +68,20 @@ public function getWithdrawalHistory( ); } + public function getWithdrawalHistoryById( + GetWithdrawalHistoryByIdReq $req + ): GetWithdrawalHistoryByIdResp { + return $this->transport->call( + "spot", + false, + "GET", + "/api/v1/withdrawals/{withdrawalId}", + $req, + GetWithdrawalHistoryByIdResp::class, + false + ); + } + public function getWithdrawalHistoryOld( GetWithdrawalHistoryOldReq $req ): GetWithdrawalHistoryOldResp { diff --git a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiTest.php b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiTest.php index e45336ee..6dcb99c1 100644 --- a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiTest.php +++ b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalApiTest.php @@ -98,7 +98,7 @@ public function testGetWithdrawalQuotasResponse() public function testWithdrawalV3Request() { $data = - "{\"currency\": \"USDT\", \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\", \"amount\": 3, \"withdrawType\": \"ADDRESS\", \"chain\": \"trx\", \"isInner\": true, \"remark\": \"this is Remark\"}"; + "{\"currency\": \"USDT\", \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\", \"amount\": \"3\", \"withdrawType\": \"ADDRESS\", \"chain\": \"trx\", \"isInner\": true, \"remark\": \"this is Remark\"}"; $req = WithdrawalV3Req::jsonDeserialize($data, $this->serializer); $this->assertTrue($this->hasAnyNoneNull($req)); echo $req->jsonSerialize($this->serializer); @@ -196,6 +196,44 @@ public function testGetWithdrawalHistoryResponse() : $this->assertTrue(true); echo $resp->jsonSerialize($this->serializer); } + /** + * getWithdrawalHistoryById Request + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + public function testGetWithdrawalHistoryByIdRequest() + { + $data = "{\"withdrawalId\": \"67e6515f7960ba0007b42025\"}"; + $req = GetWithdrawalHistoryByIdReq::jsonDeserialize( + $data, + $this->serializer + ); + $this->assertTrue($this->hasAnyNoneNull($req)); + echo $req->jsonSerialize($this->serializer); + } + + /** + * getWithdrawalHistoryById Response + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + public function testGetWithdrawalHistoryByIdResponse() + { + $data = + "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"67e6515f7960ba0007b42025\",\n \"uid\": 165111215,\n \"currency\": \"USDT\",\n \"chainId\": \"trx\",\n \"chainName\": \"TRC20\",\n \"currencyName\": \"USDT\",\n \"status\": \"SUCCESS\",\n \"failureReason\": \"\",\n \"failureReasonMsg\": null,\n \"address\": \"TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"3.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"addressRemark\": null,\n \"remark\": \"this is Remark\",\n \"createdAt\": 1743147359000,\n \"cancelType\": \"NON_CANCELABLE\",\n \"taxes\": null,\n \"taxDescription\": null,\n \"returnStatus\": \"NOT_RETURN\",\n \"returnAmount\": null,\n \"returnCurrency\": \"KCS\"\n }\n}"; + $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); + $respData = $commonResp->data + ? $this->serializer->serialize($commonResp->data, "json") + : null; + $resp = GetWithdrawalHistoryByIdResp::jsonDeserialize( + $respData, + $this->serializer + ); + $commonResp->data + ? $this->assertTrue($this->hasAnyNoneNull($resp)) + : $this->assertTrue(true); + echo $resp->jsonSerialize($this->serializer); + } /** * getWithdrawalHistoryOld Request * Get Withdrawal History - Old diff --git a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalV3Req.php b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalV3Req.php index 8eddf69c..8df3a609 100644 --- a/sdk/php/src/Generate/Account/Withdrawal/WithdrawalV3Req.php +++ b/sdk/php/src/Generate/Account/Withdrawal/WithdrawalV3Req.php @@ -37,8 +37,8 @@ public function pathVarMapping() public $chain = "eth"; /** * Withdrawal amount, a positive number which is a multiple of the amount precision - * @var int $amount - * @Type("int") + * @var string $amount + * @Type("string") * @SerializedName("amount") */ public $amount; @@ -175,7 +175,7 @@ public function setChain($value) /** * Withdrawal amount, a positive number which is a multiple of the amount precision - * @param int $value + * @param string $value * @return self */ public function setAmount($value) diff --git a/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusData.php b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusData.php new file mode 100644 index 00000000..3ae20388 --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusData.php @@ -0,0 +1,63 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize($json, GetKYCStatusData::class, "json"); + } +} diff --git a/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListItems.php b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListItems.php new file mode 100644 index 00000000..4ab946db --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListItems.php @@ -0,0 +1,67 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + GetKYCStatusListItems::class, + "json" + ); + } +} diff --git a/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListReq.php b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListReq.php new file mode 100644 index 00000000..2c58be6e --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListReq.php @@ -0,0 +1,135 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + GetKYCStatusListReq::class, + "json" + ); + } + /** + * Creates a new instance of the `GetKYCStatusListReq` class. + * The builder pattern allows step-by-step construction of a `GetKYCStatusListReq` object. + * @return GetKYCStatusListReqBuilder + */ + public static function builder() + { + return new GetKYCStatusListReqBuilder(new self()); + } + + /** + * Creates a new instance of the `GetKYCStatusListReq` class with the given data. + * Ensure that the keys in data match the target field names in the documentation, + * rather than the variable names in the class. + * @return self + */ + public static function create(array $data) + { + $obj = new self(); + foreach ($data as $key => $value) { + if (property_exists($obj, $key)) { + $obj->$key = $value; + } + } + return $obj; + } +} + +class GetKYCStatusListReqBuilder +{ + /** + * @var GetKYCStatusListReq $obj + */ + private $obj; + + public function __construct(GetKYCStatusListReq $obj) + { + $this->obj = $obj; + } + /** + * Page Number + * @param int $value + * @return self + */ + public function setPageNumber($value) + { + $this->obj->pageNumber = $value; + return $this; + } + + /** + * Page Size + * @param int $value + * @return self + */ + public function setPageSize($value) + { + $this->obj->pageSize = $value; + return $this; + } + + /** + * Get the final object. + * @return GetKYCStatusListReq + */ + public function build() + { + return $this->obj; + } +} diff --git a/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListResp.php b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListResp.php new file mode 100644 index 00000000..cdeebfb6 --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusListResp.php @@ -0,0 +1,90 @@ +") + * @SerializedName("items") + */ + public $items; + + /** + * common response + * @Exclude() + * @var RestResponse $commonResponse + */ + public $commonResponse; + + public function setCommonResponse($response): void + { + $this->commonResponse = $response; + } + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + GetKYCStatusListResp::class, + "json" + ); + } +} diff --git a/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusReq.php b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusReq.php new file mode 100644 index 00000000..2352f957 --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusReq.php @@ -0,0 +1,113 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize($json, GetKYCStatusReq::class, "json"); + } + /** + * Creates a new instance of the `GetKYCStatusReq` class. + * The builder pattern allows step-by-step construction of a `GetKYCStatusReq` object. + * @return GetKYCStatusReqBuilder + */ + public static function builder() + { + return new GetKYCStatusReqBuilder(new self()); + } + + /** + * Creates a new instance of the `GetKYCStatusReq` class with the given data. + * Ensure that the keys in data match the target field names in the documentation, + * rather than the variable names in the class. + * @return self + */ + public static function create(array $data) + { + $obj = new self(); + foreach ($data as $key => $value) { + if (property_exists($obj, $key)) { + $obj->$key = $value; + } + } + return $obj; + } +} + +class GetKYCStatusReqBuilder +{ + /** + * @var GetKYCStatusReq $obj + */ + private $obj; + + public function __construct(GetKYCStatusReq $obj) + { + $this->obj = $obj; + } + /** + * Client uid, Use commas to separate multiple UIDs + * @param string $value + * @return self + */ + public function setClientUids($value) + { + $this->obj->clientUids = $value; + return $this; + } + + /** + * Get the final object. + * @return GetKYCStatusReq + */ + public function build() + { + return $this->obj; + } +} diff --git a/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusResp.php b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusResp.php new file mode 100644 index 00000000..6bf64238 --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/GetKYCStatusResp.php @@ -0,0 +1,65 @@ +") + * @SerializedName("data") + */ + public $data; + + /** + * common response + * @Exclude() + * @var RestResponse $commonResponse + */ + public $commonResponse; + + public function setCommonResponse($response): void + { + $this->commonResponse = $response; + } + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + $data = $serializer->deserialize( + $json, + "array", + "json" + ); + $obj = new self(); + $obj->data = $data; + return $obj; + } +} diff --git a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.php b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.php index 5f1b7134..63ab56a1 100644 --- a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.php +++ b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.php @@ -5,6 +5,62 @@ interface NDBrokerApi { + /** + * Submit KYC + * + * This endpointcan submit kyc information for a sub-account of nd broker + * @see: https://www.kucoin.com/docs-new/api-3472406 + * + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | BROKER | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | BROKER | + * | API-RATE-LIMIT-WEIGHT | NULL | + * +-----------------------+---------+ + */ + public function submitKYC(SubmitKYCReq $req): SubmitKYCResp; + + /** + * Get KYC Status + * + * This endpoint can query the specified Kyc status + * @see: https://www.kucoin.com/docs-new/api-3472407 + * + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | BROKER | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | BROKER | + * | API-RATE-LIMIT-WEIGHT | NULL | + * +-----------------------+---------+ + */ + public function getKYCStatus(GetKYCStatusReq $req): GetKYCStatusResp; + + /** + * Get KYC Status List + * + * This endpoint can query the specified Kyc status list + * @see: https://www.kucoin.com/docs-new/api-3472408 + * + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | BROKER | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | GENERAL | + * | API-RATE-LIMIT-POOL | BROKER | + * | API-RATE-LIMIT-WEIGHT | NULL | + * +-----------------------+---------+ + */ + public function getKYCStatusList( + GetKYCStatusListReq $req + ): GetKYCStatusListResp; + /** * Get Broker Info * diff --git a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.template b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.template index 62a171ee..4405fe7e 100644 --- a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.template +++ b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApi.template @@ -1,4 +1,60 @@ + /** + * submitKYC + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + public function testSubmitKYC() { + $builder = SubmitKYCReq::builder(); + $builder->setClientUid(?)->setFirstName(?)->setLastName(?)->setIssueCountry(?)->setBirthDate(?)->setIdentityType(?)->setIdentityNumber(?)->setExpireDate(?)->setFrontPhoto(?)->setBackendPhoto(?)->setFacePhoto(?); + $req = $builder->build(); + $resp = $this->api->submitKYC($req); + self::assertNotNull($resp->data); + Logger::info($resp->jsonSerialize($this->serializer)); + } + + /** + * getKYCStatus + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + public function testGetKYCStatus() { + $builder = GetKYCStatusReq::builder(); + $builder->setClientUids(?); + $req = $builder->build(); + $resp = $this->api->getKYCStatus($req); + foreach($resp->data as $item) { + self::assertNotNull($item->clientUid); + self::assertNotNull($item->status); + self::assertNotNull($item->rejectReason); + } + + Logger::info($resp->jsonSerialize($this->serializer)); + } + + /** + * getKYCStatusList + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + public function testGetKYCStatusList() { + $builder = GetKYCStatusListReq::builder(); + $builder->setPageNumber(?)->setPageSize(?); + $req = $builder->build(); + $resp = $this->api->getKYCStatusList($req); + self::assertNotNull($resp->currentPage); + self::assertNotNull($resp->pageSize); + self::assertNotNull($resp->totalNum); + self::assertNotNull($resp->totalPage); + foreach($resp->items as $item) { + self::assertNotNull($item->clientUid); + self::assertNotNull($item->status); + self::assertNotNull($item->rejectReason); + } + + Logger::info($resp->jsonSerialize($this->serializer)); + } + /** * getBrokerInfo * Get Broker Info diff --git a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiImpl.php b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiImpl.php index 0376f671..d14bd1d6 100644 --- a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiImpl.php +++ b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiImpl.php @@ -13,6 +13,46 @@ public function __construct(Transport $transport) $this->transport = $transport; } + public function submitKYC(SubmitKYCReq $req): SubmitKYCResp + { + return $this->transport->call( + "broker", + true, + "POST", + "/api/kyc/ndBroker/proxyClient/submit", + $req, + SubmitKYCResp::class, + false + ); + } + + public function getKYCStatus(GetKYCStatusReq $req): GetKYCStatusResp + { + return $this->transport->call( + "broker", + true, + "GET", + "/api/kyc/ndBroker/proxyClient/status/list", + $req, + GetKYCStatusResp::class, + false + ); + } + + public function getKYCStatusList( + GetKYCStatusListReq $req + ): GetKYCStatusListResp { + return $this->transport->call( + "broker", + true, + "GET", + "/api/kyc/ndBroker/proxyClient/status/page", + $req, + GetKYCStatusListResp::class, + false + ); + } + public function getBrokerInfo(GetBrokerInfoReq $req): GetBrokerInfoResp { return $this->transport->call( diff --git a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiTest.php b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiTest.php index eb5a36fa..0f587810 100644 --- a/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiTest.php +++ b/sdk/php/src/Generate/Broker/Ndbroker/NDBrokerApiTest.php @@ -52,6 +52,105 @@ function hasAnyNoneNull($object): bool return $excludeSize === $totalSize; } + /** + * submitKYC Request + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + public function testSubmitKYCRequest() + { + $data = + "{\"clientUid\": \"226383154\", \"firstName\": \"Kaylah\", \"lastName\": \"Padberg\", \"issueCountry\": \"JP\", \"birthDate\": \"2000-01-01\", \"expireDate\": \"2030-01-01\", \"identityType\": \"passport\", \"identityNumber\": \"55\", \"facePhoto\": \"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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\", \"frontPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\", \"backendPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\"}"; + $req = SubmitKYCReq::jsonDeserialize($data, $this->serializer); + $this->assertTrue($this->hasAnyNoneNull($req)); + echo $req->jsonSerialize($this->serializer); + } + + /** + * submitKYC Response + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + public function testSubmitKYCResponse() + { + $data = "{\"code\":\"200000\",\"data\":null}"; + $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); + $respData = $commonResp->data + ? $this->serializer->serialize($commonResp->data, "json") + : null; + $resp = SubmitKYCResp::jsonDeserialize($respData, $this->serializer); + $commonResp->data + ? $this->assertTrue($this->hasAnyNoneNull($resp)) + : $this->assertTrue(true); + echo $resp->jsonSerialize($this->serializer); + } + /** + * getKYCStatus Request + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + public function testGetKYCStatusRequest() + { + $data = "{\"clientUids\": \"226383154\"}"; + $req = GetKYCStatusReq::jsonDeserialize($data, $this->serializer); + $this->assertTrue($this->hasAnyNoneNull($req)); + echo $req->jsonSerialize($this->serializer); + } + + /** + * getKYCStatus Response + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + public function testGetKYCStatusResponse() + { + $data = + "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n }\n ]\n}"; + $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); + $respData = $commonResp->data + ? $this->serializer->serialize($commonResp->data, "json") + : null; + $resp = GetKYCStatusResp::jsonDeserialize($respData, $this->serializer); + $commonResp->data + ? $this->assertTrue($this->hasAnyNoneNull($resp)) + : $this->assertTrue(true); + echo $resp->jsonSerialize($this->serializer); + } + /** + * getKYCStatusList Request + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + public function testGetKYCStatusListRequest() + { + $data = "{\"pageNumber\": 1, \"pageSize\": 100}"; + $req = GetKYCStatusListReq::jsonDeserialize($data, $this->serializer); + $this->assertTrue($this->hasAnyNoneNull($req)); + echo $req->jsonSerialize($this->serializer); + } + + /** + * getKYCStatusList Response + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + public function testGetKYCStatusListResponse() + { + $data = + "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 100,\n \"totalNum\": 9,\n \"totalPage\": 1,\n \"items\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n },\n {\n \"clientUid\": 232772137,\n \"status\": \"REJECT\",\n \"rejectReason\": \"frontPhoto:Picture is not clear/covered/incomplete\"\n }\n ]\n }\n}"; + $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); + $respData = $commonResp->data + ? $this->serializer->serialize($commonResp->data, "json") + : null; + $resp = GetKYCStatusListResp::jsonDeserialize( + $respData, + $this->serializer + ); + $commonResp->data + ? $this->assertTrue($this->hasAnyNoneNull($resp)) + : $this->assertTrue(true); + echo $resp->jsonSerialize($this->serializer); + } /** * getBrokerInfo Request * Get Broker Info diff --git a/sdk/php/src/Generate/Broker/Ndbroker/SubmitKYCReq.php b/sdk/php/src/Generate/Broker/Ndbroker/SubmitKYCReq.php new file mode 100644 index 00000000..ebbaf007 --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/SubmitKYCReq.php @@ -0,0 +1,301 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize($json, SubmitKYCReq::class, "json"); + } + /** + * Creates a new instance of the `SubmitKYCReq` class. + * The builder pattern allows step-by-step construction of a `SubmitKYCReq` object. + * @return SubmitKYCReqBuilder + */ + public static function builder() + { + return new SubmitKYCReqBuilder(new self()); + } + + /** + * Creates a new instance of the `SubmitKYCReq` class with the given data. + * Ensure that the keys in data match the target field names in the documentation, + * rather than the variable names in the class. + * @return self + */ + public static function create(array $data) + { + $obj = new self(); + foreach ($data as $key => $value) { + if (property_exists($obj, $key)) { + $obj->$key = $value; + } + } + return $obj; + } +} + +class SubmitKYCReqBuilder +{ + /** + * @var SubmitKYCReq $obj + */ + private $obj; + + public function __construct(SubmitKYCReq $obj) + { + $this->obj = $obj; + } + /** + * client uid + * @param string $value + * @return self + */ + public function setClientUid($value) + { + $this->obj->clientUid = $value; + return $this; + } + + /** + * first Name + * @param string $value + * @return self + */ + public function setFirstName($value) + { + $this->obj->firstName = $value; + return $this; + } + + /** + * last Name + * @param string $value + * @return self + */ + public function setLastName($value) + { + $this->obj->lastName = $value; + return $this; + } + + /** + * ISO country code + * @param string $value + * @return self + */ + public function setIssueCountry($value) + { + $this->obj->issueCountry = $value; + return $this; + } + + /** + * Birth Date + * @param string $value + * @return self + */ + public function setBirthDate($value) + { + $this->obj->birthDate = $value; + return $this; + } + + /** + * Identity type + * - 'idcard' : id card + * - 'drivinglicense' : driving license + * - 'passport' : passport + * - 'bvn' : bvn + * @param string $value + * @return self + */ + public function setIdentityType($value) + { + $this->obj->identityType = $value; + return $this; + } + + /** + * Identity Number + * @param string $value + * @return self + */ + public function setIdentityNumber($value) + { + $this->obj->identityNumber = $value; + return $this; + } + + /** + * expire Date. If there is no expiration date, please fill in: 2099-01-01 + * @param string $value + * @return self + */ + public function setExpireDate($value) + { + $this->obj->expireDate = $value; + return $this; + } + + /** + * **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + * @param string $value + * @return self + */ + public function setFrontPhoto($value) + { + $this->obj->frontPhoto = $value; + return $this; + } + + /** + * **Optional when identityType=passport/bvn,** Back photo of ID, same as above + * @param string $value + * @return self + */ + public function setBackendPhoto($value) + { + $this->obj->backendPhoto = $value; + return $this; + } + + /** + * Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + * @param string $value + * @return self + */ + public function setFacePhoto($value) + { + $this->obj->facePhoto = $value; + return $this; + } + + /** + * Get the final object. + * @return SubmitKYCReq + */ + public function build() + { + return $this->obj; + } +} diff --git a/sdk/php/src/Generate/Broker/Ndbroker/SubmitKYCResp.php b/sdk/php/src/Generate/Broker/Ndbroker/SubmitKYCResp.php new file mode 100644 index 00000000..1422f8d8 --- /dev/null +++ b/sdk/php/src/Generate/Broker/Ndbroker/SubmitKYCResp.php @@ -0,0 +1,61 @@ +commonResponse = $response; + } + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + $data = $serializer->deserialize($json, "string", "json"); + $obj = new self(); + $obj->data = $data; + return $obj; + } +} diff --git a/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.php b/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.php index 5745a8b3..e2d9d6ea 100644 --- a/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.php +++ b/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.php @@ -6,7 +6,7 @@ interface FundingFeesApi { /** - * Get Current Funding Rate. + * Get Current Funding Rate * * Get Current Funding Rate. * @see: https://www.kucoin.com/docs-new/api-3470265 diff --git a/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.template b/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.template index 8c32b104..5785f8df 100644 --- a/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.template +++ b/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApi.template @@ -1,7 +1,7 @@ /** * getCurrentFundingRate - * Get Current Funding Rate. + * Get Current Funding Rate * /api/v1/funding-rate/{symbol}/current */ public function testGetCurrentFundingRate() { @@ -16,6 +16,8 @@ self::assertNotNull($resp->predictedValue); self::assertNotNull($resp->fundingRateCap); self::assertNotNull($resp->fundingRateFloor); + self::assertNotNull($resp->period); + self::assertNotNull($resp->fundingTime); Logger::info($resp->jsonSerialize($this->serializer)); } diff --git a/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApiTest.php b/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApiTest.php index f923c354..1fbc6e0e 100644 --- a/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApiTest.php +++ b/sdk/php/src/Generate/Futures/Fundingfees/FundingFeesApiTest.php @@ -54,7 +54,7 @@ function hasAnyNoneNull($object): bool /** * getCurrentFundingRate Request - * Get Current Funding Rate. + * Get Current Funding Rate * /api/v1/funding-rate/{symbol}/current */ public function testGetCurrentFundingRateRequest() @@ -70,13 +70,13 @@ public function testGetCurrentFundingRateRequest() /** * getCurrentFundingRate Response - * Get Current Funding Rate. + * Get Current Funding Rate * /api/v1/funding-rate/{symbol}/current */ public function testGetCurrentFundingRateResponse() { $data = - "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1731441600000,\n \"value\": 6.41E-4,\n \"predictedValue\": 5.2E-5,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003\n }\n}"; + "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1748462400000,\n \"value\": 6.1E-5,\n \"predictedValue\": 1.09E-4,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003,\n \"period\": 0,\n \"fundingTime\": 1748491200000\n }\n}"; $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); $respData = $commonResp->data ? $this->serializer->serialize($commonResp->data, "json") diff --git a/sdk/php/src/Generate/Futures/Fundingfees/GetCurrentFundingRateResp.php b/sdk/php/src/Generate/Futures/Fundingfees/GetCurrentFundingRateResp.php index 56e5e77f..96c524e1 100644 --- a/sdk/php/src/Generate/Futures/Fundingfees/GetCurrentFundingRateResp.php +++ b/sdk/php/src/Generate/Futures/Fundingfees/GetCurrentFundingRateResp.php @@ -27,7 +27,7 @@ class GetCurrentFundingRateResp implements Response */ public $granularity; /** - * The funding rate settlement time point of the previous cycle (milliseconds) + * The funding rate settlement time point of the previous cycle (milliseconds) Before going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched. The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled. The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live. * @var int $timePoint * @Type("int") * @SerializedName("timePoint") @@ -61,6 +61,22 @@ class GetCurrentFundingRateResp implements Response * @SerializedName("fundingRateFloor") */ public $fundingRateFloor; + /** + * Indicates whether the current funding fee is charged within this cycle + * - 1 : Indicates that funding will be charged in the current cycle + * - 0 : Indicates a cross-cycle expense record that is not charged in the current cycle. + * @var int $period + * @Type("int") + * @SerializedName("period") + */ + public $period; + /** + * Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing. + * @var int $fundingTime + * @Type("int") + * @SerializedName("fundingTime") + */ + public $fundingTime; /** * common response diff --git a/sdk/php/src/Generate/Futures/FuturesPrivate/AllOrderEvent.php b/sdk/php/src/Generate/Futures/FuturesPrivate/AllOrderEvent.php index b5f0d3a6..a0c1281e 100644 --- a/sdk/php/src/Generate/Futures/FuturesPrivate/AllOrderEvent.php +++ b/sdk/php/src/Generate/Futures/FuturesPrivate/AllOrderEvent.php @@ -62,7 +62,7 @@ class AllOrderEvent implements Response */ public $type; /** - * Order time (nanoseconds) + * Gateway received the message time (milliseconds) * @var int $orderTime * @Type("int") * @SerializedName("orderTime") @@ -104,7 +104,7 @@ class AllOrderEvent implements Response */ public $status; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) * @var int $ts * @Type("int") * @SerializedName("ts") diff --git a/sdk/php/src/Generate/Futures/FuturesPrivate/AllPositionEvent.php b/sdk/php/src/Generate/Futures/FuturesPrivate/AllPositionEvent.php index 76f5629d..10ae4b92 100644 --- a/sdk/php/src/Generate/Futures/FuturesPrivate/AllPositionEvent.php +++ b/sdk/php/src/Generate/Futures/FuturesPrivate/AllPositionEvent.php @@ -223,7 +223,7 @@ class AllPositionEvent implements Response */ public $autoDeposit; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement * @var float|null $maintMarginReq * @Type("float") * @SerializedName("maintMarginReq") @@ -272,7 +272,7 @@ class AllPositionEvent implements Response */ public $posFunding; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin * @var float|null $posMaint * @Type("float") * @SerializedName("posMaint") diff --git a/sdk/php/src/Generate/Futures/FuturesPrivate/CrossLeverageEvent.php b/sdk/php/src/Generate/Futures/FuturesPrivate/CrossLeverageEvent.php index 544df2ef..d925f02f 100644 --- a/sdk/php/src/Generate/Futures/FuturesPrivate/CrossLeverageEvent.php +++ b/sdk/php/src/Generate/Futures/FuturesPrivate/CrossLeverageEvent.php @@ -42,15 +42,23 @@ public function jsonSerialize($serializer) return $serializer->serialize($this, "json"); } + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ public static function jsonDeserialize($json, $serializer) { - $item = $serializer->deserialize( + if ($json === null) { + return new self(); + } + $data = $serializer->deserialize( $json, - "array", + "array", "json" ); $obj = new self(); - $obj->data = $item; + $obj->data = $data; return $obj; } diff --git a/sdk/php/src/Generate/Futures/FuturesPrivate/MarginModeEvent.php b/sdk/php/src/Generate/Futures/FuturesPrivate/MarginModeEvent.php index 0a524610..b57dcb3c 100644 --- a/sdk/php/src/Generate/Futures/FuturesPrivate/MarginModeEvent.php +++ b/sdk/php/src/Generate/Futures/FuturesPrivate/MarginModeEvent.php @@ -14,11 +14,11 @@ class MarginModeEvent implements Response { /** * The SYMBOL is the key with value \"CROSS\" or \"ISOLATED\" - * @var string $sYMBOL - * @Type("string") - * @SerializedName("SYMBOL") + * @var array $data + * @Type("array") + * @SerializedName("data") */ - public $sYMBOL; + public $data; private function __construct() {} @@ -49,7 +49,17 @@ public function jsonSerialize($serializer) */ public static function jsonDeserialize($json, $serializer) { - return $serializer->deserialize($json, MarginModeEvent::class, "json"); + if ($json === null) { + return new self(); + } + $data = $serializer->deserialize( + $json, + "array", + "json" + ); + $obj = new self(); + $obj->data = $data; + return $obj; } /** diff --git a/sdk/php/src/Generate/Futures/FuturesPrivate/OrderEvent.php b/sdk/php/src/Generate/Futures/FuturesPrivate/OrderEvent.php index 924a7384..078a738a 100644 --- a/sdk/php/src/Generate/Futures/FuturesPrivate/OrderEvent.php +++ b/sdk/php/src/Generate/Futures/FuturesPrivate/OrderEvent.php @@ -62,7 +62,7 @@ class OrderEvent implements Response */ public $type; /** - * Order time (nanoseconds) + * Gateway received the message time (milliseconds) * @var int $orderTime * @Type("int") * @SerializedName("orderTime") @@ -104,7 +104,7 @@ class OrderEvent implements Response */ public $status; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) * @var int $ts * @Type("int") * @SerializedName("ts") diff --git a/sdk/php/src/Generate/Futures/FuturesPrivate/PositionEvent.php b/sdk/php/src/Generate/Futures/FuturesPrivate/PositionEvent.php index 3f699acd..8e69466a 100644 --- a/sdk/php/src/Generate/Futures/FuturesPrivate/PositionEvent.php +++ b/sdk/php/src/Generate/Futures/FuturesPrivate/PositionEvent.php @@ -223,7 +223,7 @@ class PositionEvent implements Response */ public $autoDeposit; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement * @var float|null $maintMarginReq * @Type("float") * @SerializedName("maintMarginReq") @@ -272,7 +272,7 @@ class PositionEvent implements Response */ public $posFunding; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin * @var float|null $posMaint * @Type("float") * @SerializedName("posMaint") diff --git a/sdk/php/src/Generate/Futures/Market/GetAllSymbolsData.php b/sdk/php/src/Generate/Futures/Market/GetAllSymbolsData.php index 7283ff80..54b53bb0 100644 --- a/sdk/php/src/Generate/Futures/Market/GetAllSymbolsData.php +++ b/sdk/php/src/Generate/Futures/Market/GetAllSymbolsData.php @@ -183,7 +183,7 @@ class GetAllSymbolsData implements Serializable public $makerFixFee; /** * Settlement fee - * @var float $settlementFee + * @var float|null $settlementFee * @Type("float") * @SerializedName("settlementFee") */ @@ -220,28 +220,28 @@ class GetAllSymbolsData implements Serializable /** * Fair price marking method; the Futures contract is null * - 'FundingRate' : FundingRate - * @var string $fairMethod + * @var string|null $fairMethod * @Type("string") * @SerializedName("fairMethod") */ public $fairMethod; /** * Ticker symbol of the base currency - * @var string $fundingBaseSymbol + * @var string|null $fundingBaseSymbol * @Type("string") * @SerializedName("fundingBaseSymbol") */ public $fundingBaseSymbol; /** * Ticker symbol of the quote currency - * @var string $fundingQuoteSymbol + * @var string|null $fundingQuoteSymbol * @Type("string") * @SerializedName("fundingQuoteSymbol") */ public $fundingQuoteSymbol; /** * Funding rate symbol - * @var string $fundingRateSymbol + * @var string|null $fundingRateSymbol * @Type("string") * @SerializedName("fundingRateSymbol") */ diff --git a/sdk/php/src/Generate/Futures/Order/GetOrderByClientOidResp.php b/sdk/php/src/Generate/Futures/Order/GetOrderByClientOidResp.php index b5600274..2275e80c 100644 --- a/sdk/php/src/Generate/Futures/Order/GetOrderByClientOidResp.php +++ b/sdk/php/src/Generate/Futures/Order/GetOrderByClientOidResp.php @@ -91,7 +91,10 @@ class GetOrderByClientOidResp implements Response */ public $stp; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type + * - 'down' : Triggers when the price reaches or goes below the stopPrice. + * - 'up' : Triggers when the price reaches or goes above the stopPrice. + * - '' : Not a stop order * @var string $stop * @Type("string") * @SerializedName("stop") @@ -99,10 +102,10 @@ class GetOrderByClientOidResp implements Response public $stop; /** * Trigger price type of stop orders - * - '' : None * - 'TP' : TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. * - 'MP' : MP for mark price. The mark price can be obtained through relevant OPEN API for index services. * - 'IP' : IP for index price. The index price can be obtained through relevant OPEN API for index services. + * - '' : Not a stop order * @var string $stopPriceType * @Type("string") * @SerializedName("stopPriceType") diff --git a/sdk/php/src/Generate/Futures/Order/GetOrderByOrderIdResp.php b/sdk/php/src/Generate/Futures/Order/GetOrderByOrderIdResp.php index 5e9027af..c19b4911 100644 --- a/sdk/php/src/Generate/Futures/Order/GetOrderByOrderIdResp.php +++ b/sdk/php/src/Generate/Futures/Order/GetOrderByOrderIdResp.php @@ -91,7 +91,10 @@ class GetOrderByOrderIdResp implements Response */ public $stp; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type + * - 'down' : Triggers when the price reaches or goes below the stopPrice. + * - 'up' : Triggers when the price reaches or goes above the stopPrice. + * - '' : Not a stop order * @var string $stop * @Type("string") * @SerializedName("stop") @@ -99,10 +102,10 @@ class GetOrderByOrderIdResp implements Response public $stop; /** * Trigger price type of stop orders - * - '' : * - 'TP' : TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. * - 'MP' : MP for mark price, The mark price can be obtained through relevant OPEN API for index services * - 'IP' : IP for index price, The index price can be obtained through relevant OPEN API for index services + * - '' : Not a stop order * @var string $stopPriceType * @Type("string") * @SerializedName("stopPriceType") diff --git a/sdk/php/src/Generate/Futures/Order/GetOrderListItems.php b/sdk/php/src/Generate/Futures/Order/GetOrderListItems.php index edeb315e..15a63665 100644 --- a/sdk/php/src/Generate/Futures/Order/GetOrderListItems.php +++ b/sdk/php/src/Generate/Futures/Order/GetOrderListItems.php @@ -82,7 +82,10 @@ class GetOrderListItems implements Serializable */ public $stp; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type + * - 'down' : Triggers when the price reaches or goes below the stopPrice. + * - 'up' : Triggers when the price reaches or goes above the stopPrice. + * - '' : Not a stop order * @var string $stop * @Type("string") * @SerializedName("stop") @@ -90,6 +93,10 @@ class GetOrderListItems implements Serializable public $stop; /** * Trigger price type of stop orders + * - 'TP' : TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + * - 'MP' : MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + * - 'IP' : IP for index price. The index price can be obtained through relevant OPEN API for index services. + * - '' : Not a stop order * @var string $stopPriceType * @Type("string") * @SerializedName("stopPriceType") diff --git a/sdk/php/src/Generate/Futures/Order/GetRecentClosedOrdersData.php b/sdk/php/src/Generate/Futures/Order/GetRecentClosedOrdersData.php index 4319fee8..048f70fa 100644 --- a/sdk/php/src/Generate/Futures/Order/GetRecentClosedOrdersData.php +++ b/sdk/php/src/Generate/Futures/Order/GetRecentClosedOrdersData.php @@ -82,7 +82,10 @@ class GetRecentClosedOrdersData implements Serializable */ public $stp; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type + * - 'down' : Triggers when the price reaches or goes below the stopPrice. + * - 'up' : Triggers when the price reaches or goes above the stopPrice. + * - '' : Not a stop order * @var string $stop * @Type("string") * @SerializedName("stop") @@ -90,6 +93,10 @@ class GetRecentClosedOrdersData implements Serializable public $stop; /** * Trigger price type of stop orders + * - 'TP' : TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + * - 'MP' : MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + * - 'IP' : IP for index price. The index price can be obtained through relevant OPEN API for index services. + * - '' : Not a stop order * @var string $stopPriceType * @Type("string") * @SerializedName("stopPriceType") diff --git a/sdk/php/src/Generate/Futures/Order/GetRecentTradeHistoryData.php b/sdk/php/src/Generate/Futures/Order/GetRecentTradeHistoryData.php index 84f693da..c7bf8c77 100644 --- a/sdk/php/src/Generate/Futures/Order/GetRecentTradeHistoryData.php +++ b/sdk/php/src/Generate/Futures/Order/GetRecentTradeHistoryData.php @@ -94,6 +94,9 @@ class GetRecentTradeHistoryData implements Serializable public $closeFeePay; /** * A mark to the stop order type + * - 'down' : Triggers when the price reaches or goes below the stopPrice. + * - 'up' : Triggers when the price reaches or goes above the stopPrice. + * - '' : Not a stop order * @var string $stop * @Type("string") * @SerializedName("stop") diff --git a/sdk/php/src/Generate/Futures/Order/GetStopOrderListItems.php b/sdk/php/src/Generate/Futures/Order/GetStopOrderListItems.php index 4c94504b..4a3f9556 100644 --- a/sdk/php/src/Generate/Futures/Order/GetStopOrderListItems.php +++ b/sdk/php/src/Generate/Futures/Order/GetStopOrderListItems.php @@ -82,7 +82,10 @@ class GetStopOrderListItems implements Serializable */ public $stp; /** - * Stop order type (stop limit or stop market) + * A mark to the stop order type + * - 'down' : Triggers when the price reaches or goes below the stopPrice. + * - 'up' : Triggers when the price reaches or goes above the stopPrice. + * - '' : Not a stop order * @var string $stop * @Type("string") * @SerializedName("stop") @@ -90,6 +93,10 @@ class GetStopOrderListItems implements Serializable public $stop; /** * Trigger price type of stop orders + * - 'TP' : TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + * - 'MP' : MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + * - 'IP' : IP for index price. The index price can be obtained through relevant OPEN API for index services. + * - '' : Not a stop order * @var string $stopPriceType * @Type("string") * @SerializedName("stopPriceType") diff --git a/sdk/php/src/Generate/Futures/Order/GetTradeHistoryItems.php b/sdk/php/src/Generate/Futures/Order/GetTradeHistoryItems.php index 9a8a6268..3ed81169 100644 --- a/sdk/php/src/Generate/Futures/Order/GetTradeHistoryItems.php +++ b/sdk/php/src/Generate/Futures/Order/GetTradeHistoryItems.php @@ -94,6 +94,9 @@ class GetTradeHistoryItems implements Serializable public $closeFeePay; /** * A mark to the stop order type + * - 'down' : Triggers when the price reaches or goes below the stopPrice. + * - 'up' : Triggers when the price reaches or goes above the stopPrice. + * - '' : Not a stop order * @var string $stop * @Type("string") * @SerializedName("stop") diff --git a/sdk/php/src/Generate/Futures/Order/OrderApi.php b/sdk/php/src/Generate/Futures/Order/OrderApi.php index c2634c0e..8a28a7c9 100644 --- a/sdk/php/src/Generate/Futures/Order/OrderApi.php +++ b/sdk/php/src/Generate/Futures/Order/OrderApi.php @@ -349,7 +349,7 @@ public function getTradeHistory( * | API-CHANNEL | PRIVATE | * | API-PERMISSION | FUTURES | * | API-RATE-LIMIT-POOL | FUTURES | - * | API-RATE-LIMIT-WEIGHT | 200 | + * | API-RATE-LIMIT-WEIGHT | 800 | * +-----------------------+---------+ */ public function cancelAllOrdersV1( diff --git a/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeErrors.php b/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeErrors.php new file mode 100644 index 00000000..585978cf --- /dev/null +++ b/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeErrors.php @@ -0,0 +1,63 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + BatchSwitchMarginModeErrors::class, + "json" + ); + } +} diff --git a/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeReq.php b/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeReq.php new file mode 100644 index 00000000..0dd6ffe2 --- /dev/null +++ b/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeReq.php @@ -0,0 +1,139 @@ +") + * @SerializedName("symbols") + */ + public $symbols; + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + BatchSwitchMarginModeReq::class, + "json" + ); + } + /** + * Creates a new instance of the `BatchSwitchMarginModeReq` class. + * The builder pattern allows step-by-step construction of a `BatchSwitchMarginModeReq` object. + * @return BatchSwitchMarginModeReqBuilder + */ + public static function builder() + { + return new BatchSwitchMarginModeReqBuilder(new self()); + } + + /** + * Creates a new instance of the `BatchSwitchMarginModeReq` class with the given data. + * Ensure that the keys in data match the target field names in the documentation, + * rather than the variable names in the class. + * @return self + */ + public static function create(array $data) + { + $obj = new self(); + foreach ($data as $key => $value) { + if (property_exists($obj, $key)) { + $obj->$key = $value; + } + } + return $obj; + } +} + +class BatchSwitchMarginModeReqBuilder +{ + /** + * @var BatchSwitchMarginModeReq $obj + */ + private $obj; + + public function __construct(BatchSwitchMarginModeReq $obj) + { + $this->obj = $obj; + } + /** + * Modified margin model: ISOLATED (isolated), CROSS (cross margin). + * - 'ISOLATED' : Isolated Margin Mode + * - 'CROSS' : Cross Margin MOde + * @param string $value + * @return self + */ + public function setMarginMode($value) + { + $this->obj->marginMode = $value; + return $this; + } + + /** + * Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + * @param string[] $value + * @return self + */ + public function setSymbols($value) + { + $this->obj->symbols = $value; + return $this; + } + + /** + * Get the final object. + * @return BatchSwitchMarginModeReq + */ + public function build() + { + return $this->obj; + } +} diff --git a/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeResp.php b/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeResp.php new file mode 100644 index 00000000..445e108a --- /dev/null +++ b/sdk/php/src/Generate/Futures/Positions/BatchSwitchMarginModeResp.php @@ -0,0 +1,69 @@ + $marginMode + * @Type("array") + * @SerializedName("marginMode") + */ + public $marginMode; + /** + * Symbol which modification failed + * @var BatchSwitchMarginModeErrors[] $errors + * @Type("array") + * @SerializedName("errors") + */ + public $errors; + + /** + * common response + * @Exclude() + * @var RestResponse $commonResponse + */ + public $commonResponse; + + public function setCommonResponse($response): void + { + $this->commonResponse = $response; + } + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + BatchSwitchMarginModeResp::class, + "json" + ); + } +} diff --git a/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitData.php b/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitData.php new file mode 100644 index 00000000..9eb96831 --- /dev/null +++ b/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitData.php @@ -0,0 +1,105 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + GetCrossMarginRiskLimitData::class, + "json" + ); + } +} diff --git a/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitReq.php b/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitReq.php new file mode 100644 index 00000000..9a233f05 --- /dev/null +++ b/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitReq.php @@ -0,0 +1,153 @@ +serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + return $serializer->deserialize( + $json, + GetCrossMarginRiskLimitReq::class, + "json" + ); + } + /** + * Creates a new instance of the `GetCrossMarginRiskLimitReq` class. + * The builder pattern allows step-by-step construction of a `GetCrossMarginRiskLimitReq` object. + * @return GetCrossMarginRiskLimitReqBuilder + */ + public static function builder() + { + return new GetCrossMarginRiskLimitReqBuilder(new self()); + } + + /** + * Creates a new instance of the `GetCrossMarginRiskLimitReq` class with the given data. + * Ensure that the keys in data match the target field names in the documentation, + * rather than the variable names in the class. + * @return self + */ + public static function create(array $data) + { + $obj = new self(); + foreach ($data as $key => $value) { + if (property_exists($obj, $key)) { + $obj->$key = $value; + } + } + return $obj; + } +} + +class GetCrossMarginRiskLimitReqBuilder +{ + /** + * @var GetCrossMarginRiskLimitReq $obj + */ + private $obj; + + public function __construct(GetCrossMarginRiskLimitReq $obj) + { + $this->obj = $obj; + } + /** + * Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) + * @param string $value + * @return self + */ + public function setSymbol($value) + { + $this->obj->symbol = $value; + return $this; + } + + /** + * The position opening amount, in the contract's settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price. + * @param string $value + * @return self + */ + public function setTotalMargin($value) + { + $this->obj->totalMargin = $value; + return $this; + } + + /** + * Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. + * @param int $value + * @return self + */ + public function setLeverage($value) + { + $this->obj->leverage = $value; + return $this; + } + + /** + * Get the final object. + * @return GetCrossMarginRiskLimitReq + */ + public function build() + { + return $this->obj; + } +} diff --git a/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitResp.php b/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitResp.php new file mode 100644 index 00000000..5292f942 --- /dev/null +++ b/sdk/php/src/Generate/Futures/Positions/GetCrossMarginRiskLimitResp.php @@ -0,0 +1,65 @@ +") + * @SerializedName("data") + */ + public $data; + + /** + * common response + * @Exclude() + * @var RestResponse $commonResponse + */ + public $commonResponse; + + public function setCommonResponse($response): void + { + $this->commonResponse = $response; + } + + private function __construct() {} + + /** + * @param Serializer $serializer + * @return string + */ + public function jsonSerialize($serializer) + { + return $serializer->serialize($this, "json"); + } + + /** + * @param string $json + * @param Serializer $serializer + * @return self + */ + public static function jsonDeserialize($json, $serializer) + { + if ($json === null) { + return new self(); + } + $data = $serializer->deserialize( + $json, + "array", + "json" + ); + $obj = new self(); + $obj->data = $data; + return $obj; + } +} diff --git a/sdk/php/src/Generate/Futures/Positions/GetPositionDetailsResp.php b/sdk/php/src/Generate/Futures/Positions/GetPositionDetailsResp.php index 5de3a226..c9404ae0 100644 --- a/sdk/php/src/Generate/Futures/Positions/GetPositionDetailsResp.php +++ b/sdk/php/src/Generate/Futures/Positions/GetPositionDetailsResp.php @@ -41,7 +41,7 @@ class GetPositionDetailsResp implements Response */ public $delevPercentage; /** - * Open time + * First opening time * @var int $openingTimestamp * @Type("int") * @SerializedName("openingTimestamp") @@ -240,7 +240,7 @@ class GetPositionDetailsResp implements Response */ public $autoDeposit; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement * @var float|null $maintMarginReq * @Type("float") * @SerializedName("maintMarginReq") @@ -303,7 +303,7 @@ class GetPositionDetailsResp implements Response */ public $posFunding; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin * @var float|null $posMaint * @Type("float") * @SerializedName("posMaint") diff --git a/sdk/php/src/Generate/Futures/Positions/GetPositionListData.php b/sdk/php/src/Generate/Futures/Positions/GetPositionListData.php index 2f3aee1d..499a0953 100644 --- a/sdk/php/src/Generate/Futures/Positions/GetPositionListData.php +++ b/sdk/php/src/Generate/Futures/Positions/GetPositionListData.php @@ -40,7 +40,7 @@ class GetPositionListData implements Serializable */ public $delevPercentage; /** - * Open time + * First opening time * @var int $openingTimestamp * @Type("int") * @SerializedName("openingTimestamp") @@ -239,7 +239,7 @@ class GetPositionListData implements Serializable */ public $autoDeposit; /** - * Maintenance margin requirement **Only applicable to Isolated Margin** + * Maintenance margin requirement * @var float|null $maintMarginReq * @Type("float") * @SerializedName("maintMarginReq") @@ -302,7 +302,7 @@ class GetPositionListData implements Serializable */ public $posFunding; /** - * Maintenance margin **Only applicable to Isolated Margin** + * Maintenance margin * @var float|null $posMaint * @Type("float") * @SerializedName("posMaint") diff --git a/sdk/php/src/Generate/Futures/Positions/GetPositionListReq.php b/sdk/php/src/Generate/Futures/Positions/GetPositionListReq.php index 028d5c47..918d1ada 100644 --- a/sdk/php/src/Generate/Futures/Positions/GetPositionListReq.php +++ b/sdk/php/src/Generate/Futures/Positions/GetPositionListReq.php @@ -22,7 +22,7 @@ public function pathVarMapping() return self::$pathVarMapping; } /** - * Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + * Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty * @var string|null $currency * @Type("string") * @SerializedName("currency") @@ -96,7 +96,7 @@ public function __construct(GetPositionListReq $obj) $this->obj = $obj; } /** - * Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + * Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty * @param string $value * @return self */ diff --git a/sdk/php/src/Generate/Futures/Positions/PositionsApi.php b/sdk/php/src/Generate/Futures/Positions/PositionsApi.php index c14867b4..191c2042 100644 --- a/sdk/php/src/Generate/Futures/Positions/PositionsApi.php +++ b/sdk/php/src/Generate/Futures/Positions/PositionsApi.php @@ -43,6 +43,26 @@ public function switchMarginMode( SwitchMarginModeReq $req ): SwitchMarginModeResp; + /** + * Batch Switch Margin Mode + * + * Batch modify the margin mode of the symbols. + * @see: https://www.kucoin.com/docs-new/api-3472403 + * + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | FUTURES | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | FUTURES | + * | API-RATE-LIMIT-POOL | FUTURES | + * | API-RATE-LIMIT-WEIGHT | 2 | + * +-----------------------+---------+ + */ + public function batchSwitchMarginMode( + BatchSwitchMarginModeReq $req + ): BatchSwitchMarginModeResp; + /** * Get Max Open Size * @@ -221,6 +241,26 @@ public function removeIsolatedMargin( RemoveIsolatedMarginReq $req ): RemoveIsolatedMarginResp; + /** + * Get Cross Margin Risk Limit + * + * Batch get cross margin risk limit. + * @see: https://www.kucoin.com/docs-new/api-3472655 + * + * +-----------------------+---------+ + * | Extra API Info | Value | + * +-----------------------+---------+ + * | API-DOMAIN | FUTURES | + * | API-CHANNEL | PRIVATE | + * | API-PERMISSION | FUTURES | + * | API-RATE-LIMIT-POOL | FUTURES | + * | API-RATE-LIMIT-WEIGHT | 2 | + * +-----------------------+---------+ + */ + public function getCrossMarginRiskLimit( + GetCrossMarginRiskLimitReq $req + ): GetCrossMarginRiskLimitResp; + /** * Get Isolated Margin Risk Limit * diff --git a/sdk/php/src/Generate/Futures/Positions/PositionsApi.template b/sdk/php/src/Generate/Futures/Positions/PositionsApi.template index 5fb0d4bd..c502d8e1 100644 --- a/sdk/php/src/Generate/Futures/Positions/PositionsApi.template +++ b/sdk/php/src/Generate/Futures/Positions/PositionsApi.template @@ -29,6 +29,26 @@ Logger::info($resp->jsonSerialize($this->serializer)); } + /** + * batchSwitchMarginMode + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + public function testBatchSwitchMarginMode() { + $builder = BatchSwitchMarginModeReq::builder(); + $builder->setMarginMode(?)->setSymbols(?); + $req = $builder->build(); + $resp = $this->api->batchSwitchMarginMode($req); + self::assertNotNull($resp->marginMode); + foreach($resp->errors as $item) { + self::assertNotNull($item->code); + self::assertNotNull($item->msg); + self::assertNotNull($item->symbol); + } + + Logger::info($resp->jsonSerialize($this->serializer)); + } + /** * getMaxOpenSize * Get Max Open Size @@ -311,6 +331,31 @@ Logger::info($resp->jsonSerialize($this->serializer)); } + /** + * getCrossMarginRiskLimit + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + public function testGetCrossMarginRiskLimit() { + $builder = GetCrossMarginRiskLimitReq::builder(); + $builder->setSymbol(?)->setTotalMargin(?)->setLeverage(?); + $req = $builder->build(); + $resp = $this->api->getCrossMarginRiskLimit($req); + foreach($resp->data as $item) { + self::assertNotNull($item->symbol); + self::assertNotNull($item->maxOpenSize); + self::assertNotNull($item->maxOpenValue); + self::assertNotNull($item->totalMargin); + self::assertNotNull($item->price); + self::assertNotNull($item->leverage); + self::assertNotNull($item->mmr); + self::assertNotNull($item->imr); + self::assertNotNull($item->currency); + } + + Logger::info($resp->jsonSerialize($this->serializer)); + } + /** * getIsolatedMarginRiskLimit * Get Isolated Margin Risk Limit diff --git a/sdk/php/src/Generate/Futures/Positions/PositionsApiImpl.php b/sdk/php/src/Generate/Futures/Positions/PositionsApiImpl.php index 2440e4a6..2c82ed99 100644 --- a/sdk/php/src/Generate/Futures/Positions/PositionsApiImpl.php +++ b/sdk/php/src/Generate/Futures/Positions/PositionsApiImpl.php @@ -40,6 +40,20 @@ public function switchMarginMode( ); } + public function batchSwitchMarginMode( + BatchSwitchMarginModeReq $req + ): BatchSwitchMarginModeResp { + return $this->transport->call( + "futures", + false, + "POST", + "/api/v2/position/batchChangeMarginMode", + $req, + BatchSwitchMarginModeResp::class, + false + ); + } + public function getMaxOpenSize(GetMaxOpenSizeReq $req): GetMaxOpenSizeResp { return $this->transport->call( @@ -165,6 +179,20 @@ public function removeIsolatedMargin( ); } + public function getCrossMarginRiskLimit( + GetCrossMarginRiskLimitReq $req + ): GetCrossMarginRiskLimitResp { + return $this->transport->call( + "futures", + false, + "GET", + "/api/v2/batchGetCrossOrderLimit", + $req, + GetCrossMarginRiskLimitResp::class, + false + ); + } + public function getIsolatedMarginRiskLimit( GetIsolatedMarginRiskLimitReq $req ): GetIsolatedMarginRiskLimitResp { diff --git a/sdk/php/src/Generate/Futures/Positions/PositionsApiTest.php b/sdk/php/src/Generate/Futures/Positions/PositionsApiTest.php index 7ac029c6..3617b4ca 100644 --- a/sdk/php/src/Generate/Futures/Positions/PositionsApiTest.php +++ b/sdk/php/src/Generate/Futures/Positions/PositionsApiTest.php @@ -122,6 +122,45 @@ public function testSwitchMarginModeResponse() : $this->assertTrue(true); echo $resp->jsonSerialize($this->serializer); } + /** + * batchSwitchMarginMode Request + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + public function testBatchSwitchMarginModeRequest() + { + $data = + "{\"marginMode\": \"ISOLATED\", \"symbols\": [\"XBTUSDTM\", \"ETHUSDTM\"]}"; + $req = BatchSwitchMarginModeReq::jsonDeserialize( + $data, + $this->serializer + ); + $this->assertTrue($this->hasAnyNoneNull($req)); + echo $req->jsonSerialize($this->serializer); + } + + /** + * batchSwitchMarginMode Response + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + public function testBatchSwitchMarginModeResponse() + { + $data = + "{\n \"code\": \"200000\",\n \"data\": {\n \"marginMode\": {\n \"ETHUSDTM\": \"ISOLATED\",\n \"XBTUSDTM\": \"CROSS\"\n },\n \"errors\": [\n {\n \"code\": \"50002\",\n \"msg\": \"exist.order.or.position\",\n \"symbol\": \"XBTUSDTM\"\n }\n ]\n }\n}"; + $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); + $respData = $commonResp->data + ? $this->serializer->serialize($commonResp->data, "json") + : null; + $resp = BatchSwitchMarginModeResp::jsonDeserialize( + $respData, + $this->serializer + ); + $commonResp->data + ? $this->assertTrue($this->hasAnyNoneNull($resp)) + : $this->assertTrue(true); + echo $resp->jsonSerialize($this->serializer); + } /** * getMaxOpenSize Request * Get Max Open Size @@ -453,6 +492,45 @@ public function testRemoveIsolatedMarginResponse() : $this->assertTrue(true); echo $resp->jsonSerialize($this->serializer); } + /** + * getCrossMarginRiskLimit Request + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + public function testGetCrossMarginRiskLimitRequest() + { + $data = + "{\"symbol\": \"XBTUSDTM\", \"totalMargin\": \"example_string_default_value\", \"leverage\": 123456}"; + $req = GetCrossMarginRiskLimitReq::jsonDeserialize( + $data, + $this->serializer + ); + $this->assertTrue($this->hasAnyNoneNull($req)); + echo $req->jsonSerialize($this->serializer); + } + + /** + * getCrossMarginRiskLimit Response + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + public function testGetCrossMarginRiskLimitResponse() + { + $data = + "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"symbol\": \"XBTUSDTM\",\n \"maxOpenSize\": 12102,\n \"maxOpenValue\": \"1234549.2240000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"102012\",\n \"leverage\": \"125.00\",\n \"mmr\": \"0.00416136\",\n \"imr\": \"0.008\",\n \"currency\": \"USDT\"\n },\n {\n \"symbol\": \"ETHUSDTM\",\n \"maxOpenSize\": 38003,\n \"maxOpenValue\": \"971508.6920000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"2556.4\",\n \"leverage\": \"100.00\",\n \"mmr\": \"0.0054623236\",\n \"imr\": \"0.01\",\n \"currency\": \"USDT\"\n }\n ]\n}"; + $commonResp = RestResponse::jsonDeserialize($data, $this->serializer); + $respData = $commonResp->data + ? $this->serializer->serialize($commonResp->data, "json") + : null; + $resp = GetCrossMarginRiskLimitResp::jsonDeserialize( + $respData, + $this->serializer + ); + $commonResp->data + ? $this->assertTrue($this->hasAnyNoneNull($resp)) + : $this->assertTrue(true); + echo $resp->jsonSerialize($this->serializer); + } /** * getIsolatedMarginRiskLimit Request * Get Isolated Margin Risk Limit diff --git a/sdk/php/src/Generate/Margin/Order/CancelOrderByClientOidReq.php b/sdk/php/src/Generate/Margin/Order/CancelOrderByClientOidReq.php index c9732e2e..b2ad04d0 100644 --- a/sdk/php/src/Generate/Margin/Order/CancelOrderByClientOidReq.php +++ b/sdk/php/src/Generate/Margin/Order/CancelOrderByClientOidReq.php @@ -23,6 +23,13 @@ public function pathVarMapping() { return self::$pathVarMapping; } + /** + * symbol + * @var string|null $symbol + * @Type("string") + * @SerializedName("symbol") + */ + public $symbol; /** * Client Order Id, unique identifier created by the user * @var string|null $clientOid @@ -31,13 +38,6 @@ public function pathVarMapping() * @Exclude() */ public $clientOid; - /** - * symbol - * @var string|null $symbol - * @Type("string") - * @SerializedName("symbol") - */ - public $symbol; private function __construct() {} @@ -106,24 +106,24 @@ public function __construct(CancelOrderByClientOidReq $obj) $this->obj = $obj; } /** - * Client Order Id, unique identifier created by the user + * symbol * @param string $value * @return self */ - public function setClientOid($value) + public function setSymbol($value) { - $this->obj->clientOid = $value; + $this->obj->symbol = $value; return $this; } /** - * symbol + * Client Order Id, unique identifier created by the user * @param string $value * @return self */ - public function setSymbol($value) + public function setClientOid($value) { - $this->obj->symbol = $value; + $this->obj->clientOid = $value; return $this; } diff --git a/sdk/php/src/Generate/Margin/Order/CancelOrderByOrderIdReq.php b/sdk/php/src/Generate/Margin/Order/CancelOrderByOrderIdReq.php index 76512ecf..bd093c31 100644 --- a/sdk/php/src/Generate/Margin/Order/CancelOrderByOrderIdReq.php +++ b/sdk/php/src/Generate/Margin/Order/CancelOrderByOrderIdReq.php @@ -23,6 +23,13 @@ public function pathVarMapping() { return self::$pathVarMapping; } + /** + * symbol + * @var string|null $symbol + * @Type("string") + * @SerializedName("symbol") + */ + public $symbol; /** * The unique order id generated by the trading system * @var string|null $orderId @@ -31,13 +38,6 @@ public function pathVarMapping() * @Exclude() */ public $orderId; - /** - * symbol - * @var string|null $symbol - * @Type("string") - * @SerializedName("symbol") - */ - public $symbol; private function __construct() {} @@ -106,24 +106,24 @@ public function __construct(CancelOrderByOrderIdReq $obj) $this->obj = $obj; } /** - * The unique order id generated by the trading system + * symbol * @param string $value * @return self */ - public function setOrderId($value) + public function setSymbol($value) { - $this->obj->orderId = $value; + $this->obj->symbol = $value; return $this; } /** - * symbol + * The unique order id generated by the trading system * @param string $value * @return self */ - public function setSymbol($value) + public function setOrderId($value) { - $this->obj->symbol = $value; + $this->obj->orderId = $value; return $this; } diff --git a/sdk/php/src/Generate/Margin/Order/GetOrderByClientOidReq.php b/sdk/php/src/Generate/Margin/Order/GetOrderByClientOidReq.php index 055bbe3e..c32187a8 100644 --- a/sdk/php/src/Generate/Margin/Order/GetOrderByClientOidReq.php +++ b/sdk/php/src/Generate/Margin/Order/GetOrderByClientOidReq.php @@ -23,6 +23,13 @@ public function pathVarMapping() { return self::$pathVarMapping; } + /** + * symbol + * @var string|null $symbol + * @Type("string") + * @SerializedName("symbol") + */ + public $symbol; /** * Client Order Id, unique identifier created by the user * @var string|null $clientOid @@ -31,13 +38,6 @@ public function pathVarMapping() * @Exclude() */ public $clientOid; - /** - * symbol - * @var string|null $symbol - * @Type("string") - * @SerializedName("symbol") - */ - public $symbol; private function __construct() {} @@ -106,24 +106,24 @@ public function __construct(GetOrderByClientOidReq $obj) $this->obj = $obj; } /** - * Client Order Id, unique identifier created by the user + * symbol * @param string $value * @return self */ - public function setClientOid($value) + public function setSymbol($value) { - $this->obj->clientOid = $value; + $this->obj->symbol = $value; return $this; } /** - * symbol + * Client Order Id, unique identifier created by the user * @param string $value * @return self */ - public function setSymbol($value) + public function setClientOid($value) { - $this->obj->symbol = $value; + $this->obj->clientOid = $value; return $this; } diff --git a/sdk/php/src/Generate/Margin/Order/GetOrderByOrderIdReq.php b/sdk/php/src/Generate/Margin/Order/GetOrderByOrderIdReq.php index 4db8ac80..9f678b82 100644 --- a/sdk/php/src/Generate/Margin/Order/GetOrderByOrderIdReq.php +++ b/sdk/php/src/Generate/Margin/Order/GetOrderByOrderIdReq.php @@ -23,6 +23,13 @@ public function pathVarMapping() { return self::$pathVarMapping; } + /** + * symbol + * @var string|null $symbol + * @Type("string") + * @SerializedName("symbol") + */ + public $symbol; /** * The unique order id generated by the trading system * @var string|null $orderId @@ -31,13 +38,6 @@ public function pathVarMapping() * @Exclude() */ public $orderId; - /** - * symbol - * @var string|null $symbol - * @Type("string") - * @SerializedName("symbol") - */ - public $symbol; private function __construct() {} @@ -106,24 +106,24 @@ public function __construct(GetOrderByOrderIdReq $obj) $this->obj = $obj; } /** - * The unique order id generated by the trading system + * symbol * @param string $value * @return self */ - public function setOrderId($value) + public function setSymbol($value) { - $this->obj->orderId = $value; + $this->obj->symbol = $value; return $this; } /** - * symbol + * The unique order id generated by the trading system * @param string $value * @return self */ - public function setSymbol($value) + public function setOrderId($value) { - $this->obj->symbol = $value; + $this->obj->orderId = $value; return $this; } diff --git a/sdk/php/src/Generate/Margin/Order/OrderApi.php b/sdk/php/src/Generate/Margin/Order/OrderApi.php index 5d6c1b6b..0a2c2c3b 100644 --- a/sdk/php/src/Generate/Margin/Order/OrderApi.php +++ b/sdk/php/src/Generate/Margin/Order/OrderApi.php @@ -18,7 +18,7 @@ interface OrderApi * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ public function addOrder(AddOrderReq $req): AddOrderResp; @@ -36,7 +36,7 @@ public function addOrder(AddOrderReq $req): AddOrderResp; * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ public function addOrderTest(AddOrderTestReq $req): AddOrderTestResp; @@ -54,7 +54,7 @@ public function addOrderTest(AddOrderTestReq $req): AddOrderTestResp; * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ public function cancelOrderByOrderId( @@ -74,7 +74,7 @@ public function cancelOrderByOrderId( * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 5 | + * | API-RATE-LIMIT-WEIGHT | 2 | * +-----------------------+---------+ */ public function cancelOrderByClientOid( @@ -94,7 +94,7 @@ public function cancelOrderByClientOid( * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 10 | + * | API-RATE-LIMIT-WEIGHT | 5 | * +-----------------------+---------+ */ public function cancelAllOrdersBySymbol( @@ -114,7 +114,7 @@ public function cancelAllOrdersBySymbol( * | API-CHANNEL | PRIVATE | * | API-PERMISSION | MARGIN | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | NULL | + * | API-RATE-LIMIT-WEIGHT | 4 | * +-----------------------+---------+ */ public function getSymbolsWithOpenOrder( diff --git a/sdk/php/src/Generate/Margin/Order/OrderApi.template b/sdk/php/src/Generate/Margin/Order/OrderApi.template index 9a8fa4a4..3bdcbfc9 100644 --- a/sdk/php/src/Generate/Margin/Order/OrderApi.template +++ b/sdk/php/src/Generate/Margin/Order/OrderApi.template @@ -40,7 +40,7 @@ */ public function testCancelOrderByOrderId() { $builder = CancelOrderByOrderIdReq::builder(); - $builder->setOrderId(?)->setSymbol(?); + $builder->setSymbol(?)->setOrderId(?); $req = $builder->build(); $resp = $this->api->cancelOrderByOrderId($req); self::assertNotNull($resp->orderId); @@ -54,7 +54,7 @@ */ public function testCancelOrderByClientOid() { $builder = CancelOrderByClientOidReq::builder(); - $builder->setClientOid(?)->setSymbol(?); + $builder->setSymbol(?)->setClientOid(?); $req = $builder->build(); $resp = $this->api->cancelOrderByClientOid($req); self::assertNotNull($resp->clientOid); @@ -243,7 +243,7 @@ */ public function testGetOrderByOrderId() { $builder = GetOrderByOrderIdReq::builder(); - $builder->setOrderId(?)->setSymbol(?); + $builder->setSymbol(?)->setOrderId(?); $req = $builder->build(); $resp = $this->api->getOrderByOrderId($req); self::assertNotNull($resp->id); @@ -293,7 +293,7 @@ */ public function testGetOrderByClientOid() { $builder = GetOrderByClientOidReq::builder(); - $builder->setClientOid(?)->setSymbol(?); + $builder->setSymbol(?)->setClientOid(?); $req = $builder->build(); $resp = $this->api->getOrderByClientOid($req); self::assertNotNull($resp->id); diff --git a/sdk/php/src/Generate/Margin/Order/OrderApiTest.php b/sdk/php/src/Generate/Margin/Order/OrderApiTest.php index 570abd7c..4fb0f84f 100644 --- a/sdk/php/src/Generate/Margin/Order/OrderApiTest.php +++ b/sdk/php/src/Generate/Margin/Order/OrderApiTest.php @@ -126,7 +126,7 @@ public function testAddOrderTestResponse() public function testCancelOrderByOrderIdRequest() { $data = - "{\"orderId\": \"671663e02188630007e21c9c\", \"symbol\": \"BTC-USDT\"}"; + "{\"symbol\": \"BTC-USDT\", \"orderId\": \"671663e02188630007e21c9c\"}"; $req = CancelOrderByOrderIdReq::jsonDeserialize( $data, $this->serializer @@ -165,7 +165,7 @@ public function testCancelOrderByOrderIdResponse() public function testCancelOrderByClientOidRequest() { $data = - "{\"clientOid\": \"5c52e11203aa677f33e1493fb\", \"symbol\": \"BTC-USDT\"}"; + "{\"symbol\": \"BTC-USDT\", \"clientOid\": \"5c52e11203aa677f33e1493fb\"}"; $req = CancelOrderByClientOidReq::jsonDeserialize( $data, $this->serializer @@ -386,7 +386,7 @@ public function testGetTradeHistoryResponse() public function testGetOrderByOrderIdRequest() { $data = - "{\"orderId\": \"671667306afcdb000723107f\", \"symbol\": \"BTC-USDT\"}"; + "{\"symbol\": \"BTC-USDT\", \"orderId\": \"671667306afcdb000723107f\"}"; $req = GetOrderByOrderIdReq::jsonDeserialize($data, $this->serializer); $this->assertTrue($this->hasAnyNoneNull($req)); echo $req->jsonSerialize($this->serializer); @@ -422,7 +422,7 @@ public function testGetOrderByOrderIdResponse() public function testGetOrderByClientOidRequest() { $data = - "{\"clientOid\": \"5c52e11203aa677f33e493fb\", \"symbol\": \"BTC-USDT\"}"; + "{\"symbol\": \"BTC-USDT\", \"clientOid\": \"5c52e11203aa677f33e493fb\"}"; $req = GetOrderByClientOidReq::jsonDeserialize( $data, $this->serializer diff --git a/sdk/php/src/Generate/Spot/Market/GetAllCurrenciesDataChains.php b/sdk/php/src/Generate/Spot/Market/GetAllCurrenciesDataChains.php index e1467496..421ed77a 100644 --- a/sdk/php/src/Generate/Spot/Market/GetAllCurrenciesDataChains.php +++ b/sdk/php/src/Generate/Spot/Market/GetAllCurrenciesDataChains.php @@ -27,7 +27,7 @@ class GetAllCurrenciesDataChains implements Serializable public $withdrawalMinSize; /** * Minimum deposit amount - * @var string $depositMinSize + * @var string|null $depositMinSize * @Type("string") * @SerializedName("depositMinSize") */ @@ -90,14 +90,14 @@ class GetAllCurrenciesDataChains implements Serializable public $withdrawPrecision; /** * Maximum amount of single withdrawal - * @var string $maxWithdraw + * @var string|null $maxWithdraw * @Type("string") * @SerializedName("maxWithdraw") */ public $maxWithdraw; /** * Maximum amount of single deposit (only applicable to Lightning Network) - * @var string $maxDeposit + * @var string|null $maxDeposit * @Type("string") * @SerializedName("maxDeposit") */ diff --git a/sdk/php/src/Generate/Spot/Market/GetAllSymbolsData.php b/sdk/php/src/Generate/Spot/Market/GetAllSymbolsData.php index 24df8c8a..ce0b8f18 100644 --- a/sdk/php/src/Generate/Spot/Market/GetAllSymbolsData.php +++ b/sdk/php/src/Generate/Spot/Market/GetAllSymbolsData.php @@ -170,42 +170,42 @@ class GetAllSymbolsData implements Serializable public $callauctionIsEnabled; /** * The lowest price declared in the call auction - * @var string $callauctionPriceFloor + * @var string|null $callauctionPriceFloor * @Type("string") * @SerializedName("callauctionPriceFloor") */ public $callauctionPriceFloor; /** * The highest bid price in the call auction - * @var string $callauctionPriceCeiling + * @var string|null $callauctionPriceCeiling * @Type("string") * @SerializedName("callauctionPriceCeiling") */ public $callauctionPriceCeiling; /** * The first phase of the call auction starts at (Allow add orders, allow cancel orders) - * @var int $callauctionFirstStageStartTime + * @var int|null $callauctionFirstStageStartTime * @Type("int") * @SerializedName("callauctionFirstStageStartTime") */ public $callauctionFirstStageStartTime; /** * The second phase of the call auction starts at (Allow add orders, don't allow cancel orders) - * @var int $callauctionSecondStageStartTime + * @var int|null $callauctionSecondStageStartTime * @Type("int") * @SerializedName("callauctionSecondStageStartTime") */ public $callauctionSecondStageStartTime; /** * The third phase of the call auction starts at (Don't allow add orders, don't allow cancel orders) - * @var int $callauctionThirdStageStartTime + * @var int|null $callauctionThirdStageStartTime * @Type("int") * @SerializedName("callauctionThirdStageStartTime") */ public $callauctionThirdStageStartTime; /** * Official opening time (end time of the third phase of call auction) - * @var int $tradingStartTime + * @var int|null $tradingStartTime * @Type("int") * @SerializedName("tradingStartTime") */ diff --git a/sdk/php/src/Generate/Spot/Market/GetCurrencyChains.php b/sdk/php/src/Generate/Spot/Market/GetCurrencyChains.php index 77580b47..b4dc5f5d 100644 --- a/sdk/php/src/Generate/Spot/Market/GetCurrencyChains.php +++ b/sdk/php/src/Generate/Spot/Market/GetCurrencyChains.php @@ -27,7 +27,7 @@ class GetCurrencyChains implements Serializable public $withdrawalMinSize; /** * Minimum deposit amount - * @var string $depositMinSize + * @var string|null $depositMinSize * @Type("string") * @SerializedName("depositMinSize") */ @@ -90,14 +90,14 @@ class GetCurrencyChains implements Serializable public $withdrawPrecision; /** * Maximum amount of single withdrawal - * @var float $maxWithdraw + * @var float|null $maxWithdraw * @Type("float") * @SerializedName("maxWithdraw") */ public $maxWithdraw; /** * Maximum amount of single deposit (only applicable to Lightning Network) - * @var string $maxDeposit + * @var string|null $maxDeposit * @Type("string") * @SerializedName("maxDeposit") */ diff --git a/sdk/php/src/Generate/Spot/Market/GetCurrencyReq.php b/sdk/php/src/Generate/Spot/Market/GetCurrencyReq.php index ed9d2573..6889cc1e 100644 --- a/sdk/php/src/Generate/Spot/Market/GetCurrencyReq.php +++ b/sdk/php/src/Generate/Spot/Market/GetCurrencyReq.php @@ -23,6 +23,13 @@ public function pathVarMapping() { return self::$pathVarMapping; } + /** + * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. + * @var string|null $chain + * @Type("string") + * @SerializedName("chain") + */ + public $chain; /** * Path parameter, Currency * @var string|null $currency @@ -31,13 +38,6 @@ public function pathVarMapping() * @Exclude() */ public $currency; - /** - * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. - * @var string|null $chain - * @Type("string") - * @SerializedName("chain") - */ - public $chain; private function __construct() {} @@ -102,24 +102,24 @@ public function __construct(GetCurrencyReq $obj) $this->obj = $obj; } /** - * Path parameter, Currency + * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. * @param string $value * @return self */ - public function setCurrency($value) + public function setChain($value) { - $this->obj->currency = $value; + $this->obj->chain = $value; return $this; } /** - * Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. + * Path parameter, Currency * @param string $value * @return self */ - public function setChain($value) + public function setCurrency($value) { - $this->obj->chain = $value; + $this->obj->currency = $value; return $this; } diff --git a/sdk/php/src/Generate/Spot/Market/GetCurrencyResp.php b/sdk/php/src/Generate/Spot/Market/GetCurrencyResp.php index 74d0aa46..c56f35ca 100644 --- a/sdk/php/src/Generate/Spot/Market/GetCurrencyResp.php +++ b/sdk/php/src/Generate/Spot/Market/GetCurrencyResp.php @@ -42,14 +42,14 @@ class GetCurrencyResp implements Response public $precision; /** * Number of block confirmations - * @var int $confirms + * @var int|null $confirms * @Type("int") * @SerializedName("confirms") */ public $confirms; /** * Contract address - * @var string $contractAddress + * @var string|null $contractAddress * @Type("string") * @SerializedName("contractAddress") */ diff --git a/sdk/php/src/Generate/Spot/Market/GetSymbolResp.php b/sdk/php/src/Generate/Spot/Market/GetSymbolResp.php index ea11e512..fe2fe0c5 100644 --- a/sdk/php/src/Generate/Spot/Market/GetSymbolResp.php +++ b/sdk/php/src/Generate/Spot/Market/GetSymbolResp.php @@ -171,42 +171,42 @@ class GetSymbolResp implements Response public $callauctionIsEnabled; /** * The lowest price declared in the call auction - * @var string $callauctionPriceFloor + * @var string|null $callauctionPriceFloor * @Type("string") * @SerializedName("callauctionPriceFloor") */ public $callauctionPriceFloor; /** * The highest bid price in the call auction - * @var string $callauctionPriceCeiling + * @var string|null $callauctionPriceCeiling * @Type("string") * @SerializedName("callauctionPriceCeiling") */ public $callauctionPriceCeiling; /** * The first phase of the call auction starts at (Allow add orders, allow cancel orders) - * @var int $callauctionFirstStageStartTime + * @var int|null $callauctionFirstStageStartTime * @Type("int") * @SerializedName("callauctionFirstStageStartTime") */ public $callauctionFirstStageStartTime; /** * The second phase of the call auction starts at (Allow add orders, don't allow cancel orders) - * @var int $callauctionSecondStageStartTime + * @var int|null $callauctionSecondStageStartTime * @Type("int") * @SerializedName("callauctionSecondStageStartTime") */ public $callauctionSecondStageStartTime; /** * The third phase of the call auction starts at (Don't allow add orders, don't allow cancel orders) - * @var int $callauctionThirdStageStartTime + * @var int|null $callauctionThirdStageStartTime * @Type("int") * @SerializedName("callauctionThirdStageStartTime") */ public $callauctionThirdStageStartTime; /** * Official opening time (end time of the third phase of call auction) - * @var int $tradingStartTime + * @var int|null $tradingStartTime * @Type("int") * @SerializedName("tradingStartTime") */ diff --git a/sdk/php/src/Generate/Spot/Market/MarketApi.template b/sdk/php/src/Generate/Spot/Market/MarketApi.template index 41b7de05..f4b50bf5 100644 --- a/sdk/php/src/Generate/Spot/Market/MarketApi.template +++ b/sdk/php/src/Generate/Spot/Market/MarketApi.template @@ -33,7 +33,7 @@ */ public function testGetCurrency() { $builder = GetCurrencyReq::builder(); - $builder->setCurrency(?)->setChain(?); + $builder->setChain(?)->setCurrency(?); $req = $builder->build(); $resp = $this->api->getCurrency($req); self::assertNotNull($resp->currency); diff --git a/sdk/php/src/Generate/Spot/Market/MarketApiTest.php b/sdk/php/src/Generate/Spot/Market/MarketApiTest.php index 03e340a3..ad215aa9 100644 --- a/sdk/php/src/Generate/Spot/Market/MarketApiTest.php +++ b/sdk/php/src/Generate/Spot/Market/MarketApiTest.php @@ -95,7 +95,7 @@ public function testGetAnnouncementsResponse() */ public function testGetCurrencyRequest() { - $data = "{\"currency\": \"BTC\", \"chain\": \"eth\"}"; + $data = "{\"chain\": \"eth\", \"currency\": \"BTC\"}"; $req = GetCurrencyReq::jsonDeserialize($data, $this->serializer); $this->assertTrue($this->hasAnyNoneNull($req)); echo $req->jsonSerialize($this->serializer); diff --git a/sdk/php/src/Generate/Spot/Order/AddOrderReq.php b/sdk/php/src/Generate/Spot/Order/AddOrderReq.php index f9b36a18..91c6a04f 100644 --- a/sdk/php/src/Generate/Spot/Order/AddOrderReq.php +++ b/sdk/php/src/Generate/Spot/Order/AddOrderReq.php @@ -146,14 +146,14 @@ public function pathVarMapping() */ public $funds; /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @var int|null $allowMaxTimeWindow * @Type("int") * @SerializedName("allowMaxTimeWindow") */ public $allowMaxTimeWindow; /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. * @var int|null $clientTimestamp * @Type("int") * @SerializedName("clientTimestamp") @@ -411,7 +411,7 @@ public function setFunds($value) } /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @param int $value * @return self */ @@ -422,7 +422,7 @@ public function setAllowMaxTimeWindow($value) } /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. * @param int $value * @return self */ diff --git a/sdk/php/src/Generate/Spot/Order/AddOrderSyncReq.php b/sdk/php/src/Generate/Spot/Order/AddOrderSyncReq.php index 88678f2c..fcde7d71 100644 --- a/sdk/php/src/Generate/Spot/Order/AddOrderSyncReq.php +++ b/sdk/php/src/Generate/Spot/Order/AddOrderSyncReq.php @@ -146,14 +146,14 @@ public function pathVarMapping() */ public $funds; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @var int|null $allowMaxTimeWindow * @Type("int") * @SerializedName("allowMaxTimeWindow") */ public $allowMaxTimeWindow; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. * @var int|null $clientTimestamp * @Type("int") * @SerializedName("clientTimestamp") @@ -411,7 +411,7 @@ public function setFunds($value) } /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @param int $value * @return self */ @@ -422,7 +422,7 @@ public function setAllowMaxTimeWindow($value) } /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. * @param int $value * @return self */ diff --git a/sdk/php/src/Generate/Spot/Order/AddOrderTestReq.php b/sdk/php/src/Generate/Spot/Order/AddOrderTestReq.php index 741729c1..9d0bb1f0 100644 --- a/sdk/php/src/Generate/Spot/Order/AddOrderTestReq.php +++ b/sdk/php/src/Generate/Spot/Order/AddOrderTestReq.php @@ -146,14 +146,14 @@ public function pathVarMapping() */ public $funds; /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @var int|null $allowMaxTimeWindow * @Type("int") * @SerializedName("allowMaxTimeWindow") */ public $allowMaxTimeWindow; /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. * @var int|null $clientTimestamp * @Type("int") * @SerializedName("clientTimestamp") @@ -411,7 +411,7 @@ public function setFunds($value) } /** - * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @param int $value * @return self */ @@ -422,7 +422,7 @@ public function setAllowMaxTimeWindow($value) } /** - * Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. * @param int $value * @return self */ diff --git a/sdk/php/src/Generate/Spot/Order/BatchAddOrdersOrderList.php b/sdk/php/src/Generate/Spot/Order/BatchAddOrdersOrderList.php index 84ec957d..11dacc72 100644 --- a/sdk/php/src/Generate/Spot/Order/BatchAddOrdersOrderList.php +++ b/sdk/php/src/Generate/Spot/Order/BatchAddOrdersOrderList.php @@ -145,14 +145,14 @@ public function pathVarMapping() */ public $funds; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. * @var int|null $clientTimestamp * @Type("int") * @SerializedName("clientTimestamp") */ public $clientTimestamp; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @var int|null $allowMaxTimeWindow * @Type("int") * @SerializedName("allowMaxTimeWindow") @@ -413,7 +413,7 @@ public function setFunds($value) } /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. * @param int $value * @return self */ @@ -424,7 +424,7 @@ public function setClientTimestamp($value) } /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @param int $value * @return self */ diff --git a/sdk/php/src/Generate/Spot/Order/BatchAddOrdersSyncOrderList.php b/sdk/php/src/Generate/Spot/Order/BatchAddOrdersSyncOrderList.php index 4bdd8dd9..e6e943ee 100644 --- a/sdk/php/src/Generate/Spot/Order/BatchAddOrdersSyncOrderList.php +++ b/sdk/php/src/Generate/Spot/Order/BatchAddOrdersSyncOrderList.php @@ -145,14 +145,14 @@ public function pathVarMapping() */ public $funds; /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @var int|null $allowMaxTimeWindow * @Type("int") * @SerializedName("allowMaxTimeWindow") */ public $allowMaxTimeWindow; /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. * @var int|null $clientTimestamp * @Type("int") * @SerializedName("clientTimestamp") @@ -413,7 +413,7 @@ public function setFunds($value) } /** - * The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + * Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. * @param int $value * @return self */ @@ -424,7 +424,7 @@ public function setAllowMaxTimeWindow($value) } /** - * Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + * Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. * @param int $value * @return self */ diff --git a/sdk/php/src/Generate/Spot/Order/OrderApi.php b/sdk/php/src/Generate/Spot/Order/OrderApi.php index 3cea5ca3..13827cd4 100644 --- a/sdk/php/src/Generate/Spot/Order/OrderApi.php +++ b/sdk/php/src/Generate/Spot/Order/OrderApi.php @@ -248,7 +248,7 @@ public function cancelAllOrders(): CancelAllOrdersResp; * | API-CHANNEL | PRIVATE | * | API-PERMISSION | SPOT | * | API-RATE-LIMIT-POOL | SPOT | - * | API-RATE-LIMIT-WEIGHT | 3 | + * | API-RATE-LIMIT-WEIGHT | 1 | * +-----------------------+---------+ */ public function modifyOrder(ModifyOrderReq $req): ModifyOrderResp; diff --git a/sdk/php/src/Generate/Spot/SpotPrivate/OrderV1Event.php b/sdk/php/src/Generate/Spot/SpotPrivate/OrderV1Event.php index c75febea..838f92e8 100644 --- a/sdk/php/src/Generate/Spot/SpotPrivate/OrderV1Event.php +++ b/sdk/php/src/Generate/Spot/SpotPrivate/OrderV1Event.php @@ -41,7 +41,7 @@ class OrderV1Event implements Response */ public $orderId; /** - * Order time (milliseconds) + * Gateway received the message time (milliseconds) * @var int $orderTime * @Type("int") * @SerializedName("orderTime") @@ -111,7 +111,7 @@ class OrderV1Event implements Response */ public $symbol; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) * @var int $ts * @Type("int") * @SerializedName("ts") diff --git a/sdk/php/src/Generate/Spot/SpotPrivate/OrderV2Event.php b/sdk/php/src/Generate/Spot/SpotPrivate/OrderV2Event.php index 4c16c1a9..98035a5c 100644 --- a/sdk/php/src/Generate/Spot/SpotPrivate/OrderV2Event.php +++ b/sdk/php/src/Generate/Spot/SpotPrivate/OrderV2Event.php @@ -41,7 +41,7 @@ class OrderV2Event implements Response */ public $orderId; /** - * Order time (milliseconds) + * Gateway received the message time (milliseconds) * @var int $orderTime * @Type("int") * @SerializedName("orderTime") @@ -111,7 +111,7 @@ class OrderV2Event implements Response */ public $symbol; /** - * Push time (nanoseconds) + * Match engine received the message time (nanoseconds) * @var int $ts * @Type("int") * @SerializedName("ts") diff --git a/sdk/php/src/Generate/Spot/SpotPrivate/StopOrderEvent.php b/sdk/php/src/Generate/Spot/SpotPrivate/StopOrderEvent.php index 6641e288..86e983af 100644 --- a/sdk/php/src/Generate/Spot/SpotPrivate/StopOrderEvent.php +++ b/sdk/php/src/Generate/Spot/SpotPrivate/StopOrderEvent.php @@ -55,7 +55,7 @@ class StopOrderEvent implements Response */ public $size; /** - * Order type: loss: stop loss order, oco: oco order + * Order type * @var string $stop * @Type("string") * @SerializedName("stop") diff --git a/sdk/php/src/Generate/VIPLending/Viplending/VIPLendingApi.php b/sdk/php/src/Generate/VIPLending/Viplending/VIPLendingApi.php index d0a87c6d..5e7b5acf 100644 --- a/sdk/php/src/Generate/VIPLending/Viplending/VIPLendingApi.php +++ b/sdk/php/src/Generate/VIPLending/Viplending/VIPLendingApi.php @@ -34,7 +34,7 @@ public function getDiscountRateConfigs(): GetDiscountRateConfigsResp; * +-----------------------+------------+ * | API-DOMAIN | SPOT | * | API-CHANNEL | PRIVATE | - * | API-PERMISSION | GENERAL | + * | API-PERMISSION | SPOT | * | API-RATE-LIMIT-POOL | MANAGEMENT | * | API-RATE-LIMIT-WEIGHT | 5 | * +-----------------------+------------+ @@ -52,7 +52,7 @@ public function getLoanInfo(): GetLoanInfoResp; * +-----------------------+------------+ * | API-DOMAIN | SPOT | * | API-CHANNEL | PRIVATE | - * | API-PERMISSION | GENERAL | + * | API-PERMISSION | SPOT | * | API-RATE-LIMIT-POOL | MANAGEMENT | * | API-RATE-LIMIT-WEIGHT | 20 | * +-----------------------+------------+ diff --git a/sdk/php/src/Generate/Version.php b/sdk/php/src/Generate/Version.php index 33ddf757..b9289b68 100644 --- a/sdk/php/src/Generate/Version.php +++ b/sdk/php/src/Generate/Version.php @@ -4,6 +4,6 @@ class Version { - const SDK_VERSION = "0.1.1-alpha"; - const SDK_GENERATE_DATE = "2025-05-29"; + const SDK_VERSION = "0.1.2-alpha"; + const SDK_GENERATE_DATE = "2025-06-11"; } diff --git a/sdk/php/tests/e2e/rest/Account/AccountWithdrawTest.php b/sdk/php/tests/e2e/rest/Account/AccountWithdrawTest.php index 9a5082cb..07399ceb 100644 --- a/sdk/php/tests/e2e/rest/Account/AccountWithdrawTest.php +++ b/sdk/php/tests/e2e/rest/Account/AccountWithdrawTest.php @@ -7,6 +7,7 @@ use KuCoin\UniversalSDK\Api\DefaultClient; use KuCoin\UniversalSDK\Common\Logger; use KuCoin\UniversalSDK\Generate\Account\Withdrawal\CancelWithdrawalReq; +use KuCoin\UniversalSDK\Generate\Account\Withdrawal\GetWithdrawalHistoryByIdReq; use KuCoin\UniversalSDK\Generate\Account\Withdrawal\GetWithdrawalHistoryOldReq; use KuCoin\UniversalSDK\Generate\Account\Withdrawal\GetWithdrawalHistoryReq; use KuCoin\UniversalSDK\Generate\Account\Withdrawal\GetWithdrawalQuotasReq; @@ -172,6 +173,41 @@ public function testGetWithdrawalHistory() Logger::info($resp->jsonSerialize($this->serializer)); } + + /** + * getWithdrawalHistoryById + * Get Withdrawal History By ID + * /api/v1/withdrawals/{withdrawalId} + */ + public function testGetWithdrawalHistoryById() { + $builder = GetWithdrawalHistoryByIdReq::builder(); + $builder->setWithdrawalId("674576dc74b2bb000778452c"); + $req = $builder->build(); + $resp = $this->api->getWithdrawalHistoryById($req); + self::assertNotNull($resp->id); + self::assertNotNull($resp->uid); + self::assertNotNull($resp->currency); + self::assertNotNull($resp->chainId); + self::assertNotNull($resp->chainName); + self::assertNotNull($resp->currencyName); + self::assertNotNull($resp->status); + self::assertNotNull($resp->failureReason); + self::assertNotNull($resp->failureReasonMsg); + self::assertNotNull($resp->address); + self::assertNotNull($resp->memo); + self::assertNotNull($resp->isInner); + self::assertNotNull($resp->amount); + self::assertNotNull($resp->fee); + self::assertNotNull($resp->walletTxId); + self::assertNotNull($resp->addressRemark); + self::assertNotNull($resp->remark); + self::assertNotNull($resp->createdAt); + self::assertNotNull($resp->cancelType); + self::assertNotNull($resp->returnStatus); + self::assertNotNull($resp->returnCurrency); + Logger::info($resp->jsonSerialize($this->serializer)); + } + /** * getWithdrawalHistoryOld * Get Withdrawal History - Old diff --git a/sdk/php/tests/e2e/rest/Broker/NDBrokerTest.php b/sdk/php/tests/e2e/rest/Broker/NDBrokerTest.php index 2febcbc5..fe959711 100644 --- a/sdk/php/tests/e2e/rest/Broker/NDBrokerTest.php +++ b/sdk/php/tests/e2e/rest/Broker/NDBrokerTest.php @@ -12,6 +12,8 @@ use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetBrokerInfoReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetDepositDetailReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetDepositListReq; +use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetKYCStatusListReq; +use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetKYCStatusReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetRebaseReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetSubAccountAPIReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetSubAccountReq; @@ -19,6 +21,7 @@ use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\GetWithdrawDetailReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\ModifySubAccountApiReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\NDBrokerApi; +use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\SubmitKYCReq; use KuCoin\UniversalSDK\Generate\Broker\Ndbroker\TransferReq; use KuCoin\UniversalSDK\Internal\Utils\JsonSerializedHandler; use KuCoin\UniversalSDK\Model\ClientOptionBuilder; @@ -87,6 +90,65 @@ protected function setUp(): void } + /** + * submitKYC + * Submit KYC + * /api/kyc/ndBroker/proxyClient/submit + */ + public function testSubmitKYC() + { + $builder = SubmitKYCReq::builder(); + $builder->setClientUid('226383154')->setFirstName('Kaylah')->setLastName('Padberg')->setIssueCountry("JP")-> + setBirthDate("2000-01-01")->setIdentityType("passport")->setIdentityNumber("55")-> + setExpireDate("2030-01-01")->setFrontPhoto("****")->setBackendPhoto("***")->setFacePhoto("***"); + $req = $builder->build(); + $resp = $this->api->submitKYC($req); + Logger::info($resp->jsonSerialize($this->serializer)); + } + + /** + * getKYCStatus + * Get KYC Status + * /api/kyc/ndBroker/proxyClient/status/list + */ + public function testGetKYCStatus() + { + $builder = GetKYCStatusReq::builder(); + $builder->setClientUids("226383154"); + $req = $builder->build(); + $resp = $this->api->getKYCStatus($req); + foreach ($resp->data as $item) { + self::assertNotNull($item->clientUid); + self::assertNotNull($item->status); + self::assertNotNull($item->rejectReason); + } + + Logger::info($resp->jsonSerialize($this->serializer)); + } + + /** + * getKYCStatusList + * Get KYC Status List + * /api/kyc/ndBroker/proxyClient/status/page + */ + public function testGetKYCStatusList() + { + $builder = GetKYCStatusListReq::builder(); + $builder->setPageNumber(1)->setPageSize(100); + $req = $builder->build(); + $resp = $this->api->getKYCStatusList($req); + self::assertNotNull($resp->currentPage); + self::assertNotNull($resp->pageSize); + self::assertNotNull($resp->totalNum); + self::assertNotNull($resp->totalPage); + foreach ($resp->items as $item) { + self::assertNotNull($item->clientUid); + self::assertNotNull($item->status); + } + + Logger::info($resp->jsonSerialize($this->serializer)); + } + /** * getBrokerInfo * Get Broker Info diff --git a/sdk/php/tests/e2e/rest/Futures/FuturesPositionsTest.php b/sdk/php/tests/e2e/rest/Futures/FuturesPositionsTest.php index 930d7c45..776434a2 100644 --- a/sdk/php/tests/e2e/rest/Futures/FuturesPositionsTest.php +++ b/sdk/php/tests/e2e/rest/Futures/FuturesPositionsTest.php @@ -7,7 +7,9 @@ use KuCoin\UniversalSDK\Api\DefaultClient; use KuCoin\UniversalSDK\Common\Logger; use KuCoin\UniversalSDK\Generate\Futures\Positions\AddIsolatedMarginReq; +use KuCoin\UniversalSDK\Generate\Futures\Positions\BatchSwitchMarginModeReq; use KuCoin\UniversalSDK\Generate\Futures\Positions\GetCrossMarginLeverageReq; +use KuCoin\UniversalSDK\Generate\Futures\Positions\GetCrossMarginRiskLimitReq; use KuCoin\UniversalSDK\Generate\Futures\Positions\GetIsolatedMarginRiskLimitReq; use KuCoin\UniversalSDK\Generate\Futures\Positions\GetMarginModeReq; use KuCoin\UniversalSDK\Generate\Futures\Positions\GetMaxOpenSizeReq; @@ -119,6 +121,26 @@ public function testSwitchMarginMode() Logger::info($resp->jsonSerialize($this->serializer)); } + /** + * batchSwitchMarginMode + * Batch Switch Margin Mode + * /api/v2/position/batchChangeMarginMode + */ + public function testBatchSwitchMarginMode() { + $builder = BatchSwitchMarginModeReq::builder(); + $builder->setMarginMode("ISOLATED")->setSymbols(['XBTUSDTM', 'DOGEUSDTM']); + $req = $builder->build(); + $resp = $this->api->batchSwitchMarginMode($req); + self::assertNotNull($resp->marginMode); + foreach($resp->errors as $item) { + self::assertNotNull($item->code); + self::assertNotNull($item->msg); + self::assertNotNull($item->symbol); + } + + Logger::info($resp->jsonSerialize($this->serializer)); + } + /** * getMaxOpenSize * Get Max Open Size @@ -387,6 +409,30 @@ public function testRemoveIsolatedMargin() Logger::info($resp->jsonSerialize($this->serializer)); } + /** + * getCrossMarginRiskLimit + * Get Cross Margin Risk Limit + * /api/v2/batchGetCrossOrderLimit + */ + public function testGetCrossMarginRiskLimit() + { + $builder = GetCrossMarginRiskLimitReq::builder(); + $builder->setSymbol("XBTUSDTM")->setTotalMargin("1000")->setLeverage(1); + $req = $builder->build(); + $resp = $this->api->getCrossMarginRiskLimit($req); + foreach ($resp->data as $item) { + self::assertNotNull($item->symbol); + self::assertNotNull($item->maxOpenSize); + self::assertNotNull($item->maxOpenValue); + self::assertNotNull($item->totalMargin); + self::assertNotNull($item->price); + self::assertNotNull($item->leverage); + self::assertNotNull($item->mmr); + self::assertNotNull($item->imr); + self::assertNotNull($item->currency); + } + } + /** * getIsolatedMarginRiskLimit * Get Isolated Margin Risk Limit diff --git a/sdk/php/tests/e2e/rest/Spot/SpotMarketTest.php b/sdk/php/tests/e2e/rest/Spot/SpotMarketTest.php index 74760635..a7957e1d 100644 --- a/sdk/php/tests/e2e/rest/Spot/SpotMarketTest.php +++ b/sdk/php/tests/e2e/rest/Spot/SpotMarketTest.php @@ -232,7 +232,6 @@ public function testGetAllSymbols() self::assertNotNull($item->quoteIncrement); self::assertNotNull($item->priceIncrement); self::assertNotNull($item->priceLimitRate); - self::assertNotNull($item->minFunds); self::assertNotNull($item->isMarginEnabled); self::assertNotNull($item->enableTrading); self::assertNotNull($item->feeCategory); diff --git a/sdk/php/tests/e2e/ws/Futures/FuturesPrivateTest.php b/sdk/php/tests/e2e/ws/Futures/FuturesPrivateTest.php index 79996f95..6fc33ffc 100644 --- a/sdk/php/tests/e2e/ws/Futures/FuturesPrivateTest.php +++ b/sdk/php/tests/e2e/ws/Futures/FuturesPrivateTest.php @@ -325,7 +325,7 @@ function (Exception $e) { } )->then(function (string $id) { Logger::info("Subscribed with ID: $id"); - return waitFor(5.0, $id); + return waitFor(30.0, $id); })->then(function (string $id) { Logger::info("Unsubscribing..."); return self::$futuresPrivate->unSubscribe($id)->catch(function ($e) { diff --git a/sdk/postman/CHANGELOG.md b/sdk/postman/CHANGELOG.md index 421cd2f9..f5596a2a 100644 --- a/sdk/postman/CHANGELOG.md +++ b/sdk/postman/CHANGELOG.md @@ -2,7 +2,31 @@ API documentation [Changelog](https://www.kucoin.com/docs-new/change-log) -Current synchronized API documentation version [20250313](https://www.kucoin.com/docs-new/change-log#20250313) +Current synchronized API documentation version [20250529](https://www.kucoin.com/docs-new/change-log#20250529) + +## 2025-06-11(1.3.0) +- Update the latest APIs, documentation, etc +- Introduced a new testing framework for all SDKs +- Expanded regression-test coverage for Python components +- Updated Node.js dependencies to address security vulnerabilities + +## 2025-06-11(PHP 0.1.2-alpha) +- Update the latest APIs, documentation, etc + +## 2025-05-29(PHP 0.1.1-alpha) +- Fix compatibility issues on non-macOS systems by enforcing case-sensitive PSR-4 autoloading. + +## 2025-05-27(GO 1.2.1) +- Fix the Golang type mapping: map OpenAPI number type to float64 to prevent overflow + +## 2025-05-26(PHP 0.1.0-alpha) +- Release PHP implementation + +## 2025-04-04(Python 1.2.1.post1) +- Bug Fixes + +## 2025-03-31(Python 1.2.1) +- Optimize WebSocket reconnection logic ## 2025-03-21(1.2.0) - Update the latest APIs, documentation, etc diff --git a/sdk/postman/collection-Abandoned Endpoints.json b/sdk/postman/collection-Abandoned Endpoints.json index 1ba20221..fcef1863 100644 --- a/sdk/postman/collection-Abandoned Endpoints.json +++ b/sdk/postman/collection-Abandoned Endpoints.json @@ -1113,7 +1113,7 @@ "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470309)\n\n:::tip[TIPS]\nIt is recommended to use the **POST /v3/deposit-address/create** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest via this endpoint the creation of a deposit address for a currency you intend to deposit.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| chain | string | The chainId of currency, e.g. the available values for USDT are OMNI, ERC20, and TRC20; default is ERC20. The available values for BTC are Native, Segwit, TRC20; the parameters are bech32, btc, trx; default is Native. This only applies to multi-chain currencies; no need for single-chain currencies. |\n| to | string | Deposit account type: main (funding account), trade (spot trading account); the default is main |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| address | string | Deposit address |\n| memo | string | Address remark. If there’s no remark, it is empty. When you withdraw from other platforms to KuCoin, you need to fill in memo(tag). Be careful: If you do not fill in memo(tag), your deposit may not be available. |\n| chain | string | The chainName of currency |\n| chainId | string | The chainId of currency |\n| to | string | Deposit account type: main (funding account), trade (spot trading account) |\n| currency | string | currency |\n\n---\n", "body": { "mode": "raw", - "raw": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\"\n}", + "raw": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\",\n \"to\": \"MAIN\"\n}", "options": { "raw": { "language": "json" @@ -3048,7 +3048,7 @@ "type": "text/javascript", "packages": {}, "exec": [ - "function extractPathVariable(str) {\n const regex = /^\\{\\{(.+?)\\}\\}$/;\n const match = str.match(regex);\n if (match) {\n return match[1];\n }\n return null;\n}\n\nfunction hasAnyFieldEmpty(obj) {\n for (const key in obj) {\n if (obj[key] === \"\" || obj[key] === null || obj[key] === undefined) {\n return true;\n }\n }\n return false;\n}\n\nfunction sign(text, secret) {\n const hash = CryptoJS.HmacSHA256(text, secret);\n return CryptoJS.enc.Base64.stringify(hash)\n}\n\nfunction auth(apiKey, method, url, data) {\n if (hasAnyFieldEmpty(apiKey)) {\n console.warn('The API key-related information is not configured; only the public channel API is accessible.')\n return {'User-Agent': `Kucoin-Universal-Postman-SDK/v1.2.0`}\n }\n\n const timestamp = Date.now();\n const text = timestamp + method.toUpperCase() + url + data;\n const signature = sign(text, apiKey.secret);\n return {\n 'KC-API-KEY': apiKey.key,\n 'KC-API-SIGN': signature,\n 'KC-API-TIMESTAMP': timestamp.toString(),\n 'KC-API-PASSPHRASE': sign(apiKey.passphrase || '', apiKey.secret),\n 'Content-Type': 'application/json',\n 'User-Agent': `Kucoin-Universal-Postman-SDK/v1.2.0`,\n 'KC-API-KEY-VERSION': 3,\n };\n}\n\nlet key = pm.environment.get('API_KEY')\nlet secret = pm.environment.get('API_SECRET')\nlet passphrase = pm.environment.get('API_PASSPHRASE')\n\nlet url = pm.request.url.getPathWithQuery()\nlet method = pm.request.method\nlet body = pm.request.body ? pm.request.body.toString() : ''\n\nfor (const index in pm.request.url.path) {\n path = pm.request.url.path[index]\n pathVar = extractPathVariable(path)\n if (pathVar != null) {\n let collectionVariable = pm.collectionVariables.get(pathVar);\n if (collectionVariable != null) {\n url = url.replace(path, collectionVariable)\n } else {\n console.warn('no path variable set: ' + path)\n }\n }\n}\n\nheader = auth({ key: key, passphrase: passphrase, secret: secret }, method, url, body)\n\nfor (const [headerName, headerValue] of Object.entries(header)) {\n pm.request.headers.add({ key: headerName, value: headerValue })\n}" + "function extractPathVariable(str) {\n const regex = /^\\{\\{(.+?)\\}\\}$/;\n const match = str.match(regex);\n if (match) {\n return match[1];\n }\n return null;\n}\n\nfunction hasAnyFieldEmpty(obj) {\n for (const key in obj) {\n if (obj[key] === \"\" || obj[key] === null || obj[key] === undefined) {\n return true;\n }\n }\n return false;\n}\n\nfunction sign(text, secret) {\n const hash = CryptoJS.HmacSHA256(text, secret);\n return CryptoJS.enc.Base64.stringify(hash)\n}\n\nfunction auth(apiKey, method, url, data) {\n if (hasAnyFieldEmpty(apiKey)) {\n console.warn('The API key-related information is not configured; only the public channel API is accessible.')\n return {'User-Agent': `Kucoin-Universal-Postman-SDK/v1.3.0`}\n }\n\n const timestamp = Date.now();\n const text = timestamp + method.toUpperCase() + url + data;\n const signature = sign(text, apiKey.secret);\n return {\n 'KC-API-KEY': apiKey.key,\n 'KC-API-SIGN': signature,\n 'KC-API-TIMESTAMP': timestamp.toString(),\n 'KC-API-PASSPHRASE': sign(apiKey.passphrase || '', apiKey.secret),\n 'Content-Type': 'application/json',\n 'User-Agent': `Kucoin-Universal-Postman-SDK/v1.3.0`,\n 'KC-API-KEY-VERSION': 3,\n };\n}\n\nlet key = pm.environment.get('API_KEY')\nlet secret = pm.environment.get('API_SECRET')\nlet passphrase = pm.environment.get('API_PASSPHRASE')\n\nlet url = pm.request.url.getPathWithQuery()\nlet method = pm.request.method\nlet body = pm.request.body ? pm.request.body.toString() : ''\n\nfor (const index in pm.request.url.path) {\n path = pm.request.url.path[index]\n pathVar = extractPathVariable(path)\n if (pathVar != null) {\n let collectionVariable = pm.collectionVariables.get(pathVar);\n if (collectionVariable != null) {\n url = url.replace(path, collectionVariable)\n } else {\n console.warn('no path variable set: ' + path)\n }\n }\n}\n\nheader = auth({ key: key, passphrase: passphrase, secret: secret }, method, url, body)\n\nfor (const [headerName, headerValue] of Object.entries(header)) {\n pm.request.headers.add({ key: headerName, value: headerValue })\n}" ] } }, diff --git a/sdk/postman/collection-REST.json b/sdk/postman/collection-REST.json index d2ed7243..a88236ab 100644 --- a/sdk/postman/collection-REST.json +++ b/sdk/postman/collection-REST.json @@ -447,7 +447,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470127)\n\n:::info[Description]\nRequest cross margin account info via this endpoint.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| totalAssetOfQuoteCurrency | string | Total Assets in Quote Currency |\n| totalLiabilityOfQuoteCurrency | string | Total Liability in Quote Currency |\n| debtRatio | string | debt ratio |\n| status | string | Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing |\n| accounts | array | Refer to the schema section of accounts |\n\n**root.data.accounts Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| total | string | Total Assets |\n| available | string | Account available assets (total assets - frozen) |\n| hold | string | Account frozen assets |\n| liability | string | Liabilities |\n| maxBorrowSize | string | The user's remaining maximum loan amount |\n| borrowEnabled | boolean | Support borrow or not |\n| transferInEnabled | boolean | Support transfer or not |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470127)\n\n:::info[Description]\nRequest cross margin account info via this endpoint.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| totalAssetOfQuoteCurrency | string | Total Assets in Quote Currency |\n| totalLiabilityOfQuoteCurrency | string | Total Liability in Quote Currency |\n| debtRatio | string | debt ratio |\n| status | string | Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing |\n| accounts | array | Refer to the schema section of accounts |\n\n**root.data.accounts Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| total | string | Total Assets |\n| available | string | Account available assets (total assets - frozen) |\n| hold | string | Account frozen assets |\n| liability | string | Liabilities |\n| maxBorrowSize | string | The user's remaining maximum loan amount |\n| borrowEnabled | boolean | Support borrow or not |\n| transferInEnabled | boolean | Support transfer or not |\n| liabilityPrincipal | string | Outstanding principal – the unpaid loan amount |\n| liabilityInterest | string | Accrued interest – the unpaid interest amount |\n\n---\n", "body": {} }, "response": [ @@ -512,7 +512,7 @@ } ], "cookie": [], - "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.02\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"0.02\",\n \"available\": \"0.02\",\n \"hold\": \"0\",\n \"liability\": \"0\",\n \"maxBorrowSize\": \"0\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}" + "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"40.8648372\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"38.68855864\",\n \"available\": \"20.01916691\",\n \"hold\": \"18.66939173\",\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"maxBorrowSize\": \"163\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}" } ] }, @@ -536,7 +536,7 @@ "query": [ { "key": "symbol", - "value": null, + "value": "BTC-USDT", "description": "For isolated trading pairs, query all without passing" }, { @@ -551,7 +551,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470128)\n\n:::info[Description]\nRequest isolated margin account info via this endpoint.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| totalAssetOfQuoteCurrency | string | Total Assets in Quote Currency |\n| totalLiabilityOfQuoteCurrency | string | Total Liability in Quote Currency |\n| timestamp | integer | timestamp |\n| assets | array | Refer to the schema section of assets |\n\n**root.data.assets Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| symbol | string | Symbol |\n| status | string | Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing |\n| debtRatio | string | debt ratio |\n| baseAsset | object | Refer to the schema section of baseAsset |\n| quoteAsset | object | Refer to the schema section of quoteAsset |\n\n**root.data.assets.baseAsset Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| borrowEnabled | boolean | Support borrow or not |\n| transferInEnabled | boolean | Support transfer or not |\n| liability | string | Liabilities |\n| total | string | Total Assets |\n| available | string | Account available assets (total assets - frozen) |\n| hold | string | Account frozen assets |\n| maxBorrowSize | string | The user's remaining maximum loan amount |\n\n**root.data.assets.baseAsset.quoteAsset Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| borrowEnabled | boolean | Support borrow or not |\n| transferInEnabled | boolean | Support transfer or not |\n| liability | string | Liabilities |\n| total | string | Total Assets |\n| available | string | Account available assets (total assets - frozen) |\n| hold | string | Account frozen assets |\n| maxBorrowSize | string | The user's remaining maximum loan amount |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470128)\n\n:::info[Description]\nRequest isolated margin account info via this endpoint.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| totalAssetOfQuoteCurrency | string | Total Assets in Quote Currency |\n| totalLiabilityOfQuoteCurrency | string | Total Liability in Quote Currency |\n| timestamp | integer | timestamp |\n| assets | array | Refer to the schema section of assets |\n\n**root.data.assets Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| symbol | string | Symbol |\n| status | string | Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing |\n| debtRatio | string | debt ratio |\n| baseAsset | object | Refer to the schema section of baseAsset |\n| quoteAsset | object | Refer to the schema section of quoteAsset |\n\n**root.data.assets.baseAsset Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| borrowEnabled | boolean | Support borrow or not |\n| transferInEnabled | boolean | Support transfer or not |\n| liability | string | Liabilities |\n| total | string | Total Assets |\n| available | string | Account available assets (total assets - frozen) |\n| hold | string | Account frozen assets |\n| maxBorrowSize | string | The user's remaining maximum loan amount |\n| liabilityPrincipal | string | Outstanding principal |\n| liabilityInterest | string | Outstanding interest |\n\n**root.data.assets.baseAsset.quoteAsset Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| borrowEnabled | boolean | Support borrow or not |\n| transferInEnabled | boolean | Support transfer or not |\n| liability | string | Liabilities |\n| total | string | Total Assets |\n| available | string | Account available assets (total assets - frozen) |\n| hold | string | Account frozen assets |\n| maxBorrowSize | string | The user's remaining maximum loan amount |\n| liabilityPrincipal | string | |\n| liabilityInterest | string | |\n\n---\n", "body": {} }, "response": [ @@ -575,7 +575,7 @@ "query": [ { "key": "symbol", - "value": null, + "value": "BTC-USDT", "description": "For isolated trading pairs, query all without passing" }, { @@ -621,7 +621,7 @@ } ], "cookie": [], - "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.01\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"timestamp\": 1728725465994,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0.01\",\n \"available\": \"0.01\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n }\n }\n ]\n }\n}" + "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"4.97047372\",\n \"totalLiabilityOfQuoteCurrency\": \"0.00038891\",\n \"timestamp\": 1747303659773,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0.00038891\",\n \"liabilityPrincipal\": \"0.00038888\",\n \"liabilityInterest\": \"0.00000003\",\n \"total\": \"4.97047372\",\n \"available\": \"4.97047372\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"44\"\n }\n }\n ]\n }\n}" } ] }, @@ -917,7 +917,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470122)\n\n:::info[Description]\nThis API endpoint returns all transfer (in and out) records in high-frequency trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\n:::\n\n\n\n:::tip[Tips]\nIf lastId is configured, the information obtained < lastId. Otherwise, it will revert to the latest information.\n\nYou can only obtain data from within a 3 * 24 hour time range (i.e., from 3 * 24 hours ago up to now). If you specify a time range that exceeds this limit, the system will default to data from within 3 * 24 hours.\n:::\n\n**context**\n\nIf the bizType is TRADE_EXCHANGE, the context field will include additional transaction information (order ID, transaction ID, and trading pair).\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Unique ID |\n| currency | string | currency |\n| amount | string | Change in funds balance |\n| fee | string | Transaction, Deposit or withdrawal fee |\n| tax | string | |\n| balance | string | Total balance of funds after change |\n| accountType | string | Master account type TRADE_HF |\n| bizType | string | Trnasaction type, such as TRANSFER, TRADE_EXCHANGE, etc. |\n| direction | string | Direction of transfer (out or in) |\n| createdAt | string | Created time |\n| context | string | Core transaction parameter |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470122)\n\n:::info[Description]\nThis API endpoint returns all transfer (in and out) records in high-frequency trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\n:::\n\n\n\n:::tip[Tips]\nIf lastId is configured, the information obtained < lastId. Otherwise, it will revert to the latest information.\n\nYou can only obtain data from within a 7 * 24 hour time range (i.e., from 7 * 24 hours ago up to now). If you specify a time range that exceeds this limit, the system will default to data from within 7 * 24 hours.\n:::\n\n**context**\n\nIf the bizType is TRADE_EXCHANGE, the context field will include additional transaction information (order ID, transaction ID, and trading pair).\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Unique ID |\n| currency | string | currency |\n| amount | string | Change in funds balance |\n| fee | string | Transaction, Deposit or withdrawal fee |\n| tax | string | |\n| balance | string | Total balance of funds after change |\n| accountType | string | Master account type TRADE_HF |\n| bizType | string | Trnasaction type, such as TRANSFER, TRADE_EXCHANGE, etc. |\n| direction | string | Direction of transfer (out or in) |\n| createdAt | string | Created time |\n| context | string | Core transaction parameter |\n\n---\n", "body": {} }, "response": [ @@ -1338,10 +1338,10 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470135)\n\n:::info[Description]\nThis endpoint can be used to create sub-accounts.\n:::\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| password | string | Password (7–24 characters, must contain letters and numbers, cannot only contain numbers or include special characters) |\n| remarks | string | Remarks (1–24 characters) |\n| subName | string | Sub-account name (must contain 7–32 characters, at least one number and one letter. Cannot contain any spaces.) |\n| access | string | Permission (types include Spot, Futures, Margin permissions, which can be used alone or in combination). |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| uid | integer | Sub-account UID |\n| subName | string | Sub-account name |\n| remarks | string | Remarks |\n| access | string | Permission |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470135)\n\n:::info[Description]\nThis endpoint can be used to create sub-accounts.\n:::\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| password | string | Password (7–24 characters, must contain letters and numbers, cannot only contain numbers or include special characters) |\n| remarks | string | Remarks (1–24 characters) |\n| subName | string | Sub-account name (must contain 7–32 characters, at least one number and one letter. Cannot contain any spaces.) |\n| access | string | Permission (types include Spot, Futures, Margin permissions, which can be used alone or in combination). |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| uid | integer | Sub account user id |\n| subName | string | Sub account name |\n| remarks | string | Sub account name |\n| access | string | permission |\n\n---\n", "body": { "mode": "raw", - "raw": "{\n \"password\": \"1234567\",\n \"remarks\": \"TheRemark\",\n \"subName\": \"Name1234567\",\n \"access\": \"Spot\"\n}", + "raw": "{\n \"password\": \"q1234567\",\n \"access\": \"Spot\",\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\"\n}", "options": { "raw": { "language": "json" @@ -1401,7 +1401,7 @@ } ], "cookie": [], - "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 10,\n \"totalNum\": 1,\n \"totalPage\": 1,\n \"items\": [\n {\n \"userId\": \"63743f07e0c5230001761d08\",\n \"uid\": 169579801,\n \"subName\": \"testapi6\",\n \"status\": 2,\n \"type\": 0,\n \"access\": \"All\",\n \"createdAt\": 1668562696000,\n \"remarks\": \"remarks\",\n \"tradeTypes\": [\n \"Spot\",\n \"Futures\",\n \"Margin\"\n ],\n \"openedTradeTypes\": [\n \"Spot\"\n ],\n \"hostedStatus\": null\n }\n ]\n }\n}" + "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"uid\": 245730746,\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\",\n \"access\": \"Spot\"\n }\n}" } ] }, @@ -2819,10 +2819,10 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470146)\n\n:::info[Description]\nUse this interface to withdraw the specified currency.\n:::\n\n:::tip[Tips]\nOn the WEB end, you can open the switch of specified favorite addresses for withdrawal, and when it is turned on, it will verify whether your withdrawal address (including chain) is a favorite address (it is case sensitive); if it fails validation, it will respond with the error message {\"msg\":\"Already set withdraw whitelist, this address is not favorite address\",\"code\":\"260325\"}.\n:::\n\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| chain | string | The chainId of currency, For a currency with multiple chains, it is recommended to specify the chain parameter instead of using the default chain; you can query the chainId through the response of the GET /api/v3/currencies/{currency} interface. |\n| amount | integer | Withdrawal amount, a positive number which is a multiple of the amount precision |\n| memo | string | Address remark. If there’s no remark, it is empty. When you withdraw from other platforms to KuCoin, you need to fill in memo(tag). Be careful: If you do not fill in memo(tag), your deposit may not be available. |\n| isInner | boolean | Internal withdrawal or not. Default: False |\n| remark | string | Remark |\n| feeDeductType | string | Withdrawal fee deduction type: INTERNAL, EXTERNAL, or not specified

1. INTERNAL: Deduct the transaction fees from your withdrawal amount
2. EXTERNAL: Deduct the transaction fees from your main account
3. If you don't specify the feeDeductType parameter, when the balance in your main account is sufficient to support the withdrawal, the system will initially deduct the transaction fees from your main account. But if the balance in your main account is not sufficient to support the withdrawal, the system will deduct the fees from your withdrawal amount. For example: Suppose you are going to withdraw 1 BTC from the KuCoin platform (transaction fee: 0.0001BTC), if the balance in your main account is insufficient, the system will deduct the transaction fees from your withdrawal amount. In this case, you will be receiving 0.9999BTC. |\n| toAddress | string | Withdrawal address |\n| withdrawType | string | Withdrawal type, ADDRESS (withdrawal address), UID, MAIL (email), PHONE (mobile phone number). Note: If you withdraw by uid/mail/phone, there will be rate limits: 3 times/10 seconds, 50 times/24 hours (calculated on a rolling basis based on the first request time) |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| withdrawalId | string | Withdrawal id, a unique ID for a withdrawal |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470146)\n\n:::info[Description]\nUse this interface to withdraw the specified currency.\n:::\n\n:::tip[Tips]\nOn the WEB end, you can open the switch of specified favorite addresses for withdrawal, and when it is turned on, it will verify whether your withdrawal address (including chain) is a favorite address (it is case sensitive); if it fails validation, it will respond with the error message {\"msg\":\"Already set withdraw whitelist, this address is not favorite address\",\"code\":\"260325\"}.\n:::\n\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currency | string | currency |\n| chain | string | The chainId of currency, For a currency with multiple chains, it is recommended to specify the chain parameter instead of using the default chain; you can query the chainId through the response of the GET /api/v3/currencies/{currency} interface. |\n| amount | string | Withdrawal amount, a positive number which is a multiple of the amount precision |\n| memo | string | Address remark. If there’s no remark, it is empty. When you withdraw from other platforms to KuCoin, you need to fill in memo(tag). Be careful: If you do not fill in memo(tag), your deposit may not be available. |\n| isInner | boolean | Internal withdrawal or not. Default: False |\n| remark | string | Remark |\n| feeDeductType | string | Withdrawal fee deduction type: INTERNAL, EXTERNAL, or not specified

1. INTERNAL: Deduct the transaction fees from your withdrawal amount
2. EXTERNAL: Deduct the transaction fees from your main account
3. If you don't specify the feeDeductType parameter, when the balance in your main account is sufficient to support the withdrawal, the system will initially deduct the transaction fees from your main account. But if the balance in your main account is not sufficient to support the withdrawal, the system will deduct the fees from your withdrawal amount. For example: Suppose you are going to withdraw 1 BTC from the KuCoin platform (transaction fee: 0.0001BTC), if the balance in your main account is insufficient, the system will deduct the transaction fees from your withdrawal amount. In this case, you will be receiving 0.9999BTC. |\n| toAddress | string | Withdrawal address |\n| withdrawType | string | Withdrawal type, ADDRESS (withdrawal address), UID, MAIL (email), PHONE (mobile phone number). Note: If you withdraw by uid/mail/phone, there will be rate limits: 3 times/10 seconds, 50 times/24 hours (calculated on a rolling basis based on the first request time) |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| withdrawalId | string | Withdrawal id, a unique ID for a withdrawal |\n\n---\n", "body": { "mode": "raw", - "raw": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": 3,\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}", + "raw": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": \"3\",\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}", "options": { "raw": { "language": "json" @@ -3010,7 +3010,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470145)\n\n:::info[Description]\nRequest a withdrawal list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currentPage | integer | current page |\n| pageSize | integer | page size |\n| totalNum | integer | total number |\n| totalPage | integer | total pages |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Unique ID |\n| currency | string | Currency |\n| chain | string | The id of currency |\n| status | string | Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE |\n| address | string | Deposit address |\n| memo | string | Address remark. If there’s no remark, it is empty. |\n| isInner | boolean | Internal deposit or not |\n| amount | string | Deposit amount |\n| fee | string | Fees charged for deposit |\n| walletTxId | string | Wallet Txid |\n| createdAt | integer | Database record creation time |\n| updatedAt | integer | Update time of the database record |\n| remark | string | Remark |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470145)\n\n:::info[Description]\nRequest a withdrawal list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currentPage | integer | current page |\n| pageSize | integer | page size |\n| totalNum | integer | total number |\n| totalPage | integer | total pages |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Unique ID |\n| currency | string | Currency |\n| chain | string | The chain id of currency |\n| status | string | Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE |\n| address | string | Withwrawal address |\n| memo | string | Address remark. If there’s no remark, it is empty. |\n| isInner | boolean | Internal deposit or not |\n| amount | string | Withwrawal amount |\n| fee | string | Fees charged for withwrawal |\n| walletTxId | string | Wallet Txid, If this is an internal
withdrawal, it is empty. |\n| createdAt | integer | Database record creation time |\n| updatedAt | integer | Update time of the database record |\n| remark | string | Remark |\n\n---\n", "body": {} }, "response": [ @@ -3097,6 +3097,83 @@ "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 50,\n \"totalNum\": 5,\n \"totalPage\": 1,\n \"items\": [\n {\n \"currency\": \"USDT\",\n \"chain\": \"\",\n \"status\": \"SUCCESS\",\n \"address\": \"a435*****@gmail.com\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"1.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"createdAt\": 1728555875000,\n \"updatedAt\": 1728555875000,\n \"remark\": \"\",\n \"arrears\": false\n },\n {\n \"currency\": \"USDT\",\n \"chain\": \"trx\",\n \"status\": \"SUCCESS\",\n \"address\": \"TSv3L1fS7******X4nLP6rqNxYz\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"6.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"createdAt\": 1721730920000,\n \"updatedAt\": 1721730920000,\n \"remark\": \"\",\n \"arrears\": false\n }\n ]\n }\n}" } ] + }, + { + "name": "Get Withdrawal History By ID", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{spot_endpoint}}" + ], + "path": [ + "api", + "v1", + "withdrawals", + "{{withdrawalId}}" + ], + "query": [] + }, + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3471890)\n\n:::info[Description]\nRequest a withdrawal history by id via this endpoint.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Unique ID |\n| uid | integer | User ID |\n| currency | string | A unique currency code that will never change |\n| chainId | string | The chain id of currency |\n| chainName | string | Chain name of currency |\n| currencyName | string | Currency name; will change after renaming |\n| status | string | Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE |\n| failureReason | string | Failure reason code |\n| failureReasonMsg | string | Failure reason message |\n| address | string | Withwrawal address |\n| memo | string | Address remark. If there’s no remark, it is empty. |\n| isInner | boolean | Internal withdrawal or not. |\n| amount | string | Withwrawal amount |\n| fee | string | Fees charged for withwrawal |\n| walletTxId | string | Wallet Transaction ID |\n| addressRemark | string | Address remark |\n| remark | string | Remark |\n| createdAt | integer | Creation Time (milliseconds) |\n| cancelType | string | |\n| taxes | array | Refer to the schema section of taxes |\n| taxDescription | string | Tax description |\n| returnStatus | string | Return status |\n| returnAmount | string | Return amount |\n| returnCurrency | string | Return currency |\n\n---\n", + "body": {} + }, + "response": [ + { + "name": "Successful Response", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{spot_endpoint}}" + ], + "path": [ + "api", + "v1", + "withdrawals", + "{{withdrawalId}}" + ], + "query": [] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": { + "content": "", + "type": "text/plain" + } + }, + { + "key": "gw-ratelimit-remaining", + "value": 1997, + "name": "gw-ratelimit-remaining" + }, + { + "key": "gw-ratelimit-limit", + "value": 2000, + "name": "gw-ratelimit-limit" + }, + { + "key": "gw-ratelimit-reset", + "value": 29990, + "name": "gw-ratelimit-reset" + } + ], + "cookie": [], + "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"67e6515f7960ba0007b42025\",\n \"uid\": 165111215,\n \"currency\": \"USDT\",\n \"chainId\": \"trx\",\n \"chainName\": \"TRC20\",\n \"currencyName\": \"USDT\",\n \"status\": \"SUCCESS\",\n \"failureReason\": \"\",\n \"failureReasonMsg\": null,\n \"address\": \"TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"3.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"addressRemark\": null,\n \"remark\": \"this is Remark\",\n \"createdAt\": 1743147359000,\n \"cancelType\": \"NON_CANCELABLE\",\n \"taxes\": null,\n \"taxDescription\": null,\n \"returnStatus\": \"NOT_RETURN\",\n \"returnAmount\": null,\n \"returnCurrency\": \"KCS\"\n }\n}" + } + ] } ], "description": "" @@ -5293,7 +5370,7 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470188)\n\n:::info[Description]\nPlace order to the Spot trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order Id,unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type `limit` and `market` |\n| side | String | Yes | `buy` or `sell` |\n| stp | String | No | self trade prevention is divided into four strategies: `CN`, `CO`, `CB` , and `DC` |\n| tags | String | No | Order tag, length cannot exceed `20` characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed `20` characters (ASCII) |\n\n**Additional Request Parameters Required by `limit` Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by `market` orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |\n\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or cancelled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled(already cancelled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly cancelled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: if the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: this feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order Id,The ClientOid field is a unique ID created by the user(we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.

Please remember the orderId created by the service provider, it used to check for updates in order status. |\n| side | string | specify if the order is to 'buy' or 'sell' |\n| symbol | string | symbol |\n| type | string | specify if the order is an 'limit' order or 'market' order.

The type of order you specify when you place your order determines whether or not you need to request other parameters and also affects the execution of the matching engine.

When placing a limit order, you must specify a price and size. The system will try to match the order according to market price or a price better than market price. If the order cannot be immediately matched, it will stay in the order book until it is matched or the user cancels.

Unlike limit orders, the price for market orders fluctuates with market prices. When placing a market order, you do not need to specify a price, you only need to specify a quantity. Market orders are filled immediately and will not enter the order book. All market orders are takers and a taker fee will be charged. |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| price | string | Specify price for order

When placing a limit order, the price must be based on priceIncrement for the trading pair. The price increment (priceIncrement) is the price precision for the trading pair. For example, for the BTC-USDT trading pair, the priceIncrement is 0.00001000. So the price for your orders cannot be less than 0.00001000 and must be a multiple of priceIncrement. Otherwise, the order will return an invalid priceIncrement error. |\n| size | string | Specify quantity for order

When **type** is limit, size refers to the amount of trading targets (the asset name written in front) for the trading pair. Teh Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| funds | string | When **type** is market, select one out of two: size or funds

When placing a market order, the funds field refers to the funds for the priced asset (the asset name written latter) of the trading pair. The funds must be based on the quoteIncrement of the trading pair. The quoteIncrement represents the precision of the trading pair. The funds value for an order must be a multiple of quoteIncrement and must be between quoteMinSize and quoteMaxSize. |\n| allowMaxTimeWindow | integer | Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order id generated by the trading system,which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order id. |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470188)\n\n:::info[Description]\nPlace order to the Spot trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order Id,unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type `limit` and `market` |\n| side | String | Yes | `buy` or `sell` |\n| stp | String | No | self trade prevention is divided into four strategies: `CN`, `CO`, `CB` , and `DC` |\n| tags | String | No | Order tag, length cannot exceed `20` characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed `20` characters (ASCII) |\n\n**Additional Request Parameters Required by `limit` Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by `market` orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |\n\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or cancelled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled(already cancelled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly cancelled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: if the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: this feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order Id,The ClientOid field is a unique ID created by the user(we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.

Please remember the orderId created by the service provider, it used to check for updates in order status. |\n| side | string | specify if the order is to 'buy' or 'sell' |\n| symbol | string | symbol |\n| type | string | specify if the order is an 'limit' order or 'market' order.

The type of order you specify when you place your order determines whether or not you need to request other parameters and also affects the execution of the matching engine.

When placing a limit order, you must specify a price and size. The system will try to match the order according to market price or a price better than market price. If the order cannot be immediately matched, it will stay in the order book until it is matched or the user cancels.

Unlike limit orders, the price for market orders fluctuates with market prices. When placing a market order, you do not need to specify a price, you only need to specify a quantity. Market orders are filled immediately and will not enter the order book. All market orders are takers and a taker fee will be charged. |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| price | string | Specify price for order

When placing a limit order, the price must be based on priceIncrement for the trading pair. The price increment (priceIncrement) is the price precision for the trading pair. For example, for the BTC-USDT trading pair, the priceIncrement is 0.00001000. So the price for your orders cannot be less than 0.00001000 and must be a multiple of priceIncrement. Otherwise, the order will return an invalid priceIncrement error. |\n| size | string | Specify quantity for order

When **type** is limit, size refers to the amount of trading targets (the asset name written in front) for the trading pair. Teh Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| funds | string | When **type** is market, select one out of two: size or funds

When placing a market order, the funds field refers to the funds for the priced asset (the asset name written latter) of the trading pair. The funds must be based on the quoteIncrement of the trading pair. The quoteIncrement represents the precision of the trading pair. The funds value for an order must be a multiple of quoteIncrement and must be between quoteMinSize and quoteMaxSize. |\n| allowMaxTimeWindow | integer | Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order id generated by the trading system,which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order id. |\n\n---\n", "body": { "mode": "raw", "raw": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", @@ -5379,7 +5456,7 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470170)\n\n:::info[Description]\nPlace order in the spot trading system\n\nThe difference between this interface and \"Add order\" is that this interface will synchronously return the order information after the order matching is completed.\n\nFor higher latency requirements, please select the \"Add order\" interface. If there is a requirement for returning data integrity, please select this interface.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order ID: The ClientOid field is a unique ID created by the user (we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.

Please remember the orderId created by the service provider, it used to check for updates in order status. |\n| side | string | Specify if the order is to 'buy' or 'sell'. |\n| symbol | string | symbol |\n| type | string | Specify if the order is a 'limit' order or 'market' order.

The type of order you specify when you place your order determines whether or not you need to request other parameters and also affects the execution of the matching engine.

When placing a limit order, you must specify a price and size. The system will try to match the order according to market price or a price better than market price. If the order cannot be immediately matched, it will stay in the order book until it is matched or the user cancels.

Unlike limit orders, the price for market orders fluctuates with market prices. When placing a market order, you do not need to specify a price; you only need to specify a quantity. Market orders are filled immediately and will not enter the order book. All market orders are takers and a taker fee will be charged. |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| price | string | Specify price for order

When placing a limit order, the price must be based on priceIncrement for the trading pair. The price increment (priceIncrement) is the price precision for the trading pair. For example, for the BTC-USDT trading pair, the priceIncrement is 0.00001000. So the price for your orders cannot be less than 0.00001000 and must be a multiple of priceIncrement. Otherwise, the order will return an invalid priceIncrement error. |\n| size | string | Specify quantity for order.

When **type** is limited, size refers to the amount of trading targets (the asset name written in front) for the trading pair. The Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| funds | string | When **type** is market, select one out of two: size or funds |\n| allowMaxTimeWindow | integer | The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order ID generated by the trading system, which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order ID. |\n| orderTime | integer | |\n| originSize | string | Original order size |\n| dealSize | string | Deal size |\n| remainSize | string | Remain size |\n| canceledSize | string | Cumulative canceled size |\n| status | string | Order Status. open: order is active; done: order has been completed |\n| matchTime | integer | |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470170)\n\n:::info[Description]\nPlace order in the spot trading system\n\nThe difference between this interface and \"Add order\" is that this interface will synchronously return the order information after the order matching is completed.\n\nFor higher latency requirements, please select the \"Add order\" interface. If there is a requirement for returning data integrity, please select this interface.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order ID: The ClientOid field is a unique ID created by the user (we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.

Please remember the orderId created by the service provider, it used to check for updates in order status. |\n| side | string | Specify if the order is to 'buy' or 'sell'. |\n| symbol | string | symbol |\n| type | string | Specify if the order is a 'limit' order or 'market' order.

The type of order you specify when you place your order determines whether or not you need to request other parameters and also affects the execution of the matching engine.

When placing a limit order, you must specify a price and size. The system will try to match the order according to market price or a price better than market price. If the order cannot be immediately matched, it will stay in the order book until it is matched or the user cancels.

Unlike limit orders, the price for market orders fluctuates with market prices. When placing a market order, you do not need to specify a price; you only need to specify a quantity. Market orders are filled immediately and will not enter the order book. All market orders are takers and a taker fee will be charged. |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| price | string | Specify price for order

When placing a limit order, the price must be based on priceIncrement for the trading pair. The price increment (priceIncrement) is the price precision for the trading pair. For example, for the BTC-USDT trading pair, the priceIncrement is 0.00001000. So the price for your orders cannot be less than 0.00001000 and must be a multiple of priceIncrement. Otherwise, the order will return an invalid priceIncrement error. |\n| size | string | Specify quantity for order.

When **type** is limited, size refers to the amount of trading targets (the asset name written in front) for the trading pair. The Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| funds | string | When **type** is market, select one out of two: size or funds |\n| allowMaxTimeWindow | integer | Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order ID generated by the trading system, which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order ID. |\n| orderTime | integer | |\n| originSize | string | Original order size |\n| dealSize | string | Deal size |\n| remainSize | string | Remain size |\n| canceledSize | string | Cumulative canceled size |\n| status | string | Order Status. open: order is active; done: order has been completed |\n| matchTime | integer | |\n\n---\n", "body": { "mode": "raw", "raw": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493f\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n", @@ -5466,7 +5543,7 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470187)\n\n:::info[Description]\nOrder test endpoint, the request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order Id,unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type `limit` and `market` |\n| side | String | Yes | `buy` or `sell` |\n| stp | String | No | self trade prevention is divided into four strategies: `CN`, `CO`, `CB` , and `DC` |\n| tags | String | No | Order tag, length cannot exceed `20` characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed `20` characters (ASCII) |\n\n**Additional Request Parameters Required by `limit` Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by `market` orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or cancelled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled(already cancelled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly cancelled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: if the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: this feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order Id,The ClientOid field is a unique ID created by the user(we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.

Please remember the orderId created by the service provider, it used to check for updates in order status. |\n| side | string | specify if the order is to 'buy' or 'sell' |\n| symbol | string | symbol |\n| type | string | specify if the order is an 'limit' order or 'market' order.

The type of order you specify when you place your order determines whether or not you need to request other parameters and also affects the execution of the matching engine.

When placing a limit order, you must specify a price and size. The system will try to match the order according to market price or a price better than market price. If the order cannot be immediately matched, it will stay in the order book until it is matched or the user cancels.

Unlike limit orders, the price for market orders fluctuates with market prices. When placing a market order, you do not need to specify a price, you only need to specify a quantity. Market orders are filled immediately and will not enter the order book. All market orders are takers and a taker fee will be charged. |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| price | string | Specify price for order

When placing a limit order, the price must be based on priceIncrement for the trading pair. The price increment (priceIncrement) is the price precision for the trading pair. For example, for the BTC-USDT trading pair, the priceIncrement is 0.00001000. So the price for your orders cannot be less than 0.00001000 and must be a multiple of priceIncrement. Otherwise, the order will return an invalid priceIncrement error. |\n| size | string | Specify quantity for order

When **type** is limit, size refers to the amount of trading targets (the asset name written in front) for the trading pair. Teh Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| funds | string | When **type** is market, select one out of two: size or funds |\n| allowMaxTimeWindow | integer | Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order id generated by the trading system,which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order id. |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470187)\n\n:::info[Description]\nOrder test endpoint, the request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order Id,unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type `limit` and `market` |\n| side | String | Yes | `buy` or `sell` |\n| stp | String | No | self trade prevention is divided into four strategies: `CN`, `CO`, `CB` , and `DC` |\n| tags | String | No | Order tag, length cannot exceed `20` characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed `20` characters (ASCII) |\n\n**Additional Request Parameters Required by `limit` Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by `market` orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or cancelled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled(already cancelled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly cancelled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: if the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: this feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order Id,The ClientOid field is a unique ID created by the user(we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.

Please remember the orderId created by the service provider, it used to check for updates in order status. |\n| side | string | specify if the order is to 'buy' or 'sell' |\n| symbol | string | symbol |\n| type | string | specify if the order is an 'limit' order or 'market' order.

The type of order you specify when you place your order determines whether or not you need to request other parameters and also affects the execution of the matching engine.

When placing a limit order, you must specify a price and size. The system will try to match the order according to market price or a price better than market price. If the order cannot be immediately matched, it will stay in the order book until it is matched or the user cancels.

Unlike limit orders, the price for market orders fluctuates with market prices. When placing a market order, you do not need to specify a price, you only need to specify a quantity. Market orders are filled immediately and will not enter the order book. All market orders are takers and a taker fee will be charged. |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| price | string | Specify price for order

When placing a limit order, the price must be based on priceIncrement for the trading pair. The price increment (priceIncrement) is the price precision for the trading pair. For example, for the BTC-USDT trading pair, the priceIncrement is 0.00001000. So the price for your orders cannot be less than 0.00001000 and must be a multiple of priceIncrement. Otherwise, the order will return an invalid priceIncrement error. |\n| size | string | Specify quantity for order

When **type** is limit, size refers to the amount of trading targets (the asset name written in front) for the trading pair. Teh Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| funds | string | When **type** is market, select one out of two: size or funds |\n| allowMaxTimeWindow | integer | Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order id generated by the trading system,which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order id. |\n\n---\n", "body": { "mode": "raw", "raw": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493f\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n", @@ -5553,7 +5630,7 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470168)\n\n:::info[Description]\nThis endpoint supports sequential batch order placement from a single endpoint. A maximum of 20 orders can be placed simultaneously.\n:::\n\n\n\n:::tip[Tips]\nThis endpoint only supports order placement requests. To obtain the results of the order placement, you will need to check the order status or subscribe to Websocket to obtain information about the order.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderList | array | Refer to the schema section of orderList |\n\n**root.orderList Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order ID: The ClientOid field is a unique ID created by the user (we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.
|\n| symbol | string | symbol |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| side | string | Specify if the order is to 'buy' or 'sell'. |\n| price | string | Specify price for order |\n| size | string | Specify quantity for order.

When **type** is limited, select one out of two: size or funds. Size refers to the amount of trading targets (the asset name written in front) for the trading pair. The Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| funds | string | When **type** is market, select one out of two: size or funds |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. |\n| allowMaxTimeWindow | integer | The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order ID generated by the trading system, which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order ID. |\n| success | boolean | Add order success/failure |\n| failMsg | string | Error message |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470168)\n\n:::info[Description]\nThis endpoint supports sequential batch order placement from a single endpoint. A maximum of 20 orders can be placed simultaneously.\n:::\n\n\n\n:::tip[Tips]\nThis endpoint only supports order placement requests. To obtain the results of the order placement, you will need to check the order status or subscribe to Websocket to obtain information about the order.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderList | array | Refer to the schema section of orderList |\n\n**root.orderList Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order ID: The ClientOid field is a unique ID created by the user (we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.
|\n| symbol | string | symbol |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| side | string | Specify if the order is to 'buy' or 'sell'. |\n| price | string | Specify price for order |\n| size | string | Specify quantity for order.

When **type** is limited, select one out of two: size or funds. Size refers to the amount of trading targets (the asset name written in front) for the trading pair. The Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| funds | string | When **type** is market, select one out of two: size or funds |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. |\n| allowMaxTimeWindow | integer | Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order ID generated by the trading system, which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order ID. |\n| success | boolean | Add order success/failure |\n| failMsg | string | Error message |\n\n---\n", "body": { "mode": "raw", "raw": "{\n \"orderList\": [\n {\n \"clientOid\": \"client order id 12\",\n \"symbol\": \"BTC-USDT\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"30000\",\n \"size\": \"0.00001\"\n },\n {\n \"clientOid\": \"client order id 13\",\n \"symbol\": \"ETH-USDT\",\n \"type\": \"limit\",\n \"side\": \"sell\",\n \"price\": \"2000\",\n \"size\": \"0.00001\"\n }\n ]\n}", @@ -5641,7 +5718,7 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470169)\n\n:::info[Description]\nThis endpoint supports sequential batch order placement from a single endpoint. A maximum of 20 orders can be placed simultaneously.\n\nThe difference between this interface and \"Batch Add Orders\" is that this interface will synchronously return the order information after the order matching is completed.\n\nFor higher latency requirements, please select the \"Batch Add Orders\" interface. If there is a requirement for returning data integrity, please select this interface.\n:::\n\n\n\n:::tip[Tips]\nThis endpoint only supports order placement requests. To obtain the results of the order placement, you will need to check the order status or subscribe to Websocket to obtain information about the order.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderList | array | Refer to the schema section of orderList |\n\n**root.orderList Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order ID: The ClientOid field is a unique ID created by the user (we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.
|\n| symbol | string | symbol |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| side | string | Specify if the order is to 'buy' or 'sell'. |\n| price | string | Specify price for order |\n| size | string | Specify quantity for order.

When **type** is limited, select one out of two: size or funds. Size refers to the amount of trading targets (the asset name written in front) for the trading pair. The Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| funds | string | When **type** is market, select one out of two: size or funds |\n| allowMaxTimeWindow | integer | The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order ID generated by the trading system, which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order ID. |\n| orderTime | integer | |\n| originSize | string | Original order size |\n| dealSize | string | Deal size |\n| remainSize | string | Remain size |\n| canceledSize | string | Cumulative canceled size |\n| status | string | Order Status. open: order is active; done: order has been completed |\n| matchTime | integer | |\n| success | boolean | Add order success/failure |\n| failMsg | string | Error message |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470169)\n\n:::info[Description]\nThis endpoint supports sequential batch order placement from a single endpoint. A maximum of 20 orders can be placed simultaneously.\n\nThe difference between this interface and \"Batch Add Orders\" is that this interface will synchronously return the order information after the order matching is completed.\n\nFor higher latency requirements, please select the \"Batch Add Orders\" interface. If there is a requirement for returning data integrity, please select this interface.\n:::\n\n\n\n:::tip[Tips]\nThis endpoint only supports order placement requests. To obtain the results of the order placement, you will need to check the order status or subscribe to Websocket to obtain information about the order.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderList | array | Refer to the schema section of orderList |\n\n**root.orderList Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientOid | string | Client Order ID: The ClientOid field is a unique ID created by the user (we recommend using a UUID), and can only contain numbers, letters, underscores (_), and hyphens (-). This field is returned when order information is obtained. You can use clientOid to tag your orders. ClientOid is different from the order ID created by the service provider. Please do not initiate requests using the same clientOid. The maximum length for the ClientOid is 40 characters.
|\n| symbol | string | symbol |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| timeInForce | string | [Time in force](https://www.kucoin.com/docs-new/doc-338146) is a special strategy used during trading |\n| side | string | Specify if the order is to 'buy' or 'sell'. |\n| price | string | Specify price for order |\n| size | string | Specify quantity for order.

When **type** is limited, select one out of two: size or funds. Size refers to the amount of trading targets (the asset name written in front) for the trading pair. The Size must be based on the baseIncrement of the trading pair. The baseIncrement represents the precision for the trading pair. The size of an order must be a positive-integer multiple of baseIncrement and must be between baseMinSize and baseMaxSize.

When **type** is market, select one out of two: size or funds |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into four strategies: CN, CO, CB , and DC |\n| cancelAfter | integer | Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1
|\n| postOnly | boolean | passive order labels, this is disabled when the order timing strategy is IOC or FOK |\n| hidden | boolean | [Hidden order](https://www.kucoin.com/docs-new/doc-338146) or not (not shown in order book) |\n| iceberg | boolean | Whether or not only visible portions of orders are shown in [Iceberg orders](https://www.kucoin.com/docs-new/doc-338146) |\n| visibleSize | string | Maximum visible quantity in iceberg orders |\n| tags | string | Order tag, length cannot exceed 20 characters (ASCII) |\n| remark | string | Order placement remarks, length cannot exceed 20 characters (ASCII) |\n| funds | string | When **type** is market, select one out of two: size or funds |\n| allowMaxTimeWindow | integer | Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. |\n| clientTimestamp | integer | Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| orderId | string | The unique order ID generated by the trading system, which can be used later for further actions such as canceling the order. |\n| clientOid | string | The user self-defined order ID. |\n| orderTime | integer | |\n| originSize | string | Original order size |\n| dealSize | string | Deal size |\n| remainSize | string | Remain size |\n| canceledSize | string | Cumulative canceled size |\n| status | string | Order Status. open: order is active; done: order has been completed |\n| matchTime | integer | |\n| success | boolean | Add order success/failure |\n| failMsg | string | Error message |\n\n---\n", "body": { "mode": "raw", "raw": "{\n \"orderList\": [\n {\n \"clientOid\": \"client order id 13\",\n \"symbol\": \"BTC-USDT\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"30000\",\n \"size\": \"0.00001\"\n },\n {\n \"clientOid\": \"client order id 14\",\n \"symbol\": \"ETH-USDT\",\n \"type\": \"limit\",\n \"side\": \"sell\",\n \"price\": \"2000\",\n \"size\": \"0.00001\"\n }\n ]\n}", @@ -6465,7 +6542,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470181)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/api-5176570) |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether its a postOnly order. |\n| hidden | boolean | Whether its a hidden order. |\n| iceberg | boolean | Whether its a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id,unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: true: enter the orderbook; false: not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions need query this field |\n| active | boolean | Order status: true-The status of the order isactive; false-The status of the order is done |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470181)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/api-5176570) |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether its a postOnly order. |\n| hidden | boolean | Whether its a hidden order. |\n| iceberg | boolean | Whether its a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id,unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: true: enter the orderbook; false: not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions need query this field |\n| active | boolean | Order status: true-The status of the order isactive; false-The status of the order is done |\n\n---\n", "body": {} }, "response": [ @@ -6557,7 +6634,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470182)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the client order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/api-5176570) |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether its a postOnly order. |\n| hidden | boolean | Whether its a hidden order. |\n| iceberg | boolean | Whether its a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id,unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: true: enter the orderbook; false: not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions need query this field |\n| active | boolean | Order status: true-The status of the order isactive; false-The status of the order is done |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470182)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the client order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/api-5176570) |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether its a postOnly order. |\n| hidden | boolean | Whether its a hidden order. |\n| iceberg | boolean | Whether its a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id,unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: true: enter the orderbook; false: not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions need query this field |\n| active | boolean | Order status: true-The status of the order isactive; false-The status of the order is done |\n\n---\n", "body": {} }, "response": [ @@ -6964,7 +7041,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470179)\n\n:::info[Description]\nThis interface is to obtain all Spot Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| lastId | integer | The id of the last set of data from the previous batch of data. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId,which can be used as a query parameter to look up new data from the next page. |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/api-5176570) |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether its a postOnly order. |\n| hidden | boolean | Whether its a hidden order. |\n| iceberg | boolean | Whether its a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id,unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: true: enter the orderbook; false: not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions need query this field |\n| active | boolean | Order status: true-The status of the order isactive; false-The status of the order is done |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470179)\n\n:::info[Description]\nThis interface is to obtain all Spot Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| lastId | integer | The id of the last set of data from the previous batch of data. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId,which can be used as a query parameter to look up new data from the next page. |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/api-5176570) |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether its a postOnly order. |\n| hidden | boolean | Whether its a hidden order. |\n| iceberg | boolean | Whether its a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id,unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: true: enter the orderbook; false: not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions need query this field |\n| active | boolean | Order status: true-The status of the order isactive; false-The status of the order is done |\n\n---\n", "body": {} }, "response": [ @@ -7119,7 +7196,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470180)\n\n:::info[Description]\nThis endpoint can be used to obtain a list of the latest Spot transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| items | array | Refer to the schema section of items |\n| lastId | integer | The id of the last set of data from the previous batch of data. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId,which can be used as a query parameter to look up new data from the next page. |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | integer | Id of transaction detail |\n| symbol | string | symbol |\n| tradeId | integer | Trade Id, symbol latitude increment |\n| orderId | string | The unique order id generated by the trading system |\n| counterOrderId | string | Counterparty order Id |\n| side | string | Buy or sell |\n| liquidity | string | Liquidity type: taker or maker |\n| forceTaker | boolean | |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeRate | string | Fee rate
|\n| feeCurrency | string | currency used to calculate trading fee |\n| stop | string | Take Profit and Stop Loss type, currently HFT does not support the Take Profit and Stop Loss type, so it is empty |\n| tradeType | string | Trade type, redundancy param |\n| taxRate | string | Tax Rate, Users in some regions need query this field |\n| tax | string | Users in some regions need query this field |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| createdAt | integer | |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470180)\n\n:::info[Description]\nThis endpoint can be used to obtain a list of the latest Spot transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| items | array | Refer to the schema section of items |\n| lastId | integer | The id of the last set of data from the previous batch of data. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId,which can be used as a query parameter to look up new data from the next page. |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | integer | Id of transaction detail |\n| symbol | string | symbol |\n| tradeId | integer | Trade Id, symbol latitude increment |\n| orderId | string | The unique order id generated by the trading system |\n| counterOrderId | string | Counterparty order Id |\n| side | string | Buy or sell |\n| liquidity | string | Liquidity type: taker or maker |\n| forceTaker | boolean | |\n| price | string | Order price |\n| size | string | Order size |\n| funds | string | Order Funds |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeRate | string | Fee rate
|\n| feeCurrency | string | currency used to calculate trading fee |\n| stop | string | Take Profit and Stop Loss type, currently HFT does not support the Take Profit and Stop Loss type, so it is empty |\n| tradeType | string | Trade type, redundancy param |\n| taxRate | string | Tax Rate, Users in some regions need query this field |\n| tax | string | Users in some regions need query this field |\n| type | string | Specify if the order is an 'limit' order or 'market' order. |\n| createdAt | integer | |\n\n---\n", "body": {} }, "response": [ @@ -10058,7 +10135,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470199)\n\n:::info[Description]\nThis interface is to obtain all Margin Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| lastId | integer | The ID of the last set of data from the previous data batch. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId, which can be used as a query parameter to look up new data from the next page. |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | Currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB , and DC |\n| stop | string | |\n| stopTriggered | boolean | |\n| stopPrice | string | |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether it’s a postOnly order. |\n| hidden | boolean | Whether it’s a hidden order. |\n| iceberg | boolean | Whether it’s a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id, unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: True: enter the orderbook; False: do not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions have this field |\n| active | boolean | Order status: true-The status of the order is active; false-The status of the order is done |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470199)\n\n:::info[Description]\nThis interface is to obtain all Margin Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| lastId | integer | The ID of the last set of data from the previous data batch. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId, which can be used as a query parameter to look up new data from the next page. |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | Currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB , and DC |\n| stop | string | |\n| stopTriggered | boolean | |\n| stopPrice | string | |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether it’s a postOnly order. |\n| hidden | boolean | Whether it’s a hidden order. |\n| iceberg | boolean | Whether it’s a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id, unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: True: enter the orderbook; False: do not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions have this field |\n| active | boolean | Order status: true-The status of the order is active; false-The status of the order is done |\n\n---\n", "body": {} }, "response": [ @@ -10225,7 +10302,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470200)\n\n:::info[Description]\nThis endpoint can be used to obtain a list of the latest Margin transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| items | array | Refer to the schema section of items |\n| lastId | integer | The ID of the last set of data from the previous data batch. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId, which can be used as a query parameter to look up new data from the next page. |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | integer | ID of transaction detail |\n| symbol | string | symbol |\n| tradeId | integer | Trade ID, symbol latitude increment |\n| orderId | string | The unique order id generated by the trading system |\n| counterOrderId | string | Counterparty order ID |\n| side | string | Buy or sell |\n| liquidity | string | Liquidity type: taker or maker |\n| forceTaker | boolean | |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeRate | string | Fee rate
|\n| feeCurrency | string | Currency used to calculate trading fee |\n| stop | string | Take Profit and Stop Loss type, currently HFT does not support the Take Profit and Stop Loss type, so it is empty |\n| tradeType | string | Trade type, redundancy param |\n| tax | string | Users in some regions have this field |\n| taxRate | string | Tax Rate: Users in some regions must query this field |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| createdAt | integer | |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470200)\n\n:::info[Description]\nThis endpoint can be used to obtain a list of the latest Margin transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| items | array | Refer to the schema section of items |\n| lastId | integer | The ID of the last set of data from the previous data batch. By default, the latest information is given.
lastId is used to filter data and paginate. If lastId is not entered, the default is a maximum of 100 returned data items. The return results include lastId, which can be used as a query parameter to look up new data from the next page. |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | integer | ID of transaction detail |\n| symbol | string | symbol |\n| tradeId | integer | Trade ID, symbol latitude increment |\n| orderId | string | The unique order id generated by the trading system |\n| counterOrderId | string | Counterparty order ID |\n| side | string | Buy or sell |\n| liquidity | string | Liquidity type: taker or maker |\n| forceTaker | boolean | |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeRate | string | Fee rate
|\n| feeCurrency | string | Currency used to calculate trading fee |\n| stop | string | Take Profit and Stop Loss type, currently HFT does not support the Take Profit and Stop Loss type, so it is empty |\n| tradeType | string | Trade type, redundancy param |\n| tax | string | Users in some regions have this field |\n| taxRate | string | Tax Rate: Users in some regions must query this field |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| createdAt | integer | |\n\n---\n", "body": {} }, "response": [ @@ -10357,7 +10434,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470202)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | Currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB , and DC |\n| stop | string | |\n| stopTriggered | boolean | |\n| stopPrice | string | |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether it’s a postOnly order. |\n| hidden | boolean | Whether it’s a hidden order. |\n| iceberg | boolean | Whether it’s a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id, unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: True: enter the orderbook; False: do not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions have this field |\n| active | boolean | Order status: true-The status of the order is active; false-The status of the order is done |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470202)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | Currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB , and DC |\n| stop | string | |\n| stopTriggered | boolean | |\n| stopPrice | string | |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether it’s a postOnly order. |\n| hidden | boolean | Whether it’s a hidden order. |\n| iceberg | boolean | Whether it’s a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id, unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: True: enter the orderbook; False: do not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions have this field |\n| active | boolean | Order status: true-The status of the order is active; false-The status of the order is done |\n\n---\n", "body": {} }, "response": [ @@ -10451,7 +10528,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470203)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the client order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | Currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB , and DC |\n| stop | string | |\n| stopTriggered | boolean | |\n| stopPrice | string | |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether it’s a postOnly order. |\n| hidden | boolean | Whether it’s a hidden order. |\n| iceberg | boolean | Whether it’s a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id, unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: True: enter the orderbook; False: do not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions have this field |\n| active | boolean | Order status: true-The status of the order is active; false-The status of the order is done |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470203)\n\n:::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the client order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | The unique order id generated by the trading system |\n| symbol | string | symbol |\n| opType | string | |\n| type | string | Specify if the order is a 'limit' order or 'market' order. |\n| side | string | Buy or sell |\n| price | string | Order Price |\n| size | string | Order Size |\n| funds | string | Order Funds |\n| dealSize | string | Number of filled transactions |\n| dealFunds | string | Funds of filled transactions |\n| fee | string | [Handling fees](https://www.kucoin.com/docs-new/api-5327739) |\n| feeCurrency | string | Currency used to calculate trading fee |\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB , and DC |\n| stop | string | |\n| stopTriggered | boolean | |\n| stopPrice | string | |\n| timeInForce | string | Time in force |\n| postOnly | boolean | Whether it’s a postOnly order. |\n| hidden | boolean | Whether it’s a hidden order. |\n| iceberg | boolean | Whether it’s a iceberg order. |\n| visibleSize | string | Visible size of iceberg order in order book. |\n| cancelAfter | integer | A GTT timeInForce that expires in n seconds |\n| channel | string | |\n| clientOid | string | Client Order Id, unique identifier created by the user |\n| remark | string | Order placement remarks |\n| tags | string | Order tag |\n| cancelExist | boolean | Whether there is a cancellation record for the order. |\n| createdAt | integer | |\n| lastUpdatedAt | integer | |\n| tradeType | string | Trade type, redundancy param |\n| inOrderBook | boolean | Whether to enter the orderbook: True: enter the orderbook; False: do not enter the orderbook |\n| cancelledSize | string | Number of canceled transactions |\n| cancelledFunds | string | Funds of canceled transactions |\n| remainSize | string | Number of remain transactions |\n| remainFunds | string | Funds of remain transactions |\n| tax | string | Users in some regions have this field |\n| active | boolean | Order status: true-The status of the order is active; false-The status of the order is done |\n\n---\n", "body": {} }, "response": [ @@ -14309,7 +14386,7 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470245)\n\n:::info[Description]\nGet a single order by order id (including a stop order).\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order |\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value
|\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity
|\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. Not supported DC at the moment. |\n| stop | string | Stop order type (stop limit or stop market)
|\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | number | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type
|\n| postOnly | boolean | Mark of post only
|\n| hidden | boolean | Mark of the hidden order
|\n| iceberg | boolean | Mark of the iceberg order
|\n| leverage | string | Leverage of the order
|\n| forceHold | boolean | A mark to forcely hold the funds for an order
|\n| closeOrder | boolean | A mark to close the position
|\n| visibleSize | integer | Visible size of the iceberg order
|\n| clientOid | string | Unique order id created by users to identify their orders
|\n| remark | string | Remark |\n| tags | string | tag order source
|\n| isActive | boolean | Mark of the active orders
|\n| cancelExist | boolean | Mark of the canceled orders
|\n| createdAt | integer | Time the order created
|\n| updatedAt | integer | last update time
|\n| endAt | integer | Order Endtime |\n| orderTime | integer | Order create time in nanosecond
|\n| settleCurrency | string | settlement currency
|\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier
|\n| filledSize | integer | Value of the executed orders
|\n| filledValue | string | Executed order quantity
|\n| status | string | order status: “open” or “done”
|\n| reduceOnly | boolean | A mark to reduce the position size only
|\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470245)\n\n:::info[Description]\nGet a single order by order id (including a stop order).\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order |\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value
|\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity
|\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. Not supported DC at the moment. |\n| stop | string | A mark to the stop order type |\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | number | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type
|\n| postOnly | boolean | Mark of post only
|\n| hidden | boolean | Mark of the hidden order
|\n| iceberg | boolean | Mark of the iceberg order
|\n| leverage | string | Leverage of the order
|\n| forceHold | boolean | A mark to forcely hold the funds for an order
|\n| closeOrder | boolean | A mark to close the position
|\n| visibleSize | integer | Visible size of the iceberg order
|\n| clientOid | string | Unique order id created by users to identify their orders
|\n| remark | string | Remark |\n| tags | string | tag order source
|\n| isActive | boolean | Mark of the active orders
|\n| cancelExist | boolean | Mark of the canceled orders
|\n| createdAt | integer | Time the order created
|\n| updatedAt | integer | last update time
|\n| endAt | integer | Order Endtime |\n| orderTime | integer | Order create time in nanosecond
|\n| settleCurrency | string | settlement currency
|\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier
|\n| filledSize | integer | Value of the executed orders
|\n| filledValue | string | Executed order quantity
|\n| status | string | order status: “open” or “done”
|\n| reduceOnly | boolean | A mark to reduce the position size only
|\n\n---\n", "body": {} }, "response": [ @@ -14392,7 +14469,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470352)\n\n:::info[Description]\nGet a single order by client order ID (including a stop order).\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order |\n| side | string | Transaction side |\n| price | string | Order Price |\n| size | integer | Order quantity |\n| value | string | Order value
|\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity
|\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. DC not currently supported. |\n| stop | string | Stop order type (stop limit or stop market)
|\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | number | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type
|\n| postOnly | boolean | Mark of post only
|\n| hidden | boolean | Mark of the hidden order
|\n| iceberg | boolean | Mark of the iceberg order
|\n| leverage | string | Leverage of the order
|\n| forceHold | boolean | A mark to force-hold the funds for an order
|\n| closeOrder | boolean | A mark to close the position
|\n| visibleSize | integer | Visible size of the iceberg order
|\n| clientOid | string | Unique order ID created by users to identify their orders
|\n| remark | string | Remark |\n| tags | string | Tag order source
|\n| isActive | boolean | Mark of the active orders
|\n| cancelExist | boolean | Mark of the canceled orders
|\n| createdAt | integer | Order creation time
|\n| updatedAt | integer | Last update time
|\n| endAt | integer | Order Endtime |\n| orderTime | integer | Order creation time in nanoseconds
|\n| settleCurrency | string | Settlement currency
|\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity); reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier
|\n| filledSize | integer | Value of the executed orders
|\n| filledValue | string | Executed order quantity
|\n| status | string | order status: “open” or “done”
|\n| reduceOnly | boolean | A mark to reduce the position size only
|\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470352)\n\n:::info[Description]\nGet a single order by client order ID (including a stop order).\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order |\n| side | string | Transaction side |\n| price | string | Order Price |\n| size | integer | Order quantity |\n| value | string | Order value
|\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity
|\n| stp | string | [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. DC not currently supported. |\n| stop | string | A mark to the stop order type |\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | number | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type
|\n| postOnly | boolean | Mark of post only
|\n| hidden | boolean | Mark of the hidden order
|\n| iceberg | boolean | Mark of the iceberg order
|\n| leverage | string | Leverage of the order
|\n| forceHold | boolean | A mark to force-hold the funds for an order
|\n| closeOrder | boolean | A mark to close the position
|\n| visibleSize | integer | Visible size of the iceberg order
|\n| clientOid | string | Unique order ID created by users to identify their orders
|\n| remark | string | Remark |\n| tags | string | Tag order source
|\n| isActive | boolean | Mark of the active orders
|\n| cancelExist | boolean | Mark of the canceled orders
|\n| createdAt | integer | Order creation time
|\n| updatedAt | integer | Last update time
|\n| endAt | integer | Order Endtime |\n| orderTime | integer | Order creation time in nanoseconds
|\n| settleCurrency | string | Settlement currency
|\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity); reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier
|\n| filledSize | integer | Value of the executed orders
|\n| filledValue | string | Executed order quantity
|\n| status | string | order status: “open” or “done”
|\n| reduceOnly | boolean | A mark to reduce the position size only
|\n\n---\n", "body": {} }, "response": [ @@ -14515,7 +14592,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470244)\n\n:::info[Description]\nList your current orders.\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24 * 7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\n**POLLING**\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the General permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight:2\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currentPage | integer | Current request page, The default currentPage is 1 |\n| pageSize | integer | pageSize, The default pageSize is 50, The maximum cannot exceed 1000 |\n| totalNum | integer | |\n| totalPage | integer | |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order
|\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value |\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity |\n| stp | string | self trade prevention |\n| stop | string | Stop order type (stop limit or stop market) |\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | integer | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type |\n| postOnly | boolean | Mark of post only |\n| hidden | boolean | Mark of the hidden order |\n| iceberg | boolean | Mark of the iceberg order |\n| leverage | string | Leverage of the order |\n| forceHold | boolean | A mark to forcely hold the funds for an order |\n| closeOrder | boolean | A mark to close the position |\n| visibleSize | integer | Visible size of the iceberg order |\n| clientOid | string | Unique order id created by users to identify their orders |\n| remark | string | Remark of the order |\n| tags | string | tag order source |\n| isActive | boolean | Mark of the active orders |\n| cancelExist | boolean | Mark of the canceled orders |\n| createdAt | integer | Time the order created |\n| updatedAt | integer | last update time |\n| endAt | integer | End time |\n| orderTime | integer | Order create time in nanosecond |\n| settleCurrency | string | settlement currency |\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin). |\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier |\n| status | string | order status: “open” or “done” |\n| filledSize | integer | Value of the executed orders |\n| filledValue | string | Executed order quantity |\n| reduceOnly | boolean | A mark to reduce the position size only |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470244)\n\n:::info[Description]\nList your current orders.\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24 * 7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\n**POLLING**\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the General permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight:2\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currentPage | integer | Current request page, The default currentPage is 1 |\n| pageSize | integer | pageSize, The default pageSize is 50, The maximum cannot exceed 1000 |\n| totalNum | integer | |\n| totalPage | integer | |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order
|\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value |\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity |\n| stp | string | self trade prevention |\n| stop | string | A mark to the stop order type |\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | integer | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type |\n| postOnly | boolean | Mark of post only |\n| hidden | boolean | Mark of the hidden order |\n| iceberg | boolean | Mark of the iceberg order |\n| leverage | string | Leverage of the order |\n| forceHold | boolean | A mark to forcely hold the funds for an order |\n| closeOrder | boolean | A mark to close the position |\n| visibleSize | integer | Visible size of the iceberg order |\n| clientOid | string | Unique order id created by users to identify their orders |\n| remark | string | Remark of the order |\n| tags | string | tag order source |\n| isActive | boolean | Mark of the active orders |\n| cancelExist | boolean | Mark of the canceled orders |\n| createdAt | integer | Time the order created |\n| updatedAt | integer | last update time |\n| endAt | integer | End time |\n| orderTime | integer | Order create time in nanosecond |\n| settleCurrency | string | settlement currency |\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin). |\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier |\n| status | string | order status: “open” or “done” |\n| filledSize | integer | Value of the executed orders |\n| filledValue | string | Executed order quantity |\n| reduceOnly | boolean | A mark to reduce the position size only |\n\n---\n", "body": {} }, "response": [ @@ -14637,7 +14714,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470246)\n\n:::info[Description]\nGet a list of recent 1000 closed orders in the last 24 hours.\n\nIf you need to get your recent traded order history with low latency, you may query this endpoint.\n\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24*7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\n**POLLING**\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the General permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight:2\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order |\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value
|\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity
|\n| stp | string | self trade prevention |\n| stop | string | Stop order type (stop limit or stop market)
|\n| stopPriceType | string | Trigger price type of stop orders
|\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | integer | Trigger price of stop orders
|\n| timeInForce | string | Time in force policy type
|\n| postOnly | boolean | Mark of post only
|\n| hidden | boolean | Mark of the hidden order
|\n| iceberg | boolean | Mark of the iceberg order
|\n| leverage | string | Leverage of the order
|\n| forceHold | boolean | A mark to forcely hold the funds for an order
|\n| closeOrder | boolean | A mark to close the position
|\n| visibleSize | integer | Visible size of the iceberg order
|\n| clientOid | string | Unique order id created by users to identify their orders
|\n| remark | string | Remark of the order
|\n| tags | string | tag order source
|\n| isActive | boolean | Mark of the active orders
|\n| cancelExist | boolean | Mark of the canceled orders
|\n| createdAt | integer | Time the order created
|\n| updatedAt | integer | last update time
|\n| endAt | integer | End time
|\n| orderTime | integer | Order create time in nanosecond
|\n| settleCurrency | string | settlement currency
|\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier
|\n| filledSize | integer | Value of the executed orders
|\n| filledValue | string | Executed order quantity
|\n| status | string | order status: “open” or “done”
|\n| reduceOnly | boolean | A mark to reduce the position size only
|\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470246)\n\n:::info[Description]\nGet a list of recent 1000 closed orders in the last 24 hours.\n\nIf you need to get your recent traded order history with low latency, you may query this endpoint.\n\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24*7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\n**POLLING**\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the General permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight:2\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order |\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value
|\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity
|\n| stp | string | self trade prevention |\n| stop | string | A mark to the stop order type |\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | integer | Trigger price of stop orders
|\n| timeInForce | string | Time in force policy type
|\n| postOnly | boolean | Mark of post only
|\n| hidden | boolean | Mark of the hidden order
|\n| iceberg | boolean | Mark of the iceberg order
|\n| leverage | string | Leverage of the order
|\n| forceHold | boolean | A mark to forcely hold the funds for an order
|\n| closeOrder | boolean | A mark to close the position
|\n| visibleSize | integer | Visible size of the iceberg order
|\n| clientOid | string | Unique order id created by users to identify their orders
|\n| remark | string | Remark of the order
|\n| tags | string | tag order source
|\n| isActive | boolean | Mark of the active orders
|\n| cancelExist | boolean | Mark of the canceled orders
|\n| createdAt | integer | Time the order created
|\n| updatedAt | integer | last update time
|\n| endAt | integer | End time
|\n| orderTime | integer | Order create time in nanosecond
|\n| settleCurrency | string | settlement currency
|\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier
|\n| filledSize | integer | Value of the executed orders
|\n| filledValue | string | Executed order quantity
|\n| status | string | order status: “open” or “done”
|\n| reduceOnly | boolean | A mark to reduce the position size only
|\n\n---\n", "body": {} }, "response": [ @@ -14754,7 +14831,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470247)\n\n:::info[Description]\nGet the un-triggered stop orders list. Stop orders that have been triggered can be queried through the general order interface\n:::\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24*7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\nPOLLING\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currentPage | integer | Current request page, The default currentPage is 1 |\n| pageSize | integer | pageSize, The default pageSize is 50, The maximum cannot exceed 1000 |\n| totalNum | integer | |\n| totalPage | integer | |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order
|\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value |\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity |\n| stp | string | self trade prevention |\n| stop | string | Stop order type (stop limit or stop market) |\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | string | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type |\n| postOnly | boolean | Mark of post only |\n| hidden | boolean | Mark of the hidden order |\n| iceberg | boolean | Mark of the iceberg order |\n| leverage | string | Leverage of the order |\n| forceHold | boolean | A mark to forcely hold the funds for an order |\n| closeOrder | boolean | A mark to close the position |\n| visibleSize | integer | Visible size of the iceberg order |\n| clientOid | string | Unique order id created by users to identify their orders |\n| remark | string | Remark of the order |\n| tags | string | tag order source |\n| isActive | boolean | Mark of the active orders |\n| cancelExist | boolean | Mark of the canceled orders |\n| createdAt | integer | Time the order created |\n| updatedAt | integer | last update time |\n| endAt | integer | End time |\n| orderTime | integer | Order create time in nanosecond |\n| settleCurrency | string | settlement currency |\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin). |\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier |\n| filledSize | integer | Value of the executed orders |\n| filledValue | string | Executed order quantity |\n| status | string | order status: “open” or “done” |\n| reduceOnly | boolean | A mark to reduce the position size only |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470247)\n\n:::info[Description]\nGet the un-triggered stop orders list. Stop orders that have been triggered can be queried through the general order interface\n:::\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24*7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\nPOLLING\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currentPage | integer | Current request page, The default currentPage is 1 |\n| pageSize | integer | pageSize, The default pageSize is 50, The maximum cannot exceed 1000 |\n| totalNum | integer | |\n| totalPage | integer | |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Order ID |\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| type | string | Order type, market order or limit order
|\n| side | string | Transaction side |\n| price | string | Order price |\n| size | integer | Order quantity |\n| value | string | Order value |\n| dealValue | string | Executed size of funds
|\n| dealSize | integer | Executed quantity |\n| stp | string | self trade prevention |\n| stop | string | A mark to the stop order type |\n| stopPriceType | string | Trigger price type of stop orders |\n| stopTriggered | boolean | Mark to show whether the stop order is triggered |\n| stopPrice | string | Trigger price of stop orders |\n| timeInForce | string | Time in force policy type |\n| postOnly | boolean | Mark of post only |\n| hidden | boolean | Mark of the hidden order |\n| iceberg | boolean | Mark of the iceberg order |\n| leverage | string | Leverage of the order |\n| forceHold | boolean | A mark to forcely hold the funds for an order |\n| closeOrder | boolean | A mark to close the position |\n| visibleSize | integer | Visible size of the iceberg order |\n| clientOid | string | Unique order id created by users to identify their orders |\n| remark | string | Remark of the order |\n| tags | string | tag order source |\n| isActive | boolean | Mark of the active orders |\n| cancelExist | boolean | Mark of the canceled orders |\n| createdAt | integer | Time the order created |\n| updatedAt | integer | last update time |\n| endAt | integer | End time |\n| orderTime | integer | Order create time in nanosecond |\n| settleCurrency | string | settlement currency |\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin). |\n| avgDealPrice | string | Average transaction price, forward contract average transaction price = sum (transaction value) / sum (transaction quantity), reverse contract average transaction price = sum (transaction quantity) / sum (transaction value). Transaction quantity = lots * multiplier |\n| filledSize | integer | Value of the executed orders |\n| filledValue | string | Executed order quantity |\n| status | string | order status: “open” or “done” |\n| reduceOnly | boolean | A mark to reduce the position size only |\n\n---\n", "body": {} }, "response": [ @@ -14958,7 +15035,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470249)\n\n:::info[Description]\nGet a list of recent 1000 fills in the last 24 hours. If you need to get your recently traded order history with low latency, you may query this endpoint.\n\nIf you need to get your recently traded order history with low latency, you may query this endpoint.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| symbol | string | Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| tradeId | string | Trade ID
|\n| orderId | string | Order ID
|\n| side | string | Transaction side
|\n| liquidity | string | Liquidity-taker or -maker
|\n| forceTaker | boolean | Whether to force processing as a taker
|\n| price | string | Filled price
|\n| size | integer | Filled amount
|\n| value | string | Order value
|\n| openFeePay | string | Opening transaction fee
|\n| closeFeePay | string | Closing transaction fee
|\n| stop | string | A mark to the stop order type
|\n| feeRate | string | Fee Rate |\n| fixFee | string | Fixed fees (Deprecated field, no actual use of the value field)
|\n| feeCurrency | string | Charging currency
|\n| tradeTime | integer | Trade time in nanoseconds
|\n| subTradeType | string | Deprecated field, no actual use of the value field |\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| displayType | string | Order Type |\n| fee | string | Transaction fee
|\n| settleCurrency | string | Settle Currency |\n| orderType | string | Order type
|\n| tradeType | string | Trade type (trade, liquid, cancel, adl or settlement)
|\n| createdAt | integer | Order creation time
|\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470249)\n\n:::info[Description]\nGet a list of recent 1000 fills in the last 24 hours. If you need to get your recently traded order history with low latency, you may query this endpoint.\n\nIf you need to get your recently traded order history with low latency, you may query this endpoint.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| symbol | string | Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| tradeId | string | Trade ID
|\n| orderId | string | Order ID
|\n| side | string | Transaction side
|\n| liquidity | string | Liquidity-taker or -maker
|\n| forceTaker | boolean | Whether to force processing as a taker
|\n| price | string | Filled price
|\n| size | integer | Filled amount
|\n| value | string | Order value
|\n| openFeePay | string | Opening transaction fee
|\n| closeFeePay | string | Closing transaction fee
|\n| stop | string | A mark to the stop order type |\n| feeRate | string | Fee Rate |\n| fixFee | string | Fixed fees (Deprecated field, no actual use of the value field)
|\n| feeCurrency | string | Charging currency
|\n| tradeTime | integer | Trade time in nanoseconds
|\n| subTradeType | string | Deprecated field, no actual use of the value field |\n| marginMode | string | Margin mode: ISOLATED (isolated), CROSS (cross margin).
|\n| displayType | string | Order Type |\n| fee | string | Transaction fee
|\n| settleCurrency | string | Settle Currency |\n| orderType | string | Order type
|\n| tradeType | string | Trade type (trade, liquid, cancel, adl or settlement)
|\n| createdAt | integer | Order creation time
|\n\n---\n", "body": {} }, "response": [ @@ -15368,6 +15445,91 @@ } ] }, + { + "name": "Batch Switch Margin Mode", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{futures_endpoint}}" + ], + "path": [ + "api", + "v2", + "position", + "batchChangeMarginMode" + ], + "query": [] + }, + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3472403)\n\n:::info[Description]\nBatch modify the margin mode of the symbols.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| marginMode | string | Modified margin model: ISOLATED (isolated), CROSS (cross margin). |\n| symbols | array | Refer to the schema section of symbols |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| marginMode | object | Refer to the schema section of marginMode |\n| errors | array | Refer to the schema section of errors |\n\n**root.data.marginMode Schema**\n\n\n**root.data.marginMode.errors Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | Error code |\n| msg | string | Error message |\n| symbol | string | Symbol |\n\n---\n", + "body": { + "mode": "raw", + "raw": "{\n \"marginMode\": \"ISOLATED\",\n \"symbols\": [\n \"XBTUSDTM\",\n \"ETHUSDTM\"\n ]\n}", + "options": { + "raw": { + "language": "json" + } + } + } + }, + "response": [ + { + "name": "Successful Response", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{futures_endpoint}}" + ], + "path": [ + "api", + "v2", + "position", + "batchChangeMarginMode" + ], + "query": [] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": { + "content": "", + "type": "text/plain" + } + }, + { + "key": "gw-ratelimit-remaining", + "value": 1997, + "name": "gw-ratelimit-remaining" + }, + { + "key": "gw-ratelimit-limit", + "value": 2000, + "name": "gw-ratelimit-limit" + }, + { + "key": "gw-ratelimit-reset", + "value": 29990, + "name": "gw-ratelimit-reset" + } + ], + "cookie": [], + "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"marginMode\": {\n \"ETHUSDTM\": \"ISOLATED\",\n \"XBTUSDTM\": \"CROSS\"\n },\n \"errors\": [\n {\n \"code\": \"50002\",\n \"msg\": \"exist.order.or.position\",\n \"symbol\": \"XBTUSDTM\"\n }\n ]\n }\n}" + } + ] + }, { "name": "Get Max Open Size", "request": { @@ -15499,7 +15661,7 @@ } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470252)\n\n:::info[Description]\nGet the position details of a specified position.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Position ID
|\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| crossMode | boolean | Whether it is cross margin. |\n| delevPercentage | number | ADL ranking percentile
|\n| openingTimestamp | integer | Open time
|\n| currentTimestamp | integer | Current timestamp
|\n| currentQty | integer | Current postion quantity
|\n| currentCost | number | Current postion value
|\n| currentComm | number | Current commission
|\n| unrealisedCost | number | Unrealised value
|\n| realisedGrossCost | number | Accumulated realised gross profit value
|\n| realisedCost | number | Current realised position value
|\n| isOpen | boolean | Opened position or not
|\n| markPrice | number | Mark price
|\n| markValue | number | Mark Value
|\n| posCost | number | Position value
|\n| posInit | number | Inital margin Cross = opening value/cross leverage; isolated = accumulation of initial margin for each transaction
|\n| posMargin | number | Bankruptcy cost Cross = mark value * imr; Isolated = position margin (accumulation of initial margin, additional margin, generated funding fees, etc.)
|\n| realisedGrossPnl | number | Accumulated realised gross profit value
|\n| realisedPnl | number | Realised profit and loss
|\n| unrealisedPnl | number | Unrealised profit and loss
|\n| unrealisedPnlPcnt | number | Profit-loss ratio of the position
|\n| unrealisedRoePcnt | number | Rate of return on investment
|\n| avgEntryPrice | number | Average entry price
|\n| liquidationPrice | number | Liquidation price For Cross Margin, you can refer to the liquidationPrice, and the liquidation is based on the risk rate.
|\n| bankruptPrice | number | Bankruptcy price For Cross Margin, you can refer to the bankruptPrice, and the liquidation is based on the risk rate.
|\n| settleCurrency | string | Currency used to clear and settle the trades
|\n| isInverse | boolean | Reverse contract or not
|\n| marginMode | string | Margin Mode: CROSS,ISOLATED
|\n| positionSide | string | Position Side
|\n| leverage | number | Leverage |\n| autoDeposit | boolean | Auto deposit margin or not **Only applicable to Isolated Margin**
|\n| maintMarginReq | number | Maintenance margin requirement **Only applicable to Isolated Margin**
|\n| riskLimit | integer | Risk limit **Only applicable to Isolated Margin**
|\n| realLeverage | number | Leverage of the order **Only applicable to Isolated Margin**
|\n| posCross | number | added margin **Only applicable to Isolated Margin**
|\n| posCrossMargin | integer | Additional margin calls (automatic, manual, adjusted risk limits) **Only applicable to Isolated Margin**
|\n| posComm | number | Bankruptcy cost **Only applicable to Isolated Margin**
|\n| posCommCommon | number | Part of bankruptcy cost (positioning, add margin) **Only applicable to Isolated Margin**
|\n| posLoss | number | Funding fees paid out **Only applicable to Isolated Margin**
|\n| posFunding | number | The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin**
|\n| posMaint | number | Maintenance margin **Only applicable to Isolated Margin**
|\n| maintMargin | number | Position margin **Only applicable to Isolated Margin**
|\n| maintainMargin | number | Maintenance margin rate **Only applicable to Isolated Margin**
|\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470252)\n\n:::info[Description]\nGet the position details of a specified position.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Position ID
|\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| crossMode | boolean | Whether it is cross margin. |\n| delevPercentage | number | ADL ranking percentile
|\n| openingTimestamp | integer | First opening time |\n| currentTimestamp | integer | Current timestamp
|\n| currentQty | integer | Current postion quantity
|\n| currentCost | number | Current postion value
|\n| currentComm | number | Current commission
|\n| unrealisedCost | number | Unrealised value
|\n| realisedGrossCost | number | Accumulated realised gross profit value
|\n| realisedCost | number | Current realised position value
|\n| isOpen | boolean | Opened position or not
|\n| markPrice | number | Mark price
|\n| markValue | number | Mark Value
|\n| posCost | number | Position value
|\n| posInit | number | Inital margin Cross = opening value/cross leverage; isolated = accumulation of initial margin for each transaction
|\n| posMargin | number | Bankruptcy cost Cross = mark value * imr; Isolated = position margin (accumulation of initial margin, additional margin, generated funding fees, etc.)
|\n| realisedGrossPnl | number | Accumulated realised gross profit value
|\n| realisedPnl | number | Realised profit and loss
|\n| unrealisedPnl | number | Unrealised profit and loss
|\n| unrealisedPnlPcnt | number | Profit-loss ratio of the position
|\n| unrealisedRoePcnt | number | Rate of return on investment
|\n| avgEntryPrice | number | Average entry price
|\n| liquidationPrice | number | Liquidation price For Cross Margin, you can refer to the liquidationPrice, and the liquidation is based on the risk rate.
|\n| bankruptPrice | number | Bankruptcy price For Cross Margin, you can refer to the bankruptPrice, and the liquidation is based on the risk rate.
|\n| settleCurrency | string | Currency used to clear and settle the trades
|\n| isInverse | boolean | Reverse contract or not
|\n| marginMode | string | Margin Mode: CROSS,ISOLATED
|\n| positionSide | string | Position Side
|\n| leverage | number | Leverage |\n| autoDeposit | boolean | Auto deposit margin or not **Only applicable to Isolated Margin**
|\n| maintMarginReq | number | Maintenance margin requirement
|\n| riskLimit | integer | Risk limit **Only applicable to Isolated Margin**
|\n| realLeverage | number | Leverage of the order **Only applicable to Isolated Margin**
|\n| posCross | number | added margin **Only applicable to Isolated Margin**
|\n| posCrossMargin | integer | Additional margin calls (automatic, manual, adjusted risk limits) **Only applicable to Isolated Margin**
|\n| posComm | number | Bankruptcy cost **Only applicable to Isolated Margin**
|\n| posCommCommon | number | Part of bankruptcy cost (positioning, add margin) **Only applicable to Isolated Margin**
|\n| posLoss | number | Funding fees paid out **Only applicable to Isolated Margin**
|\n| posFunding | number | The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin**
|\n| posMaint | number | Maintenance margin
|\n| maintMargin | number | Position margin **Only applicable to Isolated Margin**
|\n| maintainMargin | number | Maintenance margin rate **Only applicable to Isolated Margin**
|\n\n---\n", "body": {} }, "response": [ @@ -15582,11 +15744,11 @@ { "key": "currency", "value": null, - "description": "Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty" + "description": "Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty" } ] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470253)\n\n:::info[Description]\nGet the position details of a specified position.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Position ID
|\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| crossMode | boolean | Whether it is cross margin. |\n| delevPercentage | number | ADL ranking percentile
|\n| openingTimestamp | integer | Open time
|\n| currentTimestamp | integer | Current timestamp
|\n| currentQty | integer | Current postion quantity
|\n| currentCost | number | Current postion value
|\n| currentComm | number | Current commission
|\n| unrealisedCost | number | Unrealised value
|\n| realisedGrossCost | number | Accumulated realised gross profit value
|\n| realisedCost | number | Current realised position value
|\n| isOpen | boolean | Opened position or not
|\n| markPrice | number | Mark price
|\n| markValue | number | Mark Value
|\n| posCost | number | Position value
|\n| posInit | number | Inital margin Cross = opening value/cross leverage; isolated = accumulation of initial margin for each transaction
|\n| posMargin | number | Bankruptcy cost Cross = mark value * imr; Isolated = position margin (accumulation of initial margin, additional margin, generated funding fees, etc.)
|\n| realisedGrossPnl | number | Accumulated realised gross profit value
|\n| realisedPnl | number | Realised profit and loss
|\n| unrealisedPnl | number | Unrealised profit and loss
|\n| unrealisedPnlPcnt | number | Profit-loss ratio of the position
|\n| unrealisedRoePcnt | number | Rate of return on investment
|\n| avgEntryPrice | number | Average entry price
|\n| liquidationPrice | number | Liquidation price For Cross Margin, you can refer to the liquidationPrice, and the liquidation is based on the risk rate.
|\n| bankruptPrice | number | Bankruptcy price For Cross Margin, you can refer to the bankruptPrice, and the liquidation is based on the risk rate.
|\n| settleCurrency | string | Currency used to clear and settle the trades
|\n| isInverse | boolean | Reverse contract or not
|\n| marginMode | string | Margin Mode: CROSS,ISOLATED
|\n| positionSide | string | Position Side
|\n| leverage | number | Leverage |\n| autoDeposit | boolean | Auto deposit margin or not **Only applicable to Isolated Margin**
|\n| maintMarginReq | number | Maintenance margin requirement **Only applicable to Isolated Margin**
|\n| riskLimit | number | Risk limit **Only applicable to Isolated Margin**
|\n| realLeverage | number | Leverage of the order **Only applicable to Isolated Margin**
|\n| posCross | number | added margin **Only applicable to Isolated Margin**
|\n| posCrossMargin | number | Additional margin calls (automatic, manual, adjusted risk limits) **Only applicable to Isolated Margin**
|\n| posComm | number | Bankruptcy cost **Only applicable to Isolated Margin**
|\n| posCommCommon | number | Part of bankruptcy cost (positioning, add margin) **Only applicable to Isolated Margin**
|\n| posLoss | number | Funding fees paid out **Only applicable to Isolated Margin**
|\n| posFunding | number | The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin**
|\n| posMaint | number | Maintenance margin **Only applicable to Isolated Margin**
|\n| maintMargin | number | Position margin **Only applicable to Isolated Margin**
|\n| maintainMargin | number | Maintenance margin rate **Only applicable to Isolated Margin**
|\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470253)\n\n:::info[Description]\nGet the position details of a specified position.\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| id | string | Position ID
|\n| symbol | string | Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| crossMode | boolean | Whether it is cross margin. |\n| delevPercentage | number | ADL ranking percentile
|\n| openingTimestamp | integer | First opening time |\n| currentTimestamp | integer | Current timestamp
|\n| currentQty | integer | Current postion quantity
|\n| currentCost | number | Current postion value
|\n| currentComm | number | Current commission
|\n| unrealisedCost | number | Unrealised value
|\n| realisedGrossCost | number | Accumulated realised gross profit value
|\n| realisedCost | number | Current realised position value
|\n| isOpen | boolean | Opened position or not
|\n| markPrice | number | Mark price
|\n| markValue | number | Mark Value
|\n| posCost | number | Position value
|\n| posInit | number | Inital margin Cross = opening value/cross leverage; isolated = accumulation of initial margin for each transaction
|\n| posMargin | number | Bankruptcy cost Cross = mark value * imr; Isolated = position margin (accumulation of initial margin, additional margin, generated funding fees, etc.)
|\n| realisedGrossPnl | number | Accumulated realised gross profit value
|\n| realisedPnl | number | Realised profit and loss
|\n| unrealisedPnl | number | Unrealised profit and loss
|\n| unrealisedPnlPcnt | number | Profit-loss ratio of the position
|\n| unrealisedRoePcnt | number | Rate of return on investment
|\n| avgEntryPrice | number | Average entry price
|\n| liquidationPrice | number | Liquidation price For Cross Margin, you can refer to the liquidationPrice, and the liquidation is based on the risk rate.
|\n| bankruptPrice | number | Bankruptcy price For Cross Margin, you can refer to the bankruptPrice, and the liquidation is based on the risk rate.
|\n| settleCurrency | string | Currency used to clear and settle the trades
|\n| isInverse | boolean | Reverse contract or not
|\n| marginMode | string | Margin Mode: CROSS,ISOLATED
|\n| positionSide | string | Position Side
|\n| leverage | number | Leverage |\n| autoDeposit | boolean | Auto deposit margin or not **Only applicable to Isolated Margin**
|\n| maintMarginReq | number | Maintenance margin requirement
|\n| riskLimit | number | Risk limit **Only applicable to Isolated Margin**
|\n| realLeverage | number | Leverage of the order **Only applicable to Isolated Margin**
|\n| posCross | number | added margin **Only applicable to Isolated Margin**
|\n| posCrossMargin | number | Additional margin calls (automatic, manual, adjusted risk limits) **Only applicable to Isolated Margin**
|\n| posComm | number | Bankruptcy cost **Only applicable to Isolated Margin**
|\n| posCommCommon | number | Part of bankruptcy cost (positioning, add margin) **Only applicable to Isolated Margin**
|\n| posLoss | number | Funding fees paid out **Only applicable to Isolated Margin**
|\n| posFunding | number | The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin**
|\n| posMaint | number | Maintenance margin |\n| maintMargin | number | Position margin **Only applicable to Isolated Margin**
|\n| maintainMargin | number | Maintenance margin rate **Only applicable to Isolated Margin**
|\n\n---\n", "body": {} }, "response": [ @@ -15610,7 +15772,7 @@ { "key": "currency", "value": null, - "description": "Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty" + "description": "Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty" } ] } @@ -16207,6 +16369,113 @@ } ] }, + { + "name": "Get Cross Margin Risk Limit", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{futures_endpoint}}" + ], + "path": [ + "api", + "v2", + "batchGetCrossOrderLimit" + ], + "query": [ + { + "key": "symbol", + "value": null, + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP)" + }, + { + "key": "totalMargin", + "value": null, + "description": "The position opening amount, in the contract's settlement currency.\nDefaults to 10,000 in margin currency for max position calculation.\nFor USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price." + }, + { + "key": "leverage", + "value": null, + "description": "Calculates the max position size at the specified leverage.\nDefaults to the symbol’s max cross leverage." + } + ] + }, + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3472655)\n\n:::info[Description]\nBatch get cross margin risk limit. (It should be noted that the risk limit of cross marign does not have a fixed gear, but is a smooth curve)\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| symbol | string | Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) |\n| maxOpenSize | integer | Maximum amount of open position(Unit is **lots**)
|\n| maxOpenValue | string | Maximum value of open position(Unit is **quoteCcy**)
|\n| totalMargin | string | Margin amount used for max position calculation. |\n| price | string | Price used for max position calculation. Defaults to latest transaction price |\n| leverage | string | Leverage used for max position calculation. |\n| mmr | string | Maintenance Margin Rate |\n| imr | string | Initial Margin Rate |\n| currency | string | Margin Currency |\n\n---\n", + "body": {} + }, + "response": [ + { + "name": "Successful Response", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{futures_endpoint}}" + ], + "path": [ + "api", + "v2", + "batchGetCrossOrderLimit" + ], + "query": [ + { + "key": "symbol", + "value": null, + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP)" + }, + { + "key": "totalMargin", + "value": null, + "description": "The position opening amount, in the contract's settlement currency.\nDefaults to 10,000 in margin currency for max position calculation.\nFor USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price." + }, + { + "key": "leverage", + "value": null, + "description": "Calculates the max position size at the specified leverage.\nDefaults to the symbol’s max cross leverage." + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": { + "content": "", + "type": "text/plain" + } + }, + { + "key": "gw-ratelimit-remaining", + "value": 1997, + "name": "gw-ratelimit-remaining" + }, + { + "key": "gw-ratelimit-limit", + "value": 2000, + "name": "gw-ratelimit-limit" + }, + { + "key": "gw-ratelimit-reset", + "value": 29990, + "name": "gw-ratelimit-reset" + } + ], + "cookie": [], + "body": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"symbol\": \"XBTUSDTM\",\n \"maxOpenSize\": 12102,\n \"maxOpenValue\": \"1234549.2240000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"102012\",\n \"leverage\": \"125.00\",\n \"mmr\": \"0.00416136\",\n \"imr\": \"0.008\",\n \"currency\": \"USDT\"\n },\n {\n \"symbol\": \"ETHUSDTM\",\n \"maxOpenSize\": 38003,\n \"maxOpenValue\": \"971508.6920000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"2556.4\",\n \"leverage\": \"100.00\",\n \"mmr\": \"0.0054623236\",\n \"imr\": \"0.01\",\n \"currency\": \"USDT\"\n }\n ]\n}" + } + ] + }, { "name": "Get Isolated Margin Risk Limit", "request": { @@ -16380,7 +16649,7 @@ "name": "Funding Fees", "item": [ { - "name": "Get Current Funding Rate.", + "name": "Get Current Funding Rate", "request": { "method": "GET", "header": [], @@ -16399,7 +16668,7 @@ ], "query": [] }, - "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470265)\n\n:::info[Description]\nGet Current Funding Rate.\n\n\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| symbol | string | Funding Rate Symbol
|\n| granularity | integer | Granularity (milliseconds)
|\n| timePoint | integer | The funding rate settlement time point of the previous cycle
(milliseconds)
|\n| value | number | Current cycle funding rate
|\n| predictedValue | number | Predicted funding rate
|\n| fundingRateCap | number | Maximum Funding Rate |\n| fundingRateFloor | number | Minimum Funding Rate |\n\n---\n", + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3470265)\n\n:::info[Description]\nGet Current Funding Rate.\n\n\n\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| symbol | string | Funding Rate Symbol
|\n| granularity | integer | Granularity (milliseconds)
|\n| timePoint | integer | The funding rate settlement time point of the previous cycle
(milliseconds)
Before going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched.
The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled.
The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live.

|\n| value | number | Current cycle funding rate
|\n| predictedValue | number | Predicted funding rate
|\n| fundingRateCap | number | Maximum Funding Rate |\n| fundingRateFloor | number | Minimum Funding Rate |\n| period | integer | Indicates whether the current funding fee is charged within this cycle |\n| fundingTime | integer | Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing. |\n\n---\n", "body": {} }, "response": [ @@ -16454,7 +16723,7 @@ } ], "cookie": [], - "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1731441600000,\n \"value\": 0.000641,\n \"predictedValue\": 5.2e-05,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003\n }\n}" + "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1748462400000,\n \"value\": 6.1e-05,\n \"predictedValue\": 0.000109,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003,\n \"period\": 0,\n \"fundingTime\": 1748491200000\n }\n}" } ] }, @@ -18060,6 +18329,289 @@ { "name": "Exchange Broker", "item": [ + { + "name": "Submit KYC", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{broker_endpoint}}" + ], + "path": [ + "api", + "kyc", + "ndBroker", + "proxyClient", + "submit" + ], + "query": [] + }, + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3472406)\n\n:::info[Description]\nThis endpointcan submit kyc information for a sub-account of nd broker\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientUid | string | client uid |\n| firstName | string | first Name |\n| lastName | string | last Name |\n| issueCountry | string | ISO country code |\n| birthDate | string | Birth Date |\n| identityType | string | Identity type |\n| identityNumber | string | Identity Number |\n| expireDate | string | expire Date. If there is no expiration date, please fill in: 2099-01-01 |\n| frontPhoto | string | **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB |\n| backendPhoto | string | **Optional when identityType=passport/bvn,** Back photo of ID, same as above |\n| facePhoto | string | Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB |\n\n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | string | |\n\n---\n", + "body": { + "mode": "raw", + "raw": "{\n \"clientUid\": \"226383154\",\n \"firstName\": \"Kaylah\",\n \"lastName\": \"Padberg\",\n \"issueCountry\": \"JP\",\n \"birthDate\": \"2000-01-01\",\n \"expireDate\": \"2030-01-01\",\n \"identityType\": \"passport\",\n \"identityNumber\": \"55\",\n \"facePhoto\": \"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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\",\n \"frontPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\",\n \"backendPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\"\n}", + "options": { + "raw": { + "language": "json" + } + } + } + }, + "response": [ + { + "name": "Successful Response", + "originalRequest": { + "method": "POST", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{broker_endpoint}}" + ], + "path": [ + "api", + "kyc", + "ndBroker", + "proxyClient", + "submit" + ], + "query": [] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": { + "content": "", + "type": "text/plain" + } + }, + { + "key": "gw-ratelimit-remaining", + "value": 1997, + "name": "gw-ratelimit-remaining" + }, + { + "key": "gw-ratelimit-limit", + "value": 2000, + "name": "gw-ratelimit-limit" + }, + { + "key": "gw-ratelimit-reset", + "value": 29990, + "name": "gw-ratelimit-reset" + } + ], + "cookie": [], + "body": "{\n \"code\": \"200000\",\n \"data\": null\n}" + } + ] + }, + { + "name": "Get KYC Status", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{broker_endpoint}}" + ], + "path": [ + "api", + "kyc", + "ndBroker", + "proxyClient", + "status", + "list" + ], + "query": [ + { + "key": "clientUids", + "value": "226383154", + "description": "Client uid, Use commas to separate multiple UIDs\n" + } + ] + }, + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3472407)\n\n:::info[Description]\nThis endpoint can query the specified Kyc status\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | array | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientUid | integer | client uid |\n| status | string | KYC status |\n| rejectReason | string | Reject Reason |\n\n---\n", + "body": {} + }, + "response": [ + { + "name": "Successful Response", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{broker_endpoint}}" + ], + "path": [ + "api", + "kyc", + "ndBroker", + "proxyClient", + "status", + "list" + ], + "query": [ + { + "key": "clientUids", + "value": "226383154", + "description": "Client uid, Use commas to separate multiple UIDs\n" + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": { + "content": "", + "type": "text/plain" + } + }, + { + "key": "gw-ratelimit-remaining", + "value": 1997, + "name": "gw-ratelimit-remaining" + }, + { + "key": "gw-ratelimit-limit", + "value": 2000, + "name": "gw-ratelimit-limit" + }, + { + "key": "gw-ratelimit-reset", + "value": 29990, + "name": "gw-ratelimit-reset" + } + ], + "cookie": [], + "body": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n }\n ]\n}" + } + ] + }, + { + "name": "Get KYC Status List", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{broker_endpoint}}" + ], + "path": [ + "api", + "kyc", + "ndBroker", + "proxyClient", + "status", + "page" + ], + "query": [ + { + "key": "pageNumber", + "value": "", + "description": "Page Number" + }, + { + "key": "pageSize", + "value": null, + "description": "Page Size" + } + ] + }, + "description": "# API Description\n\nFor the complete API documentation, please refer to [doc](https://www.kucoin.com/docs-new/api-3472408)\n\n:::info[Description]\nThis endpoint can query the specified Kyc status list\n:::\n# API Schema\n\n## Request Schema\n\n\n**Request Body**\n\n---\n **None** \n---\n## Response Schema\n\n\n**Response Body**\n\n---\n**root Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| code | string | |\n| data | object | Refer to the schema section of data |\n\n**root.data Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| currentPage | integer | |\n| pageSize | integer | |\n| totalNum | integer | |\n| totalPage | integer | |\n| items | array | Refer to the schema section of items |\n\n**root.data.items Schema**\n\n| name | type | description |\n| --- | --- | --- |\n| clientUid | integer | client uid |\n| status | string | KYC status |\n| rejectReason | string | Reject Reason |\n\n---\n", + "body": {} + }, + "response": [ + { + "name": "Successful Response", + "originalRequest": { + "method": "GET", + "header": [], + "url": { + "raw": "", + "protocol": "https", + "host": [ + "{{broker_endpoint}}" + ], + "path": [ + "api", + "kyc", + "ndBroker", + "proxyClient", + "status", + "page" + ], + "query": [ + { + "key": "pageNumber", + "value": "", + "description": "Page Number" + }, + { + "key": "pageSize", + "value": null, + "description": "Page Size" + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "name": "Content-Type", + "description": { + "content": "", + "type": "text/plain" + } + }, + { + "key": "gw-ratelimit-remaining", + "value": 1997, + "name": "gw-ratelimit-remaining" + }, + { + "key": "gw-ratelimit-limit", + "value": 2000, + "name": "gw-ratelimit-limit" + }, + { + "key": "gw-ratelimit-reset", + "value": 29990, + "name": "gw-ratelimit-reset" + } + ], + "cookie": [], + "body": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 100,\n \"totalNum\": 9,\n \"totalPage\": 1,\n \"items\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n },\n {\n \"clientUid\": 232772137,\n \"status\": \"REJECT\",\n \"rejectReason\": \"frontPhoto:Picture is not clear/covered/incomplete\"\n }\n ]\n }\n}" + } + ] + }, { "name": "Get Broker Info", "request": { @@ -19397,7 +19949,7 @@ "type": "text/javascript", "packages": {}, "exec": [ - "\nfunction extractPathVariable(str) {\n const regex = /^\\{\\{(.+?)\\}\\}$/;\n const match = str.match(regex);\n if (match) {\n return match[1];\n }\n return null;\n}\n\nfunction hasAnyFieldEmpty(obj) {\n for (const key in obj) {\n if (obj[key] === \"\" || obj[key] === null || obj[key] === undefined) {\n return true;\n }\n }\n return false;\n}\n\nfunction sign(text, secret) {\n const hash = CryptoJS.HmacSHA256(text, secret);\n return CryptoJS.enc.Base64.stringify(hash)\n}\n\nfunction auth(apiKey, method, url, data) {\n if (hasAnyFieldEmpty(apiKey)) {\n console.warn('The API key-related (or broker-related) information is not configured. Please check the fields in the environment variables.')\n return {'User-Agent': `Kucoin-Universal-Postman-SDK/v1.2.0`}\n }\n\n\n const timestamp = Date.now();\n const text = timestamp + method.toUpperCase() + url + data;\n const signature = sign(text, apiKey.secret);\n const brokerText = timestamp + apiKey.partner + apiKey.key;\n const brokerSignature = sign(brokerText, apiKey.brokerKey);\n return {\n 'KC-API-KEY': apiKey.key,\n 'KC-API-SIGN': signature,\n 'KC-API-TIMESTAMP': timestamp.toString(),\n 'KC-API-PASSPHRASE': sign(apiKey.passphrase || '', apiKey.secret),\n 'Content-Type': 'application/json',\n 'User-Agent': `Kucoin-Universal-Postman-SDK/v1.2.0`,\n 'KC-API-KEY-VERSION': 3,\n 'KC-API-PARTNER': apiKey.partner,\n 'KC-BROKER-NAME': apiKey.brokerName,\n 'KC-API-PARTNER-VERIFY': 'true',\n 'KC-API-PARTNER-SIGN': brokerSignature,\n };\n}\n\nlet key = pm.environment.get('API_KEY')\nlet secret = pm.environment.get('API_SECRET')\nlet passphrase = pm.environment.get('API_PASSPHRASE')\n\nlet brokerName = pm.environment.get('BROKER_NAME')\nlet partner = pm.environment.get('BROKER_PARTNER')\nlet brokerKey = pm.environment.get('BROKER_KEY')\n\nlet url = pm.request.url.getPathWithQuery()\nlet method = pm.request.method\nlet body = pm.request.body ? pm.request.body.toString() : ''\n\nfor (const index in pm.request.url.path) {\n path = pm.request.url.path[index]\n pathVar = extractPathVariable(path)\n if (pathVar != null) {\n let collectionVariable = pm.collectionVariables.get(pathVar);\n if (collectionVariable != null) {\n url = url.replace(path, collectionVariable)\n } else {\n console.warn('no path variable set: ' + path)\n }\n }\n}\n\nheader = auth({\n key: key, passphrase: passphrase, secret: secret, brokerName: brokerName, partner: partner, brokerKey: brokerKey\n}, method, url, body)\n\nfor (const [headerName, headerValue] of Object.entries(header)) {\n pm.request.headers.add({ key: headerName, value: headerValue })\n}" + "\nfunction extractPathVariable(str) {\n const regex = /^\\{\\{(.+?)\\}\\}$/;\n const match = str.match(regex);\n if (match) {\n return match[1];\n }\n return null;\n}\n\nfunction hasAnyFieldEmpty(obj) {\n for (const key in obj) {\n if (obj[key] === \"\" || obj[key] === null || obj[key] === undefined) {\n return true;\n }\n }\n return false;\n}\n\nfunction sign(text, secret) {\n const hash = CryptoJS.HmacSHA256(text, secret);\n return CryptoJS.enc.Base64.stringify(hash)\n}\n\nfunction auth(apiKey, method, url, data) {\n if (hasAnyFieldEmpty(apiKey)) {\n console.warn('The API key-related (or broker-related) information is not configured. Please check the fields in the environment variables.')\n return {'User-Agent': `Kucoin-Universal-Postman-SDK/v1.3.0`}\n }\n\n\n const timestamp = Date.now();\n const text = timestamp + method.toUpperCase() + url + data;\n const signature = sign(text, apiKey.secret);\n const brokerText = timestamp + apiKey.partner + apiKey.key;\n const brokerSignature = sign(brokerText, apiKey.brokerKey);\n return {\n 'KC-API-KEY': apiKey.key,\n 'KC-API-SIGN': signature,\n 'KC-API-TIMESTAMP': timestamp.toString(),\n 'KC-API-PASSPHRASE': sign(apiKey.passphrase || '', apiKey.secret),\n 'Content-Type': 'application/json',\n 'User-Agent': `Kucoin-Universal-Postman-SDK/v1.3.0`,\n 'KC-API-KEY-VERSION': 3,\n 'KC-API-PARTNER': apiKey.partner,\n 'KC-BROKER-NAME': apiKey.brokerName,\n 'KC-API-PARTNER-VERIFY': 'true',\n 'KC-API-PARTNER-SIGN': brokerSignature,\n };\n}\n\nlet key = pm.environment.get('API_KEY')\nlet secret = pm.environment.get('API_SECRET')\nlet passphrase = pm.environment.get('API_PASSPHRASE')\n\nlet brokerName = pm.environment.get('BROKER_NAME')\nlet partner = pm.environment.get('BROKER_PARTNER')\nlet brokerKey = pm.environment.get('BROKER_KEY')\n\nlet url = pm.request.url.getPathWithQuery()\nlet method = pm.request.method\nlet body = pm.request.body ? pm.request.body.toString() : ''\n\nfor (const index in pm.request.url.path) {\n path = pm.request.url.path[index]\n pathVar = extractPathVariable(path)\n if (pathVar != null) {\n let collectionVariable = pm.collectionVariables.get(pathVar);\n if (collectionVariable != null) {\n url = url.replace(path, collectionVariable)\n } else {\n console.warn('no path variable set: ' + path)\n }\n }\n}\n\nheader = auth({\n key: key, passphrase: passphrase, secret: secret, brokerName: brokerName, partner: partner, brokerKey: brokerKey\n}, method, url, body)\n\nfor (const [headerName, headerValue] of Object.entries(header)) {\n pm.request.headers.add({ key: headerName, value: headerValue })\n}" ] } }, @@ -20445,6 +20997,22 @@ } ], "description": "" + }, + { + "name": "UTA", + "item": [ + { + "name": "Account Info", + "item": [], + "description": "" + }, + { + "name": "Trading", + "item": [], + "description": "" + } + ], + "description": "" } ], "variable": [ @@ -20492,7 +21060,7 @@ "type": "text/javascript", "packages": {}, "exec": [ - "function extractPathVariable(str) {\n const regex = /^\\{\\{(.+?)\\}\\}$/;\n const match = str.match(regex);\n if (match) {\n return match[1];\n }\n return null;\n}\n\nfunction hasAnyFieldEmpty(obj) {\n for (const key in obj) {\n if (obj[key] === \"\" || obj[key] === null || obj[key] === undefined) {\n return true;\n }\n }\n return false;\n}\n\nfunction sign(text, secret) {\n const hash = CryptoJS.HmacSHA256(text, secret);\n return CryptoJS.enc.Base64.stringify(hash)\n}\n\nfunction auth(apiKey, method, url, data) {\n if (hasAnyFieldEmpty(apiKey)) {\n console.warn('The API key-related information is not configured; only the public channel API is accessible.')\n return {'User-Agent': `Kucoin-Universal-Postman-SDK/v1.2.0`}\n }\n\n const timestamp = Date.now();\n const text = timestamp + method.toUpperCase() + url + data;\n const signature = sign(text, apiKey.secret);\n return {\n 'KC-API-KEY': apiKey.key,\n 'KC-API-SIGN': signature,\n 'KC-API-TIMESTAMP': timestamp.toString(),\n 'KC-API-PASSPHRASE': sign(apiKey.passphrase || '', apiKey.secret),\n 'Content-Type': 'application/json',\n 'User-Agent': `Kucoin-Universal-Postman-SDK/v1.2.0`,\n 'KC-API-KEY-VERSION': 3,\n };\n}\n\nlet key = pm.environment.get('API_KEY')\nlet secret = pm.environment.get('API_SECRET')\nlet passphrase = pm.environment.get('API_PASSPHRASE')\n\nlet url = pm.request.url.getPathWithQuery()\nlet method = pm.request.method\nlet body = pm.request.body ? pm.request.body.toString() : ''\n\nfor (const index in pm.request.url.path) {\n path = pm.request.url.path[index]\n pathVar = extractPathVariable(path)\n if (pathVar != null) {\n let collectionVariable = pm.collectionVariables.get(pathVar);\n if (collectionVariable != null) {\n url = url.replace(path, collectionVariable)\n } else {\n console.warn('no path variable set: ' + path)\n }\n }\n}\n\nheader = auth({ key: key, passphrase: passphrase, secret: secret }, method, url, body)\n\nfor (const [headerName, headerValue] of Object.entries(header)) {\n pm.request.headers.add({ key: headerName, value: headerValue })\n}" + "function extractPathVariable(str) {\n const regex = /^\\{\\{(.+?)\\}\\}$/;\n const match = str.match(regex);\n if (match) {\n return match[1];\n }\n return null;\n}\n\nfunction hasAnyFieldEmpty(obj) {\n for (const key in obj) {\n if (obj[key] === \"\" || obj[key] === null || obj[key] === undefined) {\n return true;\n }\n }\n return false;\n}\n\nfunction sign(text, secret) {\n const hash = CryptoJS.HmacSHA256(text, secret);\n return CryptoJS.enc.Base64.stringify(hash)\n}\n\nfunction auth(apiKey, method, url, data) {\n if (hasAnyFieldEmpty(apiKey)) {\n console.warn('The API key-related information is not configured; only the public channel API is accessible.')\n return {'User-Agent': `Kucoin-Universal-Postman-SDK/v1.3.0`}\n }\n\n const timestamp = Date.now();\n const text = timestamp + method.toUpperCase() + url + data;\n const signature = sign(text, apiKey.secret);\n return {\n 'KC-API-KEY': apiKey.key,\n 'KC-API-SIGN': signature,\n 'KC-API-TIMESTAMP': timestamp.toString(),\n 'KC-API-PASSPHRASE': sign(apiKey.passphrase || '', apiKey.secret),\n 'Content-Type': 'application/json',\n 'User-Agent': `Kucoin-Universal-Postman-SDK/v1.3.0`,\n 'KC-API-KEY-VERSION': 3,\n };\n}\n\nlet key = pm.environment.get('API_KEY')\nlet secret = pm.environment.get('API_SECRET')\nlet passphrase = pm.environment.get('API_PASSPHRASE')\n\nlet url = pm.request.url.getPathWithQuery()\nlet method = pm.request.method\nlet body = pm.request.body ? pm.request.body.toString() : ''\n\nfor (const index in pm.request.url.path) {\n path = pm.request.url.path[index]\n pathVar = extractPathVariable(path)\n if (pathVar != null) {\n let collectionVariable = pm.collectionVariables.get(pathVar);\n if (collectionVariable != null) {\n url = url.replace(path, collectionVariable)\n } else {\n console.warn('no path variable set: ' + path)\n }\n }\n}\n\nheader = auth({ key: key, passphrase: passphrase, secret: secret }, method, url, body)\n\nfor (const [headerName, headerValue] of Object.entries(header)) {\n pm.request.headers.add({ key: headerName, value: headerValue })\n}" ] } }, diff --git a/sdk/python/.dockerignore b/sdk/python/.dockerignore new file mode 100644 index 00000000..b7f4b732 --- /dev/null +++ b/sdk/python/.dockerignore @@ -0,0 +1,2 @@ +.venv +.venv-test \ No newline at end of file diff --git a/sdk/python/CHANGELOG.md b/sdk/python/CHANGELOG.md index 9cf413ec..f5596a2a 100644 --- a/sdk/python/CHANGELOG.md +++ b/sdk/python/CHANGELOG.md @@ -2,12 +2,30 @@ API documentation [Changelog](https://www.kucoin.com/docs-new/change-log) -Current synchronized API documentation version [20250313](https://www.kucoin.com/docs-new/change-log#20250313) +Current synchronized API documentation version [20250529](https://www.kucoin.com/docs-new/change-log#20250529) -# 2025-04-04(Python 1.2.1.post1) +## 2025-06-11(1.3.0) +- Update the latest APIs, documentation, etc +- Introduced a new testing framework for all SDKs +- Expanded regression-test coverage for Python components +- Updated Node.js dependencies to address security vulnerabilities + +## 2025-06-11(PHP 0.1.2-alpha) +- Update the latest APIs, documentation, etc + +## 2025-05-29(PHP 0.1.1-alpha) +- Fix compatibility issues on non-macOS systems by enforcing case-sensitive PSR-4 autoloading. + +## 2025-05-27(GO 1.2.1) +- Fix the Golang type mapping: map OpenAPI number type to float64 to prevent overflow + +## 2025-05-26(PHP 0.1.0-alpha) +- Release PHP implementation + +## 2025-04-04(Python 1.2.1.post1) - Bug Fixes -# 2025-03-31(Python 1.2.1) +## 2025-03-31(Python 1.2.1) - Optimize WebSocket reconnection logic ## 2025-03-21(1.2.0) diff --git a/sdk/python/Dockerfile b/sdk/python/Dockerfile new file mode 100644 index 00000000..a92a26b5 --- /dev/null +++ b/sdk/python/Dockerfile @@ -0,0 +1,15 @@ +# build +FROM python:3.12-slim AS builder +WORKDIR /src +COPY . . +RUN pip install --upgrade pip build && \ + python -m build --wheel --outdir /wheel_out + +FROM python:3.12-slim +WORKDIR /src +COPY . /src +COPY ./script /src +COPY --from=builder /wheel_out/*.whl /tmp/ +RUN apt-get update && \ + apt-get install -y --no-install-recommends procps && \ + rm -rf /var/lib/apt/lists/* \ No newline at end of file diff --git a/sdk/python/Makefile b/sdk/python/Makefile new file mode 100644 index 00000000..1d21b818 --- /dev/null +++ b/sdk/python/Makefile @@ -0,0 +1,51 @@ + +.PHONY: build +build: + docker build -t python-sdk-image:latest . + +.PHONY: auto-test +auto-test: build + docker run -v venv-test-cache:/src/.venv-test --rm python-sdk-image:latest bash /src/auto_test.sh + +.PHONY: before-release-test +before-release-test: build + docker run --rm \ + -e API_KEY="$$API_KEY" \ + -e API_SECRET="$$API_SECRET" \ + -e API_PASSPHRASE="$$API_PASSPHRASE" \ + -e USE_LOCAL="true" \ + python-sdk-image:latest \ + bash /src/release_test.sh + +.PHONY: after-release-test +after-release-test: build + docker run --rm \ + -e API_KEY="$$API_KEY" \ + -e API_SECRET="$$API_SECRET" \ + -e API_PASSPHRASE="$$API_PASSPHRASE" \ + python-sdk-image:latest \ + bash /src/release_test.sh + +.PHONY: run-forever-test +run-forever-test: build + docker rm -f python-run-forever-test + docker run -idt \ + -e API_KEY="$$API_KEY" \ + -e API_SECRET="$$API_SECRET" \ + -e API_PASSPHRASE="$$API_PASSPHRASE" \ + -e USE_LOCAL="true" \ + --name python-run-forever-test \ + python-sdk-image:latest \ + bash /src/run_forever_test.sh + +.PHONY: reconnect-test +reconnect-test: build + docker rm -f python-reconnect-test + docker run -idt \ + -e API_KEY="$$API_KEY" \ + -e API_SECRET="$$API_SECRET" \ + -e API_PASSPHRASE="$$API_PASSPHRASE" \ + -e USE_LOCAL="true" \ + --name python-reconnect-test --network isolated_net \ + python-sdk-image:latest \ + bash /src/ws_reconnect_test.sh \ No newline at end of file diff --git a/sdk/python/README.md b/sdk/python/README.md index 42407025..3313c59d 100644 --- a/sdk/python/README.md +++ b/sdk/python/README.md @@ -8,7 +8,7 @@ For an overview of the project and SDKs in other languages, refer to the [Main R ## 📦 Installation -### Latest Version: `1.2.1.post1` +### Latest Version: `1.3.0` Install the Python SDK using `pip`: ```bash diff --git a/sdk/python/kucoin_universal_sdk/generate/account/account/api_account_test.py b/sdk/python/kucoin_universal_sdk/generate/account/account/api_account_test.py index 0218cabb..809d5ec0 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/account/api_account_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/account/api_account_test.py @@ -135,7 +135,7 @@ def test_get_cross_margin_account_resp_model(self): Get Account - Cross Margin /api/v3/margin/accounts """ - data = "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.02\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"0.02\",\n \"available\": \"0.02\",\n \"hold\": \"0\",\n \"liability\": \"0\",\n \"maxBorrowSize\": \"0\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}" + data = "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"40.8648372\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"38.68855864\",\n \"available\": \"20.01916691\",\n \"hold\": \"18.66939173\",\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"maxBorrowSize\": \"163\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}" common_response = RestResponse.from_json(data) resp = GetCrossMarginAccountResp.from_dict(common_response.data) @@ -145,7 +145,7 @@ def test_get_isolated_margin_account_req_model(self): Get Account - Isolated Margin /api/v3/isolated/accounts """ - data = "{\"symbol\": \"example_string_default_value\", \"quoteCurrency\": \"USDT\", \"queryType\": \"ISOLATED\"}" + data = "{\"symbol\": \"BTC-USDT\", \"quoteCurrency\": \"USDT\", \"queryType\": \"ISOLATED\"}" req = GetIsolatedMarginAccountReq.from_json(data) def test_get_isolated_margin_account_resp_model(self): @@ -154,7 +154,7 @@ def test_get_isolated_margin_account_resp_model(self): Get Account - Isolated Margin /api/v3/isolated/accounts """ - data = "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.01\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"timestamp\": 1728725465994,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0.01\",\n \"available\": \"0.01\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n }\n }\n ]\n }\n}" + data = "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"4.97047372\",\n \"totalLiabilityOfQuoteCurrency\": \"0.00038891\",\n \"timestamp\": 1747303659773,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"liabilityPrincipal\": \"0\",\n \"liabilityInterest\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0.00038891\",\n \"liabilityPrincipal\": \"0.00038888\",\n \"liabilityInterest\": \"0.00000003\",\n \"total\": \"4.97047372\",\n \"available\": \"4.97047372\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"44\"\n }\n }\n ]\n }\n}" common_response = RestResponse.from_json(data) resp = GetIsolatedMarginAccountResp.from_dict(common_response.data) diff --git a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_accounts.py b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_accounts.py index b542a831..4fe07cf3 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_accounts.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_accounts.py @@ -23,6 +23,8 @@ class GetCrossMarginAccountAccounts(BaseModel): max_borrow_size (str): The user's remaining maximum loan amount borrow_enabled (bool): Support borrow or not transfer_in_enabled (bool): Support transfer or not + liability_principal (str): Outstanding principal – the unpaid loan amount + liability_interest (str): Accrued interest – the unpaid interest amount """ currency: Optional[str] = Field(default=None, description="currency") @@ -44,10 +46,19 @@ class GetCrossMarginAccountAccounts(BaseModel): default=None, description="Support transfer or not", alias="transferInEnabled") + liability_principal: Optional[str] = Field( + default=None, + description="Outstanding principal – the unpaid loan amount", + alias="liabilityPrincipal") + liability_interest: Optional[str] = Field( + default=None, + description="Accrued interest – the unpaid interest amount", + alias="liabilityInterest") __properties: ClassVar[List[str]] = [ "currency", "total", "available", "hold", "liability", "maxBorrowSize", - "borrowEnabled", "transferInEnabled" + "borrowEnabled", "transferInEnabled", "liabilityPrincipal", + "liabilityInterest" ] model_config = ConfigDict( @@ -101,6 +112,10 @@ def from_dict( "borrowEnabled": obj.get("borrowEnabled"), "transferInEnabled": - obj.get("transferInEnabled") + obj.get("transferInEnabled"), + "liabilityPrincipal": + obj.get("liabilityPrincipal"), + "liabilityInterest": + obj.get("liabilityInterest") }) return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_resp.py b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_resp.py index b501e6b5..12c54564 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_resp.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_cross_margin_account_resp.py @@ -6,7 +6,6 @@ import pprint import json -from enum import Enum from pydantic import BaseModel, ConfigDict, Field from typing import Any, ClassVar, Dict, List, Optional from .model_get_cross_margin_account_accounts import GetCrossMarginAccountAccounts @@ -22,25 +21,10 @@ class GetCrossMarginAccountResp(BaseModel, Response): total_asset_of_quote_currency (str): Total Assets in Quote Currency total_liability_of_quote_currency (str): Total Liability in Quote Currency debt_ratio (str): debt ratio - status (StatusEnum): Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing + status (str): Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing accounts (list[GetCrossMarginAccountAccounts]): Margin account list """ - class StatusEnum(Enum): - """ - Attributes: - EFFECTIVE: Effective - BANKRUPTCY: Bankruptcy liquidation - LIQUIDATION: Closing - REPAY: Repayment - BORROW: Borrowing - """ - EFFECTIVE = 'EFFECTIVE' - BANKRUPTCY = 'BANKRUPTCY' - LIQUIDATION = 'LIQUIDATION' - REPAY = 'REPAY' - BORROW = 'BORROW' - common_response: Optional[RestResponse] = Field( default=None, description="Common response") total_asset_of_quote_currency: Optional[str] = Field( @@ -54,7 +38,7 @@ class StatusEnum(Enum): debt_ratio: Optional[str] = Field(default=None, description="debt ratio", alias="debtRatio") - status: Optional[StatusEnum] = Field( + status: Optional[str] = Field( default=None, description= "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" diff --git a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets.py b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets.py index 59e85312..6bc47325 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets.py @@ -6,7 +6,6 @@ import pprint import json -from enum import Enum from pydantic import BaseModel, ConfigDict, Field from typing import Any, ClassVar, Dict, List, Optional from .model_get_isolated_margin_account_assets_base_asset import GetIsolatedMarginAccountAssetsBaseAsset @@ -19,29 +18,14 @@ class GetIsolatedMarginAccountAssets(BaseModel): Attributes: symbol (str): Symbol - status (StatusEnum): Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing + status (str): Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing debt_ratio (str): debt ratio base_asset (GetIsolatedMarginAccountAssetsBaseAsset): quote_asset (GetIsolatedMarginAccountAssetsQuoteAsset): """ - class StatusEnum(Enum): - """ - Attributes: - EFFECTIVE: Effective - BANKRUPTCY: Bankruptcy liquidation - LIQUIDATION: Closing - REPAY: Repayment - BORROW: Borrowing - """ - EFFECTIVE = 'EFFECTIVE' - BANKRUPTCY = 'BANKRUPTCY' - LIQUIDATION = 'LIQUIDATION' - REPAY = 'REPAY' - BORROW = 'BORROW' - symbol: Optional[str] = Field(default=None, description="Symbol") - status: Optional[StatusEnum] = Field( + status: Optional[str] = Field( default=None, description= "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" diff --git a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_base_asset.py b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_base_asset.py index 44a948da..55c3edf7 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_base_asset.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_base_asset.py @@ -23,6 +23,8 @@ class GetIsolatedMarginAccountAssetsBaseAsset(BaseModel): available (str): Account available assets (total assets - frozen) hold (str): Account frozen assets max_borrow_size (str): The user's remaining maximum loan amount + liability_principal (str): Outstanding principal + liability_interest (str): Outstanding interest """ currency: Optional[str] = Field(default=None, description="currency") @@ -44,10 +46,19 @@ class GetIsolatedMarginAccountAssetsBaseAsset(BaseModel): default=None, description="The user's remaining maximum loan amount", alias="maxBorrowSize") + liability_principal: Optional[str] = Field( + default=None, + description="Outstanding principal", + alias="liabilityPrincipal") + liability_interest: Optional[str] = Field( + default=None, + description="Outstanding interest", + alias="liabilityInterest") __properties: ClassVar[List[str]] = [ "currency", "borrowEnabled", "transferInEnabled", "liability", "total", - "available", "hold", "maxBorrowSize" + "available", "hold", "maxBorrowSize", "liabilityPrincipal", + "liabilityInterest" ] model_config = ConfigDict( @@ -101,6 +112,10 @@ def from_dict( "hold": obj.get("hold"), "maxBorrowSize": - obj.get("maxBorrowSize") + obj.get("maxBorrowSize"), + "liabilityPrincipal": + obj.get("liabilityPrincipal"), + "liabilityInterest": + obj.get("liabilityInterest") }) return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.py b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.py index 9131bc03..82f016bb 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_isolated_margin_account_assets_quote_asset.py @@ -23,6 +23,8 @@ class GetIsolatedMarginAccountAssetsQuoteAsset(BaseModel): available (str): Account available assets (total assets - frozen) hold (str): Account frozen assets max_borrow_size (str): The user's remaining maximum loan amount + liability_principal (str): + liability_interest (str): """ currency: Optional[str] = Field(default=None, description="currency") @@ -44,10 +46,15 @@ class GetIsolatedMarginAccountAssetsQuoteAsset(BaseModel): default=None, description="The user's remaining maximum loan amount", alias="maxBorrowSize") + liability_principal: Optional[str] = Field(default=None, + alias="liabilityPrincipal") + liability_interest: Optional[str] = Field(default=None, + alias="liabilityInterest") __properties: ClassVar[List[str]] = [ "currency", "borrowEnabled", "transferInEnabled", "liability", "total", - "available", "hold", "maxBorrowSize" + "available", "hold", "maxBorrowSize", "liabilityPrincipal", + "liabilityInterest" ] model_config = ConfigDict( @@ -101,6 +108,10 @@ def from_dict( "hold": obj.get("hold"), "maxBorrowSize": - obj.get("maxBorrowSize") + obj.get("maxBorrowSize"), + "liabilityPrincipal": + obj.get("liabilityPrincipal"), + "liabilityInterest": + obj.get("liabilityInterest") }) return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_spot_hf_ledger_req.py b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_spot_hf_ledger_req.py index 3affb6c7..a8a0d586 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_spot_hf_ledger_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/account/model_get_spot_hf_ledger_req.py @@ -37,14 +37,16 @@ class DirectionEnum(Enum): class BizTypeEnum(Enum): """ Attributes: - TRADE_EXCHANGE: trade exchange - TRANSFER: transfer - RETURNED_FEES: returned fees - DEDUCTION_FEES: deduction fees - OTHER: other + TRADE_EXCHANGE: Trade exchange + TRANSFER: Transfer + SUB_TRANSFER: Sub transfer + RETURNED_FEES: Returned fees + DEDUCTION_FEES: Deduction fees + OTHER: Other """ TRADE_EXCHANGE = 'TRADE_EXCHANGE' TRANSFER = 'TRANSFER' + SUB_TRANSFER = 'SUB_TRANSFER' RETURNED_FEES = 'RETURNED_FEES' DEDUCTION_FEES = 'DEDUCTION_FEES' OTHER = 'OTHER' diff --git a/sdk/python/kucoin_universal_sdk/generate/account/deposit/api_deposit_test.py b/sdk/python/kucoin_universal_sdk/generate/account/deposit/api_deposit_test.py index df87a721..dabdcd1c 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/deposit/api_deposit_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/deposit/api_deposit_test.py @@ -139,7 +139,7 @@ def test_add_deposit_address_v1_req_model(self): Add Deposit Address - V1 /api/v1/deposit-addresses """ - data = "{\"currency\": \"ETH\", \"chain\": \"eth\"}" + data = "{\"currency\": \"ETH\", \"chain\": \"eth\", \"to\": \"MAIN\"}" req = AddDepositAddressV1Req.from_json(data) def test_add_deposit_address_v1_resp_model(self): diff --git a/sdk/python/kucoin_universal_sdk/generate/account/deposit/model_add_deposit_address_v1_req.py b/sdk/python/kucoin_universal_sdk/generate/account/deposit/model_add_deposit_address_v1_req.py index 83b9a820..c249f999 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/deposit/model_add_deposit_address_v1_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/deposit/model_add_deposit_address_v1_req.py @@ -27,8 +27,8 @@ class ToEnum(Enum): MAIN: Funding account TRADE: Spot account """ - MAIN = 'main' - TRADE = 'trade' + MAIN = 'MAIN' + TRADE = 'TRADE' currency: Optional[str] = Field(default=None, description="currency") chain: Optional[str] = Field( diff --git a/sdk/python/kucoin_universal_sdk/generate/account/subaccount/api_sub_account_test.py b/sdk/python/kucoin_universal_sdk/generate/account/subaccount/api_sub_account_test.py index 858f8da1..d052edc7 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/subaccount/api_sub_account_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/subaccount/api_sub_account_test.py @@ -35,7 +35,7 @@ def test_add_sub_account_req_model(self): Add sub-account /api/v2/sub/user/created """ - data = "{\"password\": \"1234567\", \"remarks\": \"TheRemark\", \"subName\": \"Name1234567\", \"access\": \"Spot\"}" + data = "{\"password\": \"q1234567\", \"access\": \"Spot\", \"subName\": \"subNameTest1\", \"remarks\": \"TheRemark\"}" req = AddSubAccountReq.from_json(data) def test_add_sub_account_resp_model(self): @@ -44,7 +44,7 @@ def test_add_sub_account_resp_model(self): Add sub-account /api/v2/sub/user/created """ - data = "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 10,\n \"totalNum\": 1,\n \"totalPage\": 1,\n \"items\": [\n {\n \"userId\": \"63743f07e0c5230001761d08\",\n \"uid\": 169579801,\n \"subName\": \"testapi6\",\n \"status\": 2,\n \"type\": 0,\n \"access\": \"All\",\n \"createdAt\": 1668562696000,\n \"remarks\": \"remarks\",\n \"tradeTypes\": [\n \"Spot\",\n \"Futures\",\n \"Margin\"\n ],\n \"openedTradeTypes\": [\n \"Spot\"\n ],\n \"hostedStatus\": null\n }\n ]\n }\n}" + data = "{\n \"code\": \"200000\",\n \"data\": {\n \"uid\": 245730746,\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\",\n \"access\": \"Spot\"\n }\n}" common_response = RestResponse.from_json(data) resp = AddSubAccountResp.from_dict(common_response.data) diff --git a/sdk/python/kucoin_universal_sdk/generate/account/subaccount/model_add_sub_account_resp.py b/sdk/python/kucoin_universal_sdk/generate/account/subaccount/model_add_sub_account_resp.py index 7306a2fd..c7970b13 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/subaccount/model_add_sub_account_resp.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/subaccount/model_add_sub_account_resp.py @@ -17,20 +17,21 @@ class AddSubAccountResp(BaseModel, Response): AddSubAccountResp Attributes: - uid (int): Sub-account UID - sub_name (str): Sub-account name - remarks (str): Remarks - access (str): Permission + uid (int): Sub account user id + sub_name (str): Sub account name + remarks (str): Sub account name + access (str): permission """ common_response: Optional[RestResponse] = Field( default=None, description="Common response") - uid: Optional[int] = Field(default=None, description="Sub-account UID") + uid: Optional[int] = Field(default=None, description="Sub account user id") sub_name: Optional[str] = Field(default=None, - description="Sub-account name", + description="Sub account name", alias="subName") - remarks: Optional[str] = Field(default=None, description="Remarks") - access: Optional[str] = Field(default=None, description="Permission") + remarks: Optional[str] = Field(default=None, + description="Sub account name") + access: Optional[str] = Field(default=None, description="permission") __properties: ClassVar[List[str]] = ["uid", "subName", "remarks", "access"] diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/__init__.py b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/__init__.py index 569b674c..6454a497 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/__init__.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/__init__.py @@ -1,6 +1,9 @@ from .model_cancel_withdrawal_req import CancelWithdrawalReq from .model_cancel_withdrawal_req import CancelWithdrawalReqBuilder from .model_cancel_withdrawal_resp import CancelWithdrawalResp +from .model_get_withdrawal_history_by_id_req import GetWithdrawalHistoryByIdReq +from .model_get_withdrawal_history_by_id_req import GetWithdrawalHistoryByIdReqBuilder +from .model_get_withdrawal_history_by_id_resp import GetWithdrawalHistoryByIdResp from .model_get_withdrawal_history_items import GetWithdrawalHistoryItems from .model_get_withdrawal_history_old_items import GetWithdrawalHistoryOldItems from .model_get_withdrawal_history_old_req import GetWithdrawalHistoryOldReq diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.py b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.py index 2a261872..9ea76f9b 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.py @@ -5,6 +5,8 @@ from kucoin_universal_sdk.internal.interfaces.transport import Transport from .model_cancel_withdrawal_req import CancelWithdrawalReq from .model_cancel_withdrawal_resp import CancelWithdrawalResp +from .model_get_withdrawal_history_by_id_req import GetWithdrawalHistoryByIdReq +from .model_get_withdrawal_history_by_id_resp import GetWithdrawalHistoryByIdResp from .model_get_withdrawal_history_old_req import GetWithdrawalHistoryOldReq from .model_get_withdrawal_history_old_resp import GetWithdrawalHistoryOldResp from .model_get_withdrawal_history_req import GetWithdrawalHistoryReq @@ -96,6 +98,26 @@ def get_withdrawal_history(self, req: GetWithdrawalHistoryReq, """ pass + @abstractmethod + def get_withdrawal_history_by_id( + self, req: GetWithdrawalHistoryByIdReq, + **kwargs: Any) -> GetWithdrawalHistoryByIdResp: + """ + summary: Get Withdrawal History By ID + description: Request a withdrawal history by id via this endpoint. + documentation: https://www.kucoin.com/docs-new/api-3471890 + +-----------------------+------------+ + | Extra API Info | Value | + +-----------------------+------------+ + | API-DOMAIN | SPOT | + | API-CHANNEL | PRIVATE | + | API-PERMISSION | GENERAL | + | API-RATE-LIMIT-POOL | MANAGEMENT | + | API-RATE-LIMIT-WEIGHT | 20 | + +-----------------------+------------+ + """ + pass + @abstractmethod @deprecated('') def get_withdrawal_history_old( @@ -167,6 +189,14 @@ def get_withdrawal_history(self, req: GetWithdrawalHistoryReq, "/api/v1/withdrawals", req, GetWithdrawalHistoryResp(), False, **kwargs) + def get_withdrawal_history_by_id( + self, req: GetWithdrawalHistoryByIdReq, + **kwargs: Any) -> GetWithdrawalHistoryByIdResp: + return self.transport.call("spot", False, "GET", + "/api/v1/withdrawals/{withdrawalId}", req, + GetWithdrawalHistoryByIdResp(), False, + **kwargs) + def get_withdrawal_history_old( self, req: GetWithdrawalHistoryOldReq, **kwargs: Any) -> GetWithdrawalHistoryOldResp: diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.template b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.template index d880fcff..8f6aa8d1 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.template +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal.template @@ -77,6 +77,25 @@ def test_get_withdrawal_history_req(self): print("error: ", e) raise e +def test_get_withdrawal_history_by_id_req(self): + """ + get_withdrawal_history_by_id + Get Withdrawal History By ID + /api/v1/withdrawals/{withdrawalId} + """ + + builder = GetWithdrawalHistoryByIdReqBuilder() + builder.set_withdrawal_id(?) + req = builder.build() + try: + resp = self.api.get_withdrawal_history_by_id(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + def test_get_withdrawal_history_old_req(self): """ get_withdrawal_history_old diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal_test.py b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal_test.py index ada09f05..cab9be55 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/api_withdrawal_test.py @@ -1,6 +1,8 @@ import unittest from .model_cancel_withdrawal_req import CancelWithdrawalReq from .model_cancel_withdrawal_resp import CancelWithdrawalResp +from .model_get_withdrawal_history_by_id_req import GetWithdrawalHistoryByIdReq +from .model_get_withdrawal_history_by_id_resp import GetWithdrawalHistoryByIdResp from .model_get_withdrawal_history_old_req import GetWithdrawalHistoryOldReq from .model_get_withdrawal_history_old_resp import GetWithdrawalHistoryOldResp from .model_get_withdrawal_history_req import GetWithdrawalHistoryReq @@ -42,7 +44,7 @@ def test_withdrawal_v3_req_model(self): Withdraw (V3) /api/v3/withdrawals """ - data = "{\"currency\": \"USDT\", \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\", \"amount\": 3, \"withdrawType\": \"ADDRESS\", \"chain\": \"trx\", \"isInner\": true, \"remark\": \"this is Remark\"}" + data = "{\"currency\": \"USDT\", \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\", \"amount\": \"3\", \"withdrawType\": \"ADDRESS\", \"chain\": \"trx\", \"isInner\": true, \"remark\": \"this is Remark\"}" req = WithdrawalV3Req.from_json(data) def test_withdrawal_v3_resp_model(self): @@ -93,6 +95,25 @@ def test_get_withdrawal_history_resp_model(self): common_response = RestResponse.from_json(data) resp = GetWithdrawalHistoryResp.from_dict(common_response.data) + def test_get_withdrawal_history_by_id_req_model(self): + """ + get_withdrawal_history_by_id + Get Withdrawal History By ID + /api/v1/withdrawals/{withdrawalId} + """ + data = "{\"withdrawalId\": \"67e6515f7960ba0007b42025\"}" + req = GetWithdrawalHistoryByIdReq.from_json(data) + + def test_get_withdrawal_history_by_id_resp_model(self): + """ + get_withdrawal_history_by_id + Get Withdrawal History By ID + /api/v1/withdrawals/{withdrawalId} + """ + data = "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"67e6515f7960ba0007b42025\",\n \"uid\": 165111215,\n \"currency\": \"USDT\",\n \"chainId\": \"trx\",\n \"chainName\": \"TRC20\",\n \"currencyName\": \"USDT\",\n \"status\": \"SUCCESS\",\n \"failureReason\": \"\",\n \"failureReasonMsg\": null,\n \"address\": \"TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"3.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"addressRemark\": null,\n \"remark\": \"this is Remark\",\n \"createdAt\": 1743147359000,\n \"cancelType\": \"NON_CANCELABLE\",\n \"taxes\": null,\n \"taxDescription\": null,\n \"returnStatus\": \"NOT_RETURN\",\n \"returnAmount\": null,\n \"returnCurrency\": \"KCS\"\n }\n}" + common_response = RestResponse.from_json(data) + resp = GetWithdrawalHistoryByIdResp.from_dict(common_response.data) + def test_get_withdrawal_history_old_req_model(self): """ get_withdrawal_history_old diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_by_id_req.py b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_by_id_req.py new file mode 100644 index 00000000..45fc23ed --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_by_id_req.py @@ -0,0 +1,80 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class GetWithdrawalHistoryByIdReq(BaseModel): + """ + GetWithdrawalHistoryByIdReq + + Attributes: + withdrawal_id (str): withdrawal ID + """ + + withdrawal_id: Optional[str] = Field(default=None, + path_variable="True", + description="withdrawal ID", + alias="withdrawalId") + + __properties: ClassVar[List[str]] = ["withdrawalId"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetWithdrawalHistoryByIdReq]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[GetWithdrawalHistoryByIdReq]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({"withdrawalId": obj.get("withdrawalId")}) + return _obj + + +class GetWithdrawalHistoryByIdReqBuilder: + + def __init__(self): + self.obj = {} + + def set_withdrawal_id(self, + value: str) -> GetWithdrawalHistoryByIdReqBuilder: + """ + withdrawal ID + """ + self.obj['withdrawalId'] = value + return self + + def build(self) -> GetWithdrawalHistoryByIdReq: + return GetWithdrawalHistoryByIdReq(**self.obj) diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_by_id_resp.py b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_by_id_resp.py new file mode 100644 index 00000000..4fa9acab --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_by_id_resp.py @@ -0,0 +1,235 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from enum import Enum +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from kucoin_universal_sdk.internal.interfaces.response import Response +from kucoin_universal_sdk.model.common import RestResponse + + +class GetWithdrawalHistoryByIdResp(BaseModel, Response): + """ + GetWithdrawalHistoryByIdResp + + Attributes: + id (str): Unique ID + uid (int): User ID + currency (str): A unique currency code that will never change + chain_id (str): The chain id of currency + chain_name (str): Chain name of currency + currency_name (str): Currency name; will change after renaming + status (str): Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE + failure_reason (str): Failure reason code + failure_reason_msg (str): Failure reason message + address (str): Withwrawal address + memo (str): Address remark. If there’s no remark, it is empty. + is_inner (bool): Internal withdrawal or not. + amount (str): Withwrawal amount + fee (str): Fees charged for withwrawal + wallet_tx_id (str): Wallet Transaction ID + address_remark (str): Address remark + remark (str): Remark + created_at (int): Creation Time (milliseconds) + cancel_type (CancelTypeEnum): + taxes (list[str]): Users in some regions need query this field + tax_description (str): Tax description + return_status (ReturnStatusEnum): Return status + return_amount (str): Return amount + return_currency (str): Return currency + """ + + class CancelTypeEnum(Enum): + """ + Attributes: + CANCELABLE: Cancellable + CANCELING: Cancelling + NON_CANCELABLE: Non-Cancellable + """ + CANCELABLE = 'CANCELABLE' + CANCELING = 'CANCELING' + NON_CANCELABLE = 'NON_CANCELABLE' + + class ReturnStatusEnum(Enum): + """ + Attributes: + NOT_RETURN: No returned + PROCESSING: To be returned + SUCCESS: Returned + """ + NOT_RETURN = 'NOT_RETURN' + PROCESSING = 'PROCESSING' + SUCCESS = 'SUCCESS' + + common_response: Optional[RestResponse] = Field( + default=None, description="Common response") + id: Optional[str] = Field(default=None, description="Unique ID") + uid: Optional[int] = Field(default=None, description="User ID") + currency: Optional[str] = Field( + default=None, + description="A unique currency code that will never change") + chain_id: Optional[str] = Field(default=None, + description="The chain id of currency", + alias="chainId") + chain_name: Optional[str] = Field(default=None, + description="Chain name of currency", + alias="chainName") + currency_name: Optional[str] = Field( + default=None, + description="Currency name; will change after renaming", + alias="currencyName") + status: Optional[str] = Field( + default=None, + description= + "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE" + ) + failure_reason: Optional[str] = Field(default=None, + description="Failure reason code", + alias="failureReason") + failure_reason_msg: Optional[str] = Field( + default=None, + description="Failure reason message", + alias="failureReasonMsg") + address: Optional[str] = Field(default=None, + description="Withwrawal address") + memo: Optional[str] = Field( + default=None, + description="Address remark. If there’s no remark, it is empty. ") + is_inner: Optional[bool] = Field( + default=None, + description="Internal withdrawal or not. ", + alias="isInner") + amount: Optional[str] = Field(default=None, + description="Withwrawal amount") + fee: Optional[str] = Field(default=None, + description="Fees charged for withwrawal") + wallet_tx_id: Optional[str] = Field(default=None, + description="Wallet Transaction ID", + alias="walletTxId") + address_remark: Optional[str] = Field(default=None, + description="Address remark", + alias="addressRemark") + remark: Optional[str] = Field(default=None, description="Remark") + created_at: Optional[int] = Field( + default=None, + description="Creation Time (milliseconds)", + alias="createdAt") + cancel_type: Optional[CancelTypeEnum] = Field(default=None, + alias="cancelType") + taxes: Optional[List[str]] = Field( + default=None, + description="Users in some regions need query this field") + tax_description: Optional[str] = Field(default=None, + description="Tax description", + alias="taxDescription") + return_status: Optional[ReturnStatusEnum] = Field( + default=None, description="Return status", alias="returnStatus") + return_amount: Optional[str] = Field(default=None, + description="Return amount", + alias="returnAmount") + return_currency: Optional[str] = Field(default=None, + description="Return currency", + alias="returnCurrency") + + __properties: ClassVar[List[str]] = [ + "id", "uid", "currency", "chainId", "chainName", "currencyName", + "status", "failureReason", "failureReasonMsg", "address", "memo", + "isInner", "amount", "fee", "walletTxId", "addressRemark", "remark", + "createdAt", "cancelType", "taxes", "taxDescription", "returnStatus", + "returnAmount", "returnCurrency" + ] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, + json_str: str) -> Optional[GetWithdrawalHistoryByIdResp]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[GetWithdrawalHistoryByIdResp]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "id": + obj.get("id"), + "uid": + obj.get("uid"), + "currency": + obj.get("currency"), + "chainId": + obj.get("chainId"), + "chainName": + obj.get("chainName"), + "currencyName": + obj.get("currencyName"), + "status": + obj.get("status"), + "failureReason": + obj.get("failureReason"), + "failureReasonMsg": + obj.get("failureReasonMsg"), + "address": + obj.get("address"), + "memo": + obj.get("memo"), + "isInner": + obj.get("isInner"), + "amount": + obj.get("amount"), + "fee": + obj.get("fee"), + "walletTxId": + obj.get("walletTxId"), + "addressRemark": + obj.get("addressRemark"), + "remark": + obj.get("remark"), + "createdAt": + obj.get("createdAt"), + "cancelType": + obj.get("cancelType"), + "taxes": + obj.get("taxes"), + "taxDescription": + obj.get("taxDescription"), + "returnStatus": + obj.get("returnStatus"), + "returnAmount": + obj.get("returnAmount"), + "returnCurrency": + obj.get("returnCurrency") + }) + return _obj + + def set_common_response(self, response: RestResponse): + self.common_response = response diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_items.py b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_items.py index 760fb9bf..c1185f5e 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_items.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_get_withdrawal_history_items.py @@ -18,14 +18,14 @@ class GetWithdrawalHistoryItems(BaseModel): Attributes: id (str): Unique ID currency (str): Currency - chain (str): The id of currency + chain (str): The chain id of currency status (StatusEnum): Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE - address (str): Deposit address + address (str): Withwrawal address memo (str): Address remark. If there’s no remark, it is empty. is_inner (bool): Internal deposit or not - amount (str): Deposit amount - fee (str): Fees charged for deposit - wallet_tx_id (str): Wallet Txid + amount (str): Withwrawal amount + fee (str): Fees charged for withwrawal + wallet_tx_id (str): Wallet Txid, If this is an internal withdrawal, it is empty. created_at (int): Database record creation time updated_at (int): Update time of the database record remark (str): Remark @@ -34,11 +34,11 @@ class GetWithdrawalHistoryItems(BaseModel): class StatusEnum(Enum): """ Attributes: - REVIEW: - PROCESSING: - WALLET_PROCESSING: - FAILURE: - SUCCESS: + REVIEW: REVIEW + PROCESSING: PROCESSING + WALLET_PROCESSING: WALLET_PROCESSING + FAILURE: FAILURE + SUCCESS: SUCCESS """ REVIEW = 'REVIEW' PROCESSING = 'PROCESSING' @@ -49,25 +49,29 @@ class StatusEnum(Enum): id: Optional[str] = Field(default=None, description="Unique ID") currency: Optional[str] = Field(default=None, description="Currency") chain: Optional[str] = Field(default=None, - description="The id of currency") + description="The chain id of currency") status: Optional[StatusEnum] = Field( default=None, description= "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE" ) - address: Optional[str] = Field(default=None, description="Deposit address") + address: Optional[str] = Field(default=None, + description="Withwrawal address") memo: Optional[str] = Field( default=None, description="Address remark. If there’s no remark, it is empty. ") is_inner: Optional[bool] = Field(default=None, description="Internal deposit or not", alias="isInner") - amount: Optional[str] = Field(default=None, description="Deposit amount") + amount: Optional[str] = Field(default=None, + description="Withwrawal amount") fee: Optional[str] = Field(default=None, - description="Fees charged for deposit") - wallet_tx_id: Optional[str] = Field(default=None, - description="Wallet Txid", - alias="walletTxId") + description="Fees charged for withwrawal") + wallet_tx_id: Optional[str] = Field( + default=None, + description= + "Wallet Txid, If this is an internal withdrawal, it is empty. ", + alias="walletTxId") created_at: Optional[int] = Field( default=None, description="Database record creation time", diff --git a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_withdrawal_v3_req.py b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_withdrawal_v3_req.py index 97a05a0f..92a5fc53 100644 --- a/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_withdrawal_v3_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/account/withdrawal/model_withdrawal_v3_req.py @@ -18,7 +18,7 @@ class WithdrawalV3Req(BaseModel): Attributes: currency (str): currency chain (str): The chainId of currency, For a currency with multiple chains, it is recommended to specify the chain parameter instead of using the default chain; you can query the chainId through the response of the GET /api/v3/currencies/{currency} interface. - amount (int): Withdrawal amount, a positive number which is a multiple of the amount precision + amount (str): Withdrawal amount, a positive number which is a multiple of the amount precision memo (str): Address remark. If there’s no remark, it is empty. When you withdraw from other platforms to KuCoin, you need to fill in memo(tag). Be careful: If you do not fill in memo(tag), your deposit may not be available. is_inner (bool): Internal withdrawal or not. Default: False remark (str): Remark @@ -46,7 +46,7 @@ class WithdrawTypeEnum(Enum): description= "The chainId of currency, For a currency with multiple chains, it is recommended to specify the chain parameter instead of using the default chain; you can query the chainId through the response of the GET /api/v3/currencies/{currency} interface." ) - amount: Optional[int] = Field( + amount: Optional[str] = Field( default=None, description= "Withdrawal amount, a positive number which is a multiple of the amount precision" @@ -154,7 +154,7 @@ def set_chain(self, value: str) -> WithdrawalV3ReqBuilder: self.obj['chain'] = value return self - def set_amount(self, value: int) -> WithdrawalV3ReqBuilder: + def set_amount(self, value: str) -> WithdrawalV3ReqBuilder: """ Withdrawal amount, a positive number which is a multiple of the amount precision """ diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/__init__.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/__init__.py index d9d28c41..5e0ff4dd 100644 --- a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/__init__.py +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/__init__.py @@ -17,6 +17,14 @@ from .model_get_deposit_list_req import GetDepositListReq from .model_get_deposit_list_req import GetDepositListReqBuilder from .model_get_deposit_list_resp import GetDepositListResp +from .model_get_kyc_status_data import GetKycStatusData +from .model_get_kyc_status_list_items import GetKycStatusListItems +from .model_get_kyc_status_list_req import GetKycStatusListReq +from .model_get_kyc_status_list_req import GetKycStatusListReqBuilder +from .model_get_kyc_status_list_resp import GetKycStatusListResp +from .model_get_kyc_status_req import GetKycStatusReq +from .model_get_kyc_status_req import GetKycStatusReqBuilder +from .model_get_kyc_status_resp import GetKycStatusResp from .model_get_rebase_req import GetRebaseReq from .model_get_rebase_req import GetRebaseReqBuilder from .model_get_rebase_resp import GetRebaseResp @@ -37,6 +45,9 @@ from .model_modify_sub_account_api_req import ModifySubAccountApiReq from .model_modify_sub_account_api_req import ModifySubAccountApiReqBuilder from .model_modify_sub_account_api_resp import ModifySubAccountApiResp +from .model_submit_kyc_req import SubmitKycReq +from .model_submit_kyc_req import SubmitKycReqBuilder +from .model_submit_kyc_resp import SubmitKycResp from .model_transfer_req import TransferReq from .model_transfer_req import TransferReqBuilder from .model_transfer_resp import TransferResp diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.py index bf56a416..a445c66d 100644 --- a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.py +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.py @@ -15,6 +15,10 @@ from .model_get_deposit_detail_resp import GetDepositDetailResp from .model_get_deposit_list_req import GetDepositListReq from .model_get_deposit_list_resp import GetDepositListResp +from .model_get_kyc_status_list_req import GetKycStatusListReq +from .model_get_kyc_status_list_resp import GetKycStatusListResp +from .model_get_kyc_status_req import GetKycStatusReq +from .model_get_kyc_status_resp import GetKycStatusResp from .model_get_rebase_req import GetRebaseReq from .model_get_rebase_resp import GetRebaseResp from .model_get_sub_account_api_req import GetSubAccountApiReq @@ -27,12 +31,70 @@ from .model_get_withdraw_detail_resp import GetWithdrawDetailResp from .model_modify_sub_account_api_req import ModifySubAccountApiReq from .model_modify_sub_account_api_resp import ModifySubAccountApiResp +from .model_submit_kyc_req import SubmitKycReq +from .model_submit_kyc_resp import SubmitKycResp from .model_transfer_req import TransferReq from .model_transfer_resp import TransferResp class NDBrokerAPI(ABC): + @abstractmethod + def submit_kyc(self, req: SubmitKycReq, **kwargs: Any) -> SubmitKycResp: + """ + summary: Submit KYC + description: This endpointcan submit kyc information for a sub-account of nd broker + documentation: https://www.kucoin.com/docs-new/api-3472406 + +-----------------------+---------+ + | Extra API Info | Value | + +-----------------------+---------+ + | API-DOMAIN | BROKER | + | API-CHANNEL | PRIVATE | + | API-PERMISSION | GENERAL | + | API-RATE-LIMIT-POOL | BROKER | + | API-RATE-LIMIT-WEIGHT | NULL | + +-----------------------+---------+ + """ + pass + + @abstractmethod + def get_kyc_status(self, req: GetKycStatusReq, + **kwargs: Any) -> GetKycStatusResp: + """ + summary: Get KYC Status + description: This endpoint can query the specified Kyc status + documentation: https://www.kucoin.com/docs-new/api-3472407 + +-----------------------+---------+ + | Extra API Info | Value | + +-----------------------+---------+ + | API-DOMAIN | BROKER | + | API-CHANNEL | PRIVATE | + | API-PERMISSION | GENERAL | + | API-RATE-LIMIT-POOL | BROKER | + | API-RATE-LIMIT-WEIGHT | NULL | + +-----------------------+---------+ + """ + pass + + @abstractmethod + def get_kyc_status_list(self, req: GetKycStatusListReq, + **kwargs: Any) -> GetKycStatusListResp: + """ + summary: Get KYC Status List + description: This endpoint can query the specified Kyc status list + documentation: https://www.kucoin.com/docs-new/api-3472408 + +-----------------------+---------+ + | Extra API Info | Value | + +-----------------------+---------+ + | API-DOMAIN | BROKER | + | API-CHANNEL | PRIVATE | + | API-PERMISSION | GENERAL | + | API-RATE-LIMIT-POOL | BROKER | + | API-RATE-LIMIT-WEIGHT | NULL | + +-----------------------+---------+ + """ + pass + @abstractmethod def get_broker_info(self, req: GetBrokerInfoReq, **kwargs: Any) -> GetBrokerInfoResp: @@ -284,6 +346,23 @@ class NDBrokerAPIImpl(NDBrokerAPI): def __init__(self, transport: Transport): self.transport = transport + def submit_kyc(self, req: SubmitKycReq, **kwargs: Any) -> SubmitKycResp: + return self.transport.call("broker", True, "POST", + "/api/kyc/ndBroker/proxyClient/submit", req, + SubmitKycResp(), False, **kwargs) + + def get_kyc_status(self, req: GetKycStatusReq, + **kwargs: Any) -> GetKycStatusResp: + return self.transport.call( + "broker", True, "GET", "/api/kyc/ndBroker/proxyClient/status/list", + req, GetKycStatusResp(), False, **kwargs) + + def get_kyc_status_list(self, req: GetKycStatusListReq, + **kwargs: Any) -> GetKycStatusListResp: + return self.transport.call( + "broker", True, "GET", "/api/kyc/ndBroker/proxyClient/status/page", + req, GetKycStatusListResp(), False, **kwargs) + def get_broker_info(self, req: GetBrokerInfoReq, **kwargs: Any) -> GetBrokerInfoResp: return self.transport.call("broker", True, "GET", diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.template b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.template index 960c1552..4bdf50a8 100644 --- a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.template +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker.template @@ -1,6 +1,63 @@ # API FUNCTION TEMPLATE +def test_submit_kyc_req(self): + """ + submit_kyc + Submit KYC + /api/kyc/ndBroker/proxyClient/submit + """ + + builder = SubmitKycReqBuilder() + builder.set_client_uid(?).set_first_name(?).set_last_name(?).set_issue_country(?).set_birth_date(?).set_identity_type(?).set_identity_number(?).set_expire_date(?).set_front_photo(?).set_backend_photo(?).set_face_photo(?) + req = builder.build() + try: + resp = self.api.submit_kyc(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + +def test_get_kyc_status_req(self): + """ + get_kyc_status + Get KYC Status + /api/kyc/ndBroker/proxyClient/status/list + """ + + builder = GetKycStatusReqBuilder() + builder.set_client_uids(?) + req = builder.build() + try: + resp = self.api.get_kyc_status(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + +def test_get_kyc_status_list_req(self): + """ + get_kyc_status_list + Get KYC Status List + /api/kyc/ndBroker/proxyClient/status/page + """ + + builder = GetKycStatusListReqBuilder() + builder.set_page_number(?).set_page_size(?) + req = builder.build() + try: + resp = self.api.get_kyc_status_list(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + def test_get_broker_info_req(self): """ get_broker_info diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker_test.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker_test.py index 087a099a..5b1a3626 100644 --- a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/api_nd_broker_test.py @@ -11,6 +11,10 @@ from .model_get_deposit_detail_resp import GetDepositDetailResp from .model_get_deposit_list_req import GetDepositListReq from .model_get_deposit_list_resp import GetDepositListResp +from .model_get_kyc_status_list_req import GetKycStatusListReq +from .model_get_kyc_status_list_resp import GetKycStatusListResp +from .model_get_kyc_status_req import GetKycStatusReq +from .model_get_kyc_status_resp import GetKycStatusResp from .model_get_rebase_req import GetRebaseReq from .model_get_rebase_resp import GetRebaseResp from .model_get_sub_account_api_req import GetSubAccountApiReq @@ -23,6 +27,8 @@ from .model_get_withdraw_detail_resp import GetWithdrawDetailResp from .model_modify_sub_account_api_req import ModifySubAccountApiReq from .model_modify_sub_account_api_resp import ModifySubAccountApiResp +from .model_submit_kyc_req import SubmitKycReq +from .model_submit_kyc_resp import SubmitKycResp from .model_transfer_req import TransferReq from .model_transfer_resp import TransferResp from kucoin_universal_sdk.model.common import RestResponse @@ -30,6 +36,63 @@ class NDBrokerAPITest(unittest.TestCase): + def test_submit_kyc_req_model(self): + """ + submit_kyc + Submit KYC + /api/kyc/ndBroker/proxyClient/submit + """ + data = "{\"clientUid\": \"226383154\", \"firstName\": \"Kaylah\", \"lastName\": \"Padberg\", \"issueCountry\": \"JP\", \"birthDate\": \"2000-01-01\", \"expireDate\": \"2030-01-01\", \"identityType\": \"passport\", \"identityNumber\": \"55\", \"facePhoto\": \"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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\", \"frontPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\", \"backendPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\"}" + req = SubmitKycReq.from_json(data) + + def test_submit_kyc_resp_model(self): + """ + submit_kyc + Submit KYC + /api/kyc/ndBroker/proxyClient/submit + """ + data = "{\"code\":\"200000\",\"data\":null}" + common_response = RestResponse.from_json(data) + resp = SubmitKycResp.from_dict(common_response.data) + + def test_get_kyc_status_req_model(self): + """ + get_kyc_status + Get KYC Status + /api/kyc/ndBroker/proxyClient/status/list + """ + data = "{\"clientUids\": \"226383154\"}" + req = GetKycStatusReq.from_json(data) + + def test_get_kyc_status_resp_model(self): + """ + get_kyc_status + Get KYC Status + /api/kyc/ndBroker/proxyClient/status/list + """ + data = "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n }\n ]\n}" + common_response = RestResponse.from_json(data) + resp = GetKycStatusResp.from_dict(common_response.data) + + def test_get_kyc_status_list_req_model(self): + """ + get_kyc_status_list + Get KYC Status List + /api/kyc/ndBroker/proxyClient/status/page + """ + data = "{\"pageNumber\": 1, \"pageSize\": 100}" + req = GetKycStatusListReq.from_json(data) + + def test_get_kyc_status_list_resp_model(self): + """ + get_kyc_status_list + Get KYC Status List + /api/kyc/ndBroker/proxyClient/status/page + """ + data = "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 100,\n \"totalNum\": 9,\n \"totalPage\": 1,\n \"items\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n },\n {\n \"clientUid\": 232772137,\n \"status\": \"REJECT\",\n \"rejectReason\": \"frontPhoto:Picture is not clear/covered/incomplete\"\n }\n ]\n }\n}" + common_response = RestResponse.from_json(data) + resp = GetKycStatusListResp.from_dict(common_response.data) + def test_get_broker_info_req_model(self): """ get_broker_info diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_data.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_data.py new file mode 100644 index 00000000..f0b21cfe --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_data.py @@ -0,0 +1,85 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from enum import Enum +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class GetKycStatusData(BaseModel): + """ + GetKycStatusData + + Attributes: + client_uid (int): client uid + status (StatusEnum): KYC status + reject_reason (str): Reject Reason + """ + + class StatusEnum(Enum): + """ + Attributes: + NONE_: KYC information not submitted + PROCESS: In progress + PASS_: Passed + REJECT: Rejected + """ + NONE_ = 'NONE' + PROCESS = 'PROCESS' + PASS_ = 'PASS' + REJECT = 'REJECT' + + client_uid: Optional[int] = Field(default=None, + description="client uid", + alias="clientUid") + status: Optional[StatusEnum] = Field(default=None, + description="KYC status") + reject_reason: Optional[str] = Field(default=None, + description="Reject Reason", + alias="rejectReason") + + __properties: ClassVar[List[str]] = ["clientUid", "status", "rejectReason"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetKycStatusData]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, + Any]]) -> Optional[GetKycStatusData]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "clientUid": obj.get("clientUid"), + "status": obj.get("status"), + "rejectReason": obj.get("rejectReason") + }) + return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_items.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_items.py new file mode 100644 index 00000000..c76cf587 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_items.py @@ -0,0 +1,86 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from enum import Enum +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class GetKycStatusListItems(BaseModel): + """ + GetKycStatusListItems + + Attributes: + client_uid (int): client uid + status (StatusEnum): KYC status + reject_reason (str): Reject Reason + """ + + class StatusEnum(Enum): + """ + Attributes: + NONE_: KYC information not submitted + PROCESS: In progress + PASS_: Passed + REJECT: Rejected + """ + NONE_ = 'NONE' + PROCESS = 'PROCESS' + PASS_ = 'PASS' + REJECT = 'REJECT' + + client_uid: Optional[int] = Field(default=None, + description="client uid", + alias="clientUid") + status: Optional[StatusEnum] = Field(default=None, + description="KYC status") + reject_reason: Optional[str] = Field(default=None, + description="Reject Reason", + alias="rejectReason") + + __properties: ClassVar[List[str]] = ["clientUid", "status", "rejectReason"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetKycStatusListItems]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, obj: Optional[Dict[str, + Any]]) -> Optional[GetKycStatusListItems]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "clientUid": obj.get("clientUid"), + "status": obj.get("status"), + "rejectReason": obj.get("rejectReason") + }) + return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_req.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_req.py new file mode 100644 index 00000000..c58fcec5 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_req.py @@ -0,0 +1,93 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class GetKycStatusListReq(BaseModel): + """ + GetKycStatusListReq + + Attributes: + page_number (int): Page Number + page_size (int): Page Size + """ + + page_number: Optional[int] = Field(default=1, + description="Page Number", + alias="pageNumber") + page_size: Optional[int] = Field(default=100, + description="Page Size", + alias="pageSize") + + __properties: ClassVar[List[str]] = ["pageNumber", "pageSize"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetKycStatusListReq]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, obj: Optional[Dict[str, + Any]]) -> Optional[GetKycStatusListReq]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "pageNumber": + obj.get("pageNumber") if obj.get("pageNumber") is not None else 1, + "pageSize": + obj.get("pageSize") if obj.get("pageSize") is not None else 100 + }) + return _obj + + +class GetKycStatusListReqBuilder: + + def __init__(self): + self.obj = {} + + def set_page_number(self, value: int) -> GetKycStatusListReqBuilder: + """ + Page Number + """ + self.obj['pageNumber'] = value + return self + + def set_page_size(self, value: int) -> GetKycStatusListReqBuilder: + """ + Page Size + """ + self.obj['pageSize'] = value + return self + + def build(self) -> GetKycStatusListReq: + return GetKycStatusListReq(**self.obj) diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_resp.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_resp.py new file mode 100644 index 00000000..6cd01eab --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_list_resp.py @@ -0,0 +1,96 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from .model_get_kyc_status_list_items import GetKycStatusListItems +from kucoin_universal_sdk.internal.interfaces.response import Response +from kucoin_universal_sdk.model.common import RestResponse + + +class GetKycStatusListResp(BaseModel, Response): + """ + GetKycStatusListResp + + Attributes: + current_page (int): + page_size (int): + total_num (int): + total_page (int): + items (list[GetKycStatusListItems]): + """ + + common_response: Optional[RestResponse] = Field( + default=None, description="Common response") + current_page: Optional[int] = Field(default=None, alias="currentPage") + page_size: Optional[int] = Field(default=None, alias="pageSize") + total_num: Optional[int] = Field(default=None, alias="totalNum") + total_page: Optional[int] = Field(default=None, alias="totalPage") + items: Optional[List[GetKycStatusListItems]] = None + + __properties: ClassVar[List[str]] = [ + "currentPage", "pageSize", "totalNum", "totalPage", "items" + ] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetKycStatusListResp]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in items (list) + _items = [] + if self.items: + for _item_items in self.items: + if _item_items: + _items.append(_item_items.to_dict()) + _dict['items'] = _items + return _dict + + @classmethod + def from_dict( + cls, obj: Optional[Dict[str, + Any]]) -> Optional[GetKycStatusListResp]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "currentPage": + obj.get("currentPage"), + "pageSize": + obj.get("pageSize"), + "totalNum": + obj.get("totalNum"), + "totalPage": + obj.get("totalPage"), + "items": + [GetKycStatusListItems.from_dict(_item) for _item in obj["items"]] + if obj.get("items") is not None else None + }) + return _obj + + def set_common_response(self, response: RestResponse): + self.common_response = response diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_req.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_req.py new file mode 100644 index 00000000..c93055e0 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_req.py @@ -0,0 +1,77 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class GetKycStatusReq(BaseModel): + """ + GetKycStatusReq + + Attributes: + client_uids (str): Client uid, Use commas to separate multiple UIDs + """ + + client_uids: Optional[str] = Field( + default=None, + description="Client uid, Use commas to separate multiple UIDs ", + alias="clientUids") + + __properties: ClassVar[List[str]] = ["clientUids"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetKycStatusReq]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, + Any]]) -> Optional[GetKycStatusReq]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({"clientUids": obj.get("clientUids")}) + return _obj + + +class GetKycStatusReqBuilder: + + def __init__(self): + self.obj = {} + + def set_client_uids(self, value: str) -> GetKycStatusReqBuilder: + """ + Client uid, Use commas to separate multiple UIDs + """ + self.obj['clientUids'] = value + return self + + def build(self) -> GetKycStatusReq: + return GetKycStatusReq(**self.obj) diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_resp.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_resp.py new file mode 100644 index 00000000..fb663545 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_get_kyc_status_resp.py @@ -0,0 +1,80 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from .model_get_kyc_status_data import GetKycStatusData +from kucoin_universal_sdk.internal.interfaces.response import Response +from kucoin_universal_sdk.model.common import RestResponse + + +class GetKycStatusResp(BaseModel, Response): + """ + GetKycStatusResp + + Attributes: + data (list[GetKycStatusData]): + """ + + common_response: Optional[RestResponse] = Field( + default=None, description="Common response") + data: Optional[List[GetKycStatusData]] = None + + __properties: ClassVar[List[str]] = ["data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetKycStatusResp]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in data (list) + _items = [] + if self.data: + for _item_data in self.data: + if _item_data: + _items.append(_item_data.to_dict()) + _dict['data'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, + Any]]) -> Optional[GetKycStatusResp]: + if obj is None: + return None + + # original response + obj = {'data': obj} + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "data": + [GetKycStatusData.from_dict(_item) + for _item in obj["data"]] if obj.get("data") is not None else None + }) + return _obj + + def set_common_response(self, response: RestResponse): + self.common_response = response diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_submit_kyc_req.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_submit_kyc_req.py new file mode 100644 index 00000000..7eb65fe1 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_submit_kyc_req.py @@ -0,0 +1,224 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from enum import Enum +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class SubmitKycReq(BaseModel): + """ + SubmitKycReq + + Attributes: + client_uid (str): client uid + first_name (str): first Name + last_name (str): last Name + issue_country (str): ISO country code + birth_date (str): Birth Date + identity_type (IdentityTypeEnum): Identity type + identity_number (str): Identity Number + expire_date (str): expire Date. If there is no expiration date, please fill in: 2099-01-01 + front_photo (str): **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + backend_photo (str): **Optional when identityType=passport/bvn,** Back photo of ID, same as above + face_photo (str): Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + """ + + class IdentityTypeEnum(Enum): + """ + Attributes: + IDCARD: id card + DRIVINGLICENSE: driving license + PASSPORT: passport + BVN: bvn + """ + IDCARD = 'idcard' + DRIVINGLICENSE = 'drivinglicense' + PASSPORT = 'passport' + BVN = 'bvn' + + client_uid: Optional[str] = Field(default=None, + description="client uid", + alias="clientUid") + first_name: Optional[str] = Field(default=None, + description="first Name", + alias="firstName") + last_name: Optional[str] = Field(default=None, + description="last Name", + alias="lastName") + issue_country: Optional[str] = Field(default=None, + description="ISO country code", + alias="issueCountry") + birth_date: Optional[str] = Field(default=None, + description="Birth Date", + alias="birthDate") + identity_type: Optional[IdentityTypeEnum] = Field( + default=None, description="Identity type", alias="identityType") + identity_number: Optional[str] = Field(default=None, + description="Identity Number", + alias="identityNumber") + expire_date: Optional[str] = Field( + default=None, + description= + "expire Date. If there is no expiration date, please fill in: 2099-01-01", + alias="expireDate") + front_photo: Optional[str] = Field( + default=None, + description= + "**Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + alias="frontPhoto") + backend_photo: Optional[str] = Field( + default=None, + description= + "**Optional when identityType=passport/bvn,** Back photo of ID, same as above", + alias="backendPhoto") + face_photo: Optional[str] = Field( + default=None, + description= + "Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + alias="facePhoto") + + __properties: ClassVar[List[str]] = [ + "clientUid", "firstName", "lastName", "issueCountry", "birthDate", + "identityType", "identityNumber", "expireDate", "frontPhoto", + "backendPhoto", "facePhoto" + ] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[SubmitKycReq]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, + Any]]) -> Optional[SubmitKycReq]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "clientUid": obj.get("clientUid"), + "firstName": obj.get("firstName"), + "lastName": obj.get("lastName"), + "issueCountry": obj.get("issueCountry"), + "birthDate": obj.get("birthDate"), + "identityType": obj.get("identityType"), + "identityNumber": obj.get("identityNumber"), + "expireDate": obj.get("expireDate"), + "frontPhoto": obj.get("frontPhoto"), + "backendPhoto": obj.get("backendPhoto"), + "facePhoto": obj.get("facePhoto") + }) + return _obj + + +class SubmitKycReqBuilder: + + def __init__(self): + self.obj = {} + + def set_client_uid(self, value: str) -> SubmitKycReqBuilder: + """ + client uid + """ + self.obj['clientUid'] = value + return self + + def set_first_name(self, value: str) -> SubmitKycReqBuilder: + """ + first Name + """ + self.obj['firstName'] = value + return self + + def set_last_name(self, value: str) -> SubmitKycReqBuilder: + """ + last Name + """ + self.obj['lastName'] = value + return self + + def set_issue_country(self, value: str) -> SubmitKycReqBuilder: + """ + ISO country code + """ + self.obj['issueCountry'] = value + return self + + def set_birth_date(self, value: str) -> SubmitKycReqBuilder: + """ + Birth Date + """ + self.obj['birthDate'] = value + return self + + def set_identity_type( + self, value: SubmitKycReq.IdentityTypeEnum) -> SubmitKycReqBuilder: + """ + Identity type + """ + self.obj['identityType'] = value + return self + + def set_identity_number(self, value: str) -> SubmitKycReqBuilder: + """ + Identity Number + """ + self.obj['identityNumber'] = value + return self + + def set_expire_date(self, value: str) -> SubmitKycReqBuilder: + """ + expire Date. If there is no expiration date, please fill in: 2099-01-01 + """ + self.obj['expireDate'] = value + return self + + def set_front_photo(self, value: str) -> SubmitKycReqBuilder: + """ + **Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + """ + self.obj['frontPhoto'] = value + return self + + def set_backend_photo(self, value: str) -> SubmitKycReqBuilder: + """ + **Optional when identityType=passport/bvn,** Back photo of ID, same as above + """ + self.obj['backendPhoto'] = value + return self + + def set_face_photo(self, value: str) -> SubmitKycReqBuilder: + """ + Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB + """ + self.obj['facePhoto'] = value + return self + + def build(self) -> SubmitKycReq: + return SubmitKycReq(**self.obj) diff --git a/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_submit_kyc_resp.py b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_submit_kyc_resp.py new file mode 100644 index 00000000..24264c22 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/broker/ndbroker/model_submit_kyc_resp.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from kucoin_universal_sdk.internal.interfaces.response import Response +from kucoin_universal_sdk.model.common import RestResponse + + +class SubmitKycResp(BaseModel, Response): + """ + SubmitKycResp + + Attributes: + data (str): + """ + + common_response: Optional[RestResponse] = Field( + default=None, description="Common response") + data: Optional[str] = None + + __properties: ClassVar[List[str]] = ["data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[SubmitKycResp]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, + Any]]) -> Optional[SubmitKycResp]: + if obj is None: + return None + + # original response + obj = {'data': obj} + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({"data": obj.get("data")}) + return _obj + + def set_common_response(self, response: RestResponse): + self.common_response = response diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.py b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.py index f54f5934..737cb257 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.py @@ -17,7 +17,7 @@ class FundingFeesAPI(ABC): def get_current_funding_rate(self, req: GetCurrentFundingRateReq, **kwargs: Any) -> GetCurrentFundingRateResp: """ - summary: Get Current Funding Rate. + summary: Get Current Funding Rate description: Get Current Funding Rate. documentation: https://www.kucoin.com/docs-new/api-3470265 +-----------------------+---------+ diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.template b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.template index 29075e19..f91fe4a1 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.template +++ b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees.template @@ -4,7 +4,7 @@ def test_get_current_funding_rate_req(self): """ get_current_funding_rate - Get Current Funding Rate. + Get Current Funding Rate /api/v1/funding-rate/{symbol}/current """ diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees_test.py b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees_test.py index 3948b3cf..0bef7b5b 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/api_funding_fees_test.py @@ -13,7 +13,7 @@ class FundingFeesAPITest(unittest.TestCase): def test_get_current_funding_rate_req_model(self): """ get_current_funding_rate - Get Current Funding Rate. + Get Current Funding Rate /api/v1/funding-rate/{symbol}/current """ data = "{\"symbol\": \"XBTUSDTM\"}" @@ -22,10 +22,10 @@ def test_get_current_funding_rate_req_model(self): def test_get_current_funding_rate_resp_model(self): """ get_current_funding_rate - Get Current Funding Rate. + Get Current Funding Rate /api/v1/funding-rate/{symbol}/current """ - data = "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1731441600000,\n \"value\": 6.41E-4,\n \"predictedValue\": 5.2E-5,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003\n }\n}" + data = "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \".XBTUSDTMFPI8H\",\n \"granularity\": 28800000,\n \"timePoint\": 1748462400000,\n \"value\": 6.1E-5,\n \"predictedValue\": 1.09E-4,\n \"fundingRateCap\": 0.003,\n \"fundingRateFloor\": -0.003,\n \"period\": 0,\n \"fundingTime\": 1748491200000\n }\n}" common_response = RestResponse.from_json(data) resp = GetCurrentFundingRateResp.from_dict(common_response.data) diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/model_get_current_funding_rate_resp.py b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/model_get_current_funding_rate_resp.py index e8bbb55d..54f7082b 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/model_get_current_funding_rate_resp.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/fundingfees/model_get_current_funding_rate_resp.py @@ -6,6 +6,7 @@ import pprint import json +from enum import Enum from pydantic import BaseModel, ConfigDict, Field from typing import Any, ClassVar, Dict, List, Optional from kucoin_universal_sdk.internal.interfaces.response import Response @@ -19,13 +20,24 @@ class GetCurrentFundingRateResp(BaseModel, Response): Attributes: symbol (str): Funding Rate Symbol granularity (int): Granularity (milliseconds) - time_point (int): The funding rate settlement time point of the previous cycle (milliseconds) + time_point (int): The funding rate settlement time point of the previous cycle (milliseconds) Before going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched. The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled. The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live. value (float): Current cycle funding rate predicted_value (float): Predicted funding rate funding_rate_cap (float): Maximum Funding Rate funding_rate_floor (float): Minimum Funding Rate + period (PeriodEnum): Indicates whether the current funding fee is charged within this cycle + funding_time (int): Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing. """ + class PeriodEnum(Enum): + """ + Attributes: + T_1: Indicates that funding will be charged in the current cycle + T_0: Indicates a cross-cycle expense record that is not charged in the current cycle. + """ + T_1 = 1 + T_0 = 0 + common_response: Optional[RestResponse] = Field( default=None, description="Common response") symbol: Optional[str] = Field(default=None, @@ -35,7 +47,7 @@ class GetCurrentFundingRateResp(BaseModel, Response): time_point: Optional[int] = Field( default=None, description= - "The funding rate settlement time point of the previous cycle (milliseconds) ", + "The funding rate settlement time point of the previous cycle (milliseconds) Before going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched. The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled. The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live. ", alias="timePoint") value: Optional[float] = Field(default=None, description="Current cycle funding rate ") @@ -51,10 +63,20 @@ class GetCurrentFundingRateResp(BaseModel, Response): default=None, description="Minimum Funding Rate", alias="fundingRateFloor") + period: Optional[PeriodEnum] = Field( + default=None, + description= + "Indicates whether the current funding fee is charged within this cycle" + ) + funding_time: Optional[int] = Field( + default=None, + description= + "Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing.", + alias="fundingTime") __properties: ClassVar[List[str]] = [ "symbol", "granularity", "timePoint", "value", "predictedValue", - "fundingRateCap", "fundingRateFloor" + "fundingRateCap", "fundingRateFloor", "period", "fundingTime" ] model_config = ConfigDict( @@ -105,7 +127,11 @@ def from_dict( "fundingRateCap": obj.get("fundingRateCap"), "fundingRateFloor": - obj.get("fundingRateFloor") + obj.get("fundingRateFloor"), + "period": + obj.get("period"), + "fundingTime": + obj.get("fundingTime") }) return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_order_event.py b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_order_event.py index 75f73379..b6095450 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_order_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_order_event.py @@ -25,13 +25,13 @@ class AllOrderEvent(BaseModel): order_id (str): The unique order id generated by the trading system margin_mode (MarginModeEnum): Margin Mode type (TypeEnum): Order Type - order_time (int): Order time (nanoseconds) + order_time (int): Gateway received the message time (milliseconds) size (str): User-specified order size filled_size (str): Cumulative number filled price (str): Price remain_size (str): Remain size status (StatusEnum): Order Status - ts (int): Push time (nanoseconds) + ts (int): Match engine received the message time (nanoseconds) liquidity (LiquidityEnum): Actual transaction order type, If the counterparty order is an [Hidden/Iceberg Order](https://www.kucoin.com/docs-new/doc-338146), even if it is a maker order, this param will be displayed as taker. For actual trading fee, please refer to the **feeType** fee_type (FeeTypeEnum): Actual Fee Type match_price (str): Match Price (when the type is \"match\") @@ -146,9 +146,10 @@ class TradeTypeEnum(Enum): description="Margin Mode", alias="marginMode") type: Optional[TypeEnum] = Field(default=None, description="Order Type") - order_time: Optional[int] = Field(default=None, - description="Order time (nanoseconds)", - alias="orderTime") + order_time: Optional[int] = Field( + default=None, + description="Gateway received the message time (milliseconds)", + alias="orderTime") size: Optional[str] = Field(default=None, description="User-specified order size") filled_size: Optional[str] = Field(default=None, @@ -160,8 +161,9 @@ class TradeTypeEnum(Enum): alias="remainSize") status: Optional[StatusEnum] = Field(default=None, description="Order Status") - ts: Optional[int] = Field(default=None, - description="Push time (nanoseconds)") + ts: Optional[int] = Field( + default=None, + description="Match engine received the message time (nanoseconds)") liquidity: Optional[LiquidityEnum] = Field( default=None, description= diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_position_event.py b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_position_event.py index 0a2a06ad..5b95c47a 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_position_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_all_position_event.py @@ -48,14 +48,14 @@ class AllPositionEvent(BaseModel): position_side (PositionSideEnum): Position Side leverage (float): Leverage auto_deposit (bool): Auto deposit margin or not **Only applicable to Isolated Margin** - maint_margin_req (float): Maintenance margin requirement **Only applicable to Isolated Margin** + maint_margin_req (float): Maintenance margin requirement risk_limit (int): Risk limit **Only applicable to Isolated Margin** real_leverage (float): Leverage of the order **Only applicable to Isolated Margin** pos_cross (float): Added margin **Only applicable to Isolated Margin** pos_comm (float): Bankruptcy cost **Only applicable to Isolated Margin** pos_loss (float): Funding fees paid out **Only applicable to Isolated Margin** pos_funding (float): The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** - pos_maint (float): Maintenance margin **Only applicable to Isolated Margin** + pos_maint (float): Maintenance margin maint_margin (float): Position margin **Only applicable to Isolated Margin** funding_time (int): Funding time qty (int): Position size @@ -199,8 +199,7 @@ class PositionSideEnum(Enum): alias="autoDeposit") maint_margin_req: Optional[float] = Field( default=None, - description= - "Maintenance margin requirement **Only applicable to Isolated Margin** ", + description="Maintenance margin requirement ", alias="maintMarginReq") risk_limit: Optional[int] = Field( default=None, @@ -229,11 +228,9 @@ class PositionSideEnum(Enum): description= "The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** ", alias="posFunding") - pos_maint: Optional[float] = Field( - default=None, - description= - "Maintenance margin **Only applicable to Isolated Margin** ", - alias="posMaint") + pos_maint: Optional[float] = Field(default=None, + description="Maintenance margin ", + alias="posMaint") maint_margin: Optional[float] = Field( default=None, description="Position margin **Only applicable to Isolated Margin** ", diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_cross_leverage_event.py b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_cross_leverage_event.py index eb7d5019..8262b16b 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_cross_leverage_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_cross_leverage_event.py @@ -64,6 +64,8 @@ def from_dict( if obj is None: return None + # original response + obj = {'data': obj} if not isinstance(obj, dict): return cls.model_validate(obj) diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_margin_mode_event.py b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_margin_mode_event.py index 691f9f93..78e607a8 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_margin_mode_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_margin_mode_event.py @@ -17,18 +17,17 @@ class MarginModeEvent(BaseModel): MarginModeEvent Attributes: - symbol (str): The SYMBOL is the key with value \"CROSS\" or \"ISOLATED\" + data (dict[str, str]): The SYMBOL is the key with value \"CROSS\" or \"ISOLATED\" """ common_response: Optional[WsMessage] = Field(default=None, description="Common response") - symbol: Optional[str] = Field( + data: Optional[Dict[str, str]] = Field( default=None, description= - "The SYMBOL is the key with value \"CROSS\" or \"ISOLATED\"", - alias="SYMBOL") + "The SYMBOL is the key with value \"CROSS\" or \"ISOLATED\"") - __properties: ClassVar[List[str]] = ["SYMBOL"] + __properties: ClassVar[List[str]] = ["data"] model_config = ConfigDict( populate_by_name=True, @@ -59,10 +58,12 @@ def from_dict(cls, obj: Optional[Dict[str, if obj is None: return None + # original response + obj = {'data': obj} if not isinstance(obj, dict): return cls.model_validate(obj) - _obj = cls.model_validate({"SYMBOL": obj.get("SYMBOL")}) + _obj = cls.model_validate({"data": obj.get("data")}) return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_order_event.py b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_order_event.py index 31dc4887..57c79549 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_order_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_order_event.py @@ -25,13 +25,13 @@ class OrderEvent(BaseModel): order_id (str): The unique order id generated by the trading system margin_mode (MarginModeEnum): Margin Mode type (TypeEnum): Order Type - order_time (int): Order time (nanoseconds) + order_time (int): Gateway received the message time (milliseconds) size (str): User-specified order size filled_size (str): Cumulative number filled price (str): Price remain_size (str): Remain size status (StatusEnum): Order Status - ts (int): Push time (nanoseconds) + ts (int): Match engine received the message time (nanoseconds) liquidity (LiquidityEnum): Actual transaction order type, If the counterparty order is an [Hidden/Iceberg Order](https://www.kucoin.com/docs-new/doc-338146), even if it is a maker order, this param will be displayed as taker. For actual trading fee, please refer to the **feeType** fee_type (FeeTypeEnum): Actual Fee Type match_price (str): Match Price (when the type is \"match\") @@ -146,9 +146,10 @@ class TradeTypeEnum(Enum): description="Margin Mode", alias="marginMode") type: Optional[TypeEnum] = Field(default=None, description="Order Type") - order_time: Optional[int] = Field(default=None, - description="Order time (nanoseconds)", - alias="orderTime") + order_time: Optional[int] = Field( + default=None, + description="Gateway received the message time (milliseconds)", + alias="orderTime") size: Optional[str] = Field(default=None, description="User-specified order size") filled_size: Optional[str] = Field(default=None, @@ -160,8 +161,9 @@ class TradeTypeEnum(Enum): alias="remainSize") status: Optional[StatusEnum] = Field(default=None, description="Order Status") - ts: Optional[int] = Field(default=None, - description="Push time (nanoseconds)") + ts: Optional[int] = Field( + default=None, + description="Match engine received the message time (nanoseconds)") liquidity: Optional[LiquidityEnum] = Field( default=None, description= diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_position_event.py b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_position_event.py index 13bf755a..10378e8c 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_position_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/futures_private/model_position_event.py @@ -48,14 +48,14 @@ class PositionEvent(BaseModel): position_side (PositionSideEnum): Position Side leverage (float): Leverage auto_deposit (bool): Auto deposit margin or not **Only applicable to Isolated Margin** - maint_margin_req (float): Maintenance margin requirement **Only applicable to Isolated Margin** + maint_margin_req (float): Maintenance margin requirement risk_limit (int): Risk limit **Only applicable to Isolated Margin** real_leverage (float): Leverage of the order **Only applicable to Isolated Margin** pos_cross (float): Added margin **Only applicable to Isolated Margin** pos_comm (float): Bankruptcy cost **Only applicable to Isolated Margin** pos_loss (float): Funding fees paid out **Only applicable to Isolated Margin** pos_funding (float): The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** - pos_maint (float): Maintenance margin **Only applicable to Isolated Margin** + pos_maint (float): Maintenance margin maint_margin (float): Position margin **Only applicable to Isolated Margin** funding_time (int): Funding time qty (int): Position size @@ -199,8 +199,7 @@ class PositionSideEnum(Enum): alias="autoDeposit") maint_margin_req: Optional[float] = Field( default=None, - description= - "Maintenance margin requirement **Only applicable to Isolated Margin** ", + description="Maintenance margin requirement ", alias="maintMarginReq") risk_limit: Optional[int] = Field( default=None, @@ -229,11 +228,9 @@ class PositionSideEnum(Enum): description= "The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** ", alias="posFunding") - pos_maint: Optional[float] = Field( - default=None, - description= - "Maintenance margin **Only applicable to Isolated Margin** ", - alias="posMaint") + pos_maint: Optional[float] = Field(default=None, + description="Maintenance margin", + alias="posMaint") maint_margin: Optional[float] = Field( default=None, description="Position margin **Only applicable to Isolated Margin** ", diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/api_order.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/api_order.py index 6ea86171..97af0877 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/api_order.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/api_order.py @@ -382,7 +382,7 @@ def cancel_all_orders_v1(self, req: CancelAllOrdersV1Req, | API-CHANNEL | PRIVATE | | API-PERMISSION | FUTURES | | API-RATE-LIMIT-POOL | FUTURES | - | API-RATE-LIMIT-WEIGHT | 200 | + | API-RATE-LIMIT-WEIGHT | 800 | +-----------------------+---------+ """ pass diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_client_oid_resp.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_client_oid_resp.py index e703588e..fa3d33ad 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_client_oid_resp.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_client_oid_resp.py @@ -28,7 +28,7 @@ class GetOrderByClientOidResp(BaseModel, Response): deal_value (str): Executed size of funds deal_size (int): Executed quantity stp (StpEnum): [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. DC not currently supported. - stop (str): Stop order type (stop limit or stop market) + stop (StopEnum): A mark to the stop order type stop_price_type (StopPriceTypeEnum): Trigger price type of stop orders stop_triggered (bool): Mark to show whether the stop order is triggered stop_price (float): Trigger price of stop orders @@ -89,18 +89,29 @@ class StpEnum(Enum): CO = 'CO' CB = 'CB' + class StopEnum(Enum): + """ + Attributes: + DOWN: Triggers when the price reaches or goes below the stopPrice. + UP: Triggers when the price reaches or goes above the stopPrice. + NONE_: Not a stop order + """ + DOWN = 'down' + UP = 'up' + NONE_ = '' + class StopPriceTypeEnum(Enum): """ Attributes: - NULL: None TRADE_PRICE: TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. MARK_PRICE: MP for mark price. The mark price can be obtained through relevant OPEN API for index services. INDEX_PRICE: IP for index price. The index price can be obtained through relevant OPEN API for index services. + NONE_: Not a stop order """ - NULL = '' TRADE_PRICE = 'TP' MARK_PRICE = 'MP' INDEX_PRICE = 'IP' + NONE_ = '' class MarginModeEnum(Enum): """ @@ -146,9 +157,8 @@ class StatusEnum(Enum): description= "[Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. DC not currently supported." ) - stop: Optional[str] = Field( - default=None, - description="Stop order type (stop limit or stop market) ") + stop: Optional[StopEnum] = Field( + default=None, description="A mark to the stop order type") stop_price_type: Optional[StopPriceTypeEnum] = Field( default=None, description="Trigger price type of stop orders", diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_order_id_resp.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_order_id_resp.py index 24e79a9d..7f56e982 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_order_id_resp.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_by_order_id_resp.py @@ -28,7 +28,7 @@ class GetOrderByOrderIdResp(BaseModel, Response): deal_value (str): Executed size of funds deal_size (int): Executed quantity stp (StpEnum): [Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. Not supported DC at the moment. - stop (str): Stop order type (stop limit or stop market) + stop (StopEnum): A mark to the stop order type stop_price_type (StopPriceTypeEnum): Trigger price type of stop orders stop_triggered (bool): Mark to show whether the stop order is triggered stop_price (float): Trigger price of stop orders @@ -89,18 +89,29 @@ class StpEnum(Enum): CO = 'CO' CB = 'CB' + class StopEnum(Enum): + """ + Attributes: + DOWN: Triggers when the price reaches or goes below the stopPrice. + UP: Triggers when the price reaches or goes above the stopPrice. + NONE_: Not a stop order + """ + DOWN = 'down' + UP = 'up' + NONE_ = '' + class StopPriceTypeEnum(Enum): """ Attributes: - NULL: TRADE_PRICE: TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. MARK_PRICE: MP for mark price, The mark price can be obtained through relevant OPEN API for index services INDEX_PRICE: IP for index price, The index price can be obtained through relevant OPEN API for index services + NONE_: Not a stop order """ - NULL = '' TRADE_PRICE = 'TP' MARK_PRICE = 'MP' INDEX_PRICE = 'IP' + NONE_ = '' class MarginModeEnum(Enum): """ @@ -146,9 +157,8 @@ class StatusEnum(Enum): description= "[Self Trade Prevention](https://www.kucoin.com/docs-new/doc-338146) is divided into these strategies: CN, CO, CB. Not supported DC at the moment." ) - stop: Optional[str] = Field( - default=None, - description="Stop order type (stop limit or stop market) ") + stop: Optional[StopEnum] = Field( + default=None, description="A mark to the stop order type") stop_price_type: Optional[StopPriceTypeEnum] = Field( default=None, description="Trigger price type of stop orders", diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_list_items.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_list_items.py index e1cde1fc..c3758796 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_list_items.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_order_list_items.py @@ -6,6 +6,7 @@ import pprint import json +from enum import Enum from pydantic import BaseModel, ConfigDict, Field from typing import Any, ClassVar, Dict, List, Optional @@ -25,8 +26,8 @@ class GetOrderListItems(BaseModel): deal_value (str): Executed size of funds deal_size (int): Executed quantity stp (str): self trade prevention - stop (str): Stop order type (stop limit or stop market) - stop_price_type (str): Trigger price type of stop orders + stop (StopEnum): A mark to the stop order type + stop_price_type (StopPriceTypeEnum): Trigger price type of stop orders stop_triggered (bool): Mark to show whether the stop order is triggered stop_price (int): Trigger price of stop orders time_in_force (str): Time in force policy type @@ -55,6 +56,30 @@ class GetOrderListItems(BaseModel): reduce_only (bool): A mark to reduce the position size only """ + class StopEnum(Enum): + """ + Attributes: + DOWN: Triggers when the price reaches or goes below the stopPrice. + UP: Triggers when the price reaches or goes above the stopPrice. + NONE_: Not a stop order + """ + DOWN = 'down' + UP = 'up' + NONE_ = '' + + class StopPriceTypeEnum(Enum): + """ + Attributes: + TRADE_PRICE: TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + MARK_PRICE: MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + INDEX_PRICE: IP for index price. The index price can be obtained through relevant OPEN API for index services. + NONE_: Not a stop order + """ + TRADE_PRICE = 'TP' + MARK_PRICE = 'MP' + INDEX_PRICE = 'IP' + NONE_ = '' + id: Optional[str] = Field(default=None, description="Order ID") symbol: Optional[str] = Field( default=None, @@ -75,10 +100,9 @@ class GetOrderListItems(BaseModel): alias="dealSize") stp: Optional[str] = Field(default=None, description="self trade prevention") - stop: Optional[str] = Field( - default=None, - description="Stop order type (stop limit or stop market)") - stop_price_type: Optional[str] = Field( + stop: Optional[StopEnum] = Field( + default=None, description="A mark to the stop order type") + stop_price_type: Optional[StopPriceTypeEnum] = Field( default=None, description="Trigger price type of stop orders", alias="stopPriceType") diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_closed_orders_data.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_closed_orders_data.py index 07e2b50d..934b42c6 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_closed_orders_data.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_closed_orders_data.py @@ -6,6 +6,7 @@ import pprint import json +from enum import Enum from pydantic import BaseModel, ConfigDict, Field from typing import Any, ClassVar, Dict, List, Optional @@ -25,8 +26,8 @@ class GetRecentClosedOrdersData(BaseModel): deal_value (str): Executed size of funds deal_size (int): Executed quantity stp (str): self trade prevention - stop (str): Stop order type (stop limit or stop market) - stop_price_type (str): Trigger price type of stop orders + stop (StopEnum): A mark to the stop order type + stop_price_type (StopPriceTypeEnum): Trigger price type of stop orders stop_triggered (bool): Mark to show whether the stop order is triggered stop_price (int): Trigger price of stop orders time_in_force (str): Time in force policy type @@ -55,6 +56,30 @@ class GetRecentClosedOrdersData(BaseModel): reduce_only (bool): A mark to reduce the position size only """ + class StopEnum(Enum): + """ + Attributes: + DOWN: Triggers when the price reaches or goes below the stopPrice. + UP: Triggers when the price reaches or goes above the stopPrice. + NONE_: Not a stop order + """ + DOWN = 'down' + UP = 'up' + NONE_ = '' + + class StopPriceTypeEnum(Enum): + """ + Attributes: + TRADE_PRICE: TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + MARK_PRICE: MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + INDEX_PRICE: IP for index price. The index price can be obtained through relevant OPEN API for index services. + NONE_: Not a stop order + """ + TRADE_PRICE = 'TP' + MARK_PRICE = 'MP' + INDEX_PRICE = 'IP' + NONE_ = '' + id: Optional[str] = Field(default=None, description="Order ID") symbol: Optional[str] = Field( default=None, @@ -75,12 +100,11 @@ class GetRecentClosedOrdersData(BaseModel): alias="dealSize") stp: Optional[str] = Field(default=None, description="self trade prevention") - stop: Optional[str] = Field( - default=None, - description="Stop order type (stop limit or stop market) ") - stop_price_type: Optional[str] = Field( + stop: Optional[StopEnum] = Field( + default=None, description="A mark to the stop order type") + stop_price_type: Optional[StopPriceTypeEnum] = Field( default=None, - description="Trigger price type of stop orders ", + description="Trigger price type of stop orders", alias="stopPriceType") stop_triggered: Optional[bool] = Field( default=None, diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_trade_history_data.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_trade_history_data.py index d710e18e..61987a42 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_trade_history_data.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_recent_trade_history_data.py @@ -27,7 +27,7 @@ class GetRecentTradeHistoryData(BaseModel): value (str): Order value open_fee_pay (str): Opening transaction fee close_fee_pay (str): Closing transaction fee - stop (str): A mark to the stop order type + stop (StopEnum): A mark to the stop order type fee_rate (str): Fee Rate fix_fee (str): Fixed fees (Deprecated field, no actual use of the value field) fee_currency (str): Charging currency @@ -60,6 +60,17 @@ class LiquidityEnum(Enum): TAKER = 'taker' MAKER = 'maker' + class StopEnum(Enum): + """ + Attributes: + DOWN: Triggers when the price reaches or goes below the stopPrice. + UP: Triggers when the price reaches or goes above the stopPrice. + NONE_: Not a stop order + """ + DOWN = 'down' + UP = 'up' + NONE_ = '' + class MarginModeEnum(Enum): """ Attributes: @@ -135,8 +146,8 @@ class TradeTypeEnum(Enum): default=None, description="Closing transaction fee ", alias="closeFeePay") - stop: Optional[str] = Field(default=None, - description="A mark to the stop order type ") + stop: Optional[StopEnum] = Field( + default=None, description="A mark to the stop order type") fee_rate: Optional[str] = Field(default=None, description="Fee Rate", alias="feeRate") diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_stop_order_list_items.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_stop_order_list_items.py index 583eeac6..1b459c10 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_stop_order_list_items.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_stop_order_list_items.py @@ -6,6 +6,7 @@ import pprint import json +from enum import Enum from pydantic import BaseModel, ConfigDict, Field from typing import Any, ClassVar, Dict, List, Optional @@ -25,8 +26,8 @@ class GetStopOrderListItems(BaseModel): deal_value (str): Executed size of funds deal_size (int): Executed quantity stp (str): self trade prevention - stop (str): Stop order type (stop limit or stop market) - stop_price_type (str): Trigger price type of stop orders + stop (StopEnum): A mark to the stop order type + stop_price_type (StopPriceTypeEnum): Trigger price type of stop orders stop_triggered (bool): Mark to show whether the stop order is triggered stop_price (str): Trigger price of stop orders time_in_force (str): Time in force policy type @@ -55,6 +56,30 @@ class GetStopOrderListItems(BaseModel): reduce_only (bool): A mark to reduce the position size only """ + class StopEnum(Enum): + """ + Attributes: + DOWN: Triggers when the price reaches or goes below the stopPrice. + UP: Triggers when the price reaches or goes above the stopPrice. + NONE_: Not a stop order + """ + DOWN = 'down' + UP = 'up' + NONE_ = '' + + class StopPriceTypeEnum(Enum): + """ + Attributes: + TRADE_PRICE: TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message. + MARK_PRICE: MP for mark price. The mark price can be obtained through relevant OPEN API for index services. + INDEX_PRICE: IP for index price. The index price can be obtained through relevant OPEN API for index services. + NONE_: Not a stop order + """ + TRADE_PRICE = 'TP' + MARK_PRICE = 'MP' + INDEX_PRICE = 'IP' + NONE_ = '' + id: Optional[str] = Field(default=None, description="Order ID") symbol: Optional[str] = Field( default=None, @@ -75,10 +100,9 @@ class GetStopOrderListItems(BaseModel): alias="dealSize") stp: Optional[str] = Field(default=None, description="self trade prevention") - stop: Optional[str] = Field( - default=None, - description="Stop order type (stop limit or stop market)") - stop_price_type: Optional[str] = Field( + stop: Optional[StopEnum] = Field( + default=None, description="A mark to the stop order type") + stop_price_type: Optional[StopPriceTypeEnum] = Field( default=None, description="Trigger price type of stop orders", alias="stopPriceType") diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_trade_history_items.py b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_trade_history_items.py index 93aeba1f..75b45fb3 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_trade_history_items.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/order/model_get_trade_history_items.py @@ -27,7 +27,7 @@ class GetTradeHistoryItems(BaseModel): value (str): Order value open_fee_pay (str): Opening transaction fee close_fee_pay (str): Closing transaction fee - stop (str): A mark to the stop order type + stop (StopEnum): A mark to the stop order type fee_rate (str): Fee Rate fix_fee (str): Fixed fees (Deprecated field, no actual use of the value field) fee_currency (str): Charging currency @@ -62,6 +62,17 @@ class LiquidityEnum(Enum): TAKER = 'taker' MAKER = 'maker' + class StopEnum(Enum): + """ + Attributes: + DOWN: Triggers when the price reaches or goes below the stopPrice. + UP: Triggers when the price reaches or goes above the stopPrice. + NONE_: Not a stop order + """ + DOWN = 'down' + UP = 'up' + NONE_ = '' + class MarginModeEnum(Enum): """ Attributes: @@ -134,8 +145,8 @@ class TradeTypeEnum(Enum): close_fee_pay: Optional[str] = Field(default=None, description="Closing transaction fee", alias="closeFeePay") - stop: Optional[str] = Field(default=None, - description="A mark to the stop order type") + stop: Optional[StopEnum] = Field( + default=None, description="A mark to the stop order type") fee_rate: Optional[str] = Field(default=None, description="Fee Rate", alias="feeRate") diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/__init__.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/__init__.py index a926fb97..798b1c18 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/positions/__init__.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/__init__.py @@ -1,9 +1,17 @@ from .model_add_isolated_margin_req import AddIsolatedMarginReq from .model_add_isolated_margin_req import AddIsolatedMarginReqBuilder from .model_add_isolated_margin_resp import AddIsolatedMarginResp +from .model_batch_switch_margin_mode_errors import BatchSwitchMarginModeErrors +from .model_batch_switch_margin_mode_req import BatchSwitchMarginModeReq +from .model_batch_switch_margin_mode_req import BatchSwitchMarginModeReqBuilder +from .model_batch_switch_margin_mode_resp import BatchSwitchMarginModeResp from .model_get_cross_margin_leverage_req import GetCrossMarginLeverageReq from .model_get_cross_margin_leverage_req import GetCrossMarginLeverageReqBuilder from .model_get_cross_margin_leverage_resp import GetCrossMarginLeverageResp +from .model_get_cross_margin_risk_limit_data import GetCrossMarginRiskLimitData +from .model_get_cross_margin_risk_limit_req import GetCrossMarginRiskLimitReq +from .model_get_cross_margin_risk_limit_req import GetCrossMarginRiskLimitReqBuilder +from .model_get_cross_margin_risk_limit_resp import GetCrossMarginRiskLimitResp from .model_get_isolated_margin_risk_limit_data import GetIsolatedMarginRiskLimitData from .model_get_isolated_margin_risk_limit_req import GetIsolatedMarginRiskLimitReq from .model_get_isolated_margin_risk_limit_req import GetIsolatedMarginRiskLimitReqBuilder diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.py index d1be1b83..8dc22b45 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.py @@ -5,8 +5,12 @@ from kucoin_universal_sdk.internal.interfaces.transport import Transport from .model_add_isolated_margin_req import AddIsolatedMarginReq from .model_add_isolated_margin_resp import AddIsolatedMarginResp +from .model_batch_switch_margin_mode_req import BatchSwitchMarginModeReq +from .model_batch_switch_margin_mode_resp import BatchSwitchMarginModeResp from .model_get_cross_margin_leverage_req import GetCrossMarginLeverageReq from .model_get_cross_margin_leverage_resp import GetCrossMarginLeverageResp +from .model_get_cross_margin_risk_limit_req import GetCrossMarginRiskLimitReq +from .model_get_cross_margin_risk_limit_resp import GetCrossMarginRiskLimitResp from .model_get_isolated_margin_risk_limit_req import GetIsolatedMarginRiskLimitReq from .model_get_isolated_margin_risk_limit_resp import GetIsolatedMarginRiskLimitResp from .model_get_margin_mode_req import GetMarginModeReq @@ -74,6 +78,25 @@ def switch_margin_mode(self, req: SwitchMarginModeReq, """ pass + @abstractmethod + def batch_switch_margin_mode(self, req: BatchSwitchMarginModeReq, + **kwargs: Any) -> BatchSwitchMarginModeResp: + """ + summary: Batch Switch Margin Mode + description: Batch modify the margin mode of the symbols. + documentation: https://www.kucoin.com/docs-new/api-3472403 + +-----------------------+---------+ + | Extra API Info | Value | + +-----------------------+---------+ + | API-DOMAIN | FUTURES | + | API-CHANNEL | PRIVATE | + | API-PERMISSION | FUTURES | + | API-RATE-LIMIT-POOL | FUTURES | + | API-RATE-LIMIT-WEIGHT | 2 | + +-----------------------+---------+ + """ + pass + @abstractmethod def get_max_open_size(self, req: GetMaxOpenSizeReq, **kwargs: Any) -> GetMaxOpenSizeResp: @@ -245,6 +268,26 @@ def remove_isolated_margin(self, req: RemoveIsolatedMarginReq, """ pass + @abstractmethod + def get_cross_margin_risk_limit( + self, req: GetCrossMarginRiskLimitReq, + **kwargs: Any) -> GetCrossMarginRiskLimitResp: + """ + summary: Get Cross Margin Risk Limit + description: Batch get cross margin risk limit. + documentation: https://www.kucoin.com/docs-new/api-3472655 + +-----------------------+---------+ + | Extra API Info | Value | + +-----------------------+---------+ + | API-DOMAIN | FUTURES | + | API-CHANNEL | PRIVATE | + | API-PERMISSION | FUTURES | + | API-RATE-LIMIT-POOL | FUTURES | + | API-RATE-LIMIT-WEIGHT | 2 | + +-----------------------+---------+ + """ + pass + @abstractmethod def get_isolated_margin_risk_limit( self, req: GetIsolatedMarginRiskLimitReq, @@ -324,6 +367,13 @@ def switch_margin_mode(self, req: SwitchMarginModeReq, "/api/v2/position/changeMarginMode", req, SwitchMarginModeResp(), False, **kwargs) + def batch_switch_margin_mode(self, req: BatchSwitchMarginModeReq, + **kwargs: Any) -> BatchSwitchMarginModeResp: + return self.transport.call("futures", False, "POST", + "/api/v2/position/batchChangeMarginMode", + req, BatchSwitchMarginModeResp(), False, + **kwargs) + def get_max_open_size(self, req: GetMaxOpenSizeReq, **kwargs: Any) -> GetMaxOpenSizeResp: return self.transport.call("futures", False, "GET", @@ -380,6 +430,14 @@ def remove_isolated_margin(self, req: RemoveIsolatedMarginReq, "/api/v1/margin/withdrawMargin", req, RemoveIsolatedMarginResp(), False, **kwargs) + def get_cross_margin_risk_limit( + self, req: GetCrossMarginRiskLimitReq, + **kwargs: Any) -> GetCrossMarginRiskLimitResp: + return self.transport.call("futures", False, "GET", + "/api/v2/batchGetCrossOrderLimit", req, + GetCrossMarginRiskLimitResp(), False, + **kwargs) + def get_isolated_margin_risk_limit( self, req: GetIsolatedMarginRiskLimitReq, **kwargs: Any) -> GetIsolatedMarginRiskLimitResp: diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.template b/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.template index fadf66b5..534caaba 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.template +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions.template @@ -39,6 +39,25 @@ def test_switch_margin_mode_req(self): print("error: ", e) raise e +def test_batch_switch_margin_mode_req(self): + """ + batch_switch_margin_mode + Batch Switch Margin Mode + /api/v2/position/batchChangeMarginMode + """ + + builder = BatchSwitchMarginModeReqBuilder() + builder.set_margin_mode(?).set_symbols(?) + req = builder.build() + try: + resp = self.api.batch_switch_margin_mode(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + def test_get_max_open_size_req(self): """ get_max_open_size @@ -210,6 +229,25 @@ def test_remove_isolated_margin_req(self): print("error: ", e) raise e +def test_get_cross_margin_risk_limit_req(self): + """ + get_cross_margin_risk_limit + Get Cross Margin Risk Limit + /api/v2/batchGetCrossOrderLimit + """ + + builder = GetCrossMarginRiskLimitReqBuilder() + builder.set_symbol(?).set_total_margin(?).set_leverage(?) + req = builder.build() + try: + resp = self.api.get_cross_margin_risk_limit(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + def test_get_isolated_margin_risk_limit_req(self): """ get_isolated_margin_risk_limit diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions_test.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions_test.py index 22e6c9af..3c08f3e7 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/api_positions_test.py @@ -1,8 +1,12 @@ import unittest from .model_add_isolated_margin_req import AddIsolatedMarginReq from .model_add_isolated_margin_resp import AddIsolatedMarginResp +from .model_batch_switch_margin_mode_req import BatchSwitchMarginModeReq +from .model_batch_switch_margin_mode_resp import BatchSwitchMarginModeResp from .model_get_cross_margin_leverage_req import GetCrossMarginLeverageReq from .model_get_cross_margin_leverage_resp import GetCrossMarginLeverageResp +from .model_get_cross_margin_risk_limit_req import GetCrossMarginRiskLimitReq +from .model_get_cross_margin_risk_limit_resp import GetCrossMarginRiskLimitResp from .model_get_isolated_margin_risk_limit_req import GetIsolatedMarginRiskLimitReq from .model_get_isolated_margin_risk_limit_resp import GetIsolatedMarginRiskLimitResp from .model_get_margin_mode_req import GetMarginModeReq @@ -71,6 +75,25 @@ def test_switch_margin_mode_resp_model(self): common_response = RestResponse.from_json(data) resp = SwitchMarginModeResp.from_dict(common_response.data) + def test_batch_switch_margin_mode_req_model(self): + """ + batch_switch_margin_mode + Batch Switch Margin Mode + /api/v2/position/batchChangeMarginMode + """ + data = "{\"marginMode\": \"ISOLATED\", \"symbols\": [\"XBTUSDTM\", \"ETHUSDTM\"]}" + req = BatchSwitchMarginModeReq.from_json(data) + + def test_batch_switch_margin_mode_resp_model(self): + """ + batch_switch_margin_mode + Batch Switch Margin Mode + /api/v2/position/batchChangeMarginMode + """ + data = "{\n \"code\": \"200000\",\n \"data\": {\n \"marginMode\": {\n \"ETHUSDTM\": \"ISOLATED\",\n \"XBTUSDTM\": \"CROSS\"\n },\n \"errors\": [\n {\n \"code\": \"50002\",\n \"msg\": \"exist.order.or.position\",\n \"symbol\": \"XBTUSDTM\"\n }\n ]\n }\n}" + common_response = RestResponse.from_json(data) + resp = BatchSwitchMarginModeResp.from_dict(common_response.data) + def test_get_max_open_size_req_model(self): """ get_max_open_size @@ -242,6 +265,25 @@ def test_remove_isolated_margin_resp_model(self): common_response = RestResponse.from_json(data) resp = RemoveIsolatedMarginResp.from_dict(common_response.data) + def test_get_cross_margin_risk_limit_req_model(self): + """ + get_cross_margin_risk_limit + Get Cross Margin Risk Limit + /api/v2/batchGetCrossOrderLimit + """ + data = "{\"symbol\": \"XBTUSDTM\", \"totalMargin\": \"example_string_default_value\", \"leverage\": 123456}" + req = GetCrossMarginRiskLimitReq.from_json(data) + + def test_get_cross_margin_risk_limit_resp_model(self): + """ + get_cross_margin_risk_limit + Get Cross Margin Risk Limit + /api/v2/batchGetCrossOrderLimit + """ + data = "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"symbol\": \"XBTUSDTM\",\n \"maxOpenSize\": 12102,\n \"maxOpenValue\": \"1234549.2240000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"102012\",\n \"leverage\": \"125.00\",\n \"mmr\": \"0.00416136\",\n \"imr\": \"0.008\",\n \"currency\": \"USDT\"\n },\n {\n \"symbol\": \"ETHUSDTM\",\n \"maxOpenSize\": 38003,\n \"maxOpenValue\": \"971508.6920000000\",\n \"totalMargin\": \"10000\",\n \"price\": \"2556.4\",\n \"leverage\": \"100.00\",\n \"mmr\": \"0.0054623236\",\n \"imr\": \"0.01\",\n \"currency\": \"USDT\"\n }\n ]\n}" + common_response = RestResponse.from_json(data) + resp = GetCrossMarginRiskLimitResp.from_dict(common_response.data) + def test_get_isolated_margin_risk_limit_req_model(self): """ get_isolated_margin_risk_limit diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_errors.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_errors.py new file mode 100644 index 00000000..94c53cd2 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_errors.py @@ -0,0 +1,68 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class BatchSwitchMarginModeErrors(BaseModel): + """ + BatchSwitchMarginModeErrors + + Attributes: + code (str): Error code + msg (str): Error message + symbol (str): Symbol + """ + + code: Optional[str] = Field(default=None, description="Error code") + msg: Optional[str] = Field(default=None, description="Error message") + symbol: Optional[str] = Field(default=None, description="Symbol") + + __properties: ClassVar[List[str]] = ["code", "msg", "symbol"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[BatchSwitchMarginModeErrors]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[BatchSwitchMarginModeErrors]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "code": obj.get("code"), + "msg": obj.get("msg"), + "symbol": obj.get("symbol") + }) + return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_req.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_req.py new file mode 100644 index 00000000..4bdf04ec --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_req.py @@ -0,0 +1,108 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from enum import Enum +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class BatchSwitchMarginModeReq(BaseModel): + """ + BatchSwitchMarginModeReq + + Attributes: + margin_mode (MarginModeEnum): Modified margin model: ISOLATED (isolated), CROSS (cross margin). + symbols (list[str]): Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + """ + + class MarginModeEnum(Enum): + """ + Attributes: + ISOLATED: Isolated Margin Mode + CROSS: Cross Margin MOde + """ + ISOLATED = 'ISOLATED' + CROSS = 'CROSS' + + margin_mode: Optional[MarginModeEnum] = Field( + default=None, + description= + "Modified margin model: ISOLATED (isolated), CROSS (cross margin).", + alias="marginMode") + symbols: Optional[List[str]] = Field( + default=None, + description= + "Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) " + ) + + __properties: ClassVar[List[str]] = ["marginMode", "symbols"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[BatchSwitchMarginModeReq]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[BatchSwitchMarginModeReq]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "marginMode": obj.get("marginMode"), + "symbols": obj.get("symbols") + }) + return _obj + + +class BatchSwitchMarginModeReqBuilder: + + def __init__(self): + self.obj = {} + + def set_margin_mode( + self, value: BatchSwitchMarginModeReq.MarginModeEnum + ) -> BatchSwitchMarginModeReqBuilder: + """ + Modified margin model: ISOLATED (isolated), CROSS (cross margin). + """ + self.obj['marginMode'] = value + return self + + def set_symbols(self, value: list[str]) -> BatchSwitchMarginModeReqBuilder: + """ + Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + """ + self.obj['symbols'] = value + return self + + def build(self) -> BatchSwitchMarginModeReq: + return BatchSwitchMarginModeReq(**self.obj) diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_resp.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_resp.py new file mode 100644 index 00000000..7fcb1de6 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_batch_switch_margin_mode_resp.py @@ -0,0 +1,89 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from .model_batch_switch_margin_mode_errors import BatchSwitchMarginModeErrors +from kucoin_universal_sdk.internal.interfaces.response import Response +from kucoin_universal_sdk.model.common import RestResponse + + +class BatchSwitchMarginModeResp(BaseModel, Response): + """ + BatchSwitchMarginModeResp + + Attributes: + margin_mode (dict[str, str]): Target Margin Model, Symbols that failed to be modified will also be included + errors (list[BatchSwitchMarginModeErrors]): Symbol which modification failed + """ + + common_response: Optional[RestResponse] = Field( + default=None, description="Common response") + margin_mode: Optional[Dict[str, str]] = Field( + default=None, + description= + "Target Margin Model, Symbols that failed to be modified will also be included", + alias="marginMode") + errors: Optional[List[BatchSwitchMarginModeErrors]] = Field( + default=None, description="Symbol which modification failed") + + __properties: ClassVar[List[str]] = ["marginMode", "errors"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[BatchSwitchMarginModeResp]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in errors (list) + _items = [] + if self.errors: + for _item_errors in self.errors: + if _item_errors: + _items.append(_item_errors.to_dict()) + _dict['errors'] = _items + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[BatchSwitchMarginModeResp]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "marginMode": + obj.get("marginMode"), + "errors": [ + BatchSwitchMarginModeErrors.from_dict(_item) + for _item in obj["errors"] + ] if obj.get("errors") is not None else None + }) + return _obj + + def set_common_response(self, response: RestResponse): + self.common_response = response diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_data.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_data.py new file mode 100644 index 00000000..d045075c --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_data.py @@ -0,0 +1,110 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class GetCrossMarginRiskLimitData(BaseModel): + """ + GetCrossMarginRiskLimitData + + Attributes: + symbol (str): Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) + max_open_size (int): Maximum amount of open position(Unit is **lots**) + max_open_value (str): Maximum value of open position(Unit is **quoteCcy**) + total_margin (str): Margin amount used for max position calculation. + price (str): Price used for max position calculation. Defaults to latest transaction price + leverage (str): Leverage used for max position calculation. + mmr (str): Maintenance Margin Rate + imr (str): Initial Margin Rate + currency (str): Margin Currency + """ + + symbol: Optional[str] = Field( + default=None, + description= + "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220)" + ) + max_open_size: Optional[int] = Field( + default=None, + description="Maximum amount of open position(Unit is **lots**) ", + alias="maxOpenSize") + max_open_value: Optional[str] = Field( + default=None, + description="Maximum value of open position(Unit is **quoteCcy**) ", + alias="maxOpenValue") + total_margin: Optional[str] = Field( + default=None, + description="Margin amount used for max position calculation.", + alias="totalMargin") + price: Optional[str] = Field( + default=None, + description= + "Price used for max position calculation. Defaults to latest transaction price" + ) + leverage: Optional[str] = Field( + default=None, + description="Leverage used for max position calculation.") + mmr: Optional[str] = Field(default=None, + description="Maintenance Margin Rate") + imr: Optional[str] = Field(default=None, description="Initial Margin Rate") + currency: Optional[str] = Field(default=None, + description="Margin Currency") + + __properties: ClassVar[List[str]] = [ + "symbol", "maxOpenSize", "maxOpenValue", "totalMargin", "price", + "leverage", "mmr", "imr", "currency" + ] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetCrossMarginRiskLimitData]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[GetCrossMarginRiskLimitData]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "symbol": obj.get("symbol"), + "maxOpenSize": obj.get("maxOpenSize"), + "maxOpenValue": obj.get("maxOpenValue"), + "totalMargin": obj.get("totalMargin"), + "price": obj.get("price"), + "leverage": obj.get("leverage"), + "mmr": obj.get("mmr"), + "imr": obj.get("imr"), + "currency": obj.get("currency") + }) + return _obj diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_req.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_req.py new file mode 100644 index 00000000..5ba0d523 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_req.py @@ -0,0 +1,111 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional + + +class GetCrossMarginRiskLimitReq(BaseModel): + """ + GetCrossMarginRiskLimitReq + + Attributes: + symbol (str): Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) + total_margin (str): The position opening amount, in the contract's settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price. + leverage (int): Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. + """ + + symbol: Optional[str] = Field( + default=None, + description= + "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP)" + ) + total_margin: Optional[str] = Field( + default=None, + description= + "The position opening amount, in the contract's settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price.", + alias="totalMargin") + leverage: Optional[int] = Field( + default=None, + description= + "Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage." + ) + + __properties: ClassVar[List[str]] = ["symbol", "totalMargin", "leverage"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetCrossMarginRiskLimitReq]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[GetCrossMarginRiskLimitReq]: + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "symbol": obj.get("symbol"), + "totalMargin": obj.get("totalMargin"), + "leverage": obj.get("leverage") + }) + return _obj + + +class GetCrossMarginRiskLimitReqBuilder: + + def __init__(self): + self.obj = {} + + def set_symbol(self, value: str) -> GetCrossMarginRiskLimitReqBuilder: + """ + Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP) + """ + self.obj['symbol'] = value + return self + + def set_total_margin(self, + value: str) -> GetCrossMarginRiskLimitReqBuilder: + """ + The position opening amount, in the contract's settlement currency. Defaults to 10,000 in margin currency for max position calculation. For USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price. + """ + self.obj['totalMargin'] = value + return self + + def set_leverage(self, value: int) -> GetCrossMarginRiskLimitReqBuilder: + """ + Calculates the max position size at the specified leverage. Defaults to the symbol’s max cross leverage. + """ + self.obj['leverage'] = value + return self + + def build(self) -> GetCrossMarginRiskLimitReq: + return GetCrossMarginRiskLimitReq(**self.obj) diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_resp.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_resp.py new file mode 100644 index 00000000..a4501d15 --- /dev/null +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_cross_margin_risk_limit_resp.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +# Code generated by Kucoin Universal SDK Generator; DO NOT EDIT. + +from __future__ import annotations +import pprint +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from .model_get_cross_margin_risk_limit_data import GetCrossMarginRiskLimitData +from kucoin_universal_sdk.internal.interfaces.response import Response +from kucoin_universal_sdk.model.common import RestResponse + + +class GetCrossMarginRiskLimitResp(BaseModel, Response): + """ + GetCrossMarginRiskLimitResp + + Attributes: + data (list[GetCrossMarginRiskLimitData]): + """ + + common_response: Optional[RestResponse] = Field( + default=None, description="Common response") + data: Optional[List[GetCrossMarginRiskLimitData]] = None + + __properties: ClassVar[List[str]] = ["data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=False, + protected_namespaces=(), + ) + + def to_str(self) -> str: + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + return self.model_dump_json(by_alias=True, exclude_none=True) + + @classmethod + def from_json(cls, json_str: str) -> Optional[GetCrossMarginRiskLimitResp]: + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + _dict = self.model_dump( + by_alias=True, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in data (list) + _items = [] + if self.data: + for _item_data in self.data: + if _item_data: + _items.append(_item_data.to_dict()) + _dict['data'] = _items + return _dict + + @classmethod + def from_dict( + cls, + obj: Optional[Dict[str, + Any]]) -> Optional[GetCrossMarginRiskLimitResp]: + if obj is None: + return None + + # original response + obj = {'data': obj} + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "data": [ + GetCrossMarginRiskLimitData.from_dict(_item) + for _item in obj["data"] + ] if obj.get("data") is not None else None + }) + return _obj + + def set_common_response(self, response: RestResponse): + self.common_response = response diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_details_resp.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_details_resp.py index 4bc19b46..f10b6405 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_details_resp.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_details_resp.py @@ -22,7 +22,7 @@ class GetPositionDetailsResp(BaseModel, Response): symbol (str): Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) cross_mode (bool): Whether it is cross margin. delev_percentage (float): ADL ranking percentile - opening_timestamp (int): Open time + opening_timestamp (int): First opening time current_timestamp (int): Current timestamp current_qty (int): Current postion quantity current_cost (float): Current postion value @@ -50,7 +50,7 @@ class GetPositionDetailsResp(BaseModel, Response): position_side (PositionSideEnum): Position Side leverage (float): Leverage auto_deposit (bool): Auto deposit margin or not **Only applicable to Isolated Margin** - maint_margin_req (float): Maintenance margin requirement **Only applicable to Isolated Margin** + maint_margin_req (float): Maintenance margin requirement risk_limit (int): Risk limit **Only applicable to Isolated Margin** real_leverage (float): Leverage of the order **Only applicable to Isolated Margin** pos_cross (float): added margin **Only applicable to Isolated Margin** @@ -59,7 +59,7 @@ class GetPositionDetailsResp(BaseModel, Response): pos_comm_common (float): Part of bankruptcy cost (positioning, add margin) **Only applicable to Isolated Margin** pos_loss (float): Funding fees paid out **Only applicable to Isolated Margin** pos_funding (float): The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** - pos_maint (float): Maintenance margin **Only applicable to Isolated Margin** + pos_maint (float): Maintenance margin maint_margin (float): Position margin **Only applicable to Isolated Margin** maintain_margin (float): Maintenance margin rate **Only applicable to Isolated Margin** """ @@ -97,7 +97,7 @@ class PositionSideEnum(Enum): description="ADL ranking percentile ", alias="delevPercentage") opening_timestamp: Optional[int] = Field(default=None, - description="Open time ", + description="First opening time", alias="openingTimestamp") current_timestamp: Optional[int] = Field(default=None, description="Current timestamp ", @@ -199,8 +199,7 @@ class PositionSideEnum(Enum): alias="autoDeposit") maint_margin_req: Optional[float] = Field( default=None, - description= - "Maintenance margin requirement **Only applicable to Isolated Margin** ", + description="Maintenance margin requirement ", alias="maintMarginReq") risk_limit: Optional[int] = Field( default=None, @@ -239,11 +238,9 @@ class PositionSideEnum(Enum): description= "The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** ", alias="posFunding") - pos_maint: Optional[float] = Field( - default=None, - description= - "Maintenance margin **Only applicable to Isolated Margin** ", - alias="posMaint") + pos_maint: Optional[float] = Field(default=None, + description="Maintenance margin ", + alias="posMaint") maint_margin: Optional[float] = Field( default=None, description="Position margin **Only applicable to Isolated Margin** ", diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_data.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_data.py index dcc1d5a3..ec04dbe7 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_data.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_data.py @@ -20,7 +20,7 @@ class GetPositionListData(BaseModel): symbol (str): Symbol of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) cross_mode (bool): Whether it is cross margin. delev_percentage (float): ADL ranking percentile - opening_timestamp (int): Open time + opening_timestamp (int): First opening time current_timestamp (int): Current timestamp current_qty (int): Current postion quantity current_cost (float): Current postion value @@ -48,7 +48,7 @@ class GetPositionListData(BaseModel): position_side (PositionSideEnum): Position Side leverage (float): Leverage auto_deposit (bool): Auto deposit margin or not **Only applicable to Isolated Margin** - maint_margin_req (float): Maintenance margin requirement **Only applicable to Isolated Margin** + maint_margin_req (float): Maintenance margin requirement risk_limit (float): Risk limit **Only applicable to Isolated Margin** real_leverage (float): Leverage of the order **Only applicable to Isolated Margin** pos_cross (float): added margin **Only applicable to Isolated Margin** @@ -57,7 +57,7 @@ class GetPositionListData(BaseModel): pos_comm_common (float): Part of bankruptcy cost (positioning, add margin) **Only applicable to Isolated Margin** pos_loss (float): Funding fees paid out **Only applicable to Isolated Margin** pos_funding (float): The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** - pos_maint (float): Maintenance margin **Only applicable to Isolated Margin** + pos_maint (float): Maintenance margin maint_margin (float): Position margin **Only applicable to Isolated Margin** maintain_margin (float): Maintenance margin rate **Only applicable to Isolated Margin** """ @@ -93,7 +93,7 @@ class PositionSideEnum(Enum): description="ADL ranking percentile ", alias="delevPercentage") opening_timestamp: Optional[int] = Field(default=None, - description="Open time ", + description="First opening time", alias="openingTimestamp") current_timestamp: Optional[int] = Field(default=None, description="Current timestamp ", @@ -195,8 +195,7 @@ class PositionSideEnum(Enum): alias="autoDeposit") maint_margin_req: Optional[float] = Field( default=None, - description= - "Maintenance margin requirement **Only applicable to Isolated Margin** ", + description="Maintenance margin requirement ", alias="maintMarginReq") risk_limit: Optional[float] = Field( default=None, @@ -235,11 +234,9 @@ class PositionSideEnum(Enum): description= "The current remaining unsettled funding fee for the position **Only applicable to Isolated Margin** ", alias="posFunding") - pos_maint: Optional[float] = Field( - default=None, - description= - "Maintenance margin **Only applicable to Isolated Margin** ", - alias="posMaint") + pos_maint: Optional[float] = Field(default=None, + description="Maintenance margin", + alias="posMaint") maint_margin: Optional[float] = Field( default=None, description="Position margin **Only applicable to Isolated Margin** ", diff --git a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_req.py b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_req.py index 3e7ce1a6..3f04b939 100644 --- a/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/futures/positions/model_get_position_list_req.py @@ -15,13 +15,13 @@ class GetPositionListReq(BaseModel): GetPositionListReq Attributes: - currency (str): Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + currency (str): Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty """ currency: Optional[str] = Field( default=None, description= - "Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty" + "Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty" ) __properties: ClassVar[List[str]] = ["currency"] @@ -70,7 +70,7 @@ def __init__(self): def set_currency(self, value: str) -> GetPositionListReqBuilder: """ - Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty + Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty """ self.obj['currency'] = value return self diff --git a/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.py b/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.py index 2a98d08f..2c7b3056 100644 --- a/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.py +++ b/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.py @@ -47,7 +47,7 @@ def add_order(self, req: AddOrderReq, **kwargs: Any) -> AddOrderResp: | API-CHANNEL | PRIVATE | | API-PERMISSION | MARGIN | | API-RATE-LIMIT-POOL | SPOT | - | API-RATE-LIMIT-WEIGHT | 5 | + | API-RATE-LIMIT-WEIGHT | 2 | +-----------------------+---------+ """ pass @@ -66,7 +66,7 @@ def add_order_test(self, req: AddOrderTestReq, | API-CHANNEL | PRIVATE | | API-PERMISSION | MARGIN | | API-RATE-LIMIT-POOL | SPOT | - | API-RATE-LIMIT-WEIGHT | 5 | + | API-RATE-LIMIT-WEIGHT | 2 | +-----------------------+---------+ """ pass @@ -85,7 +85,7 @@ def cancel_order_by_order_id(self, req: CancelOrderByOrderIdReq, | API-CHANNEL | PRIVATE | | API-PERMISSION | MARGIN | | API-RATE-LIMIT-POOL | SPOT | - | API-RATE-LIMIT-WEIGHT | 5 | + | API-RATE-LIMIT-WEIGHT | 2 | +-----------------------+---------+ """ pass @@ -105,7 +105,7 @@ def cancel_order_by_client_oid( | API-CHANNEL | PRIVATE | | API-PERMISSION | MARGIN | | API-RATE-LIMIT-POOL | SPOT | - | API-RATE-LIMIT-WEIGHT | 5 | + | API-RATE-LIMIT-WEIGHT | 2 | +-----------------------+---------+ """ pass @@ -125,7 +125,7 @@ def cancel_all_orders_by_symbol( | API-CHANNEL | PRIVATE | | API-PERMISSION | MARGIN | | API-RATE-LIMIT-POOL | SPOT | - | API-RATE-LIMIT-WEIGHT | 10 | + | API-RATE-LIMIT-WEIGHT | 5 | +-----------------------+---------+ """ pass @@ -145,7 +145,7 @@ def get_symbols_with_open_order( | API-CHANNEL | PRIVATE | | API-PERMISSION | MARGIN | | API-RATE-LIMIT-POOL | SPOT | - | API-RATE-LIMIT-WEIGHT | NULL | + | API-RATE-LIMIT-WEIGHT | 4 | +-----------------------+---------+ """ pass diff --git a/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.template b/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.template index 980e658b..52ad1b1b 100644 --- a/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.template +++ b/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order.template @@ -47,7 +47,7 @@ def test_cancel_order_by_order_id_req(self): """ builder = CancelOrderByOrderIdReqBuilder() - builder.set_order_id(?).set_symbol(?) + builder.set_symbol(?).set_order_id(?) req = builder.build() try: resp = self.api.cancel_order_by_order_id(req) @@ -66,7 +66,7 @@ def test_cancel_order_by_client_oid_req(self): """ builder = CancelOrderByClientOidReqBuilder() - builder.set_client_oid(?).set_symbol(?) + builder.set_symbol(?).set_client_oid(?) req = builder.build() try: resp = self.api.cancel_order_by_client_oid(req) @@ -180,7 +180,7 @@ def test_get_order_by_order_id_req(self): """ builder = GetOrderByOrderIdReqBuilder() - builder.set_order_id(?).set_symbol(?) + builder.set_symbol(?).set_order_id(?) req = builder.build() try: resp = self.api.get_order_by_order_id(req) @@ -199,7 +199,7 @@ def test_get_order_by_client_oid_req(self): """ builder = GetOrderByClientOidReqBuilder() - builder.set_client_oid(?).set_symbol(?) + builder.set_symbol(?).set_client_oid(?) req = builder.build() try: resp = self.api.get_order_by_client_oid(req) diff --git a/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order_test.py b/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order_test.py index 4f09cb9c..65d3a069 100644 --- a/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/margin/order/api_order_test.py @@ -75,7 +75,7 @@ def test_cancel_order_by_order_id_req_model(self): Cancel Order By OrderId /api/v3/hf/margin/orders/{orderId} """ - data = "{\"orderId\": \"671663e02188630007e21c9c\", \"symbol\": \"BTC-USDT\"}" + data = "{\"symbol\": \"BTC-USDT\", \"orderId\": \"671663e02188630007e21c9c\"}" req = CancelOrderByOrderIdReq.from_json(data) def test_cancel_order_by_order_id_resp_model(self): @@ -94,7 +94,7 @@ def test_cancel_order_by_client_oid_req_model(self): Cancel Order By ClientOid /api/v3/hf/margin/orders/client-order/{clientOid} """ - data = "{\"clientOid\": \"5c52e11203aa677f33e1493fb\", \"symbol\": \"BTC-USDT\"}" + data = "{\"symbol\": \"BTC-USDT\", \"clientOid\": \"5c52e11203aa677f33e1493fb\"}" req = CancelOrderByClientOidReq.from_json(data) def test_cancel_order_by_client_oid_resp_model(self): @@ -208,7 +208,7 @@ def test_get_order_by_order_id_req_model(self): Get Order By OrderId /api/v3/hf/margin/orders/{orderId} """ - data = "{\"orderId\": \"671667306afcdb000723107f\", \"symbol\": \"BTC-USDT\"}" + data = "{\"symbol\": \"BTC-USDT\", \"orderId\": \"671667306afcdb000723107f\"}" req = GetOrderByOrderIdReq.from_json(data) def test_get_order_by_order_id_resp_model(self): @@ -227,7 +227,7 @@ def test_get_order_by_client_oid_req_model(self): Get Order By ClientOid /api/v3/hf/margin/orders/client-order/{clientOid} """ - data = "{\"clientOid\": \"5c52e11203aa677f33e493fb\", \"symbol\": \"BTC-USDT\"}" + data = "{\"symbol\": \"BTC-USDT\", \"clientOid\": \"5c52e11203aa677f33e493fb\"}" req = GetOrderByClientOidReq.from_json(data) def test_get_order_by_client_oid_resp_model(self): diff --git a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_client_oid_req.py b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_client_oid_req.py index 8fef76b4..9cc46ec4 100644 --- a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_client_oid_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_client_oid_req.py @@ -15,18 +15,18 @@ class CancelOrderByClientOidReq(BaseModel): CancelOrderByClientOidReq Attributes: - client_oid (str): Client Order Id, unique identifier created by the user symbol (str): symbol + client_oid (str): Client Order Id, unique identifier created by the user """ + symbol: Optional[str] = Field(default=None, description="symbol") client_oid: Optional[str] = Field( default=None, path_variable="True", description="Client Order Id, unique identifier created by the user", alias="clientOid") - symbol: Optional[str] = Field(default=None, description="symbol") - __properties: ClassVar[List[str]] = ["clientOid", "symbol"] + __properties: ClassVar[List[str]] = ["symbol", "clientOid"] model_config = ConfigDict( populate_by_name=True, @@ -63,8 +63,8 @@ def from_dict( return cls.model_validate(obj) _obj = cls.model_validate({ - "clientOid": obj.get("clientOid"), - "symbol": obj.get("symbol") + "symbol": obj.get("symbol"), + "clientOid": obj.get("clientOid") }) return _obj @@ -74,18 +74,18 @@ class CancelOrderByClientOidReqBuilder: def __init__(self): self.obj = {} - def set_client_oid(self, value: str) -> CancelOrderByClientOidReqBuilder: + def set_symbol(self, value: str) -> CancelOrderByClientOidReqBuilder: """ - Client Order Id, unique identifier created by the user + symbol """ - self.obj['clientOid'] = value + self.obj['symbol'] = value return self - def set_symbol(self, value: str) -> CancelOrderByClientOidReqBuilder: + def set_client_oid(self, value: str) -> CancelOrderByClientOidReqBuilder: """ - symbol + Client Order Id, unique identifier created by the user """ - self.obj['symbol'] = value + self.obj['clientOid'] = value return self def build(self) -> CancelOrderByClientOidReq: diff --git a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_order_id_req.py b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_order_id_req.py index 7b615bfa..0b92c5bd 100644 --- a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_order_id_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_cancel_order_by_order_id_req.py @@ -15,18 +15,18 @@ class CancelOrderByOrderIdReq(BaseModel): CancelOrderByOrderIdReq Attributes: - order_id (str): The unique order id generated by the trading system symbol (str): symbol + order_id (str): The unique order id generated by the trading system """ + symbol: Optional[str] = Field(default=None, description="symbol") order_id: Optional[str] = Field( default=None, path_variable="True", description="The unique order id generated by the trading system", alias="orderId") - symbol: Optional[str] = Field(default=None, description="symbol") - __properties: ClassVar[List[str]] = ["orderId", "symbol"] + __properties: ClassVar[List[str]] = ["symbol", "orderId"] model_config = ConfigDict( populate_by_name=True, @@ -63,8 +63,8 @@ def from_dict( return cls.model_validate(obj) _obj = cls.model_validate({ - "orderId": obj.get("orderId"), - "symbol": obj.get("symbol") + "symbol": obj.get("symbol"), + "orderId": obj.get("orderId") }) return _obj @@ -74,18 +74,18 @@ class CancelOrderByOrderIdReqBuilder: def __init__(self): self.obj = {} - def set_order_id(self, value: str) -> CancelOrderByOrderIdReqBuilder: + def set_symbol(self, value: str) -> CancelOrderByOrderIdReqBuilder: """ - The unique order id generated by the trading system + symbol """ - self.obj['orderId'] = value + self.obj['symbol'] = value return self - def set_symbol(self, value: str) -> CancelOrderByOrderIdReqBuilder: + def set_order_id(self, value: str) -> CancelOrderByOrderIdReqBuilder: """ - symbol + The unique order id generated by the trading system """ - self.obj['symbol'] = value + self.obj['orderId'] = value return self def build(self) -> CancelOrderByOrderIdReq: diff --git a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_client_oid_req.py b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_client_oid_req.py index 598bbf08..998e66eb 100644 --- a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_client_oid_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_client_oid_req.py @@ -15,18 +15,18 @@ class GetOrderByClientOidReq(BaseModel): GetOrderByClientOidReq Attributes: - client_oid (str): Client Order Id, unique identifier created by the user symbol (str): symbol + client_oid (str): Client Order Id, unique identifier created by the user """ + symbol: Optional[str] = Field(default=None, description="symbol") client_oid: Optional[str] = Field( default=None, path_variable="True", description="Client Order Id, unique identifier created by the user", alias="clientOid") - symbol: Optional[str] = Field(default=None, description="symbol") - __properties: ClassVar[List[str]] = ["clientOid", "symbol"] + __properties: ClassVar[List[str]] = ["symbol", "clientOid"] model_config = ConfigDict( populate_by_name=True, @@ -62,8 +62,8 @@ def from_dict( return cls.model_validate(obj) _obj = cls.model_validate({ - "clientOid": obj.get("clientOid"), - "symbol": obj.get("symbol") + "symbol": obj.get("symbol"), + "clientOid": obj.get("clientOid") }) return _obj @@ -73,18 +73,18 @@ class GetOrderByClientOidReqBuilder: def __init__(self): self.obj = {} - def set_client_oid(self, value: str) -> GetOrderByClientOidReqBuilder: + def set_symbol(self, value: str) -> GetOrderByClientOidReqBuilder: """ - Client Order Id, unique identifier created by the user + symbol """ - self.obj['clientOid'] = value + self.obj['symbol'] = value return self - def set_symbol(self, value: str) -> GetOrderByClientOidReqBuilder: + def set_client_oid(self, value: str) -> GetOrderByClientOidReqBuilder: """ - symbol + Client Order Id, unique identifier created by the user """ - self.obj['symbol'] = value + self.obj['clientOid'] = value return self def build(self) -> GetOrderByClientOidReq: diff --git a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_order_id_req.py b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_order_id_req.py index 46714c7b..086e63ea 100644 --- a/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_order_id_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/margin/order/model_get_order_by_order_id_req.py @@ -15,18 +15,18 @@ class GetOrderByOrderIdReq(BaseModel): GetOrderByOrderIdReq Attributes: - order_id (str): The unique order id generated by the trading system symbol (str): symbol + order_id (str): The unique order id generated by the trading system """ + symbol: Optional[str] = Field(default=None, description="symbol") order_id: Optional[str] = Field( default=None, path_variable="True", description="The unique order id generated by the trading system", alias="orderId") - symbol: Optional[str] = Field(default=None, description="symbol") - __properties: ClassVar[List[str]] = ["orderId", "symbol"] + __properties: ClassVar[List[str]] = ["symbol", "orderId"] model_config = ConfigDict( populate_by_name=True, @@ -62,8 +62,8 @@ def from_dict( return cls.model_validate(obj) _obj = cls.model_validate({ - "orderId": obj.get("orderId"), - "symbol": obj.get("symbol") + "symbol": obj.get("symbol"), + "orderId": obj.get("orderId") }) return _obj @@ -73,18 +73,18 @@ class GetOrderByOrderIdReqBuilder: def __init__(self): self.obj = {} - def set_order_id(self, value: str) -> GetOrderByOrderIdReqBuilder: + def set_symbol(self, value: str) -> GetOrderByOrderIdReqBuilder: """ - The unique order id generated by the trading system + symbol """ - self.obj['orderId'] = value + self.obj['symbol'] = value return self - def set_symbol(self, value: str) -> GetOrderByOrderIdReqBuilder: + def set_order_id(self, value: str) -> GetOrderByOrderIdReqBuilder: """ - symbol + The unique order id generated by the trading system """ - self.obj['symbol'] = value + self.obj['orderId'] = value return self def build(self) -> GetOrderByOrderIdReq: diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market.template b/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market.template index 153caece..42f16c89 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market.template +++ b/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market.template @@ -28,7 +28,7 @@ def test_get_currency_req(self): """ builder = GetCurrencyReqBuilder() - builder.set_currency(?).set_chain(?) + builder.set_chain(?).set_currency(?) req = builder.build() try: resp = self.api.get_currency(req) diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market_test.py b/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market_test.py index 53d8cd49..74e69fb7 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market_test.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/market/api_market_test.py @@ -63,7 +63,7 @@ def test_get_currency_req_model(self): Get Currency /api/v3/currencies/{currency} """ - data = "{\"currency\": \"BTC\", \"chain\": \"eth\"}" + data = "{\"chain\": \"eth\", \"currency\": \"BTC\"}" req = GetCurrencyReq.from_json(data) def test_get_currency_resp_model(self): diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/market/model_get_currency_req.py b/sdk/python/kucoin_universal_sdk/generate/spot/market/model_get_currency_req.py index 95a150f1..74f8ccd0 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/market/model_get_currency_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/market/model_get_currency_req.py @@ -15,20 +15,20 @@ class GetCurrencyReq(BaseModel): GetCurrencyReq Attributes: - currency (str): Path parameter, Currency chain (str): Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. + currency (str): Path parameter, Currency """ - currency: Optional[str] = Field(default=None, - path_variable="True", - description="Path parameter, Currency") chain: Optional[str] = Field( default=None, description= "Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies." ) + currency: Optional[str] = Field(default=None, + path_variable="True", + description="Path parameter, Currency") - __properties: ClassVar[List[str]] = ["currency", "chain"] + __properties: ClassVar[List[str]] = ["chain", "currency"] model_config = ConfigDict( populate_by_name=True, @@ -63,8 +63,8 @@ def from_dict(cls, obj: Optional[Dict[str, return cls.model_validate(obj) _obj = cls.model_validate({ - "currency": obj.get("currency"), - "chain": obj.get("chain") + "chain": obj.get("chain"), + "currency": obj.get("currency") }) return _obj @@ -74,18 +74,18 @@ class GetCurrencyReqBuilder: def __init__(self): self.obj = {} - def set_currency(self, value: str) -> GetCurrencyReqBuilder: + def set_chain(self, value: str) -> GetCurrencyReqBuilder: """ - Path parameter, Currency + Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. """ - self.obj['currency'] = value + self.obj['chain'] = value return self - def set_chain(self, value: str) -> GetCurrencyReqBuilder: + def set_currency(self, value: str) -> GetCurrencyReqBuilder: """ - Support for querying the chain of currency, e.g. the available values for USDT are OMNI, ERC20, TRC20. This only applies to multi-chain currencies; no need for single-chain currencies. + Path parameter, Currency """ - self.obj['chain'] = value + self.obj['currency'] = value return self def build(self) -> GetCurrencyReq: diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/order/api_order.py b/sdk/python/kucoin_universal_sdk/generate/spot/order/api_order.py index 2087fc28..206f5ab6 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/order/api_order.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/order/api_order.py @@ -345,7 +345,7 @@ def modify_order(self, req: ModifyOrderReq, | API-CHANNEL | PRIVATE | | API-PERMISSION | SPOT | | API-RATE-LIMIT-POOL | SPOT | - | API-RATE-LIMIT-WEIGHT | 3 | + | API-RATE-LIMIT-WEIGHT | 1 | +-----------------------+---------+ """ pass diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_req.py b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_req.py index 924eb282..5b7d4b09 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_req.py @@ -32,8 +32,8 @@ class AddOrderReq(BaseModel): tags (str): Order tag, length cannot exceed 20 characters (ASCII) cancel_after (int): Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1 funds (str): When **type** is market, select one out of two: size or funds When placing a market order, the funds field refers to the funds for the priced asset (the asset name written latter) of the trading pair. The funds must be based on the quoteIncrement of the trading pair. The quoteIncrement represents the precision of the trading pair. The funds value for an order must be a multiple of quoteIncrement and must be between quoteMinSize and quoteMaxSize. - allow_max_time_window (int): Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. - client_timestamp (int): Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + allow_max_time_window (int): Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. + client_timestamp (int): Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. """ class SideEnum(Enum): @@ -152,12 +152,12 @@ class TimeInForceEnum(Enum): allow_max_time_window: Optional[int] = Field( default=None, description= - "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", alias="allowMaxTimeWindow") client_timestamp: Optional[int] = Field( default=None, description= - "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", alias="clientTimestamp") __properties: ClassVar[List[str]] = [ @@ -360,14 +360,14 @@ def set_funds(self, value: str) -> AddOrderReqBuilder: def set_allow_max_time_window(self, value: int) -> AddOrderReqBuilder: """ - Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. """ self.obj['allowMaxTimeWindow'] = value return self def set_client_timestamp(self, value: int) -> AddOrderReqBuilder: """ - Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. """ self.obj['clientTimestamp'] = value return self diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_sync_req.py b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_sync_req.py index 58c27a42..9a29eb17 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_sync_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_sync_req.py @@ -32,8 +32,8 @@ class AddOrderSyncReq(BaseModel): tags (str): Order tag, length cannot exceed 20 characters (ASCII) cancel_after (int): Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1 funds (str): When **type** is market, select one out of two: size or funds - allow_max_time_window (int): The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. - client_timestamp (int): Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + allow_max_time_window (int): Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. + client_timestamp (int): Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. """ class SideEnum(Enum): @@ -152,12 +152,12 @@ class TimeInForceEnum(Enum): allow_max_time_window: Optional[int] = Field( default=None, description= - "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", alias="allowMaxTimeWindow") client_timestamp: Optional[int] = Field( default=None, description= - "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", alias="clientTimestamp") __properties: ClassVar[List[str]] = [ @@ -365,14 +365,14 @@ def set_funds(self, value: str) -> AddOrderSyncReqBuilder: def set_allow_max_time_window(self, value: int) -> AddOrderSyncReqBuilder: """ - The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. """ self.obj['allowMaxTimeWindow'] = value return self def set_client_timestamp(self, value: int) -> AddOrderSyncReqBuilder: """ - Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. """ self.obj['clientTimestamp'] = value return self diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_test_req.py b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_test_req.py index e395d700..b9d73018 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_test_req.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_add_order_test_req.py @@ -32,8 +32,8 @@ class AddOrderTestReq(BaseModel): tags (str): Order tag, length cannot exceed 20 characters (ASCII) cancel_after (int): Cancel after n seconds, the order timing strategy is GTT, -1 means it will not be cancelled automatically, the default value is -1 funds (str): When **type** is market, select one out of two: size or funds - allow_max_time_window (int): Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. - client_timestamp (int): Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + allow_max_time_window (int): Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. + client_timestamp (int): Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. """ class SideEnum(Enum): @@ -151,12 +151,12 @@ class TimeInForceEnum(Enum): allow_max_time_window: Optional[int] = Field( default=None, description= - "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", alias="allowMaxTimeWindow") client_timestamp: Optional[int] = Field( default=None, description= - "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", alias="clientTimestamp") __properties: ClassVar[List[str]] = [ @@ -364,14 +364,14 @@ def set_funds(self, value: str) -> AddOrderTestReqBuilder: def set_allow_max_time_window(self, value: int) -> AddOrderTestReqBuilder: """ - Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail. + Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. """ self.obj['allowMaxTimeWindow'] = value return self def set_client_timestamp(self, value: int) -> AddOrderTestReqBuilder: """ - Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified. + Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified. """ self.obj['clientTimestamp'] = value return self diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_order_list.py b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_order_list.py index f4fbbbe7..82b3aa91 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_order_list.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_order_list.py @@ -32,8 +32,8 @@ class BatchAddOrdersOrderList(BaseModel): tags (str): Order tag, length cannot exceed 20 characters (ASCII) remark (str): Order placement remarks, length cannot exceed 20 characters (ASCII) funds (str): When **type** is market, select one out of two: size or funds - client_timestamp (int): Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. - allow_max_time_window (int): The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + client_timestamp (int): Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. + allow_max_time_window (int): Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. """ class TypeEnum(Enum): @@ -146,12 +146,12 @@ class StpEnum(Enum): client_timestamp: Optional[int] = Field( default=None, description= - "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", alias="clientTimestamp") allow_max_time_window: Optional[int] = Field( default=None, description= - "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", alias="allowMaxTimeWindow") __properties: ClassVar[List[str]] = [ @@ -365,7 +365,7 @@ def set_funds(self, value: str) -> BatchAddOrdersOrderListBuilder: def set_client_timestamp(self, value: int) -> BatchAddOrdersOrderListBuilder: """ - Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. """ self.obj['clientTimestamp'] = value return self @@ -373,7 +373,7 @@ def set_client_timestamp(self, def set_allow_max_time_window( self, value: int) -> BatchAddOrdersOrderListBuilder: """ - The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. """ self.obj['allowMaxTimeWindow'] = value return self diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_sync_order_list.py b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_sync_order_list.py index 03ef1234..2327455e 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_sync_order_list.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/order/model_batch_add_orders_sync_order_list.py @@ -32,8 +32,8 @@ class BatchAddOrdersSyncOrderList(BaseModel): tags (str): Order tag, length cannot exceed 20 characters (ASCII) remark (str): Order placement remarks, length cannot exceed 20 characters (ASCII) funds (str): When **type** is market, select one out of two: size or funds - allow_max_time_window (int): The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. - client_timestamp (int): Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + allow_max_time_window (int): Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. + client_timestamp (int): Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. """ class TypeEnum(Enum): @@ -146,12 +146,12 @@ class StpEnum(Enum): allow_max_time_window: Optional[int] = Field( default=None, description= - "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", alias="allowMaxTimeWindow") client_timestamp: Optional[int] = Field( default=None, description= - "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", alias="clientTimestamp") __properties: ClassVar[List[str]] = [ @@ -367,7 +367,7 @@ def set_funds(self, value: str) -> BatchAddOrdersSyncOrderListBuilder: def set_allow_max_time_window( self, value: int) -> BatchAddOrdersSyncOrderListBuilder: """ - The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail. + Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail. """ self.obj['allowMaxTimeWindow'] = value return self @@ -375,7 +375,7 @@ def set_allow_max_time_window( def set_client_timestamp(self, value: int) -> BatchAddOrdersSyncOrderListBuilder: """ - Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified. + Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified. """ self.obj['clientTimestamp'] = value return self diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v1_event.py b/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v1_event.py index 54666ae4..d881b585 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v1_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v1_event.py @@ -22,7 +22,7 @@ class OrderV1Event(BaseModel): client_oid (str): Client Order ID: The ClientOid field is a unique ID created by the user filled_size (str): Cumulative number filled order_id (str): The unique order id generated by the trading system - order_time (int): Order time (milliseconds) + order_time (int): Gateway received the message time (milliseconds) order_type (OrderTypeEnum): User-specified order type origin_size (str): User-specified order size price (str): Specify price for currency @@ -32,7 +32,7 @@ class OrderV1Event(BaseModel): size (str): User-specified order size status (StatusEnum): Order Status symbol (str): Symbol - ts (int): Push time (nanoseconds) + ts (int): Match engine received the message time (nanoseconds) type (TypeEnum): Order Type old_size (str): The size before order update fee_type (FeeTypeEnum): Actual Fee Type @@ -124,9 +124,10 @@ class LiquidityEnum(Enum): default=None, description="The unique order id generated by the trading system", alias="orderId") - order_time: Optional[int] = Field(default=None, - description="Order time (milliseconds)", - alias="orderTime") + order_time: Optional[int] = Field( + default=None, + description="Gateway received the message time (milliseconds)", + alias="orderTime") order_type: Optional[OrderTypeEnum] = Field( default=None, description="User-specified order type", @@ -148,8 +149,9 @@ class LiquidityEnum(Enum): status: Optional[StatusEnum] = Field(default=None, description="Order Status") symbol: Optional[str] = Field(default=None, description="Symbol") - ts: Optional[int] = Field(default=None, - description="Push time (nanoseconds)") + ts: Optional[int] = Field( + default=None, + description="Match engine received the message time (nanoseconds)") type: Optional[TypeEnum] = Field(default=None, description="Order Type") old_size: Optional[str] = Field(default=None, description="The size before order update", diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v2_event.py b/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v2_event.py index 67537d07..2cb38692 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v2_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_order_v2_event.py @@ -22,7 +22,7 @@ class OrderV2Event(BaseModel): client_oid (str): Client Order ID: The ClientOid field is a unique ID created by the user filled_size (str): Cumulative number filled order_id (str): The unique order id generated by the trading system - order_time (int): Order time (milliseconds) + order_time (int): Gateway received the message time (milliseconds) order_type (OrderTypeEnum): User-specified order type origin_size (str): User-specified order size price (str): Price @@ -32,7 +32,7 @@ class OrderV2Event(BaseModel): size (str): User-specified order size status (StatusEnum): Order Status symbol (str): Symbol - ts (int): Push time (nanoseconds) + ts (int): Match engine received the message time (nanoseconds) type (TypeEnum): Order Type old_size (str): The size before order update fee_type (FeeTypeEnum): Actual Fee Type @@ -126,9 +126,10 @@ class LiquidityEnum(Enum): default=None, description="The unique order id generated by the trading system", alias="orderId") - order_time: Optional[int] = Field(default=None, - description="Order time (milliseconds)", - alias="orderTime") + order_time: Optional[int] = Field( + default=None, + description="Gateway received the message time (milliseconds)", + alias="orderTime") order_type: Optional[OrderTypeEnum] = Field( default=None, description="User-specified order type", @@ -149,8 +150,9 @@ class LiquidityEnum(Enum): status: Optional[StatusEnum] = Field(default=None, description="Order Status") symbol: Optional[str] = Field(default=None, description="Symbol") - ts: Optional[int] = Field(default=None, - description="Push time (nanoseconds)") + ts: Optional[int] = Field( + default=None, + description="Match engine received the message time (nanoseconds)") type: Optional[TypeEnum] = Field(default=None, description="Order Type") old_size: Optional[str] = Field(default=None, description="The size before order update", diff --git a/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_stop_order_event.py b/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_stop_order_event.py index a910a926..8c926c7b 100644 --- a/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_stop_order_event.py +++ b/sdk/python/kucoin_universal_sdk/generate/spot/spot_private/model_stop_order_event.py @@ -24,7 +24,7 @@ class StopOrderEvent(BaseModel): order_type (OrderTypeEnum): User-specified order type side (SideEnum): buy or sell size (str): User-specified order size - stop (StopEnum): Order type: loss: stop loss order, oco: oco order + stop (StopEnum): Order type stop_price (str): Stop Price symbol (str): symbol trade_type (TradeTypeEnum): The type of trading: TRADE (Spot), MARGIN_TRADE (Cross Margin), MARGIN_ISOLATED_TRADE (Isolated Margin). @@ -52,10 +52,20 @@ class StopEnum(Enum): """ Attributes: LOSS: stop loss order - OCO: oco order + ENTRY: Take profit order + L_L_O: Limit stop loss OCO order + L_S_O: Trigger stop loss OCO order + E_L_O: Limit stop profit OCO order + E_S_O: Trigger stop profit OCO order + TSO: Moving stop loss order """ LOSS = 'loss' - OCO = 'oco' + ENTRY = 'entry' + L_L_O = 'l_l_o' + L_S_O = 'l_s_o' + E_L_O = 'e_l_o' + E_S_O = 'e_s_o' + TSO = 'tso' class TradeTypeEnum(Enum): """ @@ -105,9 +115,7 @@ class TypeEnum(Enum): side: Optional[SideEnum] = Field(default=None, description="buy or sell") size: Optional[str] = Field(default=None, description="User-specified order size") - stop: Optional[StopEnum] = Field( - default=None, - description="Order type: loss: stop loss order, oco: oco order") + stop: Optional[StopEnum] = Field(default=None, description="Order type") stop_price: Optional[str] = Field(default=None, description="Stop Price", alias="stopPrice") diff --git a/sdk/python/kucoin_universal_sdk/generate/version.py b/sdk/python/kucoin_universal_sdk/generate/version.py index d3336ef2..f3df5c94 100644 --- a/sdk/python/kucoin_universal_sdk/generate/version.py +++ b/sdk/python/kucoin_universal_sdk/generate/version.py @@ -1,2 +1,2 @@ -sdk_version = "v1.2.1.post1" -sdk_generate_date = "2025-04-04" \ No newline at end of file +sdk_version = "v1.3.0" +sdk_generate_date = "2025-06-11" diff --git a/sdk/python/kucoin_universal_sdk/generate/viplending/viplending/api_vip_lending.py b/sdk/python/kucoin_universal_sdk/generate/viplending/viplending/api_vip_lending.py index b912a10a..fdbc0457 100644 --- a/sdk/python/kucoin_universal_sdk/generate/viplending/viplending/api_vip_lending.py +++ b/sdk/python/kucoin_universal_sdk/generate/viplending/viplending/api_vip_lending.py @@ -40,7 +40,7 @@ def get_loan_info(self, **kwargs: Any) -> GetLoanInfoResp: +-----------------------+------------+ | API-DOMAIN | SPOT | | API-CHANNEL | PRIVATE | - | API-PERMISSION | GENERAL | + | API-PERMISSION | SPOT | | API-RATE-LIMIT-POOL | MANAGEMENT | | API-RATE-LIMIT-WEIGHT | 5 | +-----------------------+------------+ @@ -58,7 +58,7 @@ def get_accounts(self, **kwargs: Any) -> GetAccountsResp: +-----------------------+------------+ | API-DOMAIN | SPOT | | API-CHANNEL | PRIVATE | - | API-PERMISSION | GENERAL | + | API-PERMISSION | SPOT | | API-RATE-LIMIT-POOL | MANAGEMENT | | API-RATE-LIMIT-WEIGHT | 20 | +-----------------------+------------+ diff --git a/sdk/python/requirements-test.txt b/sdk/python/requirements-test.txt index 04ebc219..3a0761b5 100644 --- a/sdk/python/requirements-test.txt +++ b/sdk/python/requirements-test.txt @@ -4,7 +4,7 @@ charset-normalizer==3.4.0 idna==3.10 pydantic==2.10.3 pydantic_core==2.27.1 -requests==2.32.3 +requests==2.32.4 typing_extensions==4.12.2 urllib3==2.2.3 websocket-client==1.8.0 diff --git a/sdk/python/requirements.txt b/sdk/python/requirements.txt index 80a0ce40..4cb5e556 100644 --- a/sdk/python/requirements.txt +++ b/sdk/python/requirements.txt @@ -4,7 +4,7 @@ charset-normalizer==3.4.0 idna==3.10 pydantic==2.10.3 pydantic_core==2.27.1 -requests==2.32.3 +requests==2.32.4 typing_extensions==4.12.2 urllib3==2.2.3 websocket-client==1.8.0 \ No newline at end of file diff --git a/sdk/python/run_test.sh b/sdk/python/script/auto_test.sh similarity index 100% rename from sdk/python/run_test.sh rename to sdk/python/script/auto_test.sh diff --git a/sdk/python/script/release_test.sh b/sdk/python/script/release_test.sh new file mode 100644 index 00000000..051558ae --- /dev/null +++ b/sdk/python/script/release_test.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +VENV_DIR=".venv" + +echo "Virtual environment not found. Creating a new one..." +python3 -m venv "$VENV_DIR" || { echo "Failed to create virtual environment"; exit 1; } +echo "Virtual environment created at $VENV_DIR." + +source "$VENV_DIR/bin/activate" +echo "Installing dependencies..." + +echo "USE_LOCAL = ${USE_LOCAL:-}" + +if [[ "${USE_LOCAL,,}" == "true" ]]; then + echo "📦 Installing local wheel(s)…" + ls /tmp/*.whl 1>/dev/null 2>&1 + pip install --no-cache-dir /tmp/*.whl +else + echo "📦 Installing kucoin-universal-sdk from PyPI…" + pip install --no-cache-dir kucoin-universal-sdk +fi + +pip install pytest + +pytest -q test/regression/run_service_test.py +deactivate \ No newline at end of file diff --git a/sdk/python/script/run_forever_test.sh b/sdk/python/script/run_forever_test.sh new file mode 100644 index 00000000..2158884d --- /dev/null +++ b/sdk/python/script/run_forever_test.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +VENV_DIR=".venv" + +echo "Virtual environment not found. Creating a new one..." +python3 -m venv "$VENV_DIR" || { echo "Failed to create virtual environment"; exit 1; } +echo "Virtual environment created at $VENV_DIR." + +source "$VENV_DIR/bin/activate" +echo "Installing dependencies..." + +echo "USE_LOCAL = ${USE_LOCAL:-}" + +if [[ "${USE_LOCAL,,}" == "true" ]]; then + echo "📦 Installing local wheel(s)…" + ls /tmp/*.whl 1>/dev/null 2>&1 + pip install --no-cache-dir /tmp/*.whl +else + echo "📦 Installing kucoin-universal-sdk from PyPI…" + pip install --no-cache-dir kucoin-universal-sdk +fi + +python test/regression/run_forever_test.py +deactivate \ No newline at end of file diff --git a/sdk/python/script/ws_reconnect_test.sh b/sdk/python/script/ws_reconnect_test.sh new file mode 100644 index 00000000..86e74ad0 --- /dev/null +++ b/sdk/python/script/ws_reconnect_test.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +VENV_DIR=".venv" + +echo "Virtual environment not found. Creating a new one..." +python3 -m venv "$VENV_DIR" || { echo "Failed to create virtual environment"; exit 1; } +echo "Virtual environment created at $VENV_DIR." + +source "$VENV_DIR/bin/activate" +echo "Installing dependencies..." + +echo "USE_LOCAL = ${USE_LOCAL:-}" + +if [[ "${USE_LOCAL,,}" == "true" ]]; then + echo "📦 Installing local wheel(s)…" + ls /tmp/*.whl 1>/dev/null 2>&1 + pip install --no-cache-dir /tmp/*.whl +else + echo "📦 Installing kucoin-universal-sdk from PyPI…" + pip install --no-cache-dir kucoin-universal-sdk +fi + +python test/regression/run_reconnect_test.py +deactivate \ No newline at end of file diff --git a/sdk/python/setup.py b/sdk/python/setup.py index b5bbdb1c..757921ca 100644 --- a/sdk/python/setup.py +++ b/sdk/python/setup.py @@ -2,7 +2,7 @@ setup( name="kucoin-universal-sdk", - version="1.2.1.post1", + version="1.3.0", description="Official KuCoin Universal SDK", author="KuCoin", author_email="api@kucoin.com", diff --git a/sdk/python/test/e2e/rest/account_test/account_withdraw_api_test.py b/sdk/python/test/e2e/rest/account_test/account_withdraw_api_test.py index 545be970..d115b936 100644 --- a/sdk/python/test/e2e/rest/account_test/account_withdraw_api_test.py +++ b/sdk/python/test/e2e/rest/account_test/account_withdraw_api_test.py @@ -3,6 +3,7 @@ from kucoin_universal_sdk.api.client import DefaultClient from kucoin_universal_sdk.extension.interceptor.logging import LoggingInterceptor +from kucoin_universal_sdk.generate.account.withdrawal import GetWithdrawalHistoryByIdReqBuilder from kucoin_universal_sdk.generate.account.withdrawal.model_cancel_withdrawal_req import CancelWithdrawalReqBuilder from kucoin_universal_sdk.generate.account.withdrawal.model_get_withdrawal_history_old_req import \ GetWithdrawalHistoryOldReqBuilder @@ -89,6 +90,26 @@ def test_get_withdrawal_history_req(self): print("error: ", e) raise e + def test_get_withdrawal_history_by_id_req(self): + """ + get_withdrawal_history_by_id + Get Withdrawal History By ID + /api/v1/withdrawals/{withdrawalId} + """ + + builder = GetWithdrawalHistoryByIdReqBuilder() + builder.set_withdrawal_id("674576dc74b2bb000778452c") + req = builder.build() + try: + resp = self.api.get_withdrawal_history_by_id(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + + def test_withdrawal_v1_req(self): """ withdrawal_v1 @@ -155,7 +176,7 @@ def test_withdrawal_v3_req(self): """ builder = WithdrawalV3ReqBuilder() - builder.set_currency("USDT").set_chain("bsc").set_amount(20).set_is_inner(False).set_to_address( + builder.set_currency("USDT").set_chain("bsc").set_amount("20").set_is_inner(False).set_to_address( "*************").set_withdraw_type(WithdrawalV3Req.WithdrawTypeEnum.ADDRESS) req = builder.build() try: diff --git a/sdk/python/test/e2e/rest/broker_test/ndbroker_test.py b/sdk/python/test/e2e/rest/broker_test/ndbroker_test.py index 4fe831d2..645078ad 100644 --- a/sdk/python/test/e2e/rest/broker_test/ndbroker_test.py +++ b/sdk/python/test/e2e/rest/broker_test/ndbroker_test.py @@ -4,6 +4,8 @@ from kucoin_universal_sdk.api.client import DefaultClient from kucoin_universal_sdk.extension.interceptor.logging import LoggingInterceptor +from kucoin_universal_sdk.generate.broker.ndbroker import SubmitKycReqBuilder, SubmitKycReq, GetKycStatusReqBuilder, \ + GetKycStatusListReqBuilder from kucoin_universal_sdk.generate.broker.ndbroker.model_add_sub_account_api_req import AddSubAccountApiReqBuilder, \ AddSubAccountApiReq from kucoin_universal_sdk.generate.broker.ndbroker.model_add_sub_account_req import AddSubAccountReqBuilder @@ -63,6 +65,66 @@ def setUp(self): kucoin_rest_api = client.rest_service() self.api = kucoin_rest_api.get_broker_service().get_nd_broker_api() + def test_submit_kyc_req(self): + """ + submit_kyc + Submit KYC + /api/kyc/ndBroker/proxyClient/submit + """ + + builder = SubmitKycReqBuilder() + builder.set_client_uid("226383154").set_first_name("Kaylah").set_last_name("Padberg").set_issue_country( + "JP").set_birth_date( + "2000-01-01").set_identity_type(SubmitKycReq.IdentityTypeEnum.PASSPORT).set_identity_number( + "55").set_expire_date("2030-01-01").set_front_photo("****").set_backend_photo("***").set_face_photo("***") + req = builder.build() + try: + resp = self.api.submit_kyc(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + + def test_get_kyc_status_req(self): + """ + get_kyc_status + Get KYC Status + /api/kyc/ndBroker/proxyClient/status/list + """ + + builder = GetKycStatusReqBuilder() + builder.set_client_uids("226383154") + req = builder.build() + try: + resp = self.api.get_kyc_status(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + + def test_get_kyc_status_list_req(self): + """ + get_kyc_status_list + Get KYC Status List + /api/kyc/ndBroker/proxyClient/status/page + """ + + builder = GetKycStatusListReqBuilder() + builder.set_page_number(1).set_page_size(100) + req = builder.build() + try: + resp = self.api.get_kyc_status_list(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + def test_get_deposit_list_req(self): """ get_deposit_list diff --git a/sdk/python/test/e2e/rest/futures_test/futures_position_test.py b/sdk/python/test/e2e/rest/futures_test/futures_position_test.py index 784d80f3..03ef8272 100644 --- a/sdk/python/test/e2e/rest/futures_test/futures_position_test.py +++ b/sdk/python/test/e2e/rest/futures_test/futures_position_test.py @@ -3,6 +3,8 @@ from kucoin_universal_sdk.api.client import DefaultClient from kucoin_universal_sdk.extension.interceptor.logging import LoggingInterceptor +from kucoin_universal_sdk.generate.futures.positions import BatchSwitchMarginModeReqBuilder, BatchSwitchMarginModeReq, \ + GetCrossMarginRiskLimitReqBuilder from kucoin_universal_sdk.generate.futures.positions.model_add_isolated_margin_req import AddIsolatedMarginReqBuilder from kucoin_universal_sdk.generate.futures.positions.model_get_cross_margin_leverage_req import \ GetCrossMarginLeverageReqBuilder @@ -139,6 +141,25 @@ def test_remove_isolated_margin_req(self): print("error: ", e) raise e + def test_get_cross_margin_risk_limit_req(self): + """ + get_cross_margin_risk_limit + Get Cross Margin Risk Limit + /api/v2/batchGetCrossOrderLimit + """ + + builder = GetCrossMarginRiskLimitReqBuilder() + builder.set_symbol("XBTUSDTM").set_total_margin("1000").set_leverage(1) + req = builder.build() + try: + resp = self.api.get_cross_margin_risk_limit(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + def test_get_position_details_req(self): """ get_position_details @@ -310,6 +331,25 @@ def test_switch_margin_mode_req(self): print("error: ", e) raise e + def test_batch_switch_margin_mode_req(self): + """ + batch_switch_margin_mode + Batch Switch Margin Mode + /api/v2/position/batchChangeMarginMode + """ + + builder = BatchSwitchMarginModeReqBuilder() + builder.set_margin_mode(BatchSwitchMarginModeReq.MarginModeEnum.ISOLATED).set_symbols(['XBTUSDTM', 'DOGEUSDTM']) + req = builder.build() + try: + resp = self.api.batch_switch_margin_mode(req) + print("code: ", resp.common_response.code) + print("msg: ", resp.common_response.message) + print("data: ", resp.to_json()) + except Exception as e: + print("error: ", e) + raise e + def test_get_margin_mode_req(self): """ get_margin_mode diff --git a/sdk/python/test/regression/run_forever_test.py b/sdk/python/test/regression/run_forever_test.py new file mode 100644 index 00000000..caf07617 --- /dev/null +++ b/sdk/python/test/regression/run_forever_test.py @@ -0,0 +1,125 @@ +import logging +import os +import threading +from time import sleep + +from kucoin_universal_sdk.api import DefaultClient +from kucoin_universal_sdk.generate.spot.market import GetFullOrderBookReqBuilder +from kucoin_universal_sdk.model import ClientOptionBuilder, WebSocketClientOptionBuilder +from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \ + GLOBAL_BROKER_API_ENDPOINT +from kucoin_universal_sdk.model import TransportOptionBuilder + +SLEEP_SECONDS = 5 +SLEEP_FOREVER = 3600 * 24 * 30 * 12 + + +class Runner(): + + def __init__(self): + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + + # Retrieve API secret information from environment variables + key = os.getenv("API_KEY", "") + secret = os.getenv("API_SECRET", "") + passphrase = os.getenv("API_PASSPHRASE", "") + + # Set specific options, others will fall back to default values + http_transport_option = ( + TransportOptionBuilder() + .set_keep_alive(True) + .set_max_pool_size(10) + .set_max_connection_per_pool(10) + .build() + ) + + ws_transport_option = ( + WebSocketClientOptionBuilder().build() + ) + + # Create a client using the specified options + client_option = ( + ClientOptionBuilder() + .set_key(key) + .set_secret(secret) + .set_passphrase(passphrase) + .set_spot_endpoint(GLOBAL_API_ENDPOINT) + .set_futures_endpoint(GLOBAL_FUTURES_API_ENDPOINT) + .set_broker_endpoint(GLOBAL_BROKER_API_ENDPOINT) + .set_transport_option(http_transport_option) + .set_websocket_client_option(ws_transport_option) + .build() + ) + self.client = DefaultClient(client_option) + self.rest_service = self.client.rest_service() + self.ws_service = self.client.ws_service() + self.market_api = self.rest_service.get_spot_service().get_market_api() + + self.market_error_counter = 0 + self.ws_start_stop_error_counter = 0 + self.ws_message_counter = 0 + + def run_ws_service_star_stop_forever(self): + def print_cb(topic, subject, data): + len(data.to_json()) + + while True: + sleep(SLEEP_SECONDS) + try: + spot_public = self.ws_service.new_spot_public_ws() + spot_public.start() + sub_id = spot_public.ticker(["ETH-USDT", "BTC-USDT"], print_cb) + sleep(SLEEP_SECONDS) + spot_public.unsubscribe(sub_id) + spot_public.stop() + logging.info("WS STAR/STOP: [OK]") + except Exception as e: + logging.error("WS STAR/STOP: [ERROR]") + logging.error(e) + self.ws_start_stop_error_counter = self.ws_start_stop_error_counter + 1 + + def run_ws_service_forever(self): + def print_cb(topic, subject, data): + len(data.to_json()) + self.ws_message_counter = self.ws_message_counter + 1 + + spot_public = self.ws_service.new_spot_public_ws() + spot_public.start() + spot_public.orderbook_level50(["ETH-USDT", "BTC-USDT"], print_cb) + logging.info("WS: [OK]") + sleep(SLEEP_FOREVER) + + def run_market_api_forever(self): + while True: + sleep(SLEEP_SECONDS) + try: + get_full_order_book_req = GetFullOrderBookReqBuilder().set_symbol("BTC-USDT").build() + get_full_order_book_resp = self.market_api.get_full_order_book(get_full_order_book_req) + logging.info("MARKET API: [OK] %d %d", len(get_full_order_book_resp.bids), + len(get_full_order_book_resp.asks)) + except Exception as e: + logging.error("MARKET API: [ERROR]") + logging.error(e) + self.market_error_counter = self.market_error_counter + 1 + + def print_error(self): + while True: + sleep(SLEEP_SECONDS) + logging.info("Stat, Market_ERROR:[%d], WS_SS_ERROR:[%d], WS_MESSAGE:[%d]", self.market_error_counter, + self.ws_start_stop_error_counter, self.ws_message_counter) + + def run_forever(self): + threading.Thread(target=self.run_market_api_forever, daemon=True).start() + threading.Thread(target=self.run_ws_service_forever, daemon=True).start() + threading.Thread(target=self.run_ws_service_star_stop_forever, daemon=True).start() + threading.Thread(target=self.print_error, daemon=True).start() + + +if __name__ == '__main__': + r = Runner() + r.run_forever() + sleep(SLEEP_FOREVER) diff --git a/sdk/python/test/regression/run_reconnect_test.py b/sdk/python/test/regression/run_reconnect_test.py new file mode 100644 index 00000000..4cbcdecb --- /dev/null +++ b/sdk/python/test/regression/run_reconnect_test.py @@ -0,0 +1,88 @@ +import logging +import os +from time import sleep + +from kucoin_universal_sdk.api import DefaultClient, KucoinRestService +from kucoin_universal_sdk.generate.futures.futures_public import FuturesPublicWS +from kucoin_universal_sdk.generate.spot.market import GetAllSymbolsReqBuilder +from kucoin_universal_sdk.generate.spot.spot_public import SpotPublicWS +from kucoin_universal_sdk.model import ClientOptionBuilder, TransportOptionBuilder +from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \ + GLOBAL_BROKER_API_ENDPOINT +from kucoin_universal_sdk.model import WebSocketClientOptionBuilder + + +def ws_reconnect_test(): + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + + # Retrieve API secret information from environment variables + key = os.getenv("API_KEY", "") + secret = os.getenv("API_SECRET", "") + passphrase = os.getenv("API_PASSPHRASE", "") + + # Set specific options, others will fall back to default values + ws_client_option = ( + WebSocketClientOptionBuilder().build() + ) + + # Create a client using the specified options + client_option = ( + ClientOptionBuilder() + .set_key(key) + .set_secret(secret) + .set_passphrase(passphrase) + .set_websocket_client_option(ws_client_option) + .set_transport_option(TransportOptionBuilder().build()) + .set_spot_endpoint(GLOBAL_API_ENDPOINT) + .set_futures_endpoint(GLOBAL_FUTURES_API_ENDPOINT) + .set_broker_endpoint(GLOBAL_BROKER_API_ENDPOINT) + .build() + ) + client = DefaultClient(client_option) + kucoin_ws_service = client.ws_service() + symbols = get_spot_symbols(client.rest_service()) + spot_ws_example(kucoin_ws_service.new_spot_public_ws(), symbols) + futures_ws_example(kucoin_ws_service.new_futures_public_ws()) + + +def get_spot_symbols(rest_service: KucoinRestService): + market_api = rest_service.get_spot_service().get_market_api() + symbols_response = market_api.get_all_symbols(GetAllSymbolsReqBuilder().set_market("USDS").build()) + symbols = [] + for d in symbols_response.data: + symbols.append(d.symbol) + if len(symbols) > 100: + symbols = symbols[:100] + return symbols + + +def callback_func(topic: str, subject: str, data) -> None: + pass + + +def spot_ws_example(spot_public_ws: SpotPublicWS, symbols): + spot_public_ws.start() + + for symbol in symbols: + spot_public_ws.trade([symbol], callback_func) + + spot_public_ws.ticker(["BTC-USDT", "ETH-USDT"], callback_func) + logging.info("Spot subscribe [OK]") + + +def futures_ws_example(futures_public_ws: FuturesPublicWS): + futures_public_ws.start() + + futures_public_ws.ticker_v2("XBTUSDTM", callback_func) + futures_public_ws.ticker_v1("XBTUSDTM", callback_func) + logging.info("Futures subscribe [OK]") + + +if __name__ == "__main__": + ws_reconnect_test() + logging.info("Total subscribe: 103") + sleep(3600 * 24 * 365) diff --git a/sdk/python/test/regression/run_service_test.py b/sdk/python/test/regression/run_service_test.py new file mode 100644 index 00000000..ac3caa94 --- /dev/null +++ b/sdk/python/test/regression/run_service_test.py @@ -0,0 +1,175 @@ +import logging +import os +import unittest +import uuid + +from kucoin_universal_sdk.api import DefaultClient +from kucoin_universal_sdk.generate.account.fee import GetBasicFeeReqBuilder, GetBasicFeeReq +from kucoin_universal_sdk.generate.earn.earn import GetSavingsProductsReqBuilder +from kucoin_universal_sdk.generate.futures.order import AddOrderReqBuilder, AddOrderReq, \ + GetOrderByOrderIdReqBuilder as FuturesGetOrderByOrderIdReqBuilder, CancelOrderByIdReqBuilder +from kucoin_universal_sdk.generate.margin.order import AddOrderReqBuilder as MarginAddOrderReqBuilder, \ + AddOrderReq as MarginAddOrderReq, \ + GetOrderByOrderIdReqBuilder as MarginGetOrderByOrderIdReqBuilder, \ + CancelOrderByOrderIdReqBuilder as MarginCancelOrderByOrderIdReqBuilder +from kucoin_universal_sdk.generate.spot.market import Get24hrStatsReqBuilder +from kucoin_universal_sdk.generate.spot.order import AddOrderSyncReqBuilder, AddOrderSyncReq, \ + GetOrderByOrderIdReqBuilder, CancelOrderByOrderIdReqBuilder +from kucoin_universal_sdk.model import ClientOptionBuilder, RestResponse +from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \ + GLOBAL_BROKER_API_ENDPOINT +from kucoin_universal_sdk.model import TransportOptionBuilder + + +class CheckAllServiceTest(unittest.TestCase): + + def setUp(self): + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + + # Retrieve API secret information from environment variables + key = os.getenv("API_KEY", "") + secret = os.getenv("API_SECRET", "") + passphrase = os.getenv("API_PASSPHRASE", "") + + # Set specific options, others will fall back to default values + http_transport_option = ( + TransportOptionBuilder() + .set_keep_alive(True) + .set_max_pool_size(10) + .set_max_connection_per_pool(10) + .build() + ) + + # Create a client using the specified options + client_option = ( + ClientOptionBuilder() + .set_key(key) + .set_secret(secret) + .set_passphrase(passphrase) + .set_spot_endpoint(GLOBAL_API_ENDPOINT) + .set_futures_endpoint(GLOBAL_FUTURES_API_ENDPOINT) + .set_broker_endpoint(GLOBAL_BROKER_API_ENDPOINT) + .set_transport_option(http_transport_option) + .build() + ) + self.client = DefaultClient(client_option) + self.rest_service = self.client.rest_service() + + def check_common_response(self, common_resp: RestResponse): + self.assertEqual(common_resp.code, '200000') + self.assertIsNotNone(common_resp.rate_limit) + + def test_account_service(self): + account_service = self.rest_service.get_account_service() + fee_api = account_service.get_fee_api() + basic_fee_response = fee_api.get_basic_fee( + GetBasicFeeReqBuilder().set_currency_type(GetBasicFeeReq.CurrencyTypeEnum.T_0).build()) + self.check_common_response(basic_fee_response.common_response) + self.assertTrue(len(basic_fee_response.maker_fee_rate) > 0) + self.assertTrue(len(basic_fee_response.taker_fee_rate) > 0) + + def test_earn_service(self): + earn_service = self.rest_service.get_earn_service() + earn_api = earn_service.get_earn_api() + savings_products_response = earn_api.get_savings_products( + GetSavingsProductsReqBuilder().set_currency("USDT").build()) + self.check_common_response(savings_products_response.common_response) + self.assertTrue(len(savings_products_response.data) > 0) + + def test_margin_service(self): + margin_service = self.rest_service.get_margin_service() + order_api = margin_service.get_order_api() + + # add order + add_order_req = MarginAddOrderReqBuilder().set_client_oid(uuid.uuid4().__str__()).set_side( + MarginAddOrderReq.SideEnum.BUY).set_symbol( + "BTC-USDT").set_type(MarginAddOrderReq.TypeEnum.LIMIT).set_price("10000").set_size("0.001").set_auto_repay( + True).set_auto_borrow(True).set_is_isolated(True).build() + add_order_resp = order_api.add_order(add_order_req) + self.check_common_response(add_order_resp.common_response) + self.assertTrue(len(add_order_resp.order_id) > 0) + + # query order + query_order_req = MarginGetOrderByOrderIdReqBuilder().set_symbol("BTC-USDT").set_order_id( + add_order_resp.order_id).build() + query_order_resp = order_api.get_order_by_order_id(query_order_req) + self.check_common_response(query_order_resp.common_response) + self.assertTrue(len(query_order_resp.symbol), 0) + + # cancel order + cancel_order_req = MarginCancelOrderByOrderIdReqBuilder().set_order_id(add_order_resp.order_id).set_symbol( + "BTC-USDT").build() + cancel_order_resp = order_api.cancel_order_by_order_id(cancel_order_req) + self.check_common_response(cancel_order_resp.common_response) + self.assertTrue(len(cancel_order_resp.order_id) > 0) + + def test_spot_service(self): + spot_service = self.rest_service.get_spot_service() + + # query market api + market_api = spot_service.get_market_api() + stat_response = market_api.get24hr_stats(Get24hrStatsReqBuilder().set_symbol("BTC-USDT").build()) + self.check_common_response(stat_response.common_response) + self.assertTrue(len(stat_response.last) > 0) + + order_api = spot_service.get_order_api() + + # add order + add_order_sync_req = AddOrderSyncReqBuilder().set_client_oid(uuid.uuid4().__str__()).set_side( + AddOrderSyncReq.SideEnum.BUY).set_symbol( + "BTC-USDT").set_type( + AddOrderSyncReq.TypeEnum.LIMIT).set_remark("sdk_test").set_price("10000").set_size("0.001").build() + add_order_sync_resp = order_api.add_order_sync(add_order_sync_req) + self.check_common_response(add_order_sync_resp.common_response) + self.assertTrue(len(add_order_sync_resp.order_id) > 0) + self.assertTrue(add_order_sync_resp.order_time > 0) + + # query order + query_order_req = GetOrderByOrderIdReqBuilder().set_symbol("BTC-USDT").set_order_id( + add_order_sync_resp.order_id).build() + query_order_resp = order_api.get_order_by_order_id(query_order_req) + self.check_common_response(query_order_resp.common_response) + self.assertTrue(len(query_order_resp.symbol), 0) + + # cancel order + cancel_order_req = CancelOrderByOrderIdReqBuilder().set_order_id(add_order_sync_resp.order_id).set_symbol( + "BTC-USDT").build() + cancel_order_resp = order_api.cancel_order_by_order_id(cancel_order_req) + self.check_common_response(cancel_order_resp.common_response) + self.assertTrue(len(cancel_order_resp.order_id) > 0) + + def test_futures_service(self): + futures_service = self.rest_service.get_futures_service() + + # query market api + market_api = futures_service.get_market_api() + stat_response = market_api.get24hr_stats() + self.check_common_response(stat_response.common_response) + self.assertIsNotNone(stat_response.turnover_of24h) + + order_api = futures_service.get_order_api() + + # add order + add_order_req = AddOrderReqBuilder().set_client_oid(uuid.uuid4().__str__()).set_side( + AddOrderReq.SideEnum.BUY).set_symbol("XBTUSDTM").set_leverage(1).set_type( + AddOrderReq.TypeEnum.LIMIT).set_remark("sdk_test").set_margin_mode( + AddOrderReq.MarginModeEnum.CROSS).set_price("1").set_size(1).build() + add_order_resp = order_api.add_order(add_order_req) + self.check_common_response(add_order_resp.common_response) + self.assertTrue(len(add_order_resp.order_id) > 0) + + # query order + query_order_req = FuturesGetOrderByOrderIdReqBuilder().set_order_id(add_order_resp.order_id).build() + query_order_resp = order_api.get_order_by_order_id(query_order_req) + self.check_common_response(query_order_resp.common_response) + self.assertTrue(len(query_order_resp.symbol), 0) + + # cancel order + cancel_order_req = CancelOrderByIdReqBuilder().set_order_id(add_order_resp.order_id).build() + cancel_order_resp = order_api.cancel_order_by_id(cancel_order_req) + self.check_common_response(cancel_order_resp.common_response) + self.assertTrue(len(cancel_order_resp.cancelled_order_ids) > 0) diff --git a/spec/apis.csv b/spec/apis.csv index acbbf27b..dc6d291f 100644 --- a/spec/apis.csv +++ b/spec/apis.csv @@ -38,6 +38,7 @@ account,withdrawal,/api/v1/withdrawals/quotas,get,Get Withdrawal Quotas account,withdrawal,/api/v3/withdrawals,post,Withdraw (V3) account,withdrawal,/api/v1/withdrawals/{withdrawalId},delete,Cancel Withdrawal account,withdrawal,/api/v1/withdrawals,get,Get Withdrawal History +account,withdrawal,/api/v1/withdrawals/{withdrawalId},get,Get Withdrawal History By ID account,withdrawal,/api/v1/hist-withdrawals,get,Get Withdrawal History - Old account,withdrawal,/api/v1/withdrawals,post,Withdraw - V1 account,transfer,/api/v1/accounts/transferable,get,Get Transfer Quotas @@ -190,6 +191,7 @@ futures,order,/api/v1/fills,get,Get Trade History futures,order,/api/v1/orders,delete,Cancel All Orders - V1 futures,positions,/api/v2/position/getMarginMode,get,Get Margin Mode futures,positions,/api/v2/position/changeMarginMode,post,Switch Margin Mode +futures,positions,/api/v2/position/batchChangeMarginMode,post,Batch Switch Margin Mode futures,positions,/api/v2/getMaxOpenSize,get,Get Max Open Size futures,positions,/api/v1/position,get,Get Position Details futures,positions,/api/v1/positions,get,Get Position List @@ -199,10 +201,11 @@ futures,positions,/api/v2/getCrossUserLeverage,get,Get Cross Margin Leverage futures,positions,/api/v2/changeCrossUserLeverage,post,Modify Cross Margin Leverage futures,positions,/api/v1/position/margin/deposit-margin,post,Add Isolated Margin futures,positions,/api/v1/margin/withdrawMargin,post,Remove Isolated Margin +futures,positions,/api/v2/batchGetCrossOrderLimit,get,Get Cross Margin Risk Limit futures,positions,/api/v1/contracts/risk-limit/{symbol},get,Get Isolated Margin Risk Limit futures,positions,/api/v1/position/risk-limit-level/change,post,Modify Isolated Margin Risk Limit futures,positions,/api/v1/position/margin/auto-deposit-status,post,Modify Isolated Margin Auto-Deposit Status -futures,fundingfees,/api/v1/funding-rate/{symbol}/current,get,Get Current Funding Rate. +futures,fundingfees,/api/v1/funding-rate/{symbol}/current,get,Get Current Funding Rate futures,fundingfees,/api/v1/contract/funding-rates,get,Get Public Funding History futures,fundingfees,/api/v1/funding-history,get,Get Private Funding History earn,earn,/api/v1/earn/orders,post,Purchase @@ -219,6 +222,9 @@ viplending,viplending,/api/v1/otc-loan/loan,get,Get Loan Info viplending,viplending,/api/v1/otc-loan/accounts,get,Get Accounts affiliate,affiliate,/api/v2/affiliate/inviter/statistics,get,Get Account broker,apibroker,/api/v1/broker/api/rebase/download,get,Get Broker Rebate +broker,ndbroker,/api/kyc/ndBroker/proxyClient/submit,post,Submit KYC +broker,ndbroker,/api/kyc/ndBroker/proxyClient/status/list,get,Get KYC Status +broker,ndbroker,/api/kyc/ndBroker/proxyClient/status/page,get,Get KYC Status List broker,ndbroker,/api/v1/broker/nd/info,get,Get Broker Info broker,ndbroker,/api/v1/broker/nd/account,post,Add sub-account broker,ndbroker,/api/v1/broker/nd/account,get,Get sub-account diff --git a/spec/original/meta.json b/spec/original/meta.json index 378d32cc..80ac43f0 100644 --- a/spec/original/meta.json +++ b/spec/original/meta.json @@ -143,7 +143,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to obtain account summary information.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getAccountInfo\",\"sdk-method-description\":\"This endpoint can be used to obtain account summary information.\",\"api-rate-limit-weight\":20}" @@ -250,7 +251,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet the api key information. Use the api key awaiting checking to call the endpoint. Both master and sub user's api key are applicable.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getApikeyInfo\",\"sdk-method-description\":\"Get the api key information. Use the api key awaiting checking to call the endpoint. Both master and sub user's api key are applicable.\",\"api-rate-limit-weight\":20}" @@ -310,7 +312,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface determines whether the current user is a spot high-frequency user or a spot low-frequency user.\n:::\n\n:::tip[Tips]\nThis interface is a compatibility interface left over from the old version upgrade. Only some old users need to use it (high frequency will be opened before 2024 and trade_hf has been used). Most users do not need to use this interface. When the return is true, you need to use trade_hf to transfer assets and query assets. When the return is false, you need to use trade to transfer assets and query assets.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getSpotAccountType\",\"sdk-method-description\":\"This interface determines whether the current user is a spot high-frequency user or a spot low-frequency user.\",\"api-rate-limit-weight\":30}" @@ -464,7 +467,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet a list of accounts. Please deposit funds into the **main** account first, then use the Transfer function to move them to the trade account before trading.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getSpotAccountList\",\"sdk-method-description\":\"Get a list of accounts. Please deposit funds into the main account first, then use the Transfer function to move them to the trade account before trading.\",\"api-rate-limit-weight\":5}" @@ -556,7 +560,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet information for a single spot account. Use this endpoint when you know the accountId.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getSpotAccountDetail\",\"sdk-method-description\":\"Get information for a single spot account. Use this endpoint when you know the accountId.\",\"api-rate-limit-weight\":5}" @@ -569,7 +574,6 @@ "method": "get", "path": "/api/v3/margin/accounts", "parameters": { - "path": [], "query": [ { "id": "PjWvwo4LmP", @@ -603,7 +607,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "waIqv5MOOW", @@ -637,9 +642,11 @@ "description": "" } ] - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -672,41 +679,7 @@ }, "status": { "type": "string", - "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing", - "enum": [ - "EFFECTIVE", - "BANKRUPTCY", - "LIQUIDATION", - "REPAY", - "BORROW" - ], - "x-api-enum": [ - { - "value": "EFFECTIVE", - "name": "EFFECTIVE", - "description": "Effective" - }, - { - "value": "BANKRUPTCY", - "name": "BANKRUPTCY", - "description": "Bankruptcy liquidation" - }, - { - "value": "LIQUIDATION", - "name": "LIQUIDATION", - "description": "Closing" - }, - { - "value": "REPAY", - "name": "REPAY", - "description": "Repayment" - }, - { - "value": "BORROW", - "name": "BORROW", - "description": "Borrowing" - } - ] + "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" }, "accounts": { "type": "array", @@ -744,6 +717,14 @@ "transferInEnabled": { "type": "boolean", "description": "Support transfer or not" + }, + "liabilityPrincipal": { + "type": "string", + "description": "Outstanding principal – the unpaid loan amount" + }, + "liabilityInterest": { + "type": "string", + "description": "Accrued interest – the unpaid interest amount" } }, "required": [ @@ -752,6 +733,8 @@ "available", "hold", "liability", + "liabilityPrincipal", + "liabilityInterest", "maxBorrowSize", "borrowEnabled", "transferInEnabled" @@ -776,15 +759,19 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ { "name": "Success", - "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.02\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"debtRatio\": \"0\",\n \"status\": \"EFFECTIVE\",\n \"accounts\": [\n {\n \"currency\": \"USDT\",\n \"total\": \"0.02\",\n \"available\": \"0.02\",\n \"hold\": \"0\",\n \"liability\": \"0\",\n \"maxBorrowSize\": \"0\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true\n }\n ]\n }\n}", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"totalAssetOfQuoteCurrency\": \"40.8648372\",\r\n \"totalLiabilityOfQuoteCurrency\": \"0\",\r\n \"debtRatio\": \"0\",\r\n \"status\": \"EFFECTIVE\",\r\n \"accounts\": [\r\n {\r\n \"currency\": \"USDT\",\r\n \"total\": \"38.68855864\",\r\n \"available\": \"20.01916691\",\r\n \"hold\": \"18.66939173\",\r\n \"liability\": \"0\",\r\n \"liabilityPrincipal\": \"0\",\r\n \"liabilityInterest\": \"0\",\r\n \"maxBorrowSize\": \"163\",\r\n \"borrowEnabled\": true,\r\n \"transferInEnabled\": true\r\n }\r\n ]\r\n }\r\n}", "responseId": 10091, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -794,7 +781,9 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest cross margin account info via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getCrossMarginAccount\",\"sdk-method-description\":\"Request cross margin account info via this endpoint.\",\"api-rate-limit-weight\":15}" @@ -807,14 +796,15 @@ "method": "get", "path": "/api/v3/isolated/accounts", "parameters": { - "path": [], "query": [ { "id": "0GJu6LYq3T", "name": "symbol", "required": false, "description": "For isolated trading pairs, query all without passing", - "type": "string" + "type": "string", + "enable": true, + "example": "BTC-USDT" }, { "id": "PjWvwo4LmP", @@ -848,7 +838,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "waIqv5MOOW", @@ -882,9 +873,11 @@ "description": "" } ] - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -927,41 +920,7 @@ }, "status": { "type": "string", - "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing", - "enum": [ - "EFFECTIVE", - "BANKRUPTCY", - "LIQUIDATION", - "REPAY", - "BORROW" - ], - "x-api-enum": [ - { - "value": "EFFECTIVE", - "name": "EFFECTIVE", - "description": "Effective" - }, - { - "value": "BANKRUPTCY", - "name": "BANKRUPTCY", - "description": "Bankruptcy liquidation" - }, - { - "value": "LIQUIDATION", - "name": "LIQUIDATION", - "description": "Closing" - }, - { - "value": "REPAY", - "name": "REPAY", - "description": "Repayment" - }, - { - "value": "BORROW", - "name": "BORROW", - "description": "Borrowing" - } - ] + "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" }, "debtRatio": { "type": "string", @@ -1001,6 +960,14 @@ "maxBorrowSize": { "type": "string", "description": "The user's remaining maximum loan amount" + }, + "liabilityPrincipal": { + "type": "string", + "description": "Outstanding principal" + }, + "liabilityInterest": { + "type": "string", + "description": "Outstanding interest" } }, "required": [ @@ -1008,6 +975,8 @@ "borrowEnabled", "transferInEnabled", "liability", + "liabilityPrincipal", + "liabilityInterest", "total", "available", "hold", @@ -1049,6 +1018,12 @@ "maxBorrowSize": { "type": "string", "description": "The user's remaining maximum loan amount" + }, + "liabilityPrincipal": { + "type": "string" + }, + "liabilityInterest": { + "type": "string" } }, "required": [ @@ -1056,6 +1031,8 @@ "borrowEnabled", "transferInEnabled", "liability", + "liabilityPrincipal", + "liabilityInterest", "total", "available", "hold", @@ -1063,14 +1040,7 @@ ], "description": "quote asset" } - }, - "required": [ - "symbol", - "status", - "debtRatio", - "baseAsset", - "quoteAsset" - ] + } } } }, @@ -1089,15 +1059,19 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ { "name": "Success", - "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"totalAssetOfQuoteCurrency\": \"0.01\",\n \"totalLiabilityOfQuoteCurrency\": \"0\",\n \"timestamp\": 1728725465994,\n \"assets\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"status\": \"EFFECTIVE\",\n \"debtRatio\": \"0\",\n \"baseAsset\": {\n \"currency\": \"BTC\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0\",\n \"available\": \"0\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n },\n \"quoteAsset\": {\n \"currency\": \"USDT\",\n \"borrowEnabled\": true,\n \"transferInEnabled\": true,\n \"liability\": \"0\",\n \"total\": \"0.01\",\n \"available\": \"0.01\",\n \"hold\": \"0\",\n \"maxBorrowSize\": \"0\"\n }\n }\n ]\n }\n}", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"totalAssetOfQuoteCurrency\": \"4.97047372\",\r\n \"totalLiabilityOfQuoteCurrency\": \"0.00038891\",\r\n \"timestamp\": 1747303659773,\r\n \"assets\": [\r\n {\r\n \"symbol\": \"BTC-USDT\",\r\n \"status\": \"EFFECTIVE\",\r\n \"debtRatio\": \"0\",\r\n \"baseAsset\": {\r\n \"currency\": \"BTC\",\r\n \"borrowEnabled\": true,\r\n \"transferInEnabled\": true,\r\n \"liability\": \"0\",\r\n \"liabilityPrincipal\": \"0\",\r\n \"liabilityInterest\": \"0\",\r\n \"total\": \"0\",\r\n \"available\": \"0\",\r\n \"hold\": \"0\",\r\n \"maxBorrowSize\": \"0\"\r\n },\r\n \"quoteAsset\": {\r\n \"currency\": \"USDT\",\r\n \"borrowEnabled\": true,\r\n \"transferInEnabled\": true,\r\n \"liability\": \"0.00038891\",\r\n \"liabilityPrincipal\": \"0.00038888\",\r\n \"liabilityInterest\": \"0.00000003\",\r\n \"total\": \"4.97047372\",\r\n \"available\": \"4.97047372\",\r\n \"hold\": \"0\",\r\n \"maxBorrowSize\": \"44\"\r\n }\r\n }\r\n ]\r\n }\r\n}", "responseId": 10092, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -1107,7 +1081,9 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest isolated margin account info via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getIsolatedMarginAccount\",\"sdk-method-description\":\"Request isolated margin account info via this endpoint.\",\"api-rate-limit-weight\":15}" @@ -1244,7 +1220,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest futures account info via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getFuturesAccount\",\"sdk-method-description\":\"Request futures account info via this endpoint.\",\"api-rate-limit-weight\":5}" @@ -1481,7 +1458,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is for transaction records from all your account types, supporting various currency inquiries. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n:::\n\n:::tip[Tips]\nThe start and end time range cannot exceed 24 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n:::\n\n:::tip[Tips]\nSupport to obtain 1-year historical data. If you need to obtain longer historical data, please submit a ticket: https://kucoin.zendesk.com/hc/en-us/requests/new\n:::\n\n**context**\n\nIf the returned value under bizType is “trade exchange”, the additional trade info (such as order ID, trade ID, trading pair, etc.) will be returned in field context.\n\n**BizType Description**\n\n| Field | Description |\n| ------ | ---------- |\n| Assets Transferred in After Upgrading | Assets Transferred in After V1 to V2 Upgrading |\n| Deposit | Deposit |\n| Withdrawal | Withdrawal |\n| Transfer | Transfer |\n| Trade_Exchange | Trade |\n| Vote for Coin | Vote for Coin |\n| KuCoin Bonus | KuCoin Bonus |\n| Referral Bonus | Referral Bonus |\n| Rewards | Activities Rewards |\n| Distribution | Distribution, such as get GAS by holding NEO |\n| Airdrop/Fork | Airdrop/Fork |\n| Other rewards | Other rewards, except Vote, Airdrop, Fork |\n| Fee Rebate | Fee Rebate |\n| Buy Crypto | Use credit card to buy crypto |\n| Sell Crypto | Use credit card to sell crypto |\n| Public Offering Purchase | Public Offering Purchase for Spotlight |\n| Send red envelope | Send red envelope |\n| Open red envelope | Open red envelope |\n| Staking | Staking |\n| LockDrop Vesting | LockDrop Vesting |\n| Staking Profits | Staking Profits |\n| Redemption | Redemption |\n| Refunded Fees | Refunded Fees |\n| KCS Pay Fees | KCS Pay Fees |\n| Margin Trade | Margin Trade |\n| Loans | Loans |\n| Borrowings | Borrowings |\n| Debt Repayment | Debt Repayment |\n| Loans Repaid | Loans Repaid |\n| Lendings | Lendings |\n| Pool transactions | Pool-X transactions |\n| Instant Exchange | Instant Exchange |\n| Sub Account Transfer | Sub-account transfer |\n| Liquidation Fees | Liquidation Fees |\n| Soft Staking Profits | Soft Staking Profits |\n| Voting Earnings | Voting Earnings on Pool-X |\n| Redemption of Voting | Redemption of Voting on Pool-X |\n| Convert to KCS | Convert to KCS |\n| BROKER_TRANSFER | Broker transfer record |", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getSpotLedger\",\"sdk-method-description\":\"This interface is for transaction records from all your account types, supporting various currency inquiries. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\",\"api-rate-limit-weight\":2}" @@ -1494,7 +1472,6 @@ "method": "get", "path": "/api/v1/hf/accounts/ledgers", "parameters": { - "path": [], "query": [ { "id": "8YpRjfgiQY", @@ -1502,7 +1479,8 @@ "required": false, "description": "Currency (you can choose more than one currency). You can specify a max. of 10 currencies in one go. If not specified, all currencies will be queried by default.", "example": "BTC", - "type": "string" + "type": "string", + "enable": true }, { "id": "iwlQIVyBkb", @@ -1529,7 +1507,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "79t7ddnYAv", @@ -1543,6 +1522,7 @@ "enum": [ "TRADE_EXCHANGE", "TRANSFER", + "SUB_TRANSFER", "RETURNED_FEES", "DEDUCTION_FEES", "OTHER" @@ -1551,272 +1531,292 @@ { "value": "TRADE_EXCHANGE", "name": "TRADE_EXCHANGE", - "description": "trade exchange" + "description": "Trade exchange" }, { "value": "TRANSFER", "name": "TRANSFER", - "description": "transfer" + "description": "Transfer" + }, + { + "value": "SUB_TRANSFER", + "name": "SUB_TRANSFER", + "description": "Sub transfer" }, { "value": "RETURNED_FEES", "name": "RETURNED_FEES", - "description": "returned fees" + "description": "Returned fees" }, { "value": "DEDUCTION_FEES", "name": "DEDUCTION_FEES", - "description": "deduction fees" + "description": "Deduction fees" }, { "value": "OTHER", "name": "OTHER", - "description": "other" + "description": "Other" + } + ] + }, + "enable": true + }, + { + "id": "pPnKFH2DlI", + "name": "lastId", + "required": false, + "description": "The ID of the last set of data from the previous data batch. By default, the latest information is given.", + "example": "254062248624417", + "type": "integer", + "schema": { + "type": "integer", + "format": "int64" + }, + "enable": true + }, + { + "id": "TJwaZEZ59O", + "name": "limit", + "required": false, + "description": "Default100, Max200", + "example": "100", + "type": "integer", + "schema": { + "type": "integer", + "default": 100, + "maximum": 200, + "minimum": 1 + }, + "enable": true + }, + { + "id": "nRkUqJX2U6", + "name": "startAt", + "required": false, + "description": "Start time (milliseconds)", + "example": "1728663338000", + "type": "integer", + "schema": { + "type": "integer", + "format": "int64", + "maximum": 9999999999999, + "minimum": 0 + }, + "enable": true + }, + { + "id": "rqSOV202LJ", + "name": "endAt", + "required": false, + "description": "End time (milliseconds)", + "example": "1728692138000", + "type": "integer", + "schema": { + "type": "integer", + "format": "int64", + "maximum": 9999999999999, + "minimum": 0 + }, + "enable": true + } + ], + "path": [], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "10086", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID" + }, + "currency": { + "type": "string", + "description": "currency" + }, + "amount": { + "type": "string", + "description": "Change in funds balance" + }, + "fee": { + "type": "string", + "description": "Transaction, Deposit or withdrawal fee" + }, + "tax": { + "type": "string" + }, + "balance": { + "type": "string", + "description": "Total balance of funds after change" + }, + "accountType": { + "type": "string", + "description": "Master account type TRADE_HF" + }, + "bizType": { + "type": "string", + "description": "Trnasaction type, such as TRANSFER, TRADE_EXCHANGE, etc." + }, + "direction": { + "type": "string", + "description": "Direction of transfer (out or in)", + "enum": [ + "in", + "out" + ], + "x-api-enum": [ + { + "value": "in", + "name": "", + "description": "" + }, + { + "value": "out", + "name": "", + "description": "" + } + ] + }, + "createdAt": { + "type": "string", + "description": "Created time" + }, + "context": { + "type": "string", + "description": "Core transaction parameter" + } + }, + "required": [ + "id", + "currency", + "amount", + "fee", + "tax", + "balance", + "accountType", + "bizType", + "direction", + "createdAt", + "context" + ] + } + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "", + "oasExtensions": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"id\": \"254062248624417\",\n \"currency\": \"USDT\",\n \"amount\": \"1.59760080\",\n \"fee\": \"0.00159920\",\n \"tax\": \"0\",\n \"balance\": \"26.73759503\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"TRADE_EXCHANGE\",\n \"direction\": \"in\",\n \"createdAt\": \"1728443957539\",\n \"context\": \"{\\\"symbol\\\":\\\"KCS-USDT\\\",\\\"orderId\\\":\\\"6705f6350dc7210007d6a36d\\\",\\\"tradeId\\\":\\\"10046097631627265\\\"}\"\n }\n ]\n}", + "responseId": 10086, + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" + }, + { + "name": "KCS DEDUCTION FEES", + "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"id\": \"284494946713889\",\n \"currency\": \"BTC\",\n \"amount\": \"0.00004585\",\n \"fee\": \"0.00000000\",\n \"tax\": \"0\",\n \"balance\": \"0.00092103\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"TRADE_EXCHANGE\",\n \"direction\": \"in\",\n \"createdAt\": \"1729004451665\",\n \"context\": \"{\\\"symbol\\\":\\\"BTC-USDT\\\",\\\"orderId\\\":\\\"670e83a3640ce3000736aace\\\",\\\"tradeId\\\":\\\"10946063166095361\\\"}\"\n },\n {\n \"id\": \"284494946713888\",\n \"currency\": \"USDT\",\n \"amount\": \"3.00023007\",\n \"fee\": \"0.00299723\",\n \"tax\": \"0\",\n \"balance\": \"31.40074009\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"TRADE_EXCHANGE\",\n \"direction\": \"out\",\n \"createdAt\": \"1729004451665\",\n \"context\": \"{\\\"symbol\\\":\\\"BTC-USDT\\\",\\\"orderId\\\":\\\"670e83a3640ce3000736aace\\\",\\\"tradeId\\\":\\\"10946063166095361\\\"}\"\n },\n {\n \"id\": \"284494428832032\",\n \"currency\": \"USDT\",\n \"amount\": \"0.00499782\",\n \"fee\": \"0.00000000\",\n \"tax\": \"0\",\n \"balance\": \"34.40097016\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"RETURNED_FEES\",\n \"direction\": \"in\",\n \"createdAt\": \"1729004444549\",\n \"context\": \"{}\"\n },\n {\n \"id\": \"284494423736608\",\n \"currency\": \"KCS\",\n \"amount\": \"0.00047428\",\n \"fee\": \"0.00000000\",\n \"tax\": \"0\",\n \"balance\": \"17.36207049\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"DEDUCTION_FEES\",\n \"direction\": \"out\",\n \"createdAt\": \"1729004444468\",\n \"context\": \"{}\"\n }\n ]\n}", + "responseId": 10086, + "ordering": 2, + "description": "", + "oasKey": "", + "oasExtensions": "" + } + ], + "requestBody": { + "type": "none", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": {} + }, + "mediaType": "", + "examples": [], + "oasExtensions": "" + }, + "description": ":::info[Description]\nThis API endpoint returns all transfer (in and out) records in high-frequency trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\n:::\n\n\n\n:::tip[Tips]\nIf lastId is configured, the information obtained < lastId. Otherwise, it will revert to the latest information.\n\nYou can only obtain data from within a 7 * 24 hour time range (i.e., from 7 * 24 hours ago up to now). If you specify a time range that exceeds this limit, the system will default to data from within 7 * 24 hours.\n:::\n\n**context**\n\nIf the bizType is TRADE_EXCHANGE, the context field will include additional transaction information (order ID, transaction ID, and trading pair).", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getSpotHFLedger\",\"sdk-method-description\":\"This API endpoint returns all transfer (in and out) records in high-frequency trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\",\"api-rate-limit-weight\":2}" + } + }, + { + "name": "Get Account Ledgers - Margin_hf", + "api": { + "id": "3470123", + "method": "get", + "path": "/api/v3/hf/margin/account/ledgers", + "parameters": { + "path": [], + "query": [ + { + "id": "8YpRjfgiQY", + "name": "currency", + "required": false, + "description": "Currency optional; more than one can be selected; separate using commas; select no more than 10 currencies; the default will be to query for all currencies if left empty", + "example": "BTC", + "type": "string" + }, + { + "id": "iwlQIVyBkb", + "name": "direction", + "required": false, + "description": "direction: in, out", + "example": "in", + "type": "string", + "schema": { + "type": "string", + "enum": [ + "in", + "out" + ], + "x-api-enum": [ + { + "value": "in", + "name": "", + "description": "" + }, + { + "value": "out", + "name": "", + "description": "" } ] - } - }, - { - "id": "pPnKFH2DlI", - "name": "lastId", - "required": false, - "description": "The ID of the last set of data from the previous data batch. By default, the latest information is given.", - "example": "254062248624417", - "type": "integer", - "schema": { - "type": "integer", - "format": "int64" - } - }, - { - "id": "TJwaZEZ59O", - "name": "limit", - "required": false, - "description": "Default100, Max200", - "example": "100", - "type": "integer", - "schema": { - "type": "integer", - "default": 100, - "maximum": 200, - "minimum": 1 - } - }, - { - "id": "nRkUqJX2U6", - "name": "startAt", - "required": false, - "description": "Start time (milliseconds)", - "example": "1728663338000", - "type": "integer", - "schema": { - "type": "integer", - "format": "int64", - "maximum": 9999999999999, - "minimum": 0 - } - }, - { - "id": "rqSOV202LJ", - "name": "endAt", - "required": false, - "description": "End time (milliseconds)", - "example": "1728692138000", - "type": "integer", - "schema": { - "type": "integer", - "format": "int64", - "maximum": 9999999999999, - "minimum": 0 - } - } - ], - "cookie": [], - "header": [] - }, - "responses": [ - { - "id": "10086", - "code": 200, - "name": "OK", - "headers": [], - "jsonSchema": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "data": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique ID" - }, - "currency": { - "type": "string", - "description": "currency" - }, - "amount": { - "type": "string", - "description": "Change in funds balance" - }, - "fee": { - "type": "string", - "description": "Transaction, Deposit or withdrawal fee" - }, - "tax": { - "type": "string" - }, - "balance": { - "type": "string", - "description": "Total balance of funds after change" - }, - "accountType": { - "type": "string", - "description": "Master account type TRADE_HF" - }, - "bizType": { - "type": "string", - "description": "Trnasaction type, such as TRANSFER, TRADE_EXCHANGE, etc." - }, - "direction": { - "type": "string", - "description": "Direction of transfer (out or in)", - "enum": [ - "in", - "out" - ], - "x-api-enum": [ - { - "value": "in", - "name": "", - "description": "" - }, - { - "value": "out", - "name": "", - "description": "" - } - ] - }, - "createdAt": { - "type": "string", - "description": "Created time" - }, - "context": { - "type": "string", - "description": "Core transaction parameter" - } - }, - "required": [ - "id", - "currency", - "amount", - "fee", - "tax", - "balance", - "accountType", - "bizType", - "direction", - "createdAt", - "context" - ] - } - } - }, - "required": [ - "code", - "data" - ] - }, - "description": "", - "contentType": "json", - "mediaType": "" - } - ], - "responseExamples": [ - { - "name": "Success", - "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"id\": \"254062248624417\",\n \"currency\": \"USDT\",\n \"amount\": \"1.59760080\",\n \"fee\": \"0.00159920\",\n \"tax\": \"0\",\n \"balance\": \"26.73759503\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"TRADE_EXCHANGE\",\n \"direction\": \"in\",\n \"createdAt\": \"1728443957539\",\n \"context\": \"{\\\"symbol\\\":\\\"KCS-USDT\\\",\\\"orderId\\\":\\\"6705f6350dc7210007d6a36d\\\",\\\"tradeId\\\":\\\"10046097631627265\\\"}\"\n }\n ]\n}", - "responseId": 10086, - "ordering": 1 - }, - { - "name": "KCS DEDUCTION FEES", - "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"id\": \"284494946713889\",\n \"currency\": \"BTC\",\n \"amount\": \"0.00004585\",\n \"fee\": \"0.00000000\",\n \"tax\": \"0\",\n \"balance\": \"0.00092103\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"TRADE_EXCHANGE\",\n \"direction\": \"in\",\n \"createdAt\": \"1729004451665\",\n \"context\": \"{\\\"symbol\\\":\\\"BTC-USDT\\\",\\\"orderId\\\":\\\"670e83a3640ce3000736aace\\\",\\\"tradeId\\\":\\\"10946063166095361\\\"}\"\n },\n {\n \"id\": \"284494946713888\",\n \"currency\": \"USDT\",\n \"amount\": \"3.00023007\",\n \"fee\": \"0.00299723\",\n \"tax\": \"0\",\n \"balance\": \"31.40074009\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"TRADE_EXCHANGE\",\n \"direction\": \"out\",\n \"createdAt\": \"1729004451665\",\n \"context\": \"{\\\"symbol\\\":\\\"BTC-USDT\\\",\\\"orderId\\\":\\\"670e83a3640ce3000736aace\\\",\\\"tradeId\\\":\\\"10946063166095361\\\"}\"\n },\n {\n \"id\": \"284494428832032\",\n \"currency\": \"USDT\",\n \"amount\": \"0.00499782\",\n \"fee\": \"0.00000000\",\n \"tax\": \"0\",\n \"balance\": \"34.40097016\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"RETURNED_FEES\",\n \"direction\": \"in\",\n \"createdAt\": \"1729004444549\",\n \"context\": \"{}\"\n },\n {\n \"id\": \"284494423736608\",\n \"currency\": \"KCS\",\n \"amount\": \"0.00047428\",\n \"fee\": \"0.00000000\",\n \"tax\": \"0\",\n \"balance\": \"17.36207049\",\n \"accountType\": \"TRADE_HF\",\n \"bizType\": \"DEDUCTION_FEES\",\n \"direction\": \"out\",\n \"createdAt\": \"1729004444468\",\n \"context\": \"{}\"\n }\n ]\n}", - "responseId": 10086, - "ordering": 2 - } - ], - "requestBody": { - "type": "none", - "parameters": [], - "jsonSchema": { - "type": "object", - "properties": {} - }, - "mediaType": "" - }, - "description": ":::info[Description]\nThis API endpoint returns all transfer (in and out) records in high-frequency trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\n:::\n\n\n\n:::tip[Tips]\nIf lastId is configured, the information obtained < lastId. Otherwise, it will revert to the latest information.\n\nYou can only obtain data from within a 3 * 24 hour time range (i.e., from 3 * 24 hours ago up to now). If you specify a time range that exceeds this limit, the system will default to data from within 3 * 24 hours.\n:::\n\n**context**\n\nIf the bizType is TRADE_EXCHANGE, the context field will include additional transaction information (order ID, transaction ID, and trading pair).", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getSpotHFLedger\",\"sdk-method-description\":\"This API endpoint returns all transfer (in and out) records in high-frequency trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\",\"api-rate-limit-weight\":2}" - } - }, - { - "name": "Get Account Ledgers - Margin_hf", - "api": { - "id": "3470123", - "method": "get", - "path": "/api/v3/hf/margin/account/ledgers", - "parameters": { - "path": [], - "query": [ - { - "id": "8YpRjfgiQY", - "name": "currency", - "required": false, - "description": "Currency optional; more than one can be selected; separate using commas; select no more than 10 currencies; the default will be to query for all currencies if left empty", - "example": "BTC", - "type": "string" - }, - { - "id": "iwlQIVyBkb", - "name": "direction", - "required": false, - "description": "direction: in, out", - "example": "in", - "type": "string", - "schema": { - "type": "string", - "enum": [ - "in", - "out" - ], - "x-api-enum": [ - { - "value": "in", - "name": "", - "description": "" - }, - { - "value": "out", - "name": "", - "description": "" - } - ] - } - }, - { - "id": "79t7ddnYAv", - "name": "bizType", - "required": false, - "description": "Transaction type: TRANSFER- transfer funds, MARGIN_EXCHANGE-cross margin trade, ISOLATED_EXCHANGE-isolated margin trade, LIQUIDATION-liquidation, ASSERT_RETURN-forced liquidation asset return", - "example": "TRANSFER", - "type": "string", - "schema": { - "type": "string" + } + }, + { + "id": "79t7ddnYAv", + "name": "bizType", + "required": false, + "description": "Transaction type: TRANSFER- transfer funds, MARGIN_EXCHANGE-cross margin trade, ISOLATED_EXCHANGE-isolated margin trade, LIQUIDATION-liquidation, ASSERT_RETURN-forced liquidation asset return", + "example": "TRANSFER", + "type": "string", + "schema": { + "type": "string" } }, { @@ -1963,7 +1963,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint returns all transfer (in and out) records in high-frequency margin trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\n:::\n\n\n:::tip[Tips]\nIf lastId is configured, the information obtained < lastId. Otherwise, it will revert to the latest information.\n\nYou can only obtain data from within a 3 * 24 hour time range (i.e., from 3 * 24 hours ago up to now). If you specify a time range that exceeds this limit, the system will default to data from within 3 * 24 hours.\n\nIf bizType is MARGIN_EXCHANGE or ISOLATED_EXCHANGE, the context field will contain additional information about the transaction (order ID, transaction ID, transaction pair).\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getMarginHFLedger\",\"sdk-method-description\":\"This API endpoint returns all transfer (in and out) records in high-frequency margin trading accounts and supports multi-coin queries. The query results are sorted in descending order by createdAt and ID.\",\"api-rate-limit-weight\":2}" @@ -2176,7 +2177,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query the ledger records of the futures business line.\n:::\n\n:::tip[Tips]\nIf there are open positions, the status of the first page returned will be Pending, indicating the realized profit and loss in the current 8-hour settlement period. Please specify the minimum offset number of the current page into the offset field to move to the next page.\n:::\n\n:::tip[Tips]\nSupplementary instructions for startAt and endAt: startAt must be less than endAt; and the interval cannot exceed 1 day; only one field is allowed, and if only one field is passed, another field will be automatically added or subtracted by the system 1 day to complete\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getFuturesLedger\",\"sdk-method-description\":\"This interface can query the ledger records of the futures business line.\",\"api-rate-limit-weight\":2}" @@ -2218,19 +2220,19 @@ "properties": { "uid": { "type": "integer", - "description": "Sub-account UID" + "description": "Sub account user id" }, "subName": { "type": "string", - "description": "Sub-account name" + "description": "Sub account name" }, "remarks": { "type": "string", - "description": "Remarks" + "description": "Sub account name" }, "access": { "type": "string", - "description": "Permission" + "description": "permission" } }, "required": [ @@ -2248,15 +2250,19 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ { "name": "Success", - "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 10,\n \"totalNum\": 1,\n \"totalPage\": 1,\n \"items\": [\n {\n \"userId\": \"63743f07e0c5230001761d08\",\n \"uid\": 169579801,\n \"subName\": \"testapi6\",\n \"status\": 2,\n \"type\": 0,\n \"access\": \"All\",\n \"createdAt\": 1668562696000,\n \"remarks\": \"remarks\",\n \"tradeTypes\": [\n \"Spot\",\n \"Futures\",\n \"Margin\"\n ],\n \"openedTradeTypes\": [\n \"Spot\"\n ],\n \"hostedStatus\": null\n }\n ]\n }\n}", + "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"uid\": 245730746,\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\",\n \"access\": \"Spot\"\n }\n}", "responseId": 10099, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -2311,8 +2317,15 @@ "access" ] }, - "example": "{\n \"password\": \"1234567\",\n \"remarks\": \"TheRemark\",\n \"subName\": \"Name1234567\",\n \"access\": \"Spot\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"password\": \"q1234567\",\n \"access\": \"Spot\",\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to create sub-accounts.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"addSubAccount\",\"sdk-method-description\":\"This endpoint can be used to create sub-accounts.\",\"api-rate-limit-weight\":15}" @@ -2380,8 +2393,15 @@ "uid" ] }, - "example": "{\n \"uid\": \"169579801\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"uid\": \"169579801\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to add sub-account Margin permissions. Before using this endpoint, you need to ensure that the master account apikey has Margin permissions and the Margin function has been activated.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"addSubAccountMarginPermission\",\"sdk-method-description\":\"This endpoint can be used to add sub-account Margin permissions. Before using this endpoint, you need to ensure that the master account apikey has Margin permissions and the Margin function has been activated.\",\"api-rate-limit-weight\":15}" @@ -2449,8 +2469,15 @@ "uid" ] }, - "example": "{\n \"uid\": \"169579801\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"uid\": \"169579801\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to add sub-account Futures permissions. Before using this endpoint, you need to ensure that the master account apikey has Futures permissions and the Futures function has been activated.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"addSubAccountFuturesPermission\",\"sdk-method-description\":\"This endpoint can be used to add sub-account Futures permissions. Before using this endpoint, you need to ensure that the master account apikey has Futures permissions and the Futures function has been activated.\",\"api-rate-limit-weight\":15}" @@ -2673,7 +2700,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to get a paginated list of sub-accounts. Pagination is required.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"getSpotSubAccountsSummaryV2\",\"sdk-method-description\":\"This endpoint can be used to get a paginated list of sub-accounts. Pagination is required.\",\"api-rate-limit-weight\":20}" @@ -2913,7 +2941,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint returns the account info of a sub-user specified by the subUserId.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"getSpotSubAccountDetail\",\"sdk-method-description\":\"This endpoint returns the account info of a sub-user specified by the subUserId.\",\"api-rate-limit-weight\":15}" @@ -3177,7 +3206,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to get paginated Spot sub-account information. Pagination is required.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"getSpotSubAccountListV2\",\"sdk-method-description\":\"This endpoint can be used to get paginated Spot sub-account information. Pagination is required.\",\"api-rate-limit-weight\":20}" @@ -3356,7 +3386,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to get Futures sub-account information. \n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"getFuturesSubAccountListV2\",\"sdk-method-description\":\"This endpoint can be used to get Futures sub-account information. \",\"api-rate-limit-weight\":6}" @@ -3544,8 +3575,15 @@ "passphrase" ] }, - "example": "{\n \"subName\": \"testapi6\",\n \"passphrase\": \"11223344\",\n \"remark\": \"TheRemark\",\n \"permission\": \"General,Spot,Futures\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"subName\": \"testapi6\",\n \"passphrase\": \"11223344\",\n \"remark\": \"TheRemark\",\n \"permission\": \"General,Spot,Futures\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to create APIs for sub-accounts.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"addSubAccountApi\",\"sdk-method-description\":\"This endpoint can be used to create APIs for sub-accounts.\",\"api-rate-limit-weight\":20}" @@ -3700,8 +3738,15 @@ "apiKey" ] }, - "example": "{\n \"subName\": \"testapi6\",\n \"apiKey\": \"670621e3a25958000159c82f\",\n \"passphrase\": \"11223344\",\n \"permission\": \"General,Spot,Futures\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"subName\": \"testapi6\",\n \"apiKey\": \"670621e3a25958000159c82f\",\n \"passphrase\": \"11223344\",\n \"permission\": \"General,Spot,Futures\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to modify sub-account APIs.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"modifySubAccountApi\",\"sdk-method-description\":\"This endpoint can be used to modify sub-account APIs.\",\"api-rate-limit-weight\":30}" @@ -3822,7 +3867,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to obtain a list of APIs pertaining to a sub-account (not including ND broker sub-accounts).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"getSubAccountApiList\",\"sdk-method-description\":\"This endpoint can be used to obtain a list of APIs pertaining to a sub-account (not including ND broker sub-accounts).\",\"api-rate-limit-weight\":20}" @@ -3923,7 +3969,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to delete sub-account APIs.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"deleteSubAccountApi\",\"sdk-method-description\":\"This endpoint can be used to delete sub-account APIs.\",\"api-rate-limit-weight\":30}" @@ -4100,8 +4147,15 @@ "chain" ] }, - "example": "{\n \"currency\": \"TON\",\n \"chain\": \"ton\",\n \"to\": \"trade\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"TON\",\n \"chain\": \"ton\",\n \"to\": \"trade\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint the creation of a deposit address for a currency you intend to deposit.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Deposit\",\"sdk-method-name\":\"addDepositAddressV3\",\"sdk-method-description\":\"Request via this endpoint the creation of a deposit address for a currency you intend to deposit.\",\"api-rate-limit-weight\":20}" @@ -4284,7 +4338,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet all deposit addresses for the currency you intend to deposit. If the returned data is empty, you may need to add the deposit address first.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Deposit\",\"sdk-method-name\":\"getDepositAddressV3\",\"sdk-method-description\":\"Get all deposit addresses for the currency you intend to deposit. If the returned data is empty, you may need to add the deposit address first.\",\"api-rate-limit-weight\":5}" @@ -4562,7 +4617,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest a deposit list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Deposit\",\"sdk-method-name\":\"getDepositHistory\",\"sdk-method-description\":\"Request a deposit list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\",\"api-rate-limit-weight\":5}" @@ -4759,7 +4815,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can obtain the withdrawal quota information of this currency.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Withdrawal\",\"sdk-method-name\":\"getWithdrawalQuotas\",\"sdk-method-description\":\"This interface can obtain the withdrawal quota information of this currency.\",\"api-rate-limit-weight\":20}" @@ -4809,7 +4866,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -4817,7 +4875,10 @@ "name": "Success", "data": "{\"code\":\"200000\",\"data\":{\"withdrawalId\":\"670deec84d64da0007d7c946\"}}", "responseId": 10310, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -4853,8 +4914,7 @@ ] }, "amount": { - "type": "integer", - "format": "int64", + "type": "string", "description": "Withdrawal amount, a positive number which is a multiple of the amount precision" }, "memo": { @@ -4924,8 +4984,15 @@ "withdrawType" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": 3,\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": \"3\",\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nUse this interface to withdraw the specified currency.\n:::\n\n:::tip[Tips]\nOn the WEB end, you can open the switch of specified favorite addresses for withdrawal, and when it is turned on, it will verify whether your withdrawal address (including chain) is a favorite address (it is case sensitive); if it fails validation, it will respond with the error message {\"msg\":\"Already set withdraw whitelist, this address is not favorite address\",\"code\":\"260325\"}.\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Withdrawal\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Withdrawal\",\"sdk-method-name\":\"withdrawalV3\",\"sdk-method-description\":\"Use this interface to withdraw the specified currency.\",\"api-rate-limit-weight\":5}" @@ -4993,7 +5060,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can cancel the withdrawal. Only withdrawal requests with PROCESSING status can be canceled.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Withdrawal\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Withdrawal\",\"sdk-method-name\":\"cancelWithdrawal\",\"sdk-method-description\":\"This interface can cancel the withdrawal. Only withdrawal requests with PROCESSING status can be canceled.\",\"api-rate-limit-weight\":20}" @@ -5006,7 +5074,6 @@ "method": "get", "path": "/api/v1/withdrawals", "parameters": { - "path": [], "query": [ { "id": "iIrspuNh6x", @@ -5022,7 +5089,8 @@ "ETH", "USDT" ] - } + }, + "enable": true }, { "id": "0cGmW3GSC0", @@ -5067,7 +5135,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "5Lwpfvg7zz", @@ -5079,7 +5148,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "WvwRPqp0J5", @@ -5091,7 +5161,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "tYmztUdnR2", @@ -5103,7 +5174,8 @@ "schema": { "type": "integer", "default": 1 - } + }, + "enable": true }, { "id": "StNqU7nXlg", @@ -5117,9 +5189,11 @@ "minimum": 10, "maximum": 500, "default": 50 - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -5180,10 +5254,11 @@ "ton", "optimism" ], - "description": "The id of currency" + "description": "The chain id of currency" }, "status": { "type": "string", + "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE", "enum": [ "REVIEW", "PROCESSING", @@ -5191,38 +5266,37 @@ "FAILURE", "SUCCESS" ], - "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE", "x-api-enum": [ { "value": "REVIEW", "name": "REVIEW", - "description": "" + "description": "REVIEW" }, { "value": "PROCESSING", "name": "PROCESSING", - "description": "" + "description": "PROCESSING" }, { "value": "WALLET_PROCESSING", "name": "WALLET_PROCESSING", - "description": "" + "description": "WALLET_PROCESSING" }, { "value": "FAILURE", "name": "FAILURE", - "description": "" + "description": "FAILURE" }, { "value": "SUCCESS", "name": "SUCCESS", - "description": "" + "description": "SUCCESS" } ] }, "address": { "type": "string", - "description": "Deposit address" + "description": "Withwrawal address" }, "memo": { "type": "string", @@ -5234,15 +5308,15 @@ }, "amount": { "type": "string", - "description": "Deposit amount" + "description": "Withwrawal amount" }, "fee": { "type": "string", - "description": "Fees charged for deposit" + "description": "Fees charged for withwrawal" }, "walletTxId": { "type": "string", - "description": "Wallet Txid" + "description": "Wallet Txid, If this is an internal\nwithdrawal, it is empty. " }, "createdAt": { "type": "integer", @@ -5278,7 +5352,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -5286,7 +5361,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 50,\n \"totalNum\": 5,\n \"totalPage\": 1,\n \"items\": [\n {\n \"currency\": \"USDT\",\n \"chain\": \"\",\n \"status\": \"SUCCESS\",\n \"address\": \"a435*****@gmail.com\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"1.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"createdAt\": 1728555875000,\n \"updatedAt\": 1728555875000,\n \"remark\": \"\",\n \"arrears\": false\n },\n {\n \"currency\": \"USDT\",\n \"chain\": \"trx\",\n \"status\": \"SUCCESS\",\n \"address\": \"TSv3L1fS7******X4nLP6rqNxYz\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"6.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"createdAt\": 1721730920000,\n \"updatedAt\": 1721730920000,\n \"remark\": \"\",\n \"arrears\": false\n }\n ]\n }\n}", "responseId": 10309, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -5296,11 +5374,263 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest a withdrawal list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Withdrawal\",\"sdk-method-name\":\"getWithdrawalHistory\",\"sdk-method-description\":\"Request a withdrawal list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\",\"api-rate-limit-weight\":20}" } + }, + { + "name": "Get Withdrawal History By ID", + "api": { + "id": "3471890", + "method": "get", + "path": "/api/v1/withdrawals/{withdrawalId}", + "parameters": { + "query": [], + "path": [ + { + "id": "withdrawalId#0", + "name": "withdrawalId", + "required": true, + "description": "withdrawal ID", + "type": "string", + "enable": true, + "example": "67e6515f7960ba0007b42025" + } + ], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "11802", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID" + }, + "uid": { + "type": "integer", + "description": "User ID" + }, + "currency": { + "type": "string", + "description": "A unique currency code that will never change" + }, + "chainId": { + "type": "string", + "description": "The chain id of currency", + "examples": [ + "eth", + "bech32", + "btc", + "kcc", + "trx", + "bsc", + "arbitrum", + "ton", + "optimism" + ] + }, + "chainName": { + "type": "string", + "description": "Chain name of currency" + }, + "currencyName": { + "type": "string", + "description": "Currency name; will change after renaming" + }, + "status": { + "type": "string", + "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE" + }, + "failureReason": { + "type": "string", + "description": "Failure reason code" + }, + "failureReasonMsg": { + "type": "string", + "description": "Failure reason message" + }, + "address": { + "type": "string", + "description": "Withwrawal address" + }, + "memo": { + "type": "string", + "description": "Address remark. If there’s no remark, it is empty. " + }, + "isInner": { + "type": "boolean", + "description": "Internal withdrawal or not. " + }, + "amount": { + "type": "string", + "description": "Withwrawal amount" + }, + "fee": { + "type": "string", + "description": "Fees charged for withwrawal" + }, + "walletTxId": { + "type": "string", + "description": "Wallet Transaction ID" + }, + "addressRemark": { + "type": "string", + "description": "Address remark" + }, + "remark": { + "type": "string", + "description": "Remark" + }, + "createdAt": { + "type": "integer", + "format": "int64", + "description": "Creation Time (milliseconds)" + }, + "cancelType": { + "type": "string", + "enum": [ + "CANCELABLE", + "CANCELING", + "NON_CANCELABLE" + ], + "x-api-enum": [ + { + "value": "CANCELABLE", + "name": "CANCELABLE", + "description": "Cancellable" + }, + { + "value": "CANCELING", + "name": "CANCELING", + "description": "Cancelling" + }, + { + "value": "NON_CANCELABLE", + "name": "NON_CANCELABLE", + "description": "Non-Cancellable" + } + ] + }, + "taxes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Users in some regions need query this field" + }, + "taxDescription": { + "type": "string", + "description": "Tax description" + }, + "returnStatus": { + "type": "string", + "enum": [ + "NOT_RETURN", + "PROCESSING", + "SUCCESS" + ], + "description": "Return status", + "x-api-enum": [ + { + "value": "NOT_RETURN", + "name": "NOT_RETURN", + "description": "No returned" + }, + { + "value": "PROCESSING", + "name": "PROCESSING", + "description": "To be returned" + }, + { + "value": "SUCCESS", + "name": "SUCCESS", + "description": "Returned" + } + ] + }, + "returnAmount": { + "type": "string", + "description": "Return amount" + }, + "returnCurrency": { + "type": "string", + "description": "Return currency" + } + }, + "required": [ + "id", + "uid", + "currency", + "chainId", + "chainName", + "currencyName", + "status", + "failureReason", + "address", + "memo", + "isInner", + "amount", + "fee", + "remark", + "createdAt", + "cancelType", + "returnStatus", + "returnCurrency" + ] + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "", + "oasExtensions": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"67e6515f7960ba0007b42025\",\n \"uid\": 165111215,\n \"currency\": \"USDT\",\n \"chainId\": \"trx\",\n \"chainName\": \"TRC20\",\n \"currencyName\": \"USDT\",\n \"status\": \"SUCCESS\",\n \"failureReason\": \"\",\n \"failureReasonMsg\": null,\n \"address\": \"TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8\",\n \"memo\": \"\",\n \"isInner\": true,\n \"amount\": \"3.00000000\",\n \"fee\": \"0.00000000\",\n \"walletTxId\": null,\n \"addressRemark\": null,\n \"remark\": \"this is Remark\",\n \"createdAt\": 1743147359000,\n \"cancelType\": \"NON_CANCELABLE\",\n \"taxes\": null,\n \"taxDescription\": null,\n \"returnStatus\": \"NOT_RETURN\",\n \"returnAmount\": null,\n \"returnCurrency\": \"KCS\"\n }\n}", + "responseId": 11802, + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" + } + ], + "requestBody": { + "type": "none", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": {} + }, + "mediaType": "", + "examples": [], + "oasExtensions": "" + }, + "description": ":::info[Description]\nRequest a withdrawal history by id via this endpoint.\n:::", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Withdrawal\",\"sdk-method-name\":\"getWithdrawalHistoryById\",\"sdk-method-description\":\"Request a withdrawal history by id via this endpoint.\",\"api-rate-limit-weight\":20}" + } } ] }, @@ -5480,7 +5810,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint returns the transferable balance of a specified account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Transfer\",\"sdk-method-name\":\"getTransferQuotas\",\"sdk-method-description\":\"This endpoint returns the transferable balance of a specified account.\",\"api-rate-limit-weight\":20}" @@ -5724,8 +6055,15 @@ "currency" ] }, - "example": "//transfer from master-account to sub-account\n{\n \"clientOid\": \"64ccc0f164781800010d8c09\",\n \"type\": \"PARENT_TO_SUB\",\n \"currency\": \"USDT\",\n \"amount\": \"0.01\",\n \"fromAccountType\": \"TRADE\",\n \"toUserId\": \"63743f07e0c5230001761d08\",\n \"toAccountType\": \"TRADE\"\n}\n\n//transfer from sub-account to master-account\n// {\n// \"clientOid\": \"64ccc0f164781800010d8c09\",\n// \"type\": \"SUB_TO_PARENT\",\n// \"currency\": \"BTC\",\n// \"amount\": 1,\n// \"fromUserId\": \"62f5f5d4d72aaf000122707e\",\n// \"fromAccountType\": \"TRADE\",\n// \"toAccountType\": \"CONTRACT\"\n// }\n\n// internal transfer\n// {\n// \"clientOid\": \"53666633336123\",\n// \"type\": \"INTERNAL\",\n// \"currency\": \"BTC\",\n// \"amount\": 0.0003,\n// \"fromAccountType\": \"TRADE\",\n// \"toAccountType\": \"MAIN\"\n// }\n\n\n\n\n\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//transfer from master-account to sub-account\n{\n \"clientOid\": \"64ccc0f164781800010d8c09\",\n \"type\": \"PARENT_TO_SUB\",\n \"currency\": \"USDT\",\n \"amount\": \"0.01\",\n \"fromAccountType\": \"TRADE\",\n \"toUserId\": \"63743f07e0c5230001761d08\",\n \"toAccountType\": \"TRADE\"\n}\n\n//transfer from sub-account to master-account\n// {\n// \"clientOid\": \"64ccc0f164781800010d8c09\",\n// \"type\": \"SUB_TO_PARENT\",\n// \"currency\": \"BTC\",\n// \"amount\": 1,\n// \"fromUserId\": \"62f5f5d4d72aaf000122707e\",\n// \"fromAccountType\": \"TRADE\",\n// \"toAccountType\": \"CONTRACT\"\n// }\n\n// internal transfer\n// {\n// \"clientOid\": \"53666633336123\",\n// \"type\": \"INTERNAL\",\n// \"currency\": \"BTC\",\n// \"amount\": 0.0003,\n// \"fromAccountType\": \"TRADE\",\n// \"toAccountType\": \"MAIN\"\n// }\n\n\n\n\n\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can be used for transfers between master- and sub-accounts and transfers\n:::\n\nThe API Key needs universal transfer permission when calling.\n\nIt supports transfers between master account and sub-accounts, and also supports transfers between different types of accounts.\n\nIt supports transfer between master account and sub-accounts (only applicable to master account APIKey).\n\nMARGIN_V2 only supports internal transfers between MARGIN and does not support transfers between master- and sub-accounts.\n\nISOLATED_V2 only supports internal transfers between ISOLATED and does not support transfers between master- and sub-accounts.", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"FlexTransfers\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Transfer\",\"sdk-method-name\":\"flexTransfer\",\"sdk-method-description\":\"This interface can be used for transfers between master- and sub-accounts and transfers\",\"api-rate-limit-weight\":4}" @@ -5837,7 +6175,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is for the user’s spot/margin basic fee rate.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Fee\",\"sdk-method-name\":\"getBasicFee\",\"sdk-method-description\":\"This interface is for the user’s spot/margin basic fee rate.\",\"api-rate-limit-weight\":3}" @@ -5942,7 +6281,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is for the trading pair’s actual fee rate. You can inquire about fee rates of 10 trading pairs each time at most. The fee rate of your sub-account is the same as that of the master account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Fee\",\"sdk-method-name\":\"getSpotActualFee\",\"sdk-method-description\":\"This interface is for the trading pair’s actual fee rate. You can inquire about fee rates of 10 trading pairs each time at most. The fee rate of your sub-account is the same as that of the master account.\",\"api-rate-limit-weight\":3}" @@ -6037,7 +6377,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is for the trading pair’s actual futures fee rate. The fee rate of your sub-account is the same as that of the master account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Fee\",\"sdk-method-name\":\"getFuturesActualFee\",\"sdk-method-description\":\"This interface is for the trading pair’s actual futures fee rate. The fee rate of your sub-account is the same as that of the master account.\",\"api-rate-limit-weight\":3}" @@ -6457,7 +6798,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can obtain the latest news announcements, and the default page search is for announcements within a month.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getAnnouncements\",\"sdk-method-description\":\"This interface can obtain the latest news announcements, and the default page search is for announcements within a month.\",\"api-rate-limit-weight\":20}" @@ -6470,24 +6812,6 @@ "method": "get", "path": "/api/v3/currencies/{currency}", "parameters": { - "path": [ - { - "id": "currency#0", - "name": "currency", - "required": true, - "description": "Path parameter, Currency", - "example": "BTC", - "type": "string", - "schema": { - "type": "string", - "examples": [ - "BTC", - "ETH", - "USDT" - ] - } - } - ], "query": [ { "id": "nSUWM8eRPB", @@ -6509,7 +6833,27 @@ "ton", "optimism" ] - } + }, + "enable": true + } + ], + "path": [ + { + "id": "currency#0", + "name": "currency", + "required": true, + "description": "Path parameter, Currency", + "example": "BTC", + "type": "string", + "schema": { + "type": "string", + "examples": [ + "BTC", + "ETH", + "USDT" + ] + }, + "enable": true } ], "cookie": [], @@ -6631,7 +6975,6 @@ "required": [ "chainName", "withdrawalMinSize", - "depositMinSize", "withdrawFeeRate", "withdrawalMinFee", "isWithdrawEnabled", @@ -6640,8 +6983,6 @@ "preConfirms", "contractAddress", "withdrawPrecision", - "maxWithdraw", - "maxDeposit", "needTag", "chainId" ] @@ -6654,8 +6995,6 @@ "name", "fullName", "precision", - "confirms", - "contractAddress", "isMarginEnabled", "isDebitEnabled", "chains" @@ -6669,7 +7008,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -6677,7 +7017,10 @@ "name": "Success", "data": "{\"code\":\"200000\",\"data\":{\"currency\":\"BTC\",\"name\":\"BTC\",\"fullName\":\"Bitcoin\",\"precision\":8,\"confirms\":null,\"contractAddress\":null,\"isMarginEnabled\":true,\"isDebitEnabled\":true,\"chains\":[{\"chainName\":\"BTC\",\"withdrawalMinSize\":\"0.001\",\"depositMinSize\":\"0.0002\",\"withdrawFeeRate\":\"0\",\"withdrawalMinFee\":\"0.0005\",\"isWithdrawEnabled\":true,\"isDepositEnabled\":true,\"confirms\":3,\"preConfirms\":1,\"contractAddress\":\"\",\"withdrawPrecision\":8,\"maxWithdraw\":null,\"maxDeposit\":null,\"needTag\":false,\"chainId\":\"btc\"},{\"chainName\":\"Lightning Network\",\"withdrawalMinSize\":\"0.00001\",\"depositMinSize\":\"0.00001\",\"withdrawFeeRate\":\"0\",\"withdrawalMinFee\":\"0.000015\",\"isWithdrawEnabled\":true,\"isDepositEnabled\":true,\"confirms\":1,\"preConfirms\":1,\"contractAddress\":\"\",\"withdrawPrecision\":8,\"maxWithdraw\":null,\"maxDeposit\":\"0.03\",\"needTag\":false,\"chainId\":\"btcln\"},{\"chainName\":\"KCC\",\"withdrawalMinSize\":\"0.0008\",\"depositMinSize\":null,\"withdrawFeeRate\":\"0\",\"withdrawalMinFee\":\"0.00002\",\"isWithdrawEnabled\":true,\"isDepositEnabled\":true,\"confirms\":20,\"preConfirms\":20,\"contractAddress\":\"0xfa93c12cd345c658bc4644d1d4e1b9615952258c\",\"withdrawPrecision\":8,\"maxWithdraw\":null,\"maxDeposit\":null,\"needTag\":false,\"chainId\":\"kcc\"},{\"chainName\":\"BTC-Segwit\",\"withdrawalMinSize\":\"0.0008\",\"depositMinSize\":\"0.0002\",\"withdrawFeeRate\":\"0\",\"withdrawalMinFee\":\"0.0005\",\"isWithdrawEnabled\":false,\"isDepositEnabled\":true,\"confirms\":2,\"preConfirms\":2,\"contractAddress\":\"\",\"withdrawPrecision\":8,\"maxWithdraw\":null,\"maxDeposit\":null,\"needTag\":false,\"chainId\":\"bech32\"}]}}", "responseId": 10319, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -6687,7 +7030,9 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest the currency details of a specified currency via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getCurrency\",\"sdk-method-description\":\"Request the currency details of a specified currency via this endpoint.\",\"api-rate-limit-weight\":3}" @@ -6834,8 +7179,6 @@ "required": [ "chainName", "withdrawalMinSize", - "depositMinSize", - "withdrawFeeRate", "withdrawalMinFee", "isWithdrawEnabled", "isDepositEnabled", @@ -6843,10 +7186,9 @@ "preConfirms", "contractAddress", "withdrawPrecision", - "maxWithdraw", - "maxDeposit", "needTag", - "chainId" + "chainId", + "withdrawFeeRate" ] }, "description": "Chain list" @@ -6873,7 +7215,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -6881,7 +7224,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"currency\": \"BTC\",\n \"name\": \"BTC\",\n \"fullName\": \"Bitcoin\",\n \"precision\": 8,\n \"confirms\": null,\n \"contractAddress\": null,\n \"isMarginEnabled\": true,\n \"isDebitEnabled\": true,\n \"chains\": [\n {\n \"chainName\": \"BTC\",\n \"withdrawalMinSize\": \"0.001\",\n \"depositMinSize\": \"0.0002\",\n \"withdrawFeeRate\": \"0\",\n \"withdrawalMinFee\": \"0.0005\",\n \"isWithdrawEnabled\": true,\n \"isDepositEnabled\": true,\n \"confirms\": 3,\n \"preConfirms\": 1,\n \"contractAddress\": \"\",\n \"withdrawPrecision\": 8,\n \"maxWithdraw\": null,\n \"maxDeposit\": null,\n \"needTag\": false,\n \"chainId\": \"btc\"\n },\n {\n \"chainName\": \"Lightning Network\",\n \"withdrawalMinSize\": \"0.00001\",\n \"depositMinSize\": \"0.00001\",\n \"withdrawFeeRate\": \"0\",\n \"withdrawalMinFee\": \"0.000015\",\n \"isWithdrawEnabled\": true,\n \"isDepositEnabled\": true,\n \"confirms\": 1,\n \"preConfirms\": 1,\n \"contractAddress\": \"\",\n \"withdrawPrecision\": 8,\n \"maxWithdraw\": null,\n \"maxDeposit\": \"0.03\",\n \"needTag\": false,\n \"chainId\": \"btcln\"\n },\n {\n \"chainName\": \"KCC\",\n \"withdrawalMinSize\": \"0.0008\",\n \"depositMinSize\": null,\n \"withdrawFeeRate\": \"0\",\n \"withdrawalMinFee\": \"0.00002\",\n \"isWithdrawEnabled\": true,\n \"isDepositEnabled\": true,\n \"confirms\": 20,\n \"preConfirms\": 20,\n \"contractAddress\": \"0xfa93c12cd345c658bc4644d1d4e1b9615952258c\",\n \"withdrawPrecision\": 8,\n \"maxWithdraw\": null,\n \"maxDeposit\": null,\n \"needTag\": false,\n \"chainId\": \"kcc\"\n },\n {\n \"chainName\": \"BTC-Segwit\",\n \"withdrawalMinSize\": \"0.0008\",\n \"depositMinSize\": \"0.0002\",\n \"withdrawFeeRate\": \"0\",\n \"withdrawalMinFee\": \"0.0005\",\n \"isWithdrawEnabled\": false,\n \"isDepositEnabled\": true,\n \"confirms\": 2,\n \"preConfirms\": 2,\n \"contractAddress\": \"\",\n \"withdrawPrecision\": 8,\n \"maxWithdraw\": null,\n \"maxDeposit\": null,\n \"needTag\": false,\n \"chainId\": \"bech32\"\n }\n ]\n },\n {\n \"currency\": \"BTCP\",\n \"name\": \"BTCP\",\n \"fullName\": \"Bitcoin Private\",\n \"precision\": 8,\n \"confirms\": null,\n \"contractAddress\": null,\n \"isMarginEnabled\": false,\n \"isDebitEnabled\": false,\n \"chains\": [\n {\n \"chainName\": \"BTCP\",\n \"withdrawalMinSize\": \"0.100000\",\n \"depositMinSize\": null,\n \"withdrawFeeRate\": \"0\",\n \"withdrawalMinFee\": \"0.010000\",\n \"isWithdrawEnabled\": false,\n \"isDepositEnabled\": false,\n \"confirms\": 6,\n \"preConfirms\": 6,\n \"contractAddress\": \"\",\n \"withdrawPrecision\": 8,\n \"maxWithdraw\": null,\n \"maxDeposit\": null,\n \"needTag\": false,\n \"chainId\": \"btcp\"\n }\n ]\n }\n ]\n}", "responseId": 10316, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -6891,7 +7237,9 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest a currency list via this endpoint. Not all currencies currently can be used for trading.\n:::\n\n:::tip[Tips]\n**CURRENCY CODES**\n\nCurrency codes will conform to the ISO 4217 standard where possible. Currencies which have or had no representation in ISO 4217 may use a custom code.\n\n\n| Code | Description |\n| --- | --- |\n| BTC | Bitcoin |\n| ETH | Ethereum |\n| KCS | Kucoin Shares |\n\nFor a coin, the \"**currency**\" is a fixed value and works as the only recognized identity of the coin. As the \"**name**\", \"**fullnane**\" and \"**precision**\" of a coin are modifiable values, when the \"name\" of a coin is changed, you should use \"**currency**\" to get the coin.\n\nFor example: The \"**currency**\" of XRB is \"XRB\"; if the \"**name**\" of XRB is changed into \"**Nano**\", you should use \"XRB\" (the currency of XRB) to search the coin.\n:::\n\n\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getAllCurrencies\",\"sdk-method-description\":\"Request a currency list via this endpoint. Not all currencies can currently be used for trading.\",\"api-rate-limit-weight\":3}" @@ -7129,13 +7477,7 @@ "makerFeeCoefficient", "takerFeeCoefficient", "st", - "callauctionIsEnabled", - "callauctionPriceFloor", - "callauctionPriceCeiling", - "callauctionFirstStageStartTime", - "callauctionSecondStageStartTime", - "callauctionThirdStageStartTime", - "tradingStartTime" + "callauctionIsEnabled" ] } }, @@ -7146,7 +7488,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -7154,7 +7497,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \"BTC-USDT\",\n \"name\": \"BTC-USDT\",\n \"baseCurrency\": \"BTC\",\n \"quoteCurrency\": \"USDT\",\n \"feeCurrency\": \"USDT\",\n \"market\": \"USDS\",\n \"baseMinSize\": \"0.00001\",\n \"quoteMinSize\": \"0.1\",\n \"baseMaxSize\": \"10000000000\",\n \"quoteMaxSize\": \"99999999\",\n \"baseIncrement\": \"0.00000001\",\n \"quoteIncrement\": \"0.000001\",\n \"priceIncrement\": \"0.1\",\n \"priceLimitRate\": \"0.1\",\n \"minFunds\": \"0.1\",\n \"isMarginEnabled\": true,\n \"enableTrading\": true,\n \"feeCategory\": 1,\n \"makerFeeCoefficient\": \"1.00\",\n \"takerFeeCoefficient\": \"1.00\",\n \"st\": false,\n \"callauctionIsEnabled\": false,\n \"callauctionPriceFloor\": null,\n \"callauctionPriceCeiling\": null,\n \"callauctionFirstStageStartTime\": null,\n \"callauctionSecondStageStartTime\": null,\n \"callauctionThirdStageStartTime\": null,\n \"tradingStartTime\": null\n }\n}", "responseId": 10323, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -7164,7 +7510,9 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint to get detail currency pairs for trading. If you want to get the market information of the trading symbol, please use Get All Tickers.\n:::\n\n\n- The baseMinSize and baseMaxSize fields define the min and max order size.\n- The priceIncrement field specifies the min order price as well as the price increment.This also applies to quote currency.\n\nThe order price must be a positive integer multiple of this priceIncrement (i.e. if the increment is 0.01, the 0.001 and 0.021 order prices would be rejected).\n\npriceIncrement and quoteIncrement may be adjusted in the future. We will notify you by email and site notifications before adjustment.\n\n| Order Type | Follow the rules of minFunds |\n| ------ | ---------- |\n| Limit Buy\t | [Order Amount * Order Price] >= minFunds |\n| Limit Sell | [Order Amount * Order Price] >= minFunds |\n| Market Buy | Order Value >= minFunds |\n| Market Sell | [Order Amount * Last Price of Base Currency] >= minFunds |\n\nNote:\n- API market buy orders (by amount) valued at (Order Amount * Last Price of Base Currency) < minFunds will be rejected.\n- API market sell orders (by value) valued at < minFunds will be rejected.\n- Take profit and stop loss orders at market or limit prices will be rejected when triggered.", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getSymbol\",\"sdk-method-description\":\"Request via this endpoint to get detail currency pairs for trading. If you want to get the market information of the trading symbol, please use Get All Tickers.\",\"api-rate-limit-weight\":4}" @@ -7177,7 +7525,6 @@ "method": "get", "path": "/api/v2/symbols", "parameters": { - "path": [], "query": [ { "id": "4oM4tRz9wb", @@ -7193,9 +7540,11 @@ "USDS", "ETF" ] - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -7408,13 +7757,7 @@ "makerFeeCoefficient", "takerFeeCoefficient", "st", - "callauctionIsEnabled", - "callauctionPriceFloor", - "callauctionPriceCeiling", - "callauctionFirstStageStartTime", - "callauctionSecondStageStartTime", - "callauctionThirdStageStartTime", - "tradingStartTime" + "callauctionIsEnabled" ] } } @@ -7426,7 +7769,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -7434,7 +7778,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"symbol\": \"BTC-USDT\",\n \"name\": \"BTC-USDT\",\n \"baseCurrency\": \"BTC\",\n \"quoteCurrency\": \"USDT\",\n \"feeCurrency\": \"USDT\",\n \"market\": \"USDS\",\n \"baseMinSize\": \"0.00001\",\n \"quoteMinSize\": \"0.1\",\n \"baseMaxSize\": \"10000000000\",\n \"quoteMaxSize\": \"99999999\",\n \"baseIncrement\": \"0.00000001\",\n \"quoteIncrement\": \"0.000001\",\n \"priceIncrement\": \"0.1\",\n \"priceLimitRate\": \"0.1\",\n \"minFunds\": \"0.1\",\n \"isMarginEnabled\": true,\n \"enableTrading\": true,\n \"feeCategory\": 1,\n \"makerFeeCoefficient\": \"1.00\",\n \"takerFeeCoefficient\": \"1.00\",\n \"st\": false,\n \"callauctionIsEnabled\": false,\n \"callauctionPriceFloor\": null,\n \"callauctionPriceCeiling\": null,\n \"callauctionFirstStageStartTime\": null,\n \"callauctionSecondStageStartTime\": null,\n \"callauctionThirdStageStartTime\": null,\n \"tradingStartTime\": null\n }\n ]\n}", "responseId": 10318, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -7444,7 +7791,9 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest a list of available currency pairs for trading via this endpoint. If you want to get the market information of the trading symbol, please use Get All Tickers.\n:::\n\n\n:::tip[Tips]\npriceIncrement and quoteIncrement may be adjusted in the future. We will notify you by email and site notifications before adjustments.\n:::\n\n| Order Type | Follow the rules of minFunds |\n| --- | --- |\n| Limit Buy | [Order Amount * Order Price] >= minFunds |\n| Limit Sell | [Order Amount * Order Price] >= minFunds |\n| Market Buy | Order Value >= minFunds |\n| Market Sell | [Order Amount * Last Price of Base Currency] >= minFunds |\n\nNote:\n\n- API market buy orders (by amount) valued at [Order Amount * Last Price of Base Currency] < minFunds will be rejected.\n- API market sell orders (by value) valued at < minFunds will be rejected.\n- Take profit and stop loss orders at market or limit prices will be rejected when triggered.\n\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getAllSymbols\",\"sdk-method-description\":\"Request a list of available currency pairs for trading via this endpoint. If you want to get the market information of the trading symbol, please use Get All Tickers.\",\"api-rate-limit-weight\":4}" @@ -7557,7 +7906,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint to get Level 1 Market Data. The returned value includes the best bid price and size, the best ask price and size as well as the last traded price and the last traded size.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getTicker\",\"sdk-method-description\":\"Request via this endpoint to get Level 1 Market Data. The returned value includes the best bid price and size, the best ask price and size as well as the last traded price and the last traded size.\",\"api-rate-limit-weight\":2}" @@ -7759,7 +8109,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest market tickers for all the trading pairs in the market (including 24h volume); takes a snapshot every 2 seconds.\n\nOn the rare occasion that we change the currency name, if you still want the changed symbol name, you can use the symbolName field instead of the symbol field via “Get Symbols List” endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getAllTickers\",\"sdk-method-description\":\"Request market tickers for all the trading pairs in the market (including 24h volume); takes a snapshot every 2 seconds. On the rare occasion that we change the currency name, if you still want the changed symbol name, you can use the symbolName field instead of the symbol field via “Get all tickers” endpoint.\",\"api-rate-limit-weight\":15}" @@ -7877,7 +8228,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint to get the trade history of the specified symbol, the returned quantity is the last 100 transaction records.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getTradeHistory\",\"sdk-method-description\":\"Request via this endpoint to get the trade history of the specified symbol, the returned quantity is the last 100 transaction records.\",\"api-rate-limit-weight\":3}" @@ -8081,7 +8433,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet the Kline of the symbol. Data are returned in grouped buckets based on requested type.\nFor each query, the system would return at most 1500 pieces of data. To obtain more data, please page the data by time.\n:::\n\n:::tip[Tips]\nKlines data may be incomplete. No data is published for intervals where there are no ticks.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getKlines\",\"sdk-method-description\":\"Get the Kline of the symbol. Data are returned in grouped buckets based on requested type. For each query, the system would return at most 1500 pieces of data. To obtain more data, please page the data by time.\",\"api-rate-limit-weight\":3}" @@ -8219,7 +8572,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nQuery for part orderbook depth data. (aggregated by price)\n\nYou are recommended to request via this endpoint as the system reponse would be faster and cosume less traffic.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getPartOrderBook\",\"sdk-method-description\":\"Query for part orderbook depth data. (aggregated by price) You are recommended to request via this endpoint as the system reponse would be faster and cosume less traffic.\",\"api-rate-limit-weight\":2}" @@ -8327,7 +8681,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nQuery for Full orderbook depth data. (aggregated by price)\n\nIt is generally used by professional traders because it uses more server resources and traffic, and we have strict access rate limit control.\n\nTo maintain up-to-date Order Book, please use Websocket incremental feed after retrieving the OrderBook.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getFullOrderBook\",\"sdk-method-description\":\"Query for Full orderbook depth data. (aggregated by price) It is generally used by professional traders because it uses more server resources and traffic, and we have strict access rate limit control. To maintain up-to-date Order Book, please use Websocket incremental feed after retrieving the OrderBook.\",\"api-rate-limit-weight\":3}" @@ -8465,7 +8820,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nQuery for [call auction](https://www.kucoin.com/support/40999744334105) part orderbook depth data (aggregated by price).\n\nIt is recommended that you submit requests via this endpoint as the system response will be faster and consume less traffic.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getCallAuctionPartOrderBook\",\"sdk-method-description\":\"Query for call auction part orderbook depth data. (aggregated by price). It is recommended that you request via this endpoint, as the system response will be faster and consume less traffic.\",\"api-rate-limit-weight\":2}" @@ -8478,7 +8834,6 @@ "method": "get", "path": "/api/v1/market/callauctionData", "parameters": { - "path": [], "query": [ { "id": "AwnkwQxRMq", @@ -8486,9 +8841,11 @@ "required": true, "description": "symbol", "example": "BTC-USDT", - "type": "string" + "type": "string", + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -8540,19 +8897,19 @@ }, "time": { "type": "integer", - "format": "int64", - "description": "Timestamp (ms)" + "description": "Timestamp (ms)", + "format": "int64" } }, "required": [ - "symbol", - "estimatedPrice", - "estimatedSize", "sellOrderRangeLowPrice", "sellOrderRangeHighPrice", "buyOrderRangeLowPrice", "buyOrderRangeHighPrice", - "time" + "time", + "symbol", + "estimatedPrice", + "estimatedSize" ] } }, @@ -8563,7 +8920,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -8571,7 +8929,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \"BTC-USDT\",\n \"estimatedPrice\": \"0.17\",\n \"estimatedSize\": \"0.03715004\",\n \"sellOrderRangeLowPrice\": \"1.788\",\n \"sellOrderRangeHighPrice\": \"2.788\",\n \"buyOrderRangeLowPrice\": \"1.788\",\n \"buyOrderRangeHighPrice\": \"2.788\",\n \"time\": 1550653727731\n }\n}", "responseId": 11901, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -8581,7 +8942,9 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nGet [call auction](https://www.kucoin.com/support/40999744334105) data, This endpoint will return the following information for the specified symbol during the call auction phase: estimated transaction price, estimated transaction quantity, bid price range, and ask price range.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getCallAuctionInfo\",\"sdk-method-description\":\"Get call auction data. This interface will return the following information for the specified symbol during the call auction phase: estimated transaction price, estimated transaction quantity, bid price range, and ask price range.\",\"api-rate-limit-weight\":2}" @@ -12253,7 +12616,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest the fiat price of the currencies for the available trading pairs via this endpoint.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getFiatPrice\",\"sdk-method-description\":\"Request the fiat price of the currencies for the available trading pairs via this endpoint.\",\"api-rate-limit-weight\":3}" @@ -12406,7 +12770,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint to get the statistics of the specified ticker in the last 24 hours.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"get24hrStats\",\"sdk-method-description\":\"Request via this endpoint to get the statistics of the specified ticker in the last 24 hours.\",\"api-rate-limit-weight\":15}" @@ -12468,7 +12833,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint the transaction currency for the entire trading market.\n:::\n\n:::tip[Tips]\nSC has been changed to USDS, but you can still use SC as a query parameter\n\nThe three markets of ETH, NEO and TRX are merged into the ALTS market. You can query the trading pairs of the ETH, NEO and TRX markets through the ALTS trading area.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getMarketList\",\"sdk-method-description\":\"Request via this endpoint the transaction currency for the entire trading market.\",\"api-rate-limit-weight\":3}" @@ -12527,7 +12893,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet the client side IP address.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getClientIPAddress\",\"sdk-method-description\":\"Get the server time.\",\"api-rate-limit-weight\":0}" @@ -12588,7 +12955,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet the server time.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getServerTime\",\"sdk-method-description\":\"Get the server time.\",\"api-rate-limit-weight\":3}" @@ -12683,7 +13051,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet the service status.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getServiceStatus\",\"sdk-method-description\":\"Get the service status.\",\"api-rate-limit-weight\":3}" @@ -12940,7 +13309,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "examples": [ 10, @@ -12950,7 +13319,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", "format": "int64", "examples": [ 1740711735178 @@ -12963,8 +13332,15 @@ "side" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace order to the Spot trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order Id,unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type `limit` and `market` |\n| side | String | Yes | `buy` or `sell` |\n| stp | String | No | self trade prevention is divided into four strategies: `CN`, `CO`, `CB` , and `DC` |\n| tags | String | No | Order tag, length cannot exceed `20` characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed `20` characters (ASCII) |\n\n**Additional Request Parameters Required by `limit` Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by `market` orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |\n\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or cancelled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled(already cancelled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly cancelled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: if the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: this feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrder\",\"sdk-method-description\":\"Place order to the Spot trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":1}" @@ -12977,8 +13353,8 @@ "method": "post", "path": "/api/v1/hf/orders/sync", "parameters": { - "path": [], "query": [], + "path": [], "cookie": [], "header": [] }, @@ -13265,7 +13641,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "examples": [ 10, @@ -13275,7 +13651,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "examples": [ 1740711735178 @@ -13288,8 +13664,15 @@ "side" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493f\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493f\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace order in the spot trading system\n\nThe difference between this interface and \"Add order\" is that this interface will synchronously return the order information after the order matching is completed.\n\nFor higher latency requirements, please select the \"Add order\" interface. If there is a requirement for returning data integrity, please select this interface.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderSync\",\"sdk-method-description\":\"Place order in the spot trading system. The difference between this interface and \\\"Add order\\\" is that this interface will synchronously return the order information after the order matching is completed. For higher latency requirements, please select the \\\"Add order\\\" interface. If there is a requirement for returning data integrity, please select this interface.\",\"api-rate-limit-weight\":1}" @@ -13539,7 +13922,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "examples": [ 10, @@ -13549,7 +13932,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", "format": "int64", "examples": [ 1740711735178 @@ -13562,8 +13945,15 @@ "side" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493f\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493f\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\",\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nOrder test endpoint, the request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order Id,unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type `limit` and `market` |\n| side | String | Yes | `buy` or `sell` |\n| stp | String | No | self trade prevention is divided into four strategies: `CN`, `CO`, `CB` , and `DC` |\n| tags | String | No | Order tag, length cannot exceed `20` characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed `20` characters (ASCII) |\n\n**Additional Request Parameters Required by `limit` Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by `market` orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or cancelled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled(already cancelled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly cancelled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: if the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: this feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderTest\",\"sdk-method-description\":\"Order test endpoint, the request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\",\"api-rate-limit-weight\":1}" @@ -13576,8 +13966,8 @@ "method": "post", "path": "/api/v1/hf/orders/multi", "parameters": { - "path": [], "query": [], + "path": [], "cookie": [], "header": [] }, @@ -13813,7 +14203,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "examples": [ 1740711735178 @@ -13821,7 +14211,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "examples": [ 10, @@ -13844,8 +14234,15 @@ "orderList" ] }, - "example": "{\n \"orderList\": [\n {\n \"clientOid\": \"client order id 12\",\n \"symbol\": \"BTC-USDT\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"30000\",\n \"size\": \"0.00001\"\n },\n {\n \"clientOid\": \"client order id 13\",\n \"symbol\": \"ETH-USDT\",\n \"type\": \"limit\",\n \"side\": \"sell\",\n \"price\": \"2000\",\n \"size\": \"0.00001\"\n }\n ]\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"orderList\": [\n {\n \"clientOid\": \"client order id 12\",\n \"symbol\": \"BTC-USDT\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"30000\",\n \"size\": \"0.00001\"\n },\n {\n \"clientOid\": \"client order id 13\",\n \"symbol\": \"ETH-USDT\",\n \"type\": \"limit\",\n \"side\": \"sell\",\n \"price\": \"2000\",\n \"size\": \"0.00001\"\n }\n ]\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports sequential batch order placement from a single endpoint. A maximum of 20 orders can be placed simultaneously.\n:::\n\n\n\n:::tip[Tips]\nThis endpoint only supports order placement requests. To obtain the results of the order placement, you will need to check the order status or subscribe to Websocket to obtain information about the order.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchAddOrders\",\"sdk-method-description\":\"This endpoint supports sequential batch order placement from a single endpoint. A maximum of 5 orders can be placed simultaneously. The order types must be limit orders of the same trading pair\",\"api-rate-limit-weight\":1}" @@ -13858,8 +14255,8 @@ "method": "post", "path": "/api/v1/hf/orders/multi/sync", "parameters": { - "path": [], "query": [], + "path": [], "cookie": [], "header": [] }, @@ -14139,7 +14536,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "examples": [ 10, @@ -14149,7 +14546,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "examples": [ 1740711735178 @@ -14170,8 +14567,15 @@ "orderList" ] }, - "example": "{\n \"orderList\": [\n {\n \"clientOid\": \"client order id 13\",\n \"symbol\": \"BTC-USDT\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"30000\",\n \"size\": \"0.00001\"\n },\n {\n \"clientOid\": \"client order id 14\",\n \"symbol\": \"ETH-USDT\",\n \"type\": \"limit\",\n \"side\": \"sell\",\n \"price\": \"2000\",\n \"size\": \"0.00001\"\n }\n ]\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"orderList\": [\n {\n \"clientOid\": \"client order id 13\",\n \"symbol\": \"BTC-USDT\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"30000\",\n \"size\": \"0.00001\"\n },\n {\n \"clientOid\": \"client order id 14\",\n \"symbol\": \"ETH-USDT\",\n \"type\": \"limit\",\n \"side\": \"sell\",\n \"price\": \"2000\",\n \"size\": \"0.00001\"\n }\n ]\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports sequential batch order placement from a single endpoint. A maximum of 20 orders can be placed simultaneously.\n\nThe difference between this interface and \"Batch Add Orders\" is that this interface will synchronously return the order information after the order matching is completed.\n\nFor higher latency requirements, please select the \"Batch Add Orders\" interface. If there is a requirement for returning data integrity, please select this interface.\n:::\n\n\n\n:::tip[Tips]\nThis endpoint only supports order placement requests. To obtain the results of the order placement, you will need to check the order status or subscribe to Websocket to obtain information about the order.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | No | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| type | String | Yes | Order type ‘limit’ and ‘market’ |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| tags | String | No | Order tag, length cannot exceed ‘20’ characters (ASCII) |\n| remark | String | No | Order placement remarks, length cannot exceed ‘20’ characters (ASCII) |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchAddOrdersSync\",\"sdk-method-description\":\"This endpoint supports sequential batch order placement from a single endpoint. A maximum of 5 orders can be placed simultaneously. The order types must be limit orders of the same trading pair\",\"api-rate-limit-weight\":1}" @@ -14265,8 +14669,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to cancel a spot order by orderId.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByOrderId\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":1}" @@ -14403,8 +14814,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to cancel a spot order by orderId.\n\nThe difference between this interface and \"Cancel Order By OrderId\" is that this interface will synchronously return the order information after the order canceling is completed.\n\nFor higher latency requirements, please select the \"Cancel Order By OrderId\" interface. If there is a requirement for returning data integrity, please select this interface\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByOrderIdSync\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by orderId.\",\"api-rate-limit-weight\":1}" @@ -14498,8 +14916,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to cancel a spot order by clientOid.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByClientOid\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\",\"api-rate-limit-weight\":1}" @@ -14636,8 +15061,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to cancel a spot order by clientOid.\n\nThe difference between this interface and \"Cancel Order By ClientOid\" is that this interface will synchronously return the order information after the order canceling is completed.\n\nFor higher latency requirements, please select the \"Cancel Order By ClientOid\" interface. If there is a requirement for returning data integrity, please select this interface\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByClientOidSync\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by orderId.\",\"api-rate-limit-weight\":1}" @@ -14744,8 +15176,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can cancel the specified quantity of the order according to the orderId.\nThe order execution order is: price first, time first, this interface will not change the queue order\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelPartialOrder\",\"sdk-method-description\":\"This interface can cancel the specified quantity of the order according to the orderId. The order execution order is: price first, time first, this interface will not change the queue order\",\"api-rate-limit-weight\":2}" @@ -14821,8 +15260,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can cancel all spot orders for specific symbol.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllOrdersBySymbol\",\"sdk-method-description\":\"This endpoint can cancel all spot orders for specific symbol. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\",\"api-rate-limit-weight\":2}" @@ -14916,8 +15362,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can cancel all spot orders for all symbol.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllOrders\",\"sdk-method-description\":\"This endpoint can cancel all spot orders for all symbol. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\",\"api-rate-limit-weight\":30}" @@ -14972,7 +15425,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -14980,7 +15434,10 @@ "name": "Success", "data": "{\"code\":\"200000\",\"data\":{\"newOrderId\":\"67112258f9406e0007408827\",\"clientOid\":\"client order id 12\"}}", "responseId": 10335, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -15022,11 +15479,18 @@ "symbol" ] }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can modify the price and quantity of the order according to orderId or clientOid.\n\nThe implementation of this interface is: Cancel the order and place a new order on the same trading pair, and return the modification result to the client synchronously.\n\nWhen the quantity of the new order updated by the user is less than the filled quantity of this order, the order will be considered as completed, and the order will be canceled, and no new order will be placed.\n:::\n", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"modifyOrder\",\"sdk-method-description\":\"This interface can modify the price and quantity of the order according to orderId or clientOid. The implementation of this interface is: Cancel the order and place a new order on the same trading pair, and return the modification result to the client synchronously. When the quantity of the new order updated by the user is less than the filled quantity of this order, the order will be considered as completed, and the order will be canceled, and no new order will be placed.\",\"api-rate-limit-weight\":3}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"modifyOrder\",\"sdk-method-description\":\"This interface can modify the price and quantity of the order according to orderId or clientOid. The implementation of this interface is: Cancel the order and place a new order on the same trading pair, and return the modification result to the client synchronously. When the quantity of the new order updated by the user is less than the filled quantity of this order, the order will be considered as completed, and the order will be canceled, and no new order will be placed.\",\"api-rate-limit-weight\":1}" } }, { @@ -15355,7 +15819,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -15363,7 +15828,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"6717422bd51c29000775ea03\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"symbol\": \"BTC-USDT\",\n \"opType\": \"DEAL\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"70000\",\n \"size\": \"0.00001\",\n \"funds\": \"0.7\",\n \"dealSize\": \"0.00001\",\n \"dealFunds\": \"0.677176\",\n \"remainSize\": \"0\",\n \"remainFunds\": \"0.022824\",\n \"cancelledSize\": \"0\",\n \"cancelledFunds\": \"0\",\n \"fee\": \"0.000677176\",\n \"feeCurrency\": \"USDT\",\n \"stp\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"visibleSize\": \"0\",\n \"cancelAfter\": 0,\n \"channel\": \"API\",\n \"remark\": \"order remarks\",\n \"tags\": null,\n \"cancelExist\": false,\n \"tradeType\": \"TRADE\",\n \"inOrderBook\": false,\n \"active\": false,\n \"tax\": \"0\",\n \"createdAt\": 1729577515444,\n \"lastUpdatedAt\": 1729577515481\n }\n}", "responseId": 10345, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -15373,10 +15841,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByOrderId\",\"sdk-method-description\":\"This endpoint can be used to obtain information for a single Spot order using the order id. After the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":2}" } }, @@ -15706,7 +16181,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -15714,7 +16190,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"6717422bd51c29000775ea03\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"symbol\": \"BTC-USDT\",\n \"opType\": \"DEAL\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"70000\",\n \"size\": \"0.00001\",\n \"funds\": \"0.7\",\n \"dealSize\": \"0.00001\",\n \"dealFunds\": \"0.677176\",\n \"remainSize\": \"0\",\n \"remainFunds\": \"0.022824\",\n \"cancelledSize\": \"0\",\n \"cancelledFunds\": \"0\",\n \"fee\": \"0.000677176\",\n \"feeCurrency\": \"USDT\",\n \"stp\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"visibleSize\": \"0\",\n \"cancelAfter\": 0,\n \"channel\": \"API\",\n \"remark\": \"order remarks\",\n \"tags\": null,\n \"cancelExist\": false,\n \"tradeType\": \"TRADE\",\n \"inOrderBook\": false,\n \"active\": false,\n \"tax\": \"0\",\n \"createdAt\": 1729577515444,\n \"lastUpdatedAt\": 1729577515481\n }\n}", "responseId": 10346, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -15724,10 +16203,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the client order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Spot order using the client order id.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByClientOid\",\"sdk-method-description\":\"This endpoint can be used to obtain information for a single Spot order using the client order id. After the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":2}" } }, @@ -15796,8 +16282,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query all spot symbol that has active orders\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getSymbolsWithOpenOrder\",\"sdk-method-description\":\"This interface can query all spot symbol that has active orders\",\"api-rate-limit-weight\":2}" @@ -16140,8 +16633,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is to obtain all Spot active order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nFor high-frequency trading users, we recommend locally caching, maintaining your own order records, and using market data streams to update your order information in real time.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOpenOrders\",\"sdk-method-description\":\"This interface is to obtain all Spot active order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order. After the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":2}" @@ -16535,8 +17035,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is to obtain Spot active order (uncompleted order) lists by page. The returned data is sorted in descending order according to the create time of the order.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nFor high-frequency trading users, we recommend locally caching, maintaining your own order records, and using market data streams to update your order information in real time.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOpenOrdersByPage\",\"sdk-method-description\":\"This interface is to obtain Spot active order (uncompleted order) lists by page. The returned data is sorted in descending order according to the create time of the order. After the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":2}" @@ -16990,7 +17497,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -16998,7 +17506,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"lastId\": 19814995255305,\n \"items\": [\n {\n \"id\": \"6717422bd51c29000775ea03\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"symbol\": \"BTC-USDT\",\n \"opType\": \"DEAL\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"70000\",\n \"size\": \"0.00001\",\n \"funds\": \"0.7\",\n \"dealSize\": \"0.00001\",\n \"dealFunds\": \"0.677176\",\n \"remainSize\": \"0\",\n \"remainFunds\": \"0.022824\",\n \"cancelledSize\": \"0\",\n \"cancelledFunds\": \"0\",\n \"fee\": \"0.000677176\",\n \"feeCurrency\": \"USDT\",\n \"stp\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"visibleSize\": \"0\",\n \"cancelAfter\": 0,\n \"channel\": \"API\",\n \"remark\": \"order remarks\",\n \"tags\": null,\n \"cancelExist\": false,\n \"tradeType\": \"TRADE\",\n \"inOrderBook\": false,\n \"active\": false,\n \"tax\": \"0\",\n \"createdAt\": 1729577515444,\n \"lastUpdatedAt\": 1729577515481\n }\n ]\n }\n}", "responseId": 10343, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -17008,10 +17519,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis interface is to obtain all Spot Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis interface is to obtain all Spot Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getClosedOrders\",\"sdk-method-description\":\"This interface is to obtain all Spot closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order. After the user successfully places an order, the order is in Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":2}" } }, @@ -17374,7 +17892,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -17382,7 +17901,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"items\": [\n {\n \"id\": 19814995255305,\n \"orderId\": \"6717422bd51c29000775ea03\",\n \"counterOrderId\": \"67174228135f9e000709da8c\",\n \"tradeId\": 11029373945659392,\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"liquidity\": \"taker\",\n \"type\": \"limit\",\n \"forceTaker\": false,\n \"price\": \"67717.6\",\n \"size\": \"0.00001\",\n \"funds\": \"0.677176\",\n \"fee\": \"0.000677176\",\n \"feeRate\": \"0.001\",\n \"feeCurrency\": \"USDT\",\n \"stop\": \"\",\n \"tradeType\": \"TRADE\",\n \"taxRate\": \"0\",\n \"tax\": \"0\",\n \"createdAt\": 1729577515473\n }\n ],\n \"lastId\": 19814995255305\n }\n}", "responseId": 10344, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -17392,10 +17914,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis endpoint can be used to obtain a list of the latest Spot transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 _ 24 hours (ie: from the current time to 3 _ 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis endpoint can be used to obtain a list of the latest Spot transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (ie: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getTradeHistory\",\"sdk-method-description\":\"This endpoint can be used to obtain a list of the latest Spot transaction details. The returned data is sorted in descending order according to the latest update time of the order.\",\"api-rate-limit-weight\":2}" } }, @@ -17474,8 +18003,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"timeout\": 5,\n \"symbols\": \"BTC-USDT,ETH-USDT\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"timeout\": 5,\n \"symbols\": \"BTC-USDT,ETH-USDT\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet Disconnection Protect (Deadman Switch). Through this interface, you can query the settings of automatic order cancellation.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getDCP\",\"sdk-method-description\":\"Get Disconnection Protect (Deadman Switch). Through this interface, you can query the settings of automatic order cancellation.\",\"api-rate-limit-weight\":2}" @@ -17566,8 +18102,15 @@ "timeout" ] }, - "example": "{\n \"timeout\": 5,\n \"symbols\": \"BTC-USDT,ETH-USDT\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"timeout\": 5,\n \"symbols\": \"BTC-USDT,ETH-USDT\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nSet Disconnection Protect (Deadman Switch). Through this interface, call this interface to automatically cancel all orders of the set trading pair after the specified time. If this interface is not called again for renewal or cancellation before the set time, the system will help the user to cancel the order of the corresponding trading pair. Otherwise it will not.\n:::\n\n:::tip[Tips]\nThe order cancellation delay is between 0 and 10 seconds, and the order will not be canceled in real time. When the system cancels the order, if the transaction pair status is no longer operable to cancel the order, it will not cancel the order\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"setDCP\",\"sdk-method-description\":\"Set Disconnection Protect (Deadman Switch). Through this interface, call this interface to automatically cancel all orders of the set trading pair after the specified time. If this interface is not called again for renewal or cancellation before the set time, the system will help the user to cancel the order of the corresponding trading pair. Otherwise it will not.\",\"api-rate-limit-weight\":2}" @@ -17822,8 +18365,15 @@ "stopPrice" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"stopPrice\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"stopPrice\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace stop order to the Spot trading system. The maximum untriggered stop orders for a single trading pair in one account is 20.\n:::\n\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addStopOrder\",\"sdk-method-description\":\"Place stop order to the Spot trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":1}" @@ -17923,8 +18473,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to cancel a spot order by clientOid.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelStopOrderByClientOid\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot stop order by clientOid. \",\"api-rate-limit-weight\":5}" @@ -18004,8 +18561,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint the cancellation of a single stop order previously placed.\n\nYou will receive canceledOrderIds field once the system has received the cancellation request. The cancellation request will be processed by the matching engine in sequence. To know if the request is processed (successfully or not), you may check the order status or the update message from the Websocket pushes.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelStopOrderByOrderId\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot stop order by orderId. \",\"api-rate-limit-weight\":3}" @@ -18101,8 +18665,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this interface to cancel a batch of stop orders.\n\nThe count of orderId in the parameter now is not limited.\n\nAn example is:\n ```/api/v1/stop-order/cancel?symbol=ETH-BTC&tradeType=TRADE&orderIds=5bd6e9286d99522a52e458de,5bd6e9286d99522a52e458df```\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchCancelStopOrder\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot stop orders by batch.\",\"api-rate-limit-weight\":3}" @@ -18495,8 +19066,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint to get your current untriggered stop order list. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getStopOrdersList\",\"sdk-method-description\":\"This interface is to obtain all Spot active stop order lists\",\"api-rate-limit-weight\":8}" @@ -18818,8 +19396,15 @@ } } }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this interface to get a stop order information via the order ID.\n\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getStopOrderByOrderId\",\"sdk-method-description\":\"This interface is to obtain Spot stop order details by orderId\",\"api-rate-limit-weight\":3}" @@ -19154,8 +19739,15 @@ } } }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this interface to get a stop order information via the clientOid.\n\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getStopOrderByClientOid\",\"sdk-method-description\":\"This interface is to obtain Spot stop order details by orderId\",\"api-rate-limit-weight\":3}" @@ -19306,8 +19898,15 @@ "limitPrice" ] }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"94000\",\n \"size\": \"0.1\",\n \"clientOid\": \"5c52e11203aa67f1e493fb\",\n \"stopPrice\": \"98000\",\n \"limitPrice\": \"96000\",\n \"remark\": \"this is remark\",\n \"tradeType\": \"TRADE\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"94000\",\n \"size\": \"0.1\",\n \"clientOid\": \"5c52e11203aa67f1e493fb\",\n \"stopPrice\": \"98000\",\n \"limitPrice\": \"96000\",\n \"remark\": \"this is remark\",\n \"tradeType\": \"TRADE\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace OCO order to the Spot trading system\n:::\n\n:::tip[Tips]\nThe maximum untriggered stop orders for a single trading pair in one account is 20.\n:::\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOcoOrder\",\"sdk-method-description\":\"Place OCO order to the Spot trading system\",\"api-rate-limit-weight\":2}" @@ -19387,8 +19986,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this endpoint the cancellation of a single OCO order previously placed.\n\nYou will receive canceledOrderIds field once the system has received the cancellation request. The cancellation request will be processed by the matching engine in sequence. To know if the request is processed (successfully or not), you may check the order status or the update message from the pushes.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOcoOrderByOrderId\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":3}" @@ -19469,8 +20075,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this interface to cancel a stop order via the clientOid.\n\nYou will receive cancelledOrderIds field once the system has received the cancellation request. The cancellation request will be processed by the matching engine in sequence. To know if the request is processed (successfully or not), you may check the order status or the update message from the pushes.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOcoOrderByClientOid\",\"sdk-method-description\":\"Request via this interface to cancel a stop order via the clientOid. You will receive cancelledOrderIds field once the system has received the cancellation request. The cancellation request will be processed by the matching engine in sequence. To know if the request is processed (successfully or not), you may check the order status or the update message from the pushes.\",\"api-rate-limit-weight\":3}" @@ -19558,8 +20171,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can batch cancel OCO orders through orderIds.\n\nYou will receive canceledOrderIds field once the system has received the cancellation request. The cancellation request will be processed by the matching engine in sequence. To know if the request is processed (successfully or not), you may check the order status or the update message from the pushes.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchCancelOcoOrders\",\"sdk-method-description\":\"This interface can batch cancel OCO orders through orderIds. You will receive canceledOrderIds field once the system has received the cancellation request. The cancellation request will be processed by the matching engine in sequence. To know if the request is processed (successfully or not), you may check the order status or the update message from the pushes.\",\"api-rate-limit-weight\":3}" @@ -19685,8 +20305,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this interface an OCO order information via the order ID.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOcoOrderByOrderId\",\"sdk-method-description\":\"Request via this interface an OCO order information via the order ID.\",\"api-rate-limit-weight\":2}" @@ -19785,8 +20412,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this interface to get a oco order information via the client order ID.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOcoOrderByClientOid\",\"sdk-method-description\":\"Request via this interface to get a oco order information via the client order ID.\",\"api-rate-limit-weight\":2}" @@ -19924,8 +20558,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest via this interface to get a oco order detail via the order ID.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOcoOrderDetailByOrderId\",\"sdk-method-description\":\"Request via this interface to get a oco order detail via the order ID.\",\"api-rate-limit-weight\":2}" @@ -20138,8 +20779,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest your current OCO order list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOcoOrderList\",\"sdk-method-description\":\"Request your current OCO order list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\",\"api-rate-limit-weight\":2}" @@ -20328,8 +20976,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint allows querying the configuration of cross margin symbol.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getCrossMarginSymbols\",\"sdk-method-description\":\"This endpoint allows querying the configuration of cross margin symbol.\",\"api-rate-limit-weight\":3}" @@ -20437,8 +21092,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface returns leveraged token information.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getETFInfo\",\"sdk-method-description\":\"This interface returns leveraged token information.\",\"api-rate-limit-weight\":3}" @@ -20526,8 +21188,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint returns the current Mark price for specified margin trading pairs.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getMarkPriceDetail\",\"sdk-method-description\":\"This endpoint returns the current Mark price for specified margin trading pairs.\",\"api-rate-limit-weight\":2}" @@ -20613,8 +21282,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest the configure info of the cross margin via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getMarginConfig\",\"sdk-method-description\":\"Request the configure info of the cross margin via this endpoint.\",\"api-rate-limit-weight\":25}" @@ -20696,8 +21372,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint returns the current Mark price for all margin trading pairs.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getMarkPriceList\",\"sdk-method-description\":\"This endpoint returns the current Mark price for all margin trading pairs.\",\"api-rate-limit-weight\":10}" @@ -20824,8 +21507,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint allows querying the configuration of isolated margin symbol.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getIsolatedMarginSymbols\",\"sdk-method-description\":\"This endpoint allows querying the configuration of isolated margin symbol.\",\"api-rate-limit-weight\":3}" @@ -20897,7 +21587,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -20905,7 +21596,10 @@ "name": "Success", "data": "{\n \"success\": true,\n \"code\": \"200000\",\n \"data\": {\n \"orderId\": \"671663e02188630007e21c9c\",\n \"clientOid\": \"5c52e11203aa677f33e1493fb\",\n \"borrowSize\": \"10.2\",\n \"loanApplyId\": \"600656d9a33ac90009de4f6f\"\n }\n}", "responseId": 10368, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -21097,11 +21791,18 @@ "clientOid" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace order in the Cross-margin or Isolated-margin trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | Yes | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| type | String | No | Order type ‘limit’ and ‘market’, default is limit |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| isIsolated | boolean | No | true - isolated margin, false - cross margin. Default is false |\n| autoBorrow | boolean | No | When Margin Account has inefficient balance, our system autoborrows inefficient assets and opens positions according to the lowest market interest rate. |\n| autoRepay | boolean | No | AutoPay allows returning borrowed assets when you close a position. Our system automatically triggers the repayment and the maximum repayment amount equals to the filled-order amount. |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrder\",\"sdk-method-description\":\"Place order in the Cross-margin or Isolated-margin trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":5}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrder\",\"sdk-method-description\":\"Place order in the Cross-margin or Isolated-margin trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":2}" } }, { @@ -21163,7 +21864,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -21171,7 +21873,10 @@ "name": "Success", "data": "{\n \"success\": true,\n \"code\": \"200000\",\n \"data\": {\n \"orderId\": \"5bd6e9286d99522a52e458de\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"borrowSize\": 10.2,\n \"loanApplyId\": \"600656d9a33ac90009de4f6f\"\n }\n}", "responseId": 10369, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -21363,11 +22068,18 @@ "clientOid" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nOrder test endpoint: This endpoint’s request and return parameters are identical to the order endpoint, and can be used to verify whether the signature is correct, among other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | Yes | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| type | String | No | Order type ‘limit’ and ‘market’, default is limit |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| isIsolated | boolean | No | true - isolated margin, false - cross margin. Default is false |\n| autoBorrow | boolean | No | When Margin Account has inefficient balance, our system autoborrows inefficient assets and opens positions according to the lowest market interest rate. |\n| autoRepay | boolean | No | AutoPay allows returning borrowed assets when you close a position. Our system automatically triggers the repayment and the maximum repayment amount equals to the filled-order amount. |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderTest\",\"sdk-method-description\":\" Order test endpoint: This endpoint’s request and return parameters are identical to the order endpoint, and can be used to verify whether the signature is correct, among other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\",\"api-rate-limit-weight\":5}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderTest\",\"sdk-method-description\":\" Order test endpoint: This endpoint’s request and return parameters are identical to the order endpoint, and can be used to verify whether the signature is correct, among other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\",\"api-rate-limit-weight\":2}" } }, { @@ -21377,16 +22089,6 @@ "method": "delete", "path": "/api/v3/hf/margin/orders/{orderId}", "parameters": { - "path": [ - { - "id": "orderId#0", - "name": "orderId", - "required": true, - "description": "The unique order id generated by the trading system", - "example": "671663e02188630007e21c9c", - "type": "string" - } - ], "query": [ { "id": "KXIxHhD4qw", @@ -21402,7 +22104,19 @@ "ETH-USDT", "KCS-USDT" ] - } + }, + "enable": true + } + ], + "path": [ + { + "id": "orderId#0", + "name": "orderId", + "required": true, + "description": "The unique order id generated by the trading system", + "example": "671663e02188630007e21c9c", + "type": "string", + "enable": true } ], "cookie": [], @@ -21440,7 +22154,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -21448,7 +22163,10 @@ "name": "Success", "data": "{\"code\":\"200000\",\"data\":{\"orderId\":\"671663e02188630007e21c9c\"}}", "responseId": 10359, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -21458,11 +22176,18 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to cancel a margin order by orderId.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\n:::", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByOrderId\",\"sdk-method-description\":\"This endpoint can be used to cancel a margin order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":5}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByOrderId\",\"sdk-method-description\":\"This endpoint can be used to cancel a margin order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":2}" } }, { @@ -21472,16 +22197,6 @@ "method": "delete", "path": "/api/v3/hf/margin/orders/client-order/{clientOid}", "parameters": { - "path": [ - { - "id": "clientOid#0", - "name": "clientOid", - "required": true, - "description": "Client Order Id, unique identifier created by the user", - "example": "5c52e11203aa677f33e1493fb", - "type": "string" - } - ], "query": [ { "id": "KXIxHhD4qw", @@ -21497,7 +22212,19 @@ "ETH-USDT", "KCS-USDT" ] - } + }, + "enable": true + } + ], + "path": [ + { + "id": "clientOid#0", + "name": "clientOid", + "required": true, + "description": "Client Order Id, unique identifier created by the user", + "example": "5c52e11203aa677f33e1493fb", + "type": "string", + "enable": true } ], "cookie": [], @@ -21535,7 +22262,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -21543,7 +22271,10 @@ "name": "Success", "data": "{\"code\":\"200000\",\"data\":{\"clientOid\":\"5c52e11203aa677f33e1493fb\"}}", "responseId": 10365, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -21553,11 +22284,18 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can be used to cancel a margin order by clientOid.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\n:::", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByClientOid\",\"sdk-method-description\":\"This endpoint can be used to cancel a margin order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":5}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByClientOid\",\"sdk-method-description\":\"This endpoint can be used to cancel a margin order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":2}" } }, { @@ -21567,7 +22305,6 @@ "method": "delete", "path": "/api/v3/hf/margin/orders", "parameters": { - "path": [], "query": [ { "id": "KXIxHhD4qw", @@ -21583,7 +22320,8 @@ "ETH-USDT", "KCS-USDT" ] - } + }, + "enable": true }, { "id": "diFMZqfTZb", @@ -21610,9 +22348,11 @@ "description": "" } ] - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -21639,7 +22379,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -21647,7 +22388,10 @@ "name": "Success", "data": "{\"code\":\"200000\",\"data\":\"success\"}", "responseId": 10361, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -21657,11 +22401,18 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can cancel all open Margin orders by symbol.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\n:::", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllOrdersBySymbol\",\"sdk-method-description\":\"This interface can cancel all open Margin orders by symbol. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":10}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllOrdersBySymbol\",\"sdk-method-description\":\"This interface can cancel all open Margin orders by symbol. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":5}" } }, { @@ -21671,7 +22422,6 @@ "method": "get", "path": "/api/v3/hf/margin/order/active/symbols", "parameters": { - "path": [], "query": [ { "id": "D8DOjyDYcq", @@ -21698,9 +22448,11 @@ "description": "" } ] - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -21744,7 +22496,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -21752,7 +22505,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"symbolSize\": 1,\n \"symbols\": [\n \"BTC-USDT\"\n ]\n }\n}", "responseId": 10360, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -21762,11 +22518,18 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query all Margin symbols that have active orders.\n:::", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getSymbolsWithOpenOrder\",\"sdk-method-description\":\"This interface can query all Margin symbols that have active orders.\"}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getSymbolsWithOpenOrder\",\"sdk-method-description\":\"This interface can query all Margin symbols that have active orders.\",\"api-rate-limit-weight\":4}" } }, { @@ -22142,8 +22905,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is to obtain all Margin active order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nFor high-frequency trading users, we recommend caching locally, maintaining your own order records, and using market data streams to update your order information in real time.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOpenOrders\",\"sdk-method-description\":\"This interface is to obtain all Margin active order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":4}" @@ -22156,7 +22926,6 @@ "method": "get", "path": "/api/v3/hf/margin/orders/done", "parameters": { - "path": [], "query": [ { "id": "M9bgPS6vOj", @@ -22172,7 +22941,8 @@ "ETH-USDT", "KCS-USDT" ] - } + }, + "enable": true }, { "id": "Cs1ItDm2bR", @@ -22199,7 +22969,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "sTtMCE9Jhf", @@ -22225,7 +22996,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "QaBSxyasEm", @@ -22251,7 +23023,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "kkvuIGVxs6", @@ -22263,7 +23036,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "heQ8W6yKwm", @@ -22277,7 +23051,8 @@ "default": 20, "minimum": 1, "maximum": 100 - } + }, + "enable": true }, { "id": "Djtx6oC9gm", @@ -22289,7 +23064,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "K9IMpKw8u2", @@ -22301,9 +23077,11 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -22604,7 +23382,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -22612,7 +23391,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"lastId\": 136112949351,\n \"items\": [\n {\n \"id\": \"6716491f6afcdb00078365c8\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"symbol\": \"BTC-USDT\",\n \"opType\": \"DEAL\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"funds\": \"0.5\",\n \"dealSize\": \"0\",\n \"dealFunds\": \"0\",\n \"remainSize\": \"0\",\n \"remainFunds\": \"0\",\n \"cancelledSize\": \"0.00001\",\n \"cancelledFunds\": \"0.5\",\n \"fee\": \"0\",\n \"feeCurrency\": \"USDT\",\n \"stp\": null,\n \"stop\": null,\n \"stopTriggered\": false,\n \"stopPrice\": \"0\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"visibleSize\": \"0\",\n \"cancelAfter\": 0,\n \"channel\": \"API\",\n \"remark\": null,\n \"tags\": null,\n \"cancelExist\": true,\n \"tradeType\": \"MARGIN_TRADE\",\n \"inOrderBook\": false,\n \"active\": false,\n \"tax\": \"0\",\n \"createdAt\": 1729513759162,\n \"lastUpdatedAt\": 1729521126597\n }\n ]\n }\n}", "responseId": 10363, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -22622,10 +23404,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis interface is to obtain all Margin Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis interface is to obtain all Margin Closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getClosedOrders\",\"sdk-method-description\":\"This interface is to obtain all Margin closed order lists, and the return value of the active order interface is the paged data of all uncompleted order lists. The returned data is sorted in descending order according to the latest update time of the order. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":10}" } }, @@ -22636,7 +23425,6 @@ "method": "get", "path": "/api/v3/hf/margin/fills", "parameters": { - "path": [], "query": [ { "id": "M9bgPS6vOj", @@ -22652,7 +23440,8 @@ "ETH-USDT", "KCS-USDT" ] - } + }, + "enable": true }, { "id": "EfWDHYz4tE", @@ -22679,14 +23468,16 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "Bc6ZDrZFdp", "name": "orderId", "required": false, "description": "The unique order id generated by the trading system\n(If orderId is specified, please ignore the other query parameters)", - "type": "string" + "type": "string", + "enable": true }, { "id": "sTtMCE9Jhf", @@ -22712,7 +23503,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "QaBSxyasEm", @@ -22738,7 +23530,8 @@ "description": "" } ] - } + }, + "enable": true }, { "id": "kkvuIGVxs6", @@ -22750,7 +23543,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "heQ8W6yKwm", @@ -22764,7 +23558,8 @@ "default": 20, "minimum": 1, "maximum": 100 - } + }, + "enable": true }, { "id": "Djtx6oC9gm", @@ -22776,7 +23571,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "K9IMpKw8u2", @@ -22788,9 +23584,11 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -22992,7 +23790,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -23000,7 +23799,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"items\": [\n {\n \"id\": 137891621991,\n \"symbol\": \"BTC-USDT\",\n \"tradeId\": 11040911994273793,\n \"orderId\": \"671868085584bc0007d85f46\",\n \"counterOrderId\": \"67186805b7cbdf00071621f9\",\n \"side\": \"buy\",\n \"liquidity\": \"taker\",\n \"forceTaker\": false,\n \"price\": \"67141.6\",\n \"size\": \"0.00001\",\n \"funds\": \"0.671416\",\n \"fee\": \"0.000671416\",\n \"feeRate\": \"0.001\",\n \"feeCurrency\": \"USDT\",\n \"stop\": \"\",\n \"tradeType\": \"MARGIN_TRADE\",\n \"tax\": \"0\",\n \"taxRate\": \"0\",\n \"type\": \"limit\",\n \"createdAt\": 1729652744998\n }\n ],\n \"lastId\": 137891621991\n }\n}", "responseId": 10364, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -23010,10 +23812,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis endpoint can be used to obtain a list of the latest Margin transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis endpoint can be used to obtain a list of the latest Margin transaction details. \nThe returned data is sorted in descending order according to the latest update time of the order.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getTradeHistory\",\"sdk-method-description\":\"This endpoint can be used to obtain a list of the latest Margin transaction details. The returned data is sorted in descending order according to the latest update time of the order.\",\"api-rate-limit-weight\":5}" } }, @@ -23024,16 +23833,6 @@ "method": "get", "path": "/api/v3/hf/margin/orders/{orderId}", "parameters": { - "path": [ - { - "id": "orderId#0", - "name": "orderId", - "required": true, - "description": "The unique order id generated by the trading system", - "example": "671667306afcdb000723107f", - "type": "string" - } - ], "query": [ { "id": "M9bgPS6vOj", @@ -23049,7 +23848,19 @@ "ETH-USDT", "KCS-USDT" ] - } + }, + "enable": true + } + ], + "path": [ + { + "id": "orderId#0", + "name": "orderId", + "required": true, + "description": "The unique order id generated by the trading system", + "example": "671667306afcdb000723107f", + "type": "string", + "enable": true } ], "cookie": [], @@ -23352,7 +24163,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -23360,7 +24172,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"671667306afcdb000723107f\",\n \"symbol\": \"BTC-USDT\",\n \"opType\": \"DEAL\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"funds\": \"0.5\",\n \"dealSize\": \"0\",\n \"dealFunds\": \"0\",\n \"fee\": \"0\",\n \"feeCurrency\": \"USDT\",\n \"stp\": null,\n \"stop\": null,\n \"stopTriggered\": false,\n \"stopPrice\": \"0\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"visibleSize\": \"0\",\n \"cancelAfter\": 0,\n \"channel\": \"API\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": null,\n \"tags\": null,\n \"cancelExist\": false,\n \"createdAt\": 1729521456248,\n \"lastUpdatedAt\": 1729651011877,\n \"tradeType\": \"MARGIN_TRADE\",\n \"inOrderBook\": true,\n \"cancelledSize\": \"0\",\n \"cancelledFunds\": \"0\",\n \"remainSize\": \"0.00001\",\n \"remainFunds\": \"0.5\",\n \"tax\": \"0\",\n \"active\": true\n }\n}", "responseId": 10366, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -23370,10 +24185,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByOrderId\",\"sdk-method-description\":\"This endpoint can be used to obtain information for a single Margin order using the order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":5}" } }, @@ -23384,16 +24206,6 @@ "method": "get", "path": "/api/v3/hf/margin/orders/client-order/{clientOid}", "parameters": { - "path": [ - { - "id": "clientOid#0", - "name": "clientOid", - "required": true, - "description": "Client Order Id, unique identifier created by the user", - "example": "5c52e11203aa677f33e493fb", - "type": "string" - } - ], "query": [ { "id": "M9bgPS6vOj", @@ -23409,7 +24221,19 @@ "ETH-USDT", "KCS-USDT" ] - } + }, + "enable": true + } + ], + "path": [ + { + "id": "clientOid#0", + "name": "clientOid", + "required": true, + "description": "Client Order Id, unique identifier created by the user", + "example": "5c52e11203aa677f33e493fb", + "type": "string", + "enable": true } ], "cookie": [], @@ -23711,7 +24535,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -23719,7 +24544,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"671667306afcdb000723107f\",\n \"symbol\": \"BTC-USDT\",\n \"opType\": \"DEAL\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"funds\": \"0.5\",\n \"dealSize\": \"0\",\n \"dealFunds\": \"0\",\n \"fee\": \"0\",\n \"feeCurrency\": \"USDT\",\n \"stp\": null,\n \"stop\": null,\n \"stopTriggered\": false,\n \"stopPrice\": \"0\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"visibleSize\": \"0\",\n \"cancelAfter\": 0,\n \"channel\": \"API\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": null,\n \"tags\": null,\n \"cancelExist\": false,\n \"createdAt\": 1729521456248,\n \"lastUpdatedAt\": 1729651011877,\n \"tradeType\": \"MARGIN_TRADE\",\n \"inOrderBook\": true,\n \"cancelledSize\": \"0\",\n \"cancelledFunds\": \"0\",\n \"remainSize\": \"0.00001\",\n \"remainFunds\": \"0.5\",\n \"tax\": \"0\",\n \"active\": true\n }\n}", "responseId": 10367, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -23729,10 +24557,17 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, - "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the client order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 3 * 24 hours (i.e.: from the current time to 3 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 3 * 24 hours by default.\n:::", + "description": ":::info[Description]\nThis endpoint can be used to obtain information for a single Margin order using the client order ID.\n\nAfter the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\n:::\n\n:::tip[Tips]\nIf the order is not an active order, you can only get data within the time range of 7 * 24 hours (i.e.: from the current time to 7 * 24 hours ago). If the time range is exceeded, the system will query the data within the time range of 7 * 24 hours by default.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByClientOid\",\"sdk-method-description\":\"This endpoint can be used to obtain information for a single Margin order using the client order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.\",\"api-rate-limit-weight\":5}" } } @@ -23868,8 +24703,15 @@ "timeInForce" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint is used to initiate an application for cross or isolated margin borrowing.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Debit\",\"sdk-method-name\":\"borrow\",\"sdk-method-description\":\"This API endpoint is used to initiate an application for cross or isolated margin borrowing.\",\"api-rate-limit-weight\":15}" @@ -24126,8 +24968,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint is used to get the borrowing orders for cross and isolated margin accounts.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Debit\",\"sdk-method-name\":\"getBorrowHistory\",\"sdk-method-description\":\"This API endpoint is used to get the borrowing orders for cross and isolated margin accounts.\",\"api-rate-limit-weight\":15}" @@ -24242,8 +25091,15 @@ "size" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint is used to initiate an application for cross or isolated margin repayment.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Debit\",\"sdk-method-name\":\"repay\",\"sdk-method-description\":\"This API endpoint is used to initiate an application for cross or isolated margin repayment.\",\"api-rate-limit-weight\":10}" @@ -24500,8 +25356,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint is used to get the repayment orders for cross and isolated margin accounts.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Debit\",\"sdk-method-name\":\"getRepayHistory\",\"sdk-method-description\":\"This API endpoint is used to get the borrowing orders for cross and isolated margin accounts.\",\"api-rate-limit-weight\":15}" @@ -24709,8 +25572,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest the interest records of the cross/isolated margin lending via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Debit\",\"sdk-method-name\":\"getInterestHistory\",\"sdk-method-description\":\"Request the interest records of the cross/isolated margin lending via this endpoint.\",\"api-rate-limit-weight\":20}" @@ -24791,8 +25661,15 @@ "leverage" ] }, - "example": "{\n \"leverage\": \"5\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"leverage\": \"5\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint allows modifying the leverage multiplier for cross margin or isolated margin.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Debit\",\"sdk-method-name\":\"modifyLeverage\",\"sdk-method-description\":\"This endpoint allows modifying the leverage multiplier for cross margin or isolated margin.\",\"api-rate-limit-weight\":8}" @@ -24924,8 +25801,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint is used to get the information about the currencies available for lending.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Credit\",\"sdk-method-name\":\"getLoanMarket\",\"sdk-method-description\":\"This API endpoint is used to get the information about the currencies available for lending.\",\"api-rate-limit-weight\":10}" @@ -25018,8 +25902,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint is used to get the interest rates of the margin lending market over the past 7 days.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Credit\",\"sdk-method-name\":\"getLoanMarketInterestRate\",\"sdk-method-description\":\"This API endpoint is used to get the interest rates of the margin lending market over the past 7 days.\",\"api-rate-limit-weight\":5}" @@ -25110,8 +26001,15 @@ "interestRate" ] }, - "example": "{\n \"currency\": \"BTC\",\n \"size\": \"0.001\",\n \"interestRate\": \"0.1\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"BTC\",\n \"size\": \"0.001\",\n \"interestRate\": \"0.1\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nInvest credit in the market and earn interest. Please ensure that the funds are in the main (funding) account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Credit\",\"sdk-method-name\":\"purchase\",\"sdk-method-description\":\"Invest credit in the market and earn interest\",\"api-rate-limit-weight\":15}" @@ -25193,8 +26091,15 @@ "interestRate" ] }, - "example": "{\n \"currency\": \"BTC\",\n \"purchaseOrderNo\": \"671bafa804c26d000773c533\",\n \"interestRate\": \"0.09\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"BTC\",\n \"purchaseOrderNo\": \"671bafa804c26d000773c533\",\n \"interestRate\": \"0.09\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint is used to update the interest rates of subscription orders, which will take effect at the beginning of the next hour. Please ensure that the funds are in the main (funding) account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Credit\",\"sdk-method-name\":\"modifyPurchase\",\"sdk-method-description\":\"This API endpoint is used to update the interest rates of subscription orders, which will take effect at the beginning of the next hour. Please ensure that the funds are in the main (funding) account.\",\"api-rate-limit-weight\":10}" @@ -25423,8 +26328,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint provides a pagination query for the purchase orders.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Credit\",\"sdk-method-name\":\"getPurchaseOrders\",\"sdk-method-description\":\"This API endpoint provides a pagination query for the purchase orders.\",\"api-rate-limit-weight\":10}" @@ -25515,8 +26427,15 @@ "purchaseOrderNo" ] }, - "example": "{\n \"currency\": \"BTC\",\n \"size\": \"0.001\",\n \"purchaseOrderNo\": \"671bafa804c26d000773c533\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"BTC\",\n \"size\": \"0.001\",\n \"purchaseOrderNo\": \"671bafa804c26d000773c533\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRedeem your loan order.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Credit\",\"sdk-method-name\":\"redeem\",\"sdk-method-description\":\"Redeem your loan order.\",\"api-rate-limit-weight\":15}" @@ -25724,8 +26643,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis API endpoint provides pagination query for the redeem orders.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Credit\",\"sdk-method-name\":\"getRedeemOrders\",\"sdk-method-description\":\"This API endpoint provides pagination query for the redeem orders.\",\"api-rate-limit-weight\":10}" @@ -25952,8 +26878,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRequest Configure and Risk limit info of the margin via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"RiskLimit\",\"sdk-method-name\":\"getMarginRiskLimit\",\"sdk-method-description\":\"Request Configure and Risk limit info of the margin via this endpoint.\",\"api-rate-limit-weight\":20}" @@ -25980,6 +26913,7 @@ "method": "get", "path": "/api/v1/contracts/{symbol}", "parameters": { + "query": [], "path": [ { "id": "symbol#0", @@ -25987,10 +26921,10 @@ "required": true, "description": "Path Parameter. Symbol of the contract", "example": "XBTUSDTM", - "type": "string" + "type": "string", + "enable": true } ], - "query": [], "cookie": [], "header": [] }, @@ -26435,7 +27369,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -26443,13 +27378,18 @@ "name": "Success", "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"symbol\": \"XBTUSDTM\",\r\n \"rootSymbol\": \"USDT\",\r\n \"type\": \"FFWCSX\",\r\n \"firstOpenDate\": 1585555200000,\r\n \"expireDate\": null,\r\n \"settleDate\": null,\r\n \"baseCurrency\": \"XBT\",\r\n \"quoteCurrency\": \"USDT\",\r\n \"settleCurrency\": \"USDT\",\r\n \"maxOrderQty\": 1000000,\r\n \"maxPrice\": 1000000.0,\r\n \"lotSize\": 1,\r\n \"tickSize\": 0.1,\r\n \"indexPriceTickSize\": 0.01,\r\n \"multiplier\": 0.001,\r\n \"initialMargin\": 0.008,\r\n \"maintainMargin\": 0.004,\r\n \"maxRiskLimit\": 100000,\r\n \"minRiskLimit\": 100000,\r\n \"riskStep\": 50000,\r\n \"makerFeeRate\": 2.0E-4,\r\n \"takerFeeRate\": 6.0E-4,\r\n \"takerFixFee\": 0.0,\r\n \"makerFixFee\": 0.0,\r\n \"settlementFee\": null,\r\n \"isDeleverage\": true,\r\n \"isQuanto\": true,\r\n \"isInverse\": false,\r\n \"markMethod\": \"FairPrice\",\r\n \"fairMethod\": \"FundingRate\",\r\n \"fundingBaseSymbol\": \".XBTINT8H\",\r\n \"fundingQuoteSymbol\": \".USDTINT8H\",\r\n \"fundingRateSymbol\": \".XBTUSDTMFPI8H\",\r\n \"indexSymbol\": \".KXBTUSDT\",\r\n \"settlementSymbol\": \"\",\r\n \"status\": \"Open\",\r\n \"fundingFeeRate\": 5.2E-5,\r\n \"predictedFundingFeeRate\": 8.3E-5,\r\n \"fundingRateGranularity\": 28800000,\r\n \"openInterest\": \"6748176\",\r\n \"turnoverOf24h\": 1.0346431983265533E9,\r\n \"volumeOf24h\": 12069.225,\r\n \"markPrice\": 86378.69,\r\n \"indexPrice\": 86382.64,\r\n \"lastTradePrice\": 86364,\r\n \"nextFundingRateTime\": 17752926,\r\n \"maxLeverage\": 125,\r\n \"sourceExchanges\": [\r\n \"okex\",\r\n \"binance\",\r\n \"kucoin\",\r\n \"bybit\",\r\n \"bitmart\",\r\n \"gateio\"\r\n ],\r\n \"premiumsSymbol1M\": \".XBTUSDTMPI\",\r\n \"premiumsSymbol8H\": \".XBTUSDTMPI8H\",\r\n \"fundingBaseSymbol1M\": \".XBTINT\",\r\n \"fundingQuoteSymbol1M\": \".USDTINT\",\r\n \"lowPrice\": 82205.2,\r\n \"highPrice\": 89299.9,\r\n \"priceChgPct\": -0.028,\r\n \"priceChg\": -2495.9,\r\n \"k\": 490.0,\r\n \"m\": 300.0,\r\n \"f\": 1.3,\r\n \"mmrLimit\": 0.3,\r\n \"mmrLevConstant\": 125.0,\r\n \"supportCross\": true,\r\n \"buyLimit\": 90700.7115,\r\n \"sellLimit\": 82062.5485\r\n }\r\n}", "responseId": 10385, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nGet information of specified contracts that can be traded. This API will return a list of tradable contracts, including some key parameters of the contract such as the symbol name, tick size, mark price, etc.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getSymbol\",\"sdk-method-description\":\"Get information of specified contracts that can be traded. This API will return a list of tradable contracts, including some key parameters of the contract such as the symbol name, tick size, mark price, etc.\",\"api-rate-limit-weight\":3}" @@ -26462,8 +27402,8 @@ "method": "get", "path": "/api/v1/contracts/active", "parameters": { - "path": [], "query": [], + "path": [], "cookie": [], "header": [] }, @@ -26858,15 +27798,10 @@ "takerFeeRate", "takerFixFee", "makerFixFee", - "settlementFee", "isDeleverage", "isQuanto", "isInverse", "markMethod", - "fairMethod", - "fundingBaseSymbol", - "fundingQuoteSymbol", - "fundingRateSymbol", "indexSymbol", "settlementSymbol", "status", @@ -26910,7 +27845,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -26918,13 +27854,18 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"symbol\": \"XBTUSDTM\",\n \"rootSymbol\": \"USDT\",\n \"type\": \"FFWCSX\",\n \"firstOpenDate\": 1585555200000,\n \"expireDate\": null,\n \"settleDate\": null,\n \"baseCurrency\": \"XBT\",\n \"quoteCurrency\": \"USDT\",\n \"settleCurrency\": \"USDT\",\n \"maxOrderQty\": 1000000,\n \"maxPrice\": 1000000,\n \"lotSize\": 1,\n \"tickSize\": 0.1,\n \"indexPriceTickSize\": 0.01,\n \"multiplier\": 0.001,\n \"initialMargin\": 0.008,\n \"maintainMargin\": 0.004,\n \"maxRiskLimit\": 100000,\n \"minRiskLimit\": 100000,\n \"riskStep\": 50000,\n \"makerFeeRate\": 0.0002,\n \"takerFeeRate\": 0.0006,\n \"takerFixFee\": 0,\n \"makerFixFee\": 0,\n \"settlementFee\": null,\n \"isDeleverage\": true,\n \"isQuanto\": true,\n \"isInverse\": false,\n \"markMethod\": \"FairPrice\",\n \"fairMethod\": \"FundingRate\",\n \"fundingBaseSymbol\": \".XBTINT8H\",\n \"fundingQuoteSymbol\": \".USDTINT8H\",\n \"fundingRateSymbol\": \".XBTUSDTMFPI8H\",\n \"indexSymbol\": \".KXBTUSDT\",\n \"settlementSymbol\": \"\",\n \"status\": \"Open\",\n \"fundingFeeRate\": 0.000052,\n \"predictedFundingFeeRate\": 0.000083,\n \"fundingRateGranularity\": 28800000,\n \"openInterest\": \"6748176\",\n \"turnoverOf24h\": 1034643198.3265533,\n \"volumeOf24h\": 12069.225,\n \"markPrice\": 86378.69,\n \"indexPrice\": 86382.64,\n \"lastTradePrice\": 86364,\n \"nextFundingRateTime\": 17752926,\n \"maxLeverage\": 125,\n \"sourceExchanges\": [\n \"okex\",\n \"binance\",\n \"kucoin\",\n \"bybit\",\n \"bitmart\",\n \"gateio\"\n ],\n \"premiumsSymbol1M\": \".XBTUSDTMPI\",\n \"premiumsSymbol8H\": \".XBTUSDTMPI8H\",\n \"fundingBaseSymbol1M\": \".XBTINT\",\n \"fundingQuoteSymbol1M\": \".USDTINT\",\n \"lowPrice\": 82205.2,\n \"highPrice\": 89299.9,\n \"priceChgPct\": -0.028,\n \"priceChg\": -2495.9,\n \"k\": 490,\n \"m\": 300,\n \"f\": 1.3,\n \"mmrLimit\": 0.3,\n \"mmrLevConstant\": 125,\n \"supportCross\": true,\n \"buyLimit\": 90700.7115,\n \"sellLimit\": 82062.5485\n }\n ]\n}", "responseId": 10384, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "examples": [], + "oasExtensions": "" }, "description": ":::info[Description]\nGet detailed information of all contracts that can be traded. This API will return a list of tradable contracts, including some key parameters of the contract such as the symbol name, tick size, mark price, etc.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"GetAllSymbols\",\"sdk-method-description\":\"Get detailed information of all contracts that can be traded. This API will return a list of tradable contracts, including some key parameters of the contract such as the symbol name, tick size, mark price, etc.\",\"api-rate-limit-weight\":3}" @@ -27074,7 +28015,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint returns \"last traded price/size\", \"best bid/ask price/size\" etc. of a single symbol.\nThese messages can also be obtained through Websocket.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getTicker\",\"sdk-method-description\":\"This endpoint returns \\\"last traded price/size\\\", \\\"best bid/ask price/size\\\" etc. of a single symbol. These messages can also be obtained through Websocket.\",\"api-rate-limit-weight\":2}" @@ -27210,7 +28152,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint returns \"last traded price/size\", \"best bid/ask price/size\" etc. of all symbol.\nThese messages can also be obtained through Websocket.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getAllTickers\",\"sdk-method-description\":\"This endpoint returns \\\"last traded price/size\\\", \\\"best bid/ask price/size\\\" etc. of a single symbol. These messages can also be obtained through Websocket.\",\"api-rate-limit-weight\":5}" @@ -27320,7 +28263,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nQuery for Full orderbook depth data (aggregated by price)\n\nIt is generally used by professional traders because it uses more server resources and traffic, and we have strict access rate limit controls.\n\nTo maintain an up-to-date Order Book, please use Websocket incremental feed after retrieving the OrderBook.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getFullOrderBook\",\"sdk-method-description\":\"Query for Full orderbook depth data (aggregated by price). It is generally used by professional traders because it uses more server resources and traffic, and we have strict access rate limit control. To maintain an up-to-date Order Book, please use Websocket incremental feed after retrieving the OrderBook.\",\"api-rate-limit-weight\":3}" @@ -27457,7 +28401,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nQuery for part orderbook depth data (aggregated by price).\n\nIt is recommended that you submit requests via this endpoint as the system response will be faster and consume less traffic.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getPartOrderBook\",\"sdk-method-description\":\"Query for part orderbook depth data. (aggregated by price). It is recommended that you request via this endpoint, as the system response will be faster and consume less traffic.\",\"api-rate-limit-weight\":5}" @@ -27591,7 +28536,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nRequest the trade history of the specified symbol via this endpoint. The returned quantity is the last 100 transaction records.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getTradeHistory\",\"sdk-method-description\":\"Request the trade history of the specified symbol via this endpoint. The returned quantity is the last 100 transaction records.\",\"api-rate-limit-weight\":5}" @@ -27781,7 +28727,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nGet the symbol’s candlestick chart. Data are returned in grouped buckets based on requested type.\nFor each query, the system will return at most 500 pieces of data. To obtain more data, please page the data by time.\n:::\n\n:::tip[Tips]\nCandlestick chart data may be incomplete. No data is published for intervals where there are no ticks.\n\nIf the specified start/end time and the time granularity exceed the maximum size allowed for a single request, the system will only return 500 pieces of data for your request. If you want to get fine-grained data in a larger time range, you will need to specify the time ranges and make multiple requests for multiple times.\n\nIf you’ve specified only the start time in your request, the system will return 500 pieces of data from the specified start time to the current time of the system; if only the end time is specified, the system will return 500 pieces of data closest to the end time; if neither the start time nor the end time is specified, the system will return the 500 pieces of data closest to the current time of the system.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getKlines\",\"sdk-method-description\":\"Get the symbol’s candlestick chart. Data are returned in grouped buckets based on requested type. For each query, the system will return at most 500 pieces of data. To obtain more data, please page the data by time.\",\"api-rate-limit-weight\":3}" @@ -27876,7 +28823,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nGet the current mark price (Update snapshots once per second, real-time query).\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getMarkPrice\",\"sdk-method-description\":\"Get the current mark price (Update snapshots once per second, real-time query).\",\"api-rate-limit-weight\":3}" @@ -28090,7 +29038,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nGet Spot Index price (Update snapshots once per second, and there is a 5s cache when querying).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getSpotIndexPrice\",\"sdk-method-description\":\"Get Spot Index Price (Update snapshots once per second, and there is a 5s cache when querying).\",\"api-rate-limit-weight\":2}" @@ -28285,7 +29234,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nGet interest rate Index (real-time query).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getInterestRateIndex\",\"sdk-method-description\":\"Get interest rate Index (real-time query).\",\"api-rate-limit-weight\":5}" @@ -28478,7 +29428,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nSubmit request to get premium index (Update snapshots once per second, real-time query).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getPremiumIndex\",\"sdk-method-description\":\"Submit request to get premium index (Update snapshots once per second, real-time query).\",\"api-rate-limit-weight\":3}" @@ -28542,7 +29493,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nGet the statistics of the platform futures trading volume in the last 24 hours.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"get24hrStats\",\"sdk-method-description\":\"Get the statistics of the platform futures trading volume in the last 24 hours.\",\"api-rate-limit-weight\":3}" @@ -28599,7 +29551,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nGet the API server time. This is the Unix timestamp.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getServerTime\",\"sdk-method-description\":\"Get the API server time. This is the Unix timestamp.\",\"api-rate-limit-weight\":2}" @@ -28689,7 +29642,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Discription]\nGet the service status.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getServiceStatus\",\"sdk-method-description\":\"Get the service status.\",\"api-rate-limit-weight\":4}" @@ -29019,8 +29973,15 @@ "leverage" ] }, - "example": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace order in the futures trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nThe maximum limit orders for a single contract are 100 per account, and the maximum stop orders for a single contract are 200 per account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrder\",\"sdk-method-description\":\"Place order in the futures trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":2}" @@ -29344,8 +30305,15 @@ "leverage" ] }, - "example": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nOrder test endpoint, the request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderTest\",\"sdk-method-description\":\"Place order to the futures trading system just for validation\",\"api-rate-limit-weight\":2}" @@ -29687,8 +30655,15 @@ ] } }, - "example": "[\n {\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n },\n {\n \"clientOid\": \"5c52e11203aa677f33e493fc\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n }\n]", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "[\n {\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n },\n {\n \"clientOid\": \"5c52e11203aa677f33e493fc\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n }\n]", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace multiple order to the futures trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\nYou can place up to 20 orders at one time, including limit orders, market orders, and stop orders\n\nPlease be noted that the system would hold the fees from the orders entered the orderbook in advance.\n\nDo NOT include extra spaces in JSON strings.\n\nPlace Order Limit\nThe maximum limit orders for a single contract is 100 per account, and the maximum stop orders for a single contract is 50 per account.\n:::\n\n:::tip[Tips]\n- The maximum limit orders for a single contract is 100 per account, and the maximum stop orders for a single contract is 50 per account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchAddOrders\",\"sdk-method-description\":\"Place multiple order to the futures trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified. You can place up to 20 orders at one time, including limit orders, market orders, and stop orders Please be noted that the system would hold the fees from the orders entered the orderbook in advance.\",\"api-rate-limit-weight\":20}" @@ -29996,8 +30971,15 @@ "leverage" ] }, - "example": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.2\",\n \"size\": 1,\n \"timeInForce\": \"GTC\",\n \"triggerStopUpPrice\": \"0.3\",\n \"triggerStopDownPrice\": \"0.1\",\n \"stopPriceType\": \"TP\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.2\",\n \"size\": 1,\n \"timeInForce\": \"GTC\",\n \"triggerStopUpPrice\": \"0.3\",\n \"triggerStopDownPrice\": \"0.1\",\n \"stopPriceType\": \"TP\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace take profit and stop loss order supports both take-profit and stop-loss functions, and other functions are exactly the same as the place order interface.\n\nYou can place two types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n\nPlease be noted that the system would hold the fees from the orders entered the orderbook in advance. \n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addTPSLOrder\",\"sdk-method-description\":\"Place take profit and stop loss order supports both take-profit and stop-loss functions, and other functions are exactly the same as the place order interface.\",\"api-rate-limit-weight\":2}" @@ -30077,8 +31059,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nCancel an order (including a stop order).\n\nYou will receive success message once the system has received the cancellation request. The cancellation request will be processed by matching engine in sequence. To know if the request has been processed, you may check the order status or update message from the websocket pushes.\n\nThe `orderId` is the server-assigned order id, not the specified clientOid.\n\nIf the order can not be canceled (already filled or previously canceled, etc), then an error response will indicate the reason in the message field.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the Futures Trading permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight:1\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderById\",\"sdk-method-description\":\"Cancel order by system generated orderId.\",\"api-rate-limit-weight\":1}" @@ -30164,8 +31153,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nCancel an order (including a stop order).\n\nYou will receive success message once the system has received the cancellation request. The cancellation request will be processed by matching engine in sequence. To know if the request has been processed, you may check the order status or update message from the pushes.\n\nResponse the ID created by the client (clientOid).\n\nIf the order can not be canceled (already filled or previously canceled, etc), then an error response will indicate the reason in the message field.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the Futures Trading permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByClientOid\",\"sdk-method-description\":\"Cancel order by client defined orderId.\",\"api-rate-limit-weight\":1}" @@ -30279,8 +31275,15 @@ "clientOidsList" ] }, - "example": "{\n \"orderIdsList\":\n [\n \"250445104152670209\",\n \"250445181751463936\"\n ]\n}\n\n\n//{\n// \"clientOidsList\":\n// [\n// {\n// \"symbol\": \"XRPUSDTM\",\n// \"clientOid\": \"5c52e11203aa1677f133e493fb\"\n// },\n// {\n// \"symbol\": \"ETHUSDTM\",\n// \"clientOid\": \"5c52214e112\"\n// }\n// ]\n//}\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"orderIdsList\":\n [\n \"250445104152670209\",\n \"250445181751463936\"\n ]\n}\n\n\n//{\n// \"clientOidsList\":\n// [\n// {\n// \"symbol\": \"XRPUSDTM\",\n// \"clientOid\": \"5c52e11203aa1677f133e493fb\"\n// },\n// {\n// \"symbol\": \"ETHUSDTM\",\n// \"clientOid\": \"5c52214e112\"\n// }\n// ]\n//}\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nUsing this endpoint, orders can be canceled in batches, If there are both normal orders and conditional orders with the same clientOid (it is not recommended to use the same clientOrderId), when cancelling orders in batches by clientOid, normal orders will be canceled and conditional orders will be retained.\n\nSupports batch cancellation of orders by orderId or clientOid. When orderIdsList and clientOidsList are used at the same time, orderIdsList shall prevail. A maximum of 10 orders can be canceled at a time.\n\nWhen using orderId to cancel order, the response will return the orderId.\nWhen using clientOid to cancel order, the response will return the clientOid.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchCancelOrders\",\"sdk-method-description\":\"Cancel a bach of orders by client defined orderId or system generated orderId\",\"api-rate-limit-weight\":20}" @@ -30361,8 +31364,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nUsing this endpoint, all open orders (excluding stop orders) can be canceled in batches.\n\nThe response is a list of orderIDs of the canceled orders.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllOrdersV3\",\"sdk-method-description\":\"Cancel all open orders (excluding stop orders). The response is a list of orderIDs of the canceled orders.\",\"api-rate-limit-weight\":10}" @@ -30443,8 +31453,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"orderIdsList\":\n [\n \"80465574458560512\",\n \"80465575289094144\"\n ],\n \"clientOidsList\":\n [\n {\n \"symbol\": \"XBTUSDTM\",\n \"clientOid\": \"clientOid123\"\n },\n {\n \"symbol\": \"ETHUSDTM\",\n \"clientOid\": \"clientOid321\"\n }\n ]\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"orderIdsList\":\n [\n \"80465574458560512\",\n \"80465575289094144\"\n ],\n \"clientOidsList\":\n [\n {\n \"symbol\": \"XBTUSDTM\",\n \"clientOid\": \"clientOid123\"\n },\n {\n \"symbol\": \"ETHUSDTM\",\n \"clientOid\": \"clientOid321\"\n }\n ]\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nUsing this endpoint, all untriggered stop orders can be canceled in batches.\n\nSupports batch cancellation of untriggered stop orders by symbol. Cancel all all untriggered stop orders for a specific contract symbol only , If not specified, all the all untriggered stop orders will be canceled.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllStopOrders\",\"sdk-method-description\":\"Cancel all untriggered stop orders. The response is a list of orderIDs of the canceled stop orders. To cancel triggered stop orders, please use 'Cancel Multiple Futures Limit orders'.\",\"api-rate-limit-weight\":15}" @@ -30589,23 +31606,40 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", "description": "Trigger price type of stop orders", "enum": [ - "", "TP", "MP", - "IP" + "IP", + "" ], "x-api-enum": [ - { - "value": "", - "name": "NULL", - "description": "" - }, { "value": "TP", "name": "trade price", @@ -30620,6 +31654,11 @@ "value": "IP", "name": "index price", "description": "IP for index price, The index price can be obtained through relevant OPEN API for index services" + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" } ] }, @@ -30812,7 +31851,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -30820,7 +31860,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"id\": \"236655147005071361\",\n \"symbol\": \"XBTUSDTM\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"value\": \"0.0001\",\n \"dealValue\": \"0\",\n \"dealSize\": 0,\n \"stp\": \"\",\n \"stop\": \"\",\n \"stopPriceType\": \"\",\n \"stopTriggered\": false,\n \"stopPrice\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"leverage\": \"3\",\n \"forceHold\": false,\n \"closeOrder\": false,\n \"visibleSize\": 0,\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": null,\n \"tags\": \"\",\n \"isActive\": true,\n \"cancelExist\": false,\n \"createdAt\": 1729236185949,\n \"updatedAt\": 1729236185949,\n \"endAt\": null,\n \"orderTime\": 1729236185885647952,\n \"settleCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"avgDealPrice\": \"0\",\n \"filledSize\": 0,\n \"filledValue\": \"0\",\n \"status\": \"open\",\n \"reduceOnly\": false\n }\n}", "responseId": 10409, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -30830,8 +31873,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet a single order by order id (including a stop order).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByOrderId\",\"sdk-method-description\":\"Get a single order by order id (including a stop order).\",\"api-rate-limit-weight\":5}" @@ -30976,23 +32026,40 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", "description": "Trigger price type of stop orders", "enum": [ - "", "TP", "MP", - "IP" + "IP", + "" ], "x-api-enum": [ - { - "value": "", - "name": "NULL", - "description": "None" - }, { "value": "TP", "name": "trade price", @@ -31007,6 +32074,11 @@ "value": "IP", "name": "index price", "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" } ] }, @@ -31200,7 +32272,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -31208,7 +32281,10 @@ "name": "Success", "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"id\": \"250444645610336256\",\r\n \"symbol\": \"XRPUSDTM\",\r\n \"type\": \"limit\",\r\n \"side\": \"buy\",\r\n \"price\": \"0.1\",\r\n \"size\": 1,\r\n \"value\": \"1\",\r\n \"dealValue\": \"0\",\r\n \"dealSize\": 0,\r\n \"stp\": \"\",\r\n \"stop\": \"\",\r\n \"stopPriceType\": \"\",\r\n \"stopTriggered\": false,\r\n \"stopPrice\": null,\r\n \"timeInForce\": \"GTC\",\r\n \"postOnly\": false,\r\n \"hidden\": false,\r\n \"iceberg\": false,\r\n \"leverage\": \"3\",\r\n \"forceHold\": false,\r\n \"closeOrder\": false,\r\n \"visibleSize\": 0,\r\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\r\n \"remark\": null,\r\n \"tags\": \"\",\r\n \"isActive\": true,\r\n \"cancelExist\": false,\r\n \"createdAt\": 1732523858568,\r\n \"updatedAt\": 1732523858568,\r\n \"endAt\": null,\r\n \"orderTime\": 1732523858550892322,\r\n \"settleCurrency\": \"USDT\",\r\n \"marginMode\": \"ISOLATED\",\r\n \"avgDealPrice\": \"0\",\r\n \"filledSize\": 0,\r\n \"filledValue\": \"0\",\r\n \"status\": \"open\",\r\n \"reduceOnly\": false\r\n }\r\n}", "responseId": 10576, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -31218,8 +32294,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet a single order by client order ID (including a stop order).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByClientOid\",\"sdk-method-description\":\"Get a single order by client order ID (including a stop order).\",\"api-rate-limit-weight\":5}" @@ -31477,11 +32560,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -31651,7 +32784,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -31659,7 +32793,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 50,\n \"totalNum\": 1,\n \"totalPage\": 1,\n \"items\": [\n {\n \"id\": \"230181737576050688\",\n \"symbol\": \"PEOPLEUSDTM\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"0.05\",\n \"size\": 10,\n \"value\": \"5\",\n \"dealValue\": \"0\",\n \"dealSize\": 0,\n \"stp\": \"\",\n \"stop\": \"\",\n \"stopPriceType\": \"\",\n \"stopTriggered\": false,\n \"stopPrice\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"leverage\": \"1\",\n \"forceHold\": false,\n \"closeOrder\": false,\n \"visibleSize\": 0,\n \"clientOid\": \"5a80bd847f1811ef8a7faa665a37b3d7\",\n \"remark\": null,\n \"tags\": \"\",\n \"isActive\": true,\n \"cancelExist\": false,\n \"createdAt\": 1727692804813,\n \"updatedAt\": 1727692804813,\n \"endAt\": null,\n \"orderTime\": 1727692804808418000,\n \"settleCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"avgDealPrice\": \"0\",\n \"filledSize\": 0,\n \"filledValue\": \"0\",\n \"status\": \"open\",\n \"reduceOnly\": false\n }\n ]\n }\n}", "responseId": 10408, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -31669,8 +32806,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nList your current orders.\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24 * 7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\n**POLLING**\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the General permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight:2", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"GetOrderList\",\"sdk-method-description\":\"List your current orders.\",\"api-rate-limit-weight\":2}" @@ -31757,11 +32901,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders\n" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -31922,7 +33116,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -31930,7 +33125,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"id\": \"236387137732231168\",\n \"symbol\": \"XRPUSDTM\",\n \"type\": \"market\",\n \"side\": \"buy\",\n \"price\": \"0\",\n \"size\": 1,\n \"value\": \"5.51\",\n \"dealValue\": \"5.511\",\n \"dealSize\": 1,\n \"stp\": \"\",\n \"stop\": \"\",\n \"stopPriceType\": \"\",\n \"stopTriggered\": false,\n \"stopPrice\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"leverage\": \"10.0\",\n \"forceHold\": false,\n \"closeOrder\": false,\n \"visibleSize\": 0,\n \"clientOid\": \"16698fe6-2746-4aeb-a7fa-61f633ab6090\",\n \"remark\": null,\n \"tags\": \"\",\n \"isActive\": false,\n \"cancelExist\": false,\n \"createdAt\": 1729172287496,\n \"updatedAt\": 1729172287568,\n \"endAt\": 1729172287568,\n \"orderTime\": 1729172287496950800,\n \"settleCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"avgDealPrice\": \"0.5511\",\n \"filledSize\": 1,\n \"filledValue\": \"5.511\",\n \"status\": \"done\",\n \"reduceOnly\": false\n },\n {\n \"id\": \"236317213710184449\",\n \"symbol\": \"XBTUSDTM\",\n \"type\": \"market\",\n \"side\": \"buy\",\n \"price\": \"0\",\n \"size\": 1,\n \"value\": \"67.4309\",\n \"dealValue\": \"67.4309\",\n \"dealSize\": 1,\n \"stp\": \"\",\n \"stop\": \"\",\n \"stopPriceType\": \"\",\n \"stopTriggered\": false,\n \"stopPrice\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"leverage\": \"3\",\n \"forceHold\": false,\n \"closeOrder\": false,\n \"visibleSize\": 0,\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": null,\n \"tags\": \"\",\n \"isActive\": false,\n \"cancelExist\": false,\n \"createdAt\": 1729155616310,\n \"updatedAt\": 1729155616324,\n \"endAt\": 1729155616324,\n \"orderTime\": 1729155616310180400,\n \"settleCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"avgDealPrice\": \"67430.9\",\n \"filledSize\": 1,\n \"filledValue\": \"67.4309\",\n \"status\": \"done\",\n \"reduceOnly\": false\n },\n {\n \"id\": \"236317094436728832\",\n \"symbol\": \"XBTUSDTM\",\n \"type\": \"market\",\n \"side\": \"buy\",\n \"price\": \"0\",\n \"size\": 1,\n \"value\": \"67.445\",\n \"dealValue\": \"67.445\",\n \"dealSize\": 1,\n \"stp\": \"\",\n \"stop\": \"\",\n \"stopPriceType\": \"\",\n \"stopTriggered\": false,\n \"stopPrice\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"leverage\": \"3\",\n \"forceHold\": false,\n \"closeOrder\": false,\n \"visibleSize\": 0,\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": null,\n \"tags\": \"\",\n \"isActive\": false,\n \"cancelExist\": false,\n \"createdAt\": 1729155587873,\n \"updatedAt\": 1729155587946,\n \"endAt\": 1729155587946,\n \"orderTime\": 1729155587873332000,\n \"settleCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"avgDealPrice\": \"67445.0\",\n \"filledSize\": 1,\n \"filledValue\": \"67.445\",\n \"status\": \"done\",\n \"reduceOnly\": false\n }\n ]\n}", "responseId": 10410, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -31940,8 +33138,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet a list of recent 1000 closed orders in the last 24 hours.\n\nIf you need to get your recent traded order history with low latency, you may query this endpoint.\n\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24*7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\n**POLLING**\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the General permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight:2\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"GetRecentClosedOrders\",\"sdk-method-description\":\"Get a list of recent 1000 closed orders in the last 24 hours. If you need to get your recent traded order history with low latency, you may query this endpoint.\",\"api-rate-limit-weight\":5}" @@ -32147,11 +33352,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -32321,7 +33576,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -32329,7 +33585,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 50,\n \"totalNum\": 1,\n \"totalPage\": 1,\n \"items\": [\n {\n \"id\": \"230181737576050688\",\n \"symbol\": \"PEOPLEUSDTM\",\n \"type\": \"limit\",\n \"side\": \"buy\",\n \"price\": \"0.05\",\n \"size\": 10,\n \"value\": \"5\",\n \"dealValue\": \"0\",\n \"dealSize\": 0,\n \"stp\": \"\",\n \"stop\": \"\",\n \"stopPriceType\": \"\",\n \"stopTriggered\": false,\n \"stopPrice\": null,\n \"timeInForce\": \"GTC\",\n \"postOnly\": false,\n \"hidden\": false,\n \"iceberg\": false,\n \"leverage\": \"1\",\n \"forceHold\": false,\n \"closeOrder\": false,\n \"visibleSize\": 0,\n \"clientOid\": \"5a80bd847f1811ef8a7faa665a37b3d7\",\n \"remark\": null,\n \"tags\": \"\",\n \"isActive\": true,\n \"cancelExist\": false,\n \"createdAt\": 1727692804813,\n \"updatedAt\": 1727692804813,\n \"endAt\": null,\n \"orderTime\": 1727692804808418000,\n \"settleCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"avgDealPrice\": \"0\",\n \"filledSize\": 0,\n \"filledValue\": \"0\",\n \"status\": \"open\",\n \"reduceOnly\": false\n }\n ]\n }\n}", "responseId": 10411, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -32339,8 +33598,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet the un-triggered stop orders list. Stop orders that have been triggered can be queried through the general order interface\n:::\n\nAny limit order on the exchange order book is in active status. Orders removed from the order book will be marked with done status. After an order becomes done, there may be a few milliseconds latency before it’s fully settled.\n\nYou can check the orders in any status. If the status parameter is not specified, orders of done status will be returned by default.\n\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 24*7 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 24 hours, and vice versa.\n\nPOLLING\nFor high-volume trading, it is highly recommended that you maintain your own list of open orders and use one of the streaming market data feeds to keep it updated. You should poll the open orders endpoint to obtain the current state of any open order.\n\nIf you need to get your recent trade history with low latency, you may query the endpoint Get List of Orders Completed in 24h.", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"GetStopOrderList\",\"sdk-method-description\":\"Get the un-triggered stop orders list. Stop orders that have been triggered can be queried through the general order interface\",\"api-rate-limit-weight\":6}" @@ -32437,8 +33703,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nYou can query this endpoint to get the total number and value of all your active orders.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"GetOpenOrderValue\",\"sdk-method-description\":\"You can query this endpoint to get the total number and value of all your active orders.\",\"api-rate-limit-weight\":10}" @@ -32451,7 +33724,6 @@ "method": "get", "path": "/api/v1/recentFills", "parameters": { - "path": [], "query": [ { "id": "4wXlXiQszi", @@ -32459,9 +33731,11 @@ "required": false, "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](apidog://link/endpoint/3470220) ", "example": "XBTUSDTM", - "type": "string" + "type": "string", + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -32560,7 +33834,29 @@ }, "stop": { "type": "string", - "description": "A mark to the stop order type\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "feeRate": { "type": "string", @@ -32743,7 +34039,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -32751,7 +34048,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"symbol\": \"XBTUSDTM\",\n \"tradeId\": \"1784277229880\",\n \"orderId\": \"236317213710184449\",\n \"side\": \"buy\",\n \"liquidity\": \"taker\",\n \"forceTaker\": false,\n \"price\": \"67430.9\",\n \"size\": 1,\n \"value\": \"67.4309\",\n \"openFeePay\": \"0.04045854\",\n \"closeFeePay\": \"0\",\n \"stop\": \"\",\n \"feeRate\": \"0.00060\",\n \"fixFee\": \"0\",\n \"feeCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"fee\": \"0.04045854\",\n \"settleCurrency\": \"USDT\",\n \"orderType\": \"market\",\n \"displayType\": \"market\",\n \"tradeType\": \"trade\",\n \"subTradeType\": null,\n \"tradeTime\": 1729155616320000000,\n \"createdAt\": 1729155616493\n },\n {\n \"symbol\": \"XBTUSDTM\",\n \"tradeId\": \"1784277132002\",\n \"orderId\": \"236317094436728832\",\n \"side\": \"buy\",\n \"liquidity\": \"taker\",\n \"forceTaker\": false,\n \"price\": \"67445\",\n \"size\": 1,\n \"value\": \"67.445\",\n \"openFeePay\": \"0\",\n \"closeFeePay\": \"0.040467\",\n \"stop\": \"\",\n \"feeRate\": \"0.00060\",\n \"fixFee\": \"0\",\n \"feeCurrency\": \"USDT\",\n \"marginMode\": \"ISOLATED\",\n \"fee\": \"0.040467\",\n \"settleCurrency\": \"USDT\",\n \"orderType\": \"market\",\n \"displayType\": \"market\",\n \"tradeType\": \"trade\",\n \"subTradeType\": null,\n \"tradeTime\": 1729155587944000000,\n \"createdAt\": 1729155588104\n }\n ]\n}", "responseId": 10413, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -32761,8 +34061,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet a list of recent 1000 fills in the last 24 hours. If you need to get your recently traded order history with low latency, you may query this endpoint.\n\nIf you need to get your recently traded order history with low latency, you may query this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getRecentTradeHistory\",\"sdk-method-description\":\"Get a list of recent 1000 fills in the last 24 hours. If you need to get your recently traded order history with low latency, you may query this endpoint.\"}" @@ -32775,7 +34082,6 @@ "method": "get", "path": "/api/v1/fills", "parameters": { - "path": [], "query": [ { "id": "2KbksGFfyd", @@ -32783,14 +34089,16 @@ "required": false, "description": "List fills for a specific order only (if you specify orderId, other parameters can be ignored)", "example": "236655147005071361", - "type": "string" + "type": "string", + "enable": true }, { "id": "4wXlXiQszi", "name": "symbol", "required": false, "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](apidog://link/endpoint/3470220) ", - "type": "string" + "type": "string", + "enable": true }, { "id": "uaSHeFQTjq", @@ -32816,7 +34124,8 @@ "description": "sell" } ] - } + }, + "enable": true }, { "id": "WUcubn1a2F", @@ -32854,7 +34163,8 @@ "description": "Stop Market order" } ] - } + }, + "enable": true }, { "id": "n3uTl3OSFi", @@ -32871,7 +34181,8 @@ "settlement", "adl,liquid" ] - } + }, + "enable": true }, { "id": "92p8ibIf57", @@ -32882,7 +34193,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "xa3hJqPSIi", @@ -32893,7 +34205,8 @@ "schema": { "type": "integer", "format": "int64" - } + }, + "enable": true }, { "id": "1CHlZrEtu0", @@ -32904,7 +34217,8 @@ "schema": { "type": "integer", "default": 1 - } + }, + "enable": true }, { "id": "nlqXQHDnh5", @@ -32916,9 +34230,11 @@ "type": "integer", "default": 50, "maximum": 1000 - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -33032,7 +34348,29 @@ }, "stop": { "type": "string", - "description": "A mark to the stop order type" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "feeRate": { "type": "string", @@ -33228,7 +34566,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -33236,7 +34575,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 50,\n \"totalNum\": 2,\n \"totalPage\": 1,\n \"items\": [\n {\n \"symbol\": \"XBTUSDTM\",\n \"tradeId\": \"1828954878212\",\n \"orderId\": \"284486580251463680\",\n \"side\": \"buy\",\n \"liquidity\": \"taker\",\n \"forceTaker\": false,\n \"price\": \"86275.1\",\n \"size\": 1,\n \"value\": \"86.2751\",\n \"openFeePay\": \"0.05176506\",\n \"closeFeePay\": \"0\",\n \"stop\": \"\",\n \"feeRate\": \"0.00060\",\n \"fixFee\": \"0\",\n \"feeCurrency\": \"USDT\",\n \"subTradeType\": null,\n \"marginMode\": \"CROSS\",\n \"openFeeTaxPay\": \"0\",\n \"closeFeeTaxPay\": \"0\",\n \"displayType\": \"market\",\n \"fee\": \"0.05176506\",\n \"settleCurrency\": \"USDT\",\n \"orderType\": \"market\",\n \"tradeType\": \"trade\",\n \"tradeTime\": 1740640088244000000,\n \"createdAt\": 1740640088427\n }\n ]\n }\n}", "responseId": 10412, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -33246,8 +34588,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet a list of recent fills. If you need to get your recent trade history with low latency, please query endpoint Get List of Orders Completed in 24h. The requested data is not real-time.\n:::\n\n**Data Time Range**\n\nThe system allows you to retrieve up to one week’s worth of data (starting from the last day by default). If the time period of the queried data exceeds one week (time range from start time to end time exceeding 24 * 7 hours), the system will prompt to remind you that you have exceeded the time limit. If you only specified the start time, the system will automatically calculate the end time (end time = start time + 24 hours). Conversely, if you only specified the end time, the system will calculate the start time (start time = end time - 24 hours) the same way.\n\n**Fee**\n\nOrders on KuCoin Futures platform are classified into two types, taker and maker. A taker order matches other resting orders on the exchange order book, and gets executed immediately after order entry. A maker order, on the other hand, stays on the exchange order book and awaits to be matched. Taker orders will be charged taker fees, while maker orders will receive maker rebates. Please note that market orders, iceberg orders and hidden orders are always charged taker fees.\n\nThe system will pre-freeze a predicted taker fee when you place an order. The liquidity field indicates if the fill was charged taker or maker fees.\n\nThe system will pre-freeze the predicted fees (including the maintenance margin needed for the position, entry fees and fees to close positions) if you added the position, and will not pre-freeze fees if you reduced the position. After the order is executed, if you added positions, the system will deduct entry fees from your balance; if you closed positions, the system will deduct the close fees.", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getTradeHistory\",\"sdk-method-description\":\"Get a list of recent fills. If you need to get your recent trade history with low latency, please query endpoint Get List of Orders Completed in 24h. The requested data is not real-time.\",\"api-rate-limit-weight\":5}" @@ -33353,8 +34702,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query the margin mode of the current symbol.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"getMarginMode\",\"sdk-method-description\":\"This interface can query the margin mode of the current symbol.\",\"api-rate-limit-weight\":2}" @@ -33477,13 +34833,158 @@ "marginMode" ] }, - "example": "{\n \"symbol\": \"XBTUSDTM\",\n \"marginMode\": \"ISOLATED\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"XBTUSDTM\",\n \"marginMode\": \"ISOLATED\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nModify the margin mode of the current symbol.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"switchMarginMode\",\"sdk-method-description\":\"This interface can modify the margin mode of the current symbol.\",\"api-rate-limit-weight\":2}" } }, + { + "name": "Batch Switch Margin Mode", + "api": { + "id": "3472403", + "method": "post", + "path": "/api/v2/position/batchChangeMarginMode", + "parameters": { + "query": [], + "path": [], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "12304", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "marginMode": { + "type": "object", + "properties": {}, + "description": "Target Margin Model, Symbols that failed to be modified will also be included", + "additionalProperties": { + "type": "string" + } + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Error code" + }, + "msg": { + "type": "string", + "description": "Error message" + }, + "symbol": { + "type": "string", + "description": "Symbol" + } + } + }, + "description": "Symbol which modification failed" + } + }, + "required": [ + "marginMode", + "errors" + ] + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "", + "oasExtensions": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"marginMode\": {\r\n \"ETHUSDTM\": \"ISOLATED\",\r\n \"XBTUSDTM\": \"CROSS\"\r\n },\r\n \"errors\": [\r\n {\r\n \"code\": \"50002\",\r\n \"msg\": \"exist.order.or.position\",\r\n \"symbol\": \"XBTUSDTM\"\r\n }\r\n ]\r\n }\r\n}", + "responseId": 12304, + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" + } + ], + "requestBody": { + "type": "application/json", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": { + "marginMode": { + "type": "string", + "description": "Modified margin model: ISOLATED (isolated), CROSS (cross margin).", + "enum": [ + "ISOLATED", + "CROSS" + ], + "x-api-enum": [ + { + "value": "ISOLATED", + "name": "ISOLATED", + "description": "Isolated Margin Mode" + }, + { + "value": "CROSS", + "name": "CROSS", + "description": "Cross Margin MOde" + } + ] + }, + "symbols": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](apidog://link/endpoint/3470220) " + } + }, + "required": [ + "marginMode", + "symbols" + ] + }, + "mediaType": "", + "examples": [ + { + "value": "{\n \"marginMode\": \"ISOLATED\",\n \"symbols\": [\n \"XBTUSDTM\",\n \"ETHUSDTM\"\n ]\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" + }, + "description": ":::info[Description]\nBatch modify the margin mode of the symbols.\n:::", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"batchSwitchMarginMode\",\"sdk-method-description\":\"Batch modify the margin mode of the symbols.\",\"api-rate-limit-weight\":2}" + } + }, { "name": "Get Max Open Size", "api": { @@ -33574,7 +35075,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -33582,7 +35084,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"symbol\": \"XBTUSDTM\",\n \"maxBuyOpenSize\": 0,\n \"maxSellOpenSize\": 0\n }\n}", "responseId": 10415, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -33592,8 +35097,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet Maximum Open Position Size.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"GetMaxOpenSize\",\"sdk-method-description\":\"Get Maximum Open Position Size.\",\"api-rate-limit-weight\":2}" @@ -33658,7 +35170,7 @@ }, "openingTimestamp": { "type": "integer", - "description": "Open time\n", + "description": "First opening time", "format": "int64" }, "currentTimestamp": { @@ -33798,7 +35310,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "integer", @@ -33834,7 +35346,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin\n" }, "maintMargin": { "type": "number", @@ -33905,8 +35417,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet the position details of a specified position.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"GetPositionDetails\",\"sdk-method-description\":\"Get the position details of a specified position.\",\"api-rate-limit-weight\":2}" @@ -33924,7 +35443,7 @@ "id": "4wXlXiQszi", "name": "currency", "required": false, - "description": "Currency code, Please refer to [rootSymbol](apidog://link/endpoint/221752070) , such as USDT,XBT. Query all positions when empty", + "description": "Quote currency code, Please refer to [rootSymbol](apidog://link/endpoint/221752070) , such as USDT,XBT. Query all positions when empty", "type": "string", "schema": { "type": "string", @@ -33981,7 +35500,7 @@ }, "openingTimestamp": { "type": "integer", - "description": "Open time\n", + "description": "First opening time", "format": "int64" }, "currentTimestamp": { @@ -34121,7 +35640,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "number", @@ -34157,7 +35676,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin" }, "maintMargin": { "type": "number", @@ -34211,7 +35730,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -34219,7 +35739,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": [\n {\n \"id\": \"500000000001046430\",\n \"symbol\": \"ETHUSDM\",\n \"crossMode\": true,\n \"delevPercentage\": 0.71,\n \"openingTimestamp\": 1730635780702,\n \"currentTimestamp\": 1730636040926,\n \"currentQty\": 1,\n \"currentCost\": -4.069805E-4,\n \"currentComm\": 2.441E-7,\n \"unrealisedCost\": -4.069805E-4,\n \"realisedGrossCost\": 0.0,\n \"realisedCost\": 2.441E-7,\n \"isOpen\": true,\n \"markPrice\": 2454.12,\n \"markValue\": -4.07478E-4,\n \"posCost\": -4.069805E-4,\n \"posInit\": 4.06981E-5,\n \"posMargin\": 4.07478E-5,\n \"realisedGrossPnl\": 0.0,\n \"realisedPnl\": -2.441E-7,\n \"unrealisedPnl\": -4.975E-7,\n \"unrealisedPnlPcnt\": -0.0012,\n \"unrealisedRoePcnt\": -0.0122,\n \"avgEntryPrice\": 2457.12,\n \"liquidationPrice\": 1429.96,\n \"bankruptPrice\": 1414.96,\n \"settleCurrency\": \"ETH\",\n \"isInverse\": true,\n \"marginMode\": \"CROSS\",\n \"positionSide\": \"BOTH\",\n \"leverage\": 10\n },\n {\n \"id\": \"500000000000988255\",\n \"symbol\": \"XBTUSDTM\",\n \"autoDeposit\": true,\n \"crossMode\": false,\n \"maintMarginReq\": 0.005,\n \"riskLimit\": 500000,\n \"realLeverage\": 2.97,\n \"delevPercentage\": 0.5,\n \"openingTimestamp\": 1729155616322,\n \"currentTimestamp\": 1730636040926,\n \"currentQty\": 1,\n \"currentCost\": 67.4309,\n \"currentComm\": -0.15936162,\n \"unrealisedCost\": 67.4309,\n \"realisedGrossCost\": 0.0,\n \"realisedCost\": -0.15936162,\n \"isOpen\": true,\n \"markPrice\": 68323.06,\n \"markValue\": 68.32306,\n \"posCost\": 67.4309,\n \"posCross\": 0.06225152,\n \"posCrossMargin\": 0,\n \"posInit\": 22.2769666644,\n \"posComm\": 0.0539821899,\n \"posCommCommon\": 0.0539447199,\n \"posLoss\": 0.26210915,\n \"posMargin\": 22.1310912243,\n \"posFunding\": -0.19982016,\n \"posMaint\": 0.4046228699,\n \"maintMargin\": 23.0232512243,\n \"realisedGrossPnl\": 0.0,\n \"realisedPnl\": -0.2402787,\n \"unrealisedPnl\": 0.89216,\n \"unrealisedPnlPcnt\": 0.0132,\n \"unrealisedRoePcnt\": 0.04,\n \"avgEntryPrice\": 67430.9,\n \"liquidationPrice\": 45704.44,\n \"bankruptPrice\": 45353.8,\n \"settleCurrency\": \"USDT\",\n \"isInverse\": false,\n \"maintainMargin\": 0.005,\n \"marginMode\": \"ISOLATED\",\n \"positionSide\": \"BOTH\",\n \"leverage\": 2.97\n }\n ]\n}", "responseId": 10417, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -34229,8 +35752,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet the position details of a specified position.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"GetPositionList\",\"sdk-method-description\":\"Get the position details of a specified position.\",\"api-rate-limit-weight\":2}" @@ -34506,8 +36036,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query position history information records.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"GetPositionsHistory\",\"sdk-method-description\":\"This interface can query position history information records.\",\"api-rate-limit-weight\":2}" @@ -34576,8 +36113,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query the maximum amount of margin that the current position supports withdrawal.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"GetMaxWithdrawMargin\",\"sdk-method-description\":\"This interface can query the maximum amount of margin that the current position supports withdrawal.\",\"api-rate-limit-weight\":10}" @@ -34660,8 +36204,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query the current symbol’s cross-margin leverage multiple.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"getCrossMarginLeverage\",\"sdk-method-description\":\"This interface can query the current symbol’s cross-margin leverage multiple.\",\"api-rate-limit-weight\":2}" @@ -34733,8 +36284,15 @@ "leverage" ] }, - "example": "{\n \"symbol\": \"XBTUSDTM\",\n \"leverage\" : \"10\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"XBTUSDTM\",\n \"leverage\" : \"10\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can modify the current symbol’s cross-margin leverage multiple.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"ModifyMarginLeverage\",\"sdk-method-description\":\"This interface can modify the current symbol’s cross-margin leverage multiple.\",\"api-rate-limit-weight\":2}" @@ -35002,8 +36560,15 @@ "bizNo" ] }, - "example": "{\n \"symbol\": \"string\",\n \"margin\": 0,\n \"bizNo\": \"string\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"string\",\n \"margin\": 0,\n \"bizNo\": \"string\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nAdd Isolated Margin Manually.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"AddIsolatedMargin\",\"sdk-method-description\":\"Add Isolated Margin Manually.\",\"api-rate-limit-weight\":4}" @@ -35076,13 +36641,178 @@ "withdrawAmount" ] }, - "example": "{\n \"symbol\": \"XBTUSDTM\",\n \"withdrawAmount\": \"0.0000001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"XBTUSDTM\",\n \"withdrawAmount\": \"0.0000001\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRemove Isolated Margin Manually.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"RemoveIsolatedMargin\",\"sdk-method-description\":\"Remove Isolated Margin Manually.\",\"api-rate-limit-weight\":10}" } }, + { + "name": "Get Cross Margin Risk Limit", + "api": { + "id": "3472655", + "method": "get", + "path": "/api/v2/batchGetCrossOrderLimit", + "parameters": { + "query": [ + { + "id": "4wXlXiQszi", + "name": "symbol", + "required": true, + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](apidog://link/endpoint/3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP)", + "type": "string", + "schema": { + "type": "string", + "examples": [ + "XBTUSDTM", + "XBTUSDTM,ETHUSDTM" + ] + }, + "enable": true + }, + { + "id": "uaSHeFQTjq", + "name": "totalMargin", + "required": false, + "description": "The position opening amount, in the contract's settlement currency.\nDefaults to 10,000 in margin currency for max position calculation.\nFor USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price.", + "type": "string", + "enable": true + }, + { + "id": "WUcubn1a2F", + "name": "leverage", + "required": false, + "description": "Calculates the max position size at the specified leverage.\nDefaults to the symbol’s max cross leverage.", + "type": "integer", + "schema": { + "type": "integer" + }, + "enable": true + } + ], + "path": [], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "12008", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "symbol": { + "type": "string", + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](apidog://link/endpoint/3470220)" + }, + "maxOpenSize": { + "type": "integer", + "description": "Maximum amount of open position(Unit is **lots**)\n" + }, + "maxOpenValue": { + "type": "string", + "description": "Maximum value of open position(Unit is **quoteCcy**)\n" + }, + "totalMargin": { + "type": "string", + "description": "Margin amount used for max position calculation." + }, + "price": { + "type": "string", + "description": "Price used for max position calculation. Defaults to latest transaction price" + }, + "leverage": { + "type": "string", + "description": "Leverage used for max position calculation." + }, + "mmr": { + "type": "string", + "description": "Maintenance Margin Rate" + }, + "imr": { + "type": "string", + "description": "Initial Margin Rate" + }, + "currency": { + "type": "string", + "description": "Margin Currency" + } + }, + "required": [ + "symbol", + "maxOpenSize", + "maxOpenValue", + "totalMargin", + "price", + "leverage", + "mmr", + "imr", + "currency" + ] + } + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "", + "oasExtensions": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": [\r\n {\r\n \"symbol\": \"XBTUSDTM\",\r\n \"maxOpenSize\": 12102,\r\n \"maxOpenValue\": \"1234549.2240000000\",\r\n \"totalMargin\": \"10000\",\r\n \"price\": \"102012\",\r\n \"leverage\": \"125.00\",\r\n \"mmr\": \"0.00416136\",\r\n \"imr\": \"0.008\",\r\n \"currency\": \"USDT\"\r\n },\r\n {\r\n \"symbol\": \"ETHUSDTM\",\r\n \"maxOpenSize\": 38003,\r\n \"maxOpenValue\": \"971508.6920000000\",\r\n \"totalMargin\": \"10000\",\r\n \"price\": \"2556.4\",\r\n \"leverage\": \"100.00\",\r\n \"mmr\": \"0.0054623236\",\r\n \"imr\": \"0.01\",\r\n \"currency\": \"USDT\"\r\n }\r\n ]\r\n}", + "responseId": 12008, + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" + } + ], + "requestBody": { + "type": "none", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": {} + }, + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" + }, + "description": ":::info[Description]\nBatch get cross margin risk limit. (It should be noted that the risk limit of cross marign does not have a fixed gear, but is a smooth curve)\n:::", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"getCrossMarginRiskLimit\",\"sdk-method-description\":\"Batch get cross margin risk limit.\",\"api-rate-limit-weight\":2}" + } + }, { "name": "Get Isolated Margin Risk Limit", "api": { @@ -35187,8 +36917,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can be used to obtain information about risk limit level of a specific contract (only valid for Isolated Margin).\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"getIsolatedMarginRiskLimit\",\"sdk-method-description\":\"This interface can be used to obtain information about risk limit level of a specific contract (only valid for Isolated Margin).\",\"api-rate-limit-weight\":5}" @@ -35261,8 +36998,15 @@ "level" ] }, - "example": "{\n \"symbol\" : \"XBTUSDTM\",\n \"level\" : 2\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\" : \"XBTUSDTM\",\n \"level\" : 2\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is for adjusting the risk limit level (only valid for Isolated Margin). Adjusting the level will result in the cancellation of any open orders. The response will indicate only whether the adjustment request was successfully submitted. The result of the adjustment can be obtained with information from Websocket: Position Change Events.\n\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"modifyIsolatedMarginRiskLimt\",\"sdk-method-description\":\"This interface can be used to obtain information about risk limit level of a specific contract (only valid for Isolated Margin).\",\"api-rate-limit-weight\":5}" @@ -35276,12 +37020,13 @@ "description": "", "items": [ { - "name": "Get Current Funding Rate.", + "name": "Get Current Funding Rate", "api": { "id": "3470265", "method": "get", "path": "/api/v1/funding-rate/{symbol}/current", "parameters": { + "query": [], "path": [ { "id": "symbol#0", @@ -35289,10 +37034,10 @@ "required": true, "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](apidog://link/endpoint/3470220) ", "example": "XBTUSDTM", - "type": "string" + "type": "string", + "enable": true } ], - "query": [], "cookie": [], "header": [] }, @@ -35321,7 +37066,7 @@ }, "timePoint": { "type": "integer", - "description": "The funding rate settlement time point of the previous cycle\n(milliseconds)\n", + "description": "The funding rate settlement time point of the previous cycle\n(milliseconds)\nBefore going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched.\n The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled.\n The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live.\n\n", "format": "int64" }, "value": { @@ -35339,6 +37084,31 @@ "fundingRateFloor": { "type": "number", "description": "Minimum Funding Rate" + }, + "period": { + "type": "integer", + "enum": [ + 1, + 0 + ], + "description": "Indicates whether the current funding fee is charged within this cycle", + "x-api-enum": [ + { + "value": 1, + "name": "1", + "description": "Indicates that funding will be charged in the current cycle" + }, + { + "value": 0, + "name": "0", + "description": "Indicates a cross-cycle expense record that is not charged in the current cycle." + } + ] + }, + "fundingTime": { + "type": "integer", + "description": "Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing.", + "format": "int64" } }, "required": [ @@ -35348,7 +37118,9 @@ "value", "predictedValue", "fundingRateCap", - "fundingRateFloor" + "fundingRateFloor", + "period", + "fundingTime" ] } }, @@ -35359,15 +37131,19 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ { "name": "Success", - "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"symbol\": \".XBTUSDTMFPI8H\",\r\n \"granularity\": 28800000,\r\n \"timePoint\": 1731441600000,\r\n \"value\": 6.41E-4,\r\n \"predictedValue\": 5.2E-5,\r\n \"fundingRateCap\": 0.003,\r\n \"fundingRateFloor\": -0.003\r\n }\r\n}", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"symbol\": \".XBTUSDTMFPI8H\",\r\n \"granularity\": 28800000,\r\n \"timePoint\": 1748462400000,\r\n \"value\": 6.1E-5,\r\n \"predictedValue\": 1.09E-4,\r\n \"fundingRateCap\": 0.003,\r\n \"fundingRateFloor\": -0.003,\r\n \"period\": 0,\r\n \"fundingTime\": 1748491200000\r\n }\r\n}", "responseId": 10429, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -35377,8 +37153,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet Current Funding Rate.\n\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"FundingFees\",\"sdk-method-name\":\"getCurrentFundingRate\",\"sdk-method-description\":\"Get Current Funding Rate.\",\"api-rate-limit-weight\":2}" @@ -35493,8 +37276,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nQuery the funding rate at each settlement time point within a certain time range of the corresponding contract.\n\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"FundingFees\",\"sdk-method-name\":\"getPublicFundingHistory\",\"sdk-method-description\":\"Query the funding rate at each settlement time point within a certain time range of the corresponding contract.\",\"api-rate-limit-weight\":5}" @@ -35719,8 +37509,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nSubmit request to get the funding history.\n:::\n\n:::tip[Tips]\nThe **startAt** and **endAt** range cannot exceed 3 months. An error will occur if the specified time window exceeds the range. \n\nIf only **startAt** is entered, the default **endAt** is the current time. If it exceeds 3 months, an error will be reported.\n\nIf only **endAt** is entered, the system will automatically calculate the start time as end time minus 3 months.\n\n**Note:** Because data changes frequently, using offset-based pagination instead of time-based pagination (startAt and endAt) may lead to inaccurate or duplicated data. It is recommended to paginate using startAt and endAt for more reliable results. It is recommended to paginate by startAt and endAt\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"FundingFees\",\"sdk-method-name\":\"getPrivateFundingHistory\",\"sdk-method-description\":\"Submit request to get the funding history.\",\"api-rate-limit-weight\":5}" @@ -35836,8 +37633,15 @@ "accountType" ] }, - "example": "{\n \"productId\": \"2611\",\n \"amount\": \"1\",\n \"accountType\": \"TRADE\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"productId\": \"2611\",\n \"amount\": \"1\",\n \"accountType\": \"TRADE\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint allows you to subscribe Earn products.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Earn\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"purchase\",\"sdk-method-description\":\"This endpoint allows you to subscribe Earn products.\",\"api-rate-limit-weight\":5}" @@ -35977,8 +37781,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"productId\": \"2611\",\n \"amount\": \"1\",\n \"accountType\": \"TRADE\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"productId\": \"2611\",\n \"amount\": \"1\",\n \"accountType\": \"TRADE\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint can get redemption preview information by holding ID. If the current holding is fully redeemed or in the process of being redeemed, it means that the holding does not exist.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Earn\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"getRedeemPreview\",\"sdk-method-description\":\"This endpoint allows you to subscribe Earn products.\",\"api-rate-limit-weight\":5}" @@ -36133,8 +37944,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"productId\": \"2611\",\n \"amount\": \"1\",\n \"accountType\": \"TRADE\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"productId\": \"2611\",\n \"amount\": \"1\",\n \"accountType\": \"TRADE\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint allows you to redeem Earn products by using holding ID. If the current holding is fully redeemed or in the process of being redeemed, it means that the holding does not exist.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Earn\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"redeem\",\"sdk-method-description\":\"This endpoint allows you to redeem Earn products by using holding ID. If the current holding is fully redeemed or in the process of being redeemed, it means that the holding does not exist.\",\"api-rate-limit-weight\":5}" @@ -36471,7 +38289,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nAvailable savings products can be obtained at this endpoint. If no products are available, an empty list is returned.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"getSavingsProducts\",\"sdk-method-description\":\"Available savings products can be obtained at this endpoint. If no products are available, an empty list is returned.\",\"api-rate-limit-weight\":5}" @@ -36808,7 +38627,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nAvailable limited-duration products can be obtained at this endpoint. If no products are available, an empty list is returned.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"getPromotionProducts\",\"sdk-method-description\":\"Available limited-duration products can be obtained at this endpoint. If no products are available, an empty list is returned.\"}" @@ -37145,7 +38965,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nAvailable staking products can be obtained at this endpoint. If no products are available, an empty list is returned.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"getStakingProducts\",\"sdk-method-description\":\"Available staking products can be obtained at this endpoint. If no products are available, an empty list is returned.\",\"api-rate-limit-weight\":5}" @@ -37480,7 +39301,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nAvailable KCS staking products can be obtained at this endpoint. If no products are available, an empty list is returned.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"getKcsStakingProducts\",\"sdk-method-description\":\"Available KCS staking products can be obtained at this endpoint. If no products are available, an empty list is returned.\",\"api-rate-limit-weight\":5}" @@ -37807,7 +39629,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nAvailable ETH staking products can be obtained at this endpoint. If no products are available, an empty list is returned.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"getETHStakingProducts\",\"sdk-method-description\":\"Available ETH staking products can be obtained at this endpoint. If no products are available, an empty list is returned.\",\"api-rate-limit-weight\":5}" @@ -38118,7 +39941,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nInformation on currently held assets can be obtained at this endpoint. If no assets are currently held, an empty list is returned.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Earn\",\"sdk-service\":\"Earn\",\"sdk-sub-service\":\"Earn\",\"sdk-method-name\":\"getAccountHolding\",\"sdk-method-description\":\"Information on currently held assets can be obtained at this endpoint. If no assets are currently held, an empty list is returned.\",\"api-rate-limit-weight\":5}" @@ -38229,8 +40053,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet the gradient discount rate of each currency\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"VIPLending\",\"sdk-sub-service\":\"VIPLending\",\"sdk-method-name\":\"getDiscountRateConfigs\",\"sdk-method-description\":\"Get the gradient discount rate of each currency\",\"api-rate-limit-weight\":10}" @@ -38400,11 +40231,18 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThe following information is only applicable to loans. \nGet information on off-exchange funding and loans. This endpoint is only for querying accounts that are currently involved in loans.\n:::", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"VIPLending\",\"sdk-sub-service\":\"VIPLending\",\"sdk-method-name\":\"getLoanInfo\",\"sdk-method-description\":\"The following information is only applicable to loans. Get information on off-exchange funding and loans. This endpoint is only for querying accounts that are currently involved in loans.\",\"api-rate-limit-weight\":5}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"VIPLending\",\"sdk-sub-service\":\"VIPLending\",\"sdk-method-name\":\"getLoanInfo\",\"sdk-method-description\":\"The following information is only applicable to loans. Get information on off-exchange funding and loans. This endpoint is only for querying accounts that are currently involved in loans.\",\"api-rate-limit-weight\":5}" } }, { @@ -38497,11 +40335,18 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nAccounts participating in OTC lending. This interface is only for querying accounts currently running OTC lending.\n:::", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"VIPLending\",\"sdk-sub-service\":\"VIPLending\",\"sdk-method-name\":\"getAccounts\",\"sdk-method-description\":\"Accounts participating in OTC lending. This interface is only for querying accounts currently running OTC lending.\",\"api-rate-limit-weight\":20}" + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"VIPLending\",\"sdk-sub-service\":\"VIPLending\",\"sdk-method-name\":\"getAccounts\",\"sdk-method-description\":\"Accounts participating in OTC lending. This interface is only for querying accounts currently running OTC lending.\",\"api-rate-limit-weight\":20}" } } ] @@ -38676,8 +40521,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"size\": 10,\n \"timeInForce\": \"FOK\",\n \"isIsolated\": false,\n \"isHf\": false\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nAffiliate user rebate information can be obtained at this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Affiliate\",\"sdk-sub-service\":\"Affiliate\",\"sdk-method-name\":\"getAccount\",\"sdk-method-description\":\"Affiliate user rebate information can be obtained at this endpoint.\",\"api-rate-limit-weight\":30}" @@ -38702,7 +40554,6 @@ "method": "get", "path": "/api/v1/broker/api/rebase/download", "parameters": { - "path": [], "query": [ { "id": "6iUCMmMHEI", @@ -38710,7 +40561,8 @@ "required": true, "description": "Start time, for example: 20240610", "example": "20240610", - "type": "string" + "type": "string", + "enable": true }, { "id": "5uqjEGNGxr", @@ -38718,7 +40570,8 @@ "required": true, "description": "End time, for example: 20241010 (query data with a maximum interval of 6 months)\n", "example": "20241010", - "type": "string" + "type": "string", + "enable": true }, { "id": "LzvLfsT2yl", @@ -38745,9 +40598,11 @@ "description": "futures" } ] - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -38801,8 +40656,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface supports the downloading of Broker rebate orders.\n:::\n\n### Excel Response\n\n| Param | Description | Example |\n| ------------------- | ----------------- |--------- |\n| Date | Date | 2024/9/1 |\n| BrokerUID | Broker's UID | 3243241 |\n| AffiliateUID | Affiliate's UID | 2354546 |\n| UID | User's UID | 6345466 |\n| BizLine | Business Line (Spot, Futures) | Spot |\n| Volume | Volume | 0 |\n| TotalCommission | Total Commission = BrokerCommission + UserCommission + AffiliateCommission | 0 |\n| BrokerCommission | Broker Commission | 0 |\n| UserCommission | User Commission | 0 |\n| AffiliateCommission | Affiliate Commission | 0 |\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"APIBroker\",\"sdk-method-name\":\"getRebase\",\"sdk-method-description\":\"This interface supports the downloading of Broker rebate orders.\",\"api-rate-limit-weight\":3}" @@ -38815,6 +40677,494 @@ "id": 348161, "description": "", "items": [ + { + "name": "Submit KYC", + "api": { + "id": "3472406", + "method": "post", + "path": "/api/kyc/ndBroker/proxyClient/submit", + "parameters": { + "query": [], + "path": [], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "12305", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "string" + } + }, + "required": [ + "code" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "", + "oasExtensions": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\"code\":\"200000\",\"data\":null}", + "responseId": 12305, + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" + } + ], + "requestBody": { + "type": "application/json", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": { + "clientUid": { + "type": "string", + "description": "client uid", + "examples": [ + "226383154" + ] + }, + "firstName": { + "type": "string", + "description": "first Name" + }, + "lastName": { + "type": "string", + "description": "last Name" + }, + "issueCountry": { + "type": "string", + "description": "ISO country code", + "examples": [ + "CN", + "US", + "DE", + "JP" + ] + }, + "birthDate": { + "type": "string", + "description": "Birth Date", + "examples": [ + "2000-01-01" + ] + }, + "identityType": { + "type": "string", + "description": "Identity type", + "enum": [ + "idcard", + "drivinglicense", + "passport", + "bvn" + ], + "x-api-enum": [ + { + "value": "idcard", + "name": "idcard", + "description": "id card" + }, + { + "value": "drivinglicense", + "name": "drivinglicense", + "description": "driving license" + }, + { + "value": "passport", + "name": "passport", + "description": "passport" + }, + { + "value": "bvn", + "name": "bvn", + "description": "bvn" + } + ] + }, + "identityNumber": { + "type": "string", + "description": "Identity Number" + }, + "expireDate": { + "type": "string", + "description": "expire Date. If there is no expiration date, please fill in: 2099-01-01", + "examples": [ + "2030-01-01", + "2099-01-01" + ] + }, + "frontPhoto": { + "type": "string", + "description": "**Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + "examples": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + }, + "backendPhoto": { + "type": "string", + "description": "**Optional when identityType=passport/bvn,** Back photo of ID, same as above", + "examples": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + }, + "facePhoto": { + "type": "string", + "description": "Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + "examples": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + } + }, + "required": [ + "clientUid", + "firstName", + "lastName", + "issueCountry", + "birthDate", + "identityType", + "identityNumber", + "expireDate", + "frontPhoto", + "facePhoto", + "backendPhoto" + ] + }, + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientUid\": \"226383154\",\n \"firstName\": \"Kaylah\",\n \"lastName\": \"Padberg\",\n \"issueCountry\": \"JP\",\n \"birthDate\": \"2000-01-01\",\n \"expireDate\": \"2030-01-01\",\n \"identityType\": \"passport\",\n \"identityNumber\": \"55\",\n \"facePhoto\": \"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg4Jbt7Tt/My3D+HmKgCzuQcui32heCD3VQ64iqfIUMsRThAM5brLdkIzBHXYEV9yBAC3L2QcVzYPFAXDvBBAwyuJaBAqagCLglqF3ZUteGZf2nPU+UH4YLymkii89hvUnWM4egpqIUtkvy8IBaPQahDL0lgrA1MNp1lUcLcEuGS3H0T5w9c+Uo6G56mT6dAsRUh2oMUweAAtjumuhFcMGycuEFxXAzKFkeZf/AIbdHf8Ali0WwKocR+yF6gS7uX2ceBe4uwK/INri7qiOJRSAE/HfGGfuE2jugI1fuJgAE/fHnPaj+RBlhwVE7JQyWp2RPMEgaRoF4T54jwiPGBQWgEvcsD3WKFiD2P3sB3imp9oHpn2QGAoA5n2h099k+3Qirll97jUACj97l5CukuLqK66Mi/AVryLEzWqA7OILUShg/dBD5G01MQJ0Tz/R4OYMMZoRCo9nYBB1VFG0j+QLgmmJlmFYPakFTCNQqngrW5vGa12+on8aAQWg6hUIrTropXQjVh4Z3IGT3Dei8olzEuInuE+J8Z8oJahh97TYYlNR0cpd6/g0SnqU9d67aT4Q2h/uJ//EACoRAQACAQIGAgEDBQAAAAAAAAEAESExQRAgMEBRYVBxoWCAgZCRscHh/9oACAECAQE/EP6EQG4SpwwPxO+aJei3KFmLW+H1tmAgqGRmOGHEaTUQ0+Ggttw0kI8JoTME0Jd/B3DEVvB2shkbxLmLqipvhiljCu3+CNslVwIsdeVZHwf87z08HBXwS0WzPmYip5TWARIpYSq5VAtiNrvqWAp9wBas7hFRHg6BhEb1Y5yZjKKNTkYlOZ41BLNV4+Yt8NqN4jsTQnavINtrGyH1MfUhN5KmQFMoK4AxNcRPmVgmziWSnmeyagxCjERx+R4ldjVh2iq0+uCDrDcFMq3ZHgWJ14f3Ul7IZqi66ioGuJoWWiRVRpLeZbzLeZbzLeFSwTdn+OAsssOg+3yzG3I7URl2CuiAbdeJ/KYr0jZh2ihkmIj4IPgdDVNP84TO1mQ1tX/XLoHuF6lFG/XMwhvvIjDeE9RBK5hlaR+ZRD0dZChG0Wo5fj/vNAfvqxMxkzdyy3rnc2lUVyCZ1lRFstS4HeWxF8E4ntHwz1T1T1T0QXaJGJkIeW3OgoUJ+T1CAtuvW3zz1FNpbtwl8KxbHpnpnonqgW00IgBp0AS4yt69R3AC2ZKuG2cK6d+uawUHruGbsFiFC102iINFwAuW0HWNYqE7gpmSGvG0Co+phTlmvYYByQC1C7UW0Kircbjc2gemoZYlSxSoAWPKRVzI2Y1yV2ALpKlMTCq65BrJPIR0hDGWXwYw4lyOKANkOq432TQLxlPM9ebsiNZuEF0gTee6UiCI/rlYqmuSG2EMPwFpbzPdPbL5bglDFt/2yKZUr9P/AP/EAC4QAQABAwMCBAcAAwADAAAAAAERACExQVFhcYEQkaGxIDBAUMHR8GDh8YCQoP/aAAgBAQABPxD/AOvRCJc1jtSvWLYqA9YZPookr9h9LD3U74PJ8yj18h7qnbOF/wACh6eype9jyo8f6o0Hurix5L0D6qwEWKncqT/CYGlkfkwHUl5op2B4UntOo+HLIdxgO89KMxllKbhgdilkv8RUt63Y2yvWM96GSEmXmhLyKPEoMcy6XeYWgEn+DJ7QIIvYOXgplYKqxTeXWtZfd0pXdrPjFvkzQ3qR4UYnrsNuxKUD0bw/xctzUn+BvjK1ABKvFJ4rczwg3RN8DFSPwu/gJdbEXIZ4lpSjPypoOeoQnDucNmk15YFpiU2epjbYN2xv/gSakgMsM7wOlKxdqKjihRh8CghEgHFofeh6xxA2A4uPzBpRGEcUXB0Uu1s7rgFnW92W5/wEtD1AaINS6Js70bFMVLWFkEbTDSJv9CzMAYtq0RyY+mT6qnVukUkgssMJdzFN2tKJjMb+G3pT8CGOwpnopz8xwzQzbDsOLtwXnUNy46f4A4aylBituLAUrUya49ugDmKDl8kAEAS7FWMMKUPKmvUEw/iCkEOlFQXoyTeVOqFBEzCdiD5irV1+aTN8MJkR0RoYMCwOCGmrZnSPvyxQ19IVLxhXXSgm0BuliDK0Cxgmo/yYhouV75gwTF4orslEe+7SbQIoVLQeVrB1Iox02tn2jYl2YcYqyeV7IoO3rNEFi7GyOr03qAgA621ede9LmHm6KcvzgISeaJDqRJyFBPmtKiRPvbilNsT2Bt3Ypk3VQYluDfeV7U9TCg5JdhwdikAewCWvvnL/AMqGWfI4zKyll1xUpKRZAWsQMHB6VCC+QmS49m48lPxJuoQumMRlbHFW9BfI4YneR6JQ+3QIBwFRUxuFnpWb5ww0MAHT5PYHcn/X70rMKUFlXasb2MesUtd0m2lXM9yS4VvLgloSVTZc5Bl8+1HtmDugCx4C6UItHKvGEbjxSzehOqEaMudZT0Km4PamHcdQTvSTFhuEkOpJ0KGfDUbvahB8vz2cgazA53gGe1EwkSR+8PK8eAuquCmbbyyxyLoaaZqDUibB0hq42Gs6WAMBANgKCKvU3oZTFx/FNXRFKjKr1adqhGd5o2rPQXE7JTO3w3AvcVEeChnAn0pyHK/PUbUuKRKys7Xrd3+8HkGeyexMS6xG7UpxB7CX53IOi7UIKav4TkJmzHXT4JSSZGCidYfJT2pDaM8B4qiST/Rv4oXaAs2Gp7FcPOF5pSSEEsjaKRH5ZUgSDNiR6/dw2CjtAJWrCES6SEux5VFME8APx8IxoUqTFiab2EK6KLiQaVOAKkgLDMWW7LzytNH18t8SywLEnaKiLZrSryoXumB3bUhveMmYv63zgDpRuauxKbpd/tqCJjLnmpXhAWXSKw9eaD4ZBzbJt7U/KKP+s9QHu+7s7gJTF1j1aDFYvRYj6loxR4vgBgIIWiIn8uaFs+TB4gQ85qHF3U+E2o+GKiKgkpuCgZ3wLdYdKKKIiZPlFJhm2H7uhBKdnBehTMQEbsseQ0fDGaWg7VJuZAQiSoViQRO9FBBNiZ70Z+SWopZoywEgedPyShgXA7KT3fdwgkXrkPzTp8NZFPSawJ+FMZMjQgmAFGKj5SsWpwUKTd2P4j5RQkWfSD7+j7wA4xh3vZB7IpesT290Se9GPig+XMb1JWdtxD8oFmgRv+q4nZDt94NnpyS2/TJOnNFzNIzYhOxhO4aXqxjHzUIkEsE/AghrAtZW2oc9Gpr6/KLiNWN0+Q+lA0KBgAgPvBXgk83K2Kby0rCK2RIcO0UIYZkRG7LgfPX5jUGImwJh1EqdikBFBpSGQxpJxMUCja69QUdgoW5Nxk7r2psylJVWnyRLT/aMhZlYAA45U4fJEzesI5Jq+GbTqdhFSLg4D80qc2tU8oEOi0bnuGaJslzufcrlfkQB1qXtwazwJA83SgNghQHbAO5zTGQUaHy9AjrWMMPQYt5wj6jSiDQ7EJf8mR0vR8qYrFdBpLfNQyONiJllpOJ0qC4kEwQBWILSyxlq8I5hBtsc6tApZe5PRBRpc7IfOaOKJZzdhyetBbuY3kqiyJqY0p67BLjCluTnDp9vCVqml3abEBYZN+bfyUicOQSPTB2KlYuuf9LgKPzYQk25lf7owp4ovNB3Z4pphuztoCz3vUhUykaImKKC6RwOBnqX4aFM0lg4T5LWQBR6APesPllYTSmFaKyPyL0zUkqz3fOXbFF3jE0IBoQf6zps1EuE8WYNJHXZTWsZUan66nD+Ibim4nUV56gqxgDdy1Sb/aFigN8bhixMECdXN4mKNSJXQDBY91eogkNkkvX24oIiCYLNg2C73rcrdzLmoh8LmCL3yOM75ir5aoVlZtyO6m96DEZu+QAHzWnS7EW81PSlqLVnJw2XFkOulRAQbckI9uK2jwajyr9k0EkJkvwyDwx8bUoIs7BEfzrT8sTT0CorK0be13Q7UTfIJY35Vby7/E9Q1jCL9h6xScN8gUwT2ZoJCNLnuNPecIvYpQg6r0SaLcJCw9lLPRoUuoYB1JXkdahbs9n8Zg1k1J9lQDW+reylmPTJkwS1O1okk9P0PQoyeZYX+X8UgELcZjKkt9BaLWHMeqkMcDEM6fm9So0LYOa4vLgxZWZKAVgWA0DFTpfqYQqb3ZsVzJjk7TjtFQM18y03z5OSnVfwXLimULjfEa0lj4c4dBxRkNop5lIwiDKA0NblGmm6yh+z6U6Q7CM6wKbKMCHyaBiEZxFTeHO1TUkXvSUsdF4eFq8FRJYOA6jp4Q/BFFRUtqQTlzYEFESmJW0zDDWN6TZK6usY5aLKDOusnVfiJKm1EBRYcGSDqvOr+ijeWDqrlf2LUYoKc1bTshI1PKoxYHnDyilCJxdFGqF+qY5qBawAhmJ2TfZrQ5pRo8P2NY2q66Wsoxy7aulXtQ+X/bsewUIkOdVqu7RQAN6m6AHu04/KX82KalS2bjSHQPlQ04gwAgA7USFYFpGvShwpUcAMRlO+fKiKRlTyNygozoNU2G1WDMMGMFhff0R6UgEYRLkZqGHijZyx+acnvQxOWOL1LxfR96WqBLfe4qdCsYb1okIN196m37r/AFQUH9BkqaqOBobADHFc3yoyRuVqb9qr351GC0dT9FHgV3fdThEupfiainiF90VwOijpH+6HMzouMYf69KUcxAmB0M9V+KMVPz+EpseB83pWMgBXXXq+3XwMfCIgUQjea1EmNhtn9fLajm47X0k85wetDRA5IhI/YVgmmomICJY5dmsbZadzWu/LlYscUEHADV3eefF5eDuGH4o1WfJYUaMxeqX4WsqR8CMukN/FSXQP5v3RbrSCBIQjqUhiiNocdGad9yoWS+9AINI66PrV4FIdZH4a0/skbKZe9J5o4aN3mjoL8yVqHNDNOwP6aLYpByTX/Jr/AJJX/FK7FFsWqXdpvUG1aRp4qGkuhGfSaFQIQ8tjsvl8RMLPDdPc6edJEtQOM7WXtWH+qD4WtKQc0UJJa7JpHiIfPeoGssixOS64cjq0pB+wYc9QCvZtg1eKUPl6ct7xlwH4LEjvIyrdcr/Wo8XZ5e6iekh4C+9TSQzE5peZo/gHpEJEdqmS1Lonq0kIEyoZ1qA76mTsxSE0LNjaU5G8LHO7T5kZidiBE5T6u1RawhkpcXO+lC5ryP4RSYxIg30Kuoq5ManQMUYWKAU/OkjDLuRTyFnI7Afy+EDISz1mMB/ypt8eiRv+goCEIL911eaPkRQVhIEkTpR0D/oTPkSHpTfSh0PYkdvrzIItEpicwZtljuSJW5KC++gG2xUf++6lqnVaMUU4oxXqXuq6omwETLTNvwehzSPY1QdovlbXOmElM0ITcPR1lzz0TY3IF5VHHLjfJVI8qKZMwLhMCS3tQ0ujmIgBtAQtRxDK1QU7A35KlmUYi9um7UKgwXIdCodvALq0XmrBkE8WlDB9A+ijI6KHxUiEAZMwDq1OI5/NAnAXfNoxRcK+5040p+WHyxArep61Mmt6cNnunX64HpkIh6u0hL+Uog4GT2BgwHQoJJBMV9RaCoPBxRikI1nyH+1ZH/M380V8UCRG0JSbhQjdrrlDvcb7IEfSYMSDE3bm9DEXkwQgbSxWuKikLRRFETS6LpbSoIME6GDGCfKNqBlBrMt4C0u/BtVrSoKkT0onu8z9qTBDQt0FR9BNqj2oZ5WungjMekCocaqTrApqp/FFgwXB6zbfeij4yZABKuhvQYnoLvToVAL9SdYhbU2XNgg9Ayc/9oTUlQXlse1TnI00YA/W7/VkMrG4raKW8VhwqDglV5WiAMVX2Dg0+NiS5nlBPZq9U2vhQ9ZqDgJSZ57Nh36jjBSTOT9zpO9XYu7MJAOAUiKKCRNy14w0azLS31vcoSWnJZ4m2pTViPveAlvd5oj5fLaS1LJlWjwn6C3pVHoQh6qKdKRaAGVqEygqCO8mzQ70qaGTEIfxtQVFBHxsZBQ8AvRasz0yUsBwuvYKRyOQkYREbcU2xBDEaRxcTvVjty8iLT2Q7VIu1k7X6yJ0AEq6FRpuqyYOjpwl1qJWbnKgnDd/1Tdo+KGxOX7BH0WgQ02EWmEkskt+adRFHJJMsuqvBUsrVF3Ylyq53aiRFRfUT1g606LELJHtTChfUYdsVkWP5tTZWEqvLHpUrMmByfupSZSesX+js6DRk3SgSglRgArMHYEFocI79KUrcFhWbI2286n5T22BxMoA7xHepSMJxNkXcPNomIKUSPSlAoRHSudV8lAfHYgE+c0xixZ+spm7pFys50uBxwp1atILSW6xWBHyALFidRIT1pOMzFJGy0T1obU2QJw2eY1Ja8symQ3An+irMYtCGC/nUm6V+yraPg0gRcJ5GT3oNZb6Nz3+F+Xp4Zr1/wBqAKViwCZpgfwPJ87cPOmiIsDdmo9mvTIRQfJaSRq9YnOLcbccUnISDT2kvJRAix65aVaksOblhleXNGdkA+1nST6pw0YjiFhNp1k71i10oiXV7q03o+Q2GJCJM1Jw2ZJ+WPSgpHoF6hKcQ3wKO8UMG6hDuTTFC7IeTSVneYfelrt6/rqI+qwEe3WhXiJJMbUann/3RWVn8a0W5d6XbqwfinNzt/rScN5D+qhgG8H80T5+n2q/7n6qBkPhL8V/S/qv6v0r+j9KAZen6KYi/k/VQzPwfopFNNgnvUEF39sDT3kQqK96mDbeVioOEhm86ZaAAAgKPlNFaetciAQ1GBapBCPzPlRwBGndEvYfahY0wBb4NORCEKhqwdka792mpneSL3MXveBH6ie+fRln/CnrNsdEt8ytKj5mKBn/AFWEnQmp8XdD7UA3zd/xSmVHf/VQXoiUpcOhPzS8odB/NYDkfs1oV0/YoG+dSmSB5V+KUeXr7JU9PM0QesX7pNfXqlx3aHS/k4on/k8qJ/QUIjsyfzSSQRrFEVLmbh71HTGsBPkFPmwIv1NRenRD0qKigj50pZ7UhU85fKh2ZDUKYO+PKpX8haxc7+gVPmgCnSxdkqCpf2BMrqRHanxIgClh3n6g5aAnP4RaiLN85UD80Yv9bBqKjisYox4I8Iox9EOa8bMGVOm+i0SYOdLIZ7exQcRVtcUlIJChv+iKnnTu+oELEfKtHnRJmndhX3Kn7vjNQgTumX6dq9lColO2O3gpzMCAJVelTbyEYkD5Qves4InGAS9bvf6deaOamIIAhbJbON634X84elEt9w2C4SV2DWnmHYEqeSFGB9kHzijVlIMPZeSjxOeiDdLPP0mpTZ7KyGx3lFtYa08J6BBUucW0o7HNM3sWbszEPkH6dNfUMB++NaBVVBoVyVwdkZvNQ4ChABIpp0q1sSfOr+fuBPmnYASvlVjMcwjY7avDQvPBNBYwBLdZaQRgZSp0k06R3p0EAmRok5Ew9GhsnG1HXwVBTNNHGZZCx2L96gt4RcEh93eoouh8V4OosHer3oUjLBtgHYK0Db1AjzcvP0zHlmgRKroBRhj2QVgIylsOBtq1cxWW8vY0T1BaZc14/kOtcbv0fcNY7DaL+k0UoIpO/wDBNGPAvwBgRMEL5PlT8lSBOwR4NZD+gXqZclmb8rp7FGNDKQAQHlW9D5XcAJLu7u8VOzIFSLsmdbOjqoIx9K4aZuUdXLWbnLoaNJbYArfmNw4ml10KkTTDFQSSUw9n3CcfO6EhKIfSOJfcWTlpNJiDQ6wrD14pxAyhOxxY71JBFOwPSdgle9FRAzzz3zUzUGJpE3B+32aUzDILwI8V4OzQYqPqTlQ6vgM9YojFvSS+RO77xLpRtBAGAMH0zCwcmxq1Ju0Ty0JdIeVGiGewQehTek4mm1CDrZdyvLCkbD0jz+4OKGCac1/JxSYJNke8I92nuwKbxJ0bYp4yJVOAnA/XgKxRmgZoxCrWhgfvvQvAVp1O43pe0mYA1WhQfIw3WmcTKtp2KtXu5LEFNhEBocr9P6wHBRKcvMdUi9b9qCx4EJXdQFqTueoUC0oehHGgpS9JZRx5B+FUe6ArG9x/0PQpOkaDvutbY9P1UI3qIvRomWNwe3eiqVofZ9RNTU/MZ0o4xvmzd+/OpxlhdiUUcHFTN9JrC2B1DP8AyjfhTZcy+UiOJ3ovV6dZRnLs5eXioWkEm944HAdhdaEA+n9HjxB961ROjAUzey35oUpWZA+HWh2wrYCWBriJyc1GuZiw2mBIY870zGiLk3k07ViMGAfKijU48mSzWMvE0tx3LwcGlYHjNDDR45mVuCYabhjCaLc8uKPpJoyjSiAqdk5iCjzLU0IR1AfWojukg7SVHDvYPVSKyNKUj3KPlQNFf89PXWXAHv01ESCwxh2OKgmJJiyc6b6zFEQgFgEBV3F2YaumXnBrTQnoks1s1qp5iVD4WaACAOAPqM1ppFYcYsAXAY7anqRSdzC1llcY4oeQ5AdvU5KbeGRapR64eaxv+ObexXeiPWj62RZTzMNKZWD2hIJ7UuZUqsr1pprT4Cl6pIGEpwSFNhpz1Nf90Y+izz3ijNHCgv2y+1Gy3fB6YFJdalippXenLheMn1VmmSRCg6k4fSiAoRuJ8X4zS7fQCkolkRPNn0p4m51jtgKekIS4TvGDlpmlgKT1ZehzmgAABAFjFNfVHAGq6FQRkMyiY7lZetFvnihcxN4LAW9Wj6mFmKkVv7ZUdLqzzUn3RhbKbnmG9M2laMzszQtuc76CtHlQMaSgIl8+hv6VHiM0+LSyy9KIIWQYJODilqfBWPBCpLVYHLUyDH/OE9ailPEXQRYeGGkjwmmKnhGO3ck70UUCjOWp2ZO1T9C8uFEw7zYc69Mypc0tT8JClMPlpVofy1CLZHkZ+BpNIedkNU3bcUvm1m6GiCCpIQpAB6z6UNVMwB3CfKlFX4DpAec0JEsAm3goqKweYMNhA6m7xG9KA37lGt2+DiXUoII+sQ6V0IbfupNoEESXgawSGpJdgrjGMLi3k1ONNK3aeK+zzTfAYDgg830qFPgIloKxmToFO4uGnUJq0GmlPQBeBMlGhIPlWq7ltMJz4jagwxnBQvHRHzqIonDn58boDq2PYY78UpLs+ITR1AwCVpOEtk91R4qGadoHKss0R2x0TxZlETpNMbKi5M22su00WtbAIbkVZcAnYrG1RHhjNqL7iKHQ6nc0NYKdDCy9y99KPkCJYEB5fXwIoLAK9KuC7tknpNZqWJlN7sd4qAqCnBPN6XgZKUIQNsgT4DlC49YCjzTy8SrkQJwApKblMoFkCOwihVBHSj0NEANxT6RWCfmQfVqyf4/cFZdOQelFn+LaTTwKfwQKZjpX7qHw/wDG9FT0gtDFm7KA4R6XrNYzSxU6vXIl6sdvEJQMtSXORF18t9h2qFm7xK7wS+1Z2rGHk1FoEDZ/0nybUnijTHcCz6NMQqR18S8GcwDqd05jP4PizdfbelRC+llZmrlE4FNjsBT1o8csV9ZpIYTI16XpUjfEknmTjIHO8It0w3zhdOv2GKYsFK4iC6gP4pZ8CZIzRJHTIQfNVMk+IlMVTc193xFCYuK9SqFceSElKyhut5pU3KufzaoSzZD1nrTxE0k/Mir82Y/qKkQ/C+9pU+FGsX0Kk5eNPYqzJ1YD+aPmD/JFLwYaH4ysMJsfrptXgRfinZcGpi86Szl3KvM0+FwphgFHIBXnboFOfAmwUKwmtF9EM2d/QnjAJpRGosqwBMS5qW2uW2tfAip/CkzPrM8rPSiBslKAnLAAvltVhbrGHVMG+q9Kmi26PxXOAye1BoA5CKhQBj7HPaiIuXVdCROopPGJKF6F1uog9o1qVP6ZEwz4LL4lGNOrpUP/AJy+svK57VPgVlzcDQWP4t8MVFR4R4R4GPFD4bdhA+dZVp4NMyAo7TWmxCPg994inqeIxU28RKVhggWjBWLH+N5pRsRsL9UlJu34sUMOMQfmj0oyEaLygqKPs8qSDCYr9gD2oWjzRAY8tuPEYpQYKBu2cdkpcBhkMneKE0VDStwWnnNLbxXnnGIgDqtJpNMW+85joH0AXgqNRyVODKDqoT3ifHBTZiYpIEC1gEzvO3jCoC+uhYG27Si1zyjK+vipAqsAa1M5J02RH1+3k70XyCwZkZNo2ukZ+QGR0xNNGYsCC7N0Y4S6kBH0GFqdPlyWABPJ5j8FkUHrtk9ZIShs4uvXCX7RT+Pks3uVv6VbrBqbQH3b+ILim5NAwOIPWCNpoID7eCDhpySzoTq2Ba4Oba24tLB1G9RUfA8fJcjYChlBbcjEjY63hsS6UMBAYPoigtCTXSeG48LS0SZ4PfrrUfBPwCo+TKGADVWhY0qjCYHUC7yv3GKMhlgXWzc6YqVJ1XE2vD1gommWD75jQRSPQ84oLvYGeYfepV9FhzaQA8w1Nl5nN9LKTGCDigBx9Gg0cC5iAjKabLMdKaGkRSbPI6JZpEyfEen6tbABlqHxCt5BldJz2LatCPukXqL1H07SJPaNZbNzpjcam9FbYNjUOstqMNmPwQVKgvQFlsPHYFp1fXQu4GO6UissIVto4GbAd6CP8Qgoi/QME2RpS+3VM94osIGRW9ygylAcHYqDb/02Pif4nPwH+IuKTqU/Af4m+Ef+DH//2Q==\",\n \"frontPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\",\n \"backendPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" + }, + "description": ":::info[Description]\nThis endpointcan submit kyc information for a sub-account of nd broker\n:::", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"submitKYC\",\"sdk-method-description\":\"This endpointcan submit kyc information for a sub-account of nd broker\"}" + } + }, + { + "name": "Get KYC Status", + "api": { + "id": "3472407", + "method": "get", + "path": "/api/kyc/ndBroker/proxyClient/status/list", + "parameters": { + "query": [ + { + "id": "6iUCMmMHEI", + "name": "clientUids", + "required": true, + "description": "Client uid, Use commas to separate multiple UIDs\n", + "example": "226383154", + "type": "string", + "schema": { + "type": "string", + "examples": [ + "226383154", + "226383154,22341356" + ] + }, + "enable": true + } + ], + "path": [], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "12306", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "clientUid": { + "type": "integer", + "description": "client uid" + }, + "status": { + "type": "string", + "enum": [ + "NONE", + "PROCESS", + "PASS", + "REJECT" + ], + "description": "KYC status", + "x-api-enum": [ + { + "value": "NONE", + "name": "NONE", + "description": "KYC information not submitted" + }, + { + "value": "PROCESS", + "name": "PROCESS", + "description": "In progress" + }, + { + "value": "PASS", + "name": "PASS", + "description": "Passed" + }, + { + "value": "REJECT", + "name": "REJECT", + "description": "Rejected" + } + ] + }, + "rejectReason": { + "type": "string", + "description": "Reject Reason" + } + }, + "required": [ + "status", + "clientUid" + ] + } + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "", + "oasExtensions": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": [\r\n {\r\n \"clientUid\": 226383154,\r\n \"status\": \"PROCESS\",\r\n \"rejectReason\": null\r\n }\r\n ]\r\n}", + "responseId": 12306, + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" + } + ], + "requestBody": { + "type": "none", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": {} + }, + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" + }, + "description": ":::info[Description]\nThis endpoint can query the specified Kyc status\n:::", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getKYCStatus\",\"sdk-method-description\":\"This endpoint can query the specified Kyc status\"}" + } + }, + { + "name": "Get KYC Status List", + "api": { + "id": "3472408", + "method": "get", + "path": "/api/kyc/ndBroker/proxyClient/status/page", + "parameters": { + "path": [], + "query": [ + { + "id": "6iUCMmMHEI", + "name": "pageNumber", + "required": false, + "description": "Page Number", + "example": "", + "type": "integer", + "schema": { + "type": "integer", + "default": 1 + } + }, + { + "id": "8vhmlbGQrR", + "name": "pageSize", + "required": false, + "description": "Page Size", + "type": "integer", + "schema": { + "type": "integer", + "default": 100, + "maximum": 100, + "minimum": 1 + } + } + ], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "12307", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "currentPage": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "totalNum": { + "type": "integer" + }, + "totalPage": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "clientUid": { + "type": "integer", + "description": "client uid" + }, + "status": { + "type": "string", + "enum": [ + "NONE", + "PROCESS", + "PASS", + "REJECT" + ], + "description": "KYC status", + "x-api-enum": [ + { + "value": "NONE", + "name": "NONE", + "description": "KYC information not submitted" + }, + { + "value": "PROCESS", + "name": "PROCESS", + "description": "In progress" + }, + { + "value": "PASS", + "name": "PASS", + "description": "Passed" + }, + { + "value": "REJECT", + "name": "REJECT", + "description": "Rejected" + } + ] + }, + "rejectReason": { + "type": "string", + "description": "Reject Reason" + } + }, + "required": [ + "clientUid", + "status" + ] + } + } + }, + "required": [ + "currentPage", + "pageSize", + "totalNum", + "totalPage", + "items" + ] + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "", + "oasExtensions": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"currentPage\": 1,\n \"pageSize\": 100,\n \"totalNum\": 9,\n \"totalPage\": 1,\n \"items\": [\n {\n \"clientUid\": 226383154,\n \"status\": \"PROCESS\",\n \"rejectReason\": null\n },\n {\n \"clientUid\": 232772137,\n \"status\": \"REJECT\",\n \"rejectReason\": \"frontPhoto:Picture is not clear/covered/incomplete\"\n }\n ]\n }\n}", + "responseId": 12307, + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" + } + ], + "requestBody": { + "type": "none", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": {} + }, + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "mediaType": "", + "oasExtensions": "" + }, + "description": ":::info[Description]\nThis endpoint can query the specified Kyc status list\n:::", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getKYCStatusList\",\"sdk-method-description\":\"This endpoint can query the specified Kyc status list\"}" + } + }, { "name": "Get Broker Info", "api": { @@ -38822,7 +41172,6 @@ "method": "get", "path": "/api/v1/broker/nd/info", "parameters": { - "path": [], "query": [ { "id": "6iUCMmMHEI", @@ -38830,7 +41179,8 @@ "required": true, "description": "Start time, for example: 20230110", "example": "20240510", - "type": "string" + "type": "string", + "enable": true }, { "id": "5uqjEGNGxr", @@ -38838,7 +41188,8 @@ "required": true, "description": "End time, for example: 20230210 (query data with a maximum interval of 6 months)\n", "example": "20241010", - "type": "string" + "type": "string", + "enable": true }, { "id": "LzvLfsT2yl", @@ -38865,9 +41216,11 @@ "description": "futures" } ] - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -38913,7 +41266,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -38921,7 +41275,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"accountSize\": 0,\n \"maxAccountSize\": null,\n \"level\": 0\n }\n}", "responseId": 10446, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -38931,8 +41288,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports querying the basic information of the current Broker.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getBrokerInfo\",\"sdk-method-description\":\"This endpoint supports querying the basic information of the current Broker.\",\"api-rate-limit-weight\":2}" @@ -39024,8 +41388,15 @@ "accountName" ] }, - "example": "{\n \"accountName\": \"Account1\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"accountName\": \"Account1\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports Broker users creating sub-accounts.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"addSubAccount\",\"sdk-method-description\":\"This endpoint supports Broker users creating sub-accounts.\",\"api-rate-limit-weight\":3}" @@ -39038,15 +41409,15 @@ "method": "get", "path": "/api/v1/broker/nd/account", "parameters": { - "path": [], "query": [ { "id": "6iUCMmMHEI", "name": "uid", - "required": true, + "required": false, "description": "Sub-account UID", "example": "226383154", - "type": "string" + "type": "string", + "enable": true }, { "id": "5uqjEGNGxr", @@ -39058,7 +41429,8 @@ "schema": { "type": "integer", "default": 1 - } + }, + "enable": true }, { "id": "rhz4T0YToL", @@ -39072,9 +41444,11 @@ "default": 20, "maximum": 100, "minimum": 1 - } + }, + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -39175,8 +41549,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface supports querying sub-accounts created by Broker.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getSubAccount\",\"sdk-method-description\":\"This interface supports querying sub-accounts created by Broker.\",\"api-rate-limit-weight\":2}" @@ -39344,8 +41725,15 @@ "label" ] }, - "example": "{\n \"uid\": \"226383154\",\n \"passphrase\": \"11223344\",\n \"ipWhitelist\": [\n \"127.0.0.1\",\"123.123.123.123\"\n ],\n \"permissions\": [\n \"general\",\"spot\"\n ],\n \"label\": \"This is remarks\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"uid\": \"226383154\",\n \"passphrase\": \"11223344\",\n \"ipWhitelist\": [\n \"127.0.0.1\",\"123.123.123.123\"\n ],\n \"permissions\": [\n \"general\",\"spot\"\n ],\n \"label\": \"This is remarks\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface supports the creation of Broker sub-account APIKEY.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"addSubAccountApi\",\"sdk-method-description\":\"This interface supports the creation of Broker sub-account APIKEY.\",\"api-rate-limit-weight\":3}" @@ -39495,8 +41883,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface supports querying the Broker’s sub-account APIKEY.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getSubAccountAPI\",\"sdk-method-description\":\"This interface supports querying the Broker’s sub-account APIKEY.\",\"api-rate-limit-weight\":2}" @@ -39659,8 +42054,15 @@ "label" ] }, - "example": "{\n \"uid\": \"226383154\",\n \"apiKey\": \"671afb36cee20f00015cfaf1\",\n \"ipWhitelist\": [\n \"127.0.0.1\",\n \"123.123.123.123\"\n ],\n \"permissions\": [\n \"general\",\n \"spot\"\n ],\n \"label\": \"This is remarks\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"uid\": \"226383154\",\n \"apiKey\": \"671afb36cee20f00015cfaf1\",\n \"ipWhitelist\": [\n \"127.0.0.1\",\n \"123.123.123.123\"\n ],\n \"permissions\": [\n \"general\",\n \"spot\"\n ],\n \"label\": \"This is remarks\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface supports modifying the Broker’s sub-account APIKEY.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"modifySubAccountApi\",\"sdk-method-description\":\"This interface supports modifying the Broker’s sub-account APIKEY.\",\"api-rate-limit-weight\":3}" @@ -39739,8 +42141,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface supports deleting Broker’s sub-account APIKEY.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"deleteSubAccountAPI\",\"sdk-method-description\":\"This interface supports deleting Broker’s sub-account APIKEY.\",\"api-rate-limit-weight\":3}" @@ -39894,8 +42303,15 @@ "clientOid" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"amount\": \"1\",\n \"clientOid\": \"e6c24d23-6bc2-401b-bf9e-55e2daddfbc1\",\n \"direction\": \"OUT\",\n \"accountType\": \"MAIN\",\n \"specialUid\": \"226383154\",\n \"specialAccountType\": \"MAIN\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"amount\": \"1\",\n \"clientOid\": \"e6c24d23-6bc2-401b-bf9e-55e2daddfbc1\",\n \"direction\": \"OUT\",\n \"accountType\": \"MAIN\",\n \"specialUid\": \"226383154\",\n \"specialAccountType\": \"MAIN\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports fund transfer between Broker accounts and Broker sub-accounts.\n\nPlease be aware that withdrawal from sub-accounts is not directly supported. Broker has to transfer funds from broker sub-account to broker account to initiate the withdrawals.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"transfer\",\"sdk-method-description\":\"This endpoint supports fund transfer between Broker accounts and Broker sub-accounts. Please be aware that withdrawal from sub-accounts is not directly supported. Broker has to transfer funds from broker sub-account to broker account to initiate the withdrawals.\",\"api-rate-limit-weight\":1}" @@ -40128,8 +42544,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports querying the transfer records of the broker itself and its created sub-accounts.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getTransferHistory\",\"sdk-method-description\":\"This endpoint supports querying the transfer records of the broker itself and its created sub-accounts.\",\"api-rate-limit-weight\":1}" @@ -40363,8 +42786,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThe deposit records of each sub-account under the ND broker can be obtained at this endpoint.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getDepositList\",\"sdk-method-description\":\"The deposit records of each sub-account under the ND broker can be obtained at this endpoint.\",\"api-rate-limit-weight\":10}" @@ -40538,8 +42968,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports querying the deposit record of sub-accounts created by a Broker (excluding main account of ND broker).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getDepositDetail\",\"sdk-method-description\":\"This endpoint supports querying the deposit record of sub-accounts created by a Broker (excluding main account of ND broker).\",\"api-rate-limit-weight\":1}" @@ -40717,8 +43154,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint supports querying the withdrawal records of sub-accounts created by a Broker (excluding main account of ND broker).\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getWithdrawDetail\",\"sdk-method-description\":\"This endpoint supports querying the withdrawal records of sub-accounts created by a Broker (excluding main account of ND broker).\",\"api-rate-limit-weight\":1}" @@ -40830,8 +43274,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface supports the downloading of Broker rebate orders.\n:::\n\n### Excel Response\n\n| Param | Description | Example |\n| ------------------- | ----------------- |--------- |\n| Date | Date | 2024/9/1 |\n| BrokerUID | Broker's UID | 3243241 |\n| AffiliateUID | Affiliate's UID | 2354546 |\n| UID | User's UID | 6345466 |\n| BizLine | Business Line (Spot, Futures) | Spot |\n| Volume | Volume | 0 |\n| TotalCommission | Total Commission = BrokerCommission + UserCommission + AffiliateCommission | 0 |\n| BrokerCommission | Broker Commission | 0 |\n| UserCommission | User Commission | 0 |\n| AffiliateCommission | Affiliate Commission | 0 |\n\n\n\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Broker\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Broker\",\"sdk-service\":\"Broker\",\"sdk-sub-service\":\"NDBroker\",\"sdk-method-name\":\"getRebase\",\"sdk-method-description\":\"This interface supports the downloading of Broker rebate orders.\",\"api-rate-limit-weight\":3}" @@ -41111,8 +43562,15 @@ "size" ] }, - "example": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace order to the futures trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nThe maximum limit orders for a single contract is 100 per account, and the maximum stop orders for a single contract is 200 per account.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"addOrder\",\"sdk-method-description\":\"Place order to the futures trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":2}" @@ -41125,8 +43583,8 @@ "method": "post", "path": "/api/v1/copy-trade/futures/orders/test", "parameters": { - "path": [], "query": [], + "path": [], "cookie": [], "header": [] }, @@ -41384,8 +43842,15 @@ "size" ] }, - "example": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.1\",\n \"size\": 1,\n \"timeInForce\": \"GTC\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nOrder test endpoint: The request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"addOrderTest\",\"sdk-method-description\":\"Place order the futures trading system just for validation\",\"api-rate-limit-weight\":2}" @@ -41641,8 +44106,15 @@ "size" ] }, - "example": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.2\",\n \"size\": 1,\n \"timeInForce\": \"GTC\",\n \"triggerStopUpPrice\": \"0.3\",\n \"triggerStopDownPrice\": \"0.1\",\n \"stopPriceType\": \"TP\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"side\": \"buy\",\n \"symbol\": \"XBTUSDTM\",\n \"leverage\": 3,\n \"type\": \"limit\",\n \"remark\": \"order remarks\",\n \"reduceOnly\": false,\n \"marginMode\": \"ISOLATED\",\n \"price\": \"0.2\",\n \"size\": 1,\n \"timeInForce\": \"GTC\",\n \"triggerStopUpPrice\": \"0.3\",\n \"triggerStopDownPrice\": \"0.1\",\n \"stopPriceType\": \"TP\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nPlace take profit and stop loss order supports both take-profit and stop-loss functions, and other functions are exactly the same as the place order interface.\n\nYou can place two types of orders: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n\nPlease note that the system will hold the fees from the orders entered in the orderbook in advance. \n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"addTPSLOrder\",\"sdk-method-description\":\"Place take profit and stop loss order supports both take-profit and stop-loss functions, and other functions are exactly the same as the place order interface.\",\"api-rate-limit-weight\":2}" @@ -41722,8 +44194,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nCancel an order (including a stop order).\n\nYou will receive a success message once the system has received the cancellation request. The cancellation request will be processed by matching engine in sequence. To know if the request has been processed, you may check the order status or update message from the Websocket pushes.\n\nThe ‘orderId’ is the server-assigned order ID, not the specified clientOid.\n\nIf the order can not be canceled (already filled or previously canceled, etc.), then an error response will indicate the reason in the message field.\n:::\n\n**API KEY PERMISSIONS**\nThis endpoint requires the Futures Trading permission.\n\n**REQUEST URL**\nThis endpoint support Futures URL\n\n**REQUEST RATE LIMIT**\nFutures weight: 1\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"cancelOrderById\",\"sdk-method-description\":\"Cancel order by system-generated orderId.\",\"api-rate-limit-weight\":1}" @@ -41807,8 +44286,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nCancel an order (including a stop order).\n\nYou will receive a success message once the system has received the cancellation request. The cancellation request will be processed by matching engine in sequence. To know if the request has been processed, you may check the order status or update message from the pushes.\n\nReturn the client-generated order ID (clientOid).\n\nIf the order can not be canceled (already filled or previously canceled, etc.), then an error response will indicate the reason in the message field.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"cancelOrderByClientOid\",\"sdk-method-description\":\"Cancel order by client-defined orderId.\",\"api-rate-limit-weight\":1}" @@ -41925,8 +44411,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nGet Maximum Open Position Size.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"GetMaxOpenSize\",\"sdk-method-description\":\"Get Maximum Open Position Size.\",\"api-rate-limit-weight\":4}" @@ -41995,8 +44488,15 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can query the maximum amount of margin that the current position supports withdrawal.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"GetMaxWithdrawMargin\",\"sdk-method-description\":\"This interface can query the maximum amount of margin that the current position supports withdrawal.\",\"api-rate-limit-weight\":10}" @@ -42259,8 +44759,15 @@ "bizNo" ] }, - "example": "{\n \"symbol\": \"XBTUSDTM\",\n \"margin\": 3,\n \"bizNo\": \"112233\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"XBTUSDTM\",\n \"margin\": 3,\n \"bizNo\": \"112233\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nAdd Isolated Margin Manually.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"AddIsolatedMargin\",\"sdk-method-description\":\"Add Isolated Margin Manually.\",\"api-rate-limit-weight\":4}" @@ -42333,8 +44840,15 @@ "withdrawAmount" ] }, - "example": "{\n \"symbol\": \"XBTUSDTM\",\n \"withdrawAmount\": 0.0000001\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"XBTUSDTM\",\n \"withdrawAmount\": 0.0000001\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nRemove Isolated Margin Manually.\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"RemoveIsolatedMargin\",\"sdk-method-description\":\"Remove Isolated Margin Manually.\",\"api-rate-limit-weight\":10}" @@ -42407,8 +44921,15 @@ "level" ] }, - "example": "{\n \"symbol\" : \"XBTUSDTM\",\n \"level\" : 1\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\" : \"XBTUSDTM\",\n \"level\" : 1\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface is for adjusting the risk limit level (only valid for Isolated Margin). Adjusting the level will result in the cancellation of any open orders. The response will indicate only whether the adjustment request was successfully submitted. The result of the adjustment can be obtained with information from Websocket: Position Change Events.\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"modifyIsolatedMarginRiskLimt\",\"sdk-method-description\":\"This interface can be used to obtain information about risk limit level of a specific contract (only valid for Isolated Margin).\",\"api-rate-limit-weight\":2}" @@ -42484,14 +45005,40 @@ "status" ] }, - "example": "{\n \"symbol\": \"XBTUSDTM\",\n \"status\": true\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"XBTUSDTM\",\n \"status\": true\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::info[Description]\nThis endpoint is only applicable to isolated margin and is no longer recommended. It is recommended to use cross margin instead.\n:::\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"LeadtradeFutures\",\"api-rate-limit-pool\":\"CopyTrading\",\"sdk-service\":\"CopyTrading\",\"sdk-sub-service\":\"Futures\",\"sdk-method-name\":\"modifyAutoDepositStatus\",\"sdk-method-description\":\"This endpoint is only applicable to isolated margin and is no longer recommended. It is recommended to use cross margin instead.\",\"api-rate-limit-weight\":4}" } } ] + }, + { + "name": "UTA", + "id": 348669, + "description": "", + "items": [ + { + "name": "Account Info", + "id": 348670, + "description": "", + "items": [] + }, + { + "name": "Trading", + "id": 348671, + "description": "", + "items": [] + } + ] } ] }, @@ -42613,7 +45160,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can obtain the token required for Websocket to establish a Spot/Margin connection.\nIf you need use public channels (e.g. all public market data), please make request as follows to obtain the server list and public token \n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getPublicToken\",\"sdk-method-description\":\"This interface can obtain the token required for Websocket to establish a Spot/Margin connection. If you need use public channels (e.g. all public market data), please make request as follows to obtain the server list and public token\",\"api-rate-limit-weight\":10}" @@ -42727,7 +45275,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can obtain the token required for Websocket to establish a Spot/Margin private connection.\nIf you need use private channels (e.g. account balance notice), please make request as follows to obtain the server list and private token\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getPrivateToken\",\"sdk-method-description\":\"This interface can obtain the token required for Websocket to establish a Spot/Margin private connection. If you need use private channels (e.g. account balance notice), please make request as follows to obtain the server list and private token\",\"api-rate-limit-weight\":10}" @@ -42841,7 +45390,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can obtain the token required for Websocket to establish a Futures connection.\nIf you need use public channels (e.g. all public market data), please make request as follows to obtain the server list and public token\n:::\n\n", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Public\",\"api-permission\":\"NULL\",\"api-rate-limit-pool\":\"Public\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getPublicToken\",\"sdk-method-description\":\"This interface can obtain the token required for Websocket to establish a Futures connection. If you need use public channels (e.g. all public market data), please make request as follows to obtain the server list and public token\",\"api-rate-limit-weight\":10}" @@ -42955,7 +45505,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nThis interface can obtain the token required for Websocket to establish a Futures private connection.\nIf you need use private channels (e.g. account balance notice), please make request as follows to obtain the server list and private token\n:::", "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Market\",\"sdk-method-name\":\"getPrivateToken\",\"sdk-method-description\":\"This interface can obtain the token required for Websocket to establish a Futures private connection. If you need use private channels (e.g. account balance notice), please make request as follows to obtain the server list and private token\",\"api-rate-limit-weight\":10}" @@ -43119,7 +45670,8 @@ "requestBody": { "type": "none", "parameters": [], - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **GET /api/v2/sub/user** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nYou can get the user info of all sub-account via this interface.\n:::\n\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"getSpotSubAccountsSummaryV1\",\"sdk-method-description\":\"You can get the user info of all sub-account via this interface; it is recommended to use the GET /api/v2/sub/user interface for paging query\",\"api-rate-limit-weight\":20}" @@ -43326,7 +45878,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v2/sub-accounts** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThis endpoint returns the account info of all sub-users.\n:::\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"SubAccount\",\"sdk-method-name\":\"getSpotSubAccountListV1\",\"sdk-method-description\":\"This endpoint returns the account info of all sub-users.\",\"api-rate-limit-weight\":20}" @@ -43500,7 +46053,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/deposit-addresses** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nGet all deposit addresses for the currency you intend to deposit. If the returned data is empty, you may need to add the deposit address first.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Deposit\",\"sdk-method-name\":\"getDepositAddressV2\",\"sdk-method-description\":\"Get all deposit addresses for the currency you intend to deposit. If the returned data is empty, you may need to add the deposit address first.\",\"api-rate-limit-weight\":5}" @@ -43671,7 +46225,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/deposit-addresses** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nGet all deposit addresses for the currency you intend to deposit. If the returned data is empty, you may need to add the deposit address first.\n:::\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Deposit\",\"sdk-method-name\":\"getDepositAddressV1\",\"sdk-method-description\":\"Get all deposit addresses for the currency you intend to deposit. If the returned data is empty, you may need to add the deposit address first.\",\"api-rate-limit-weight\":5}" @@ -43872,8 +46427,15 @@ "subTag" ] }, - "example": "{\n \"clientOid\": \"64ccc0f164781800010d8c09\",\n \"currency\": \"USDT\",\n \"amount\": \"0.01\",\n \"direction\": \"OUT\",\n \"accountType\": \"MAIN\",\n \"subAccountType\": \"MAIN\",\n \"subUserId\": \"63743f07e0c5230001761d08\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"64ccc0f164781800010d8c09\",\n \"currency\": \"USDT\",\n \"amount\": \"0.01\",\n \"direction\": \"OUT\",\n \"accountType\": \"MAIN\",\n \"subAccountType\": \"MAIN\",\n \"subUserId\": \"63743f07e0c5230001761d08\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/accounts/universal-transfer** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nFunds in the main account, trading account and margin account of a Master Account can be transferred to the main account, trading account, futures account and margin account of its Sub-Account. The futures account of both the Master Account and Sub-Account can only accept funds transferred in from the main account, trading account and margin account and cannot transfer out to these accounts.\n:::\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Transfer\",\"sdk-method-name\":\"subAccountTransfer\",\"sdk-method-description\":\"Funds in the main account, trading account and margin account of a Master Account can be transferred to the main account, trading account, futures account and margin account of its Sub-Account. The futures account of both the Master Account and Sub-Account can only accept funds transferred in from the main account, trading account and margin account and cannot transfer out to these accounts.\",\"api-rate-limit-weight\":30}" @@ -44084,7 +46646,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v1/deposits** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest the V1 historical deposits list on KuCoin via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\n:::\n\n:::tip[TIPS]\nDefault query for one month of data.\nThis request is paginated.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Deposit\",\"sdk-method-name\":\"getDepositHistoryOld\",\"sdk-method-description\":\"Request the V1 historical deposits list on KuCoin via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\",\"api-rate-limit-weight\":5}" @@ -44281,8 +46844,15 @@ "to" ] }, - "example": "{\n \"clientOid\": \"64ccc0f164781800010d8c09\",\n \"currency\": \"USDT\",\n \"amount\": \"0.01\",\n \"from\": \"main\",\n \"to\": \"trade\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"clientOid\": \"64ccc0f164781800010d8c09\",\n \"currency\": \"USDT\",\n \"amount\": \"0.01\",\n \"from\": \"main\",\n \"to\": \"trade\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/accounts/universal-transfer** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThis API endpoint can be used to transfer funds between accounts internally. Users can transfer funds between their accounts free of charge. \n:::\n\nNotice:\nThe transfer of funds from contract accounts to other accounts is not supported.\nThe margin_v2 account currently only supports transfers between margin accounts, and does not support direct transfers from other accounts to margin_v2\nThe isolated_v2 account currently only supports transfers between margin accounts, and does not support direct transfers from other accounts to isolated_v2", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Transfer\",\"sdk-method-name\":\"innerTransfer\",\"sdk-method-description\":\"This API endpoint can be used to transfer funds between accounts internally. Users can transfer funds between their accounts free of charge. \",\"api-rate-limit-weight\":10}" @@ -44555,7 +47125,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::info[Description]\nFutures account transfer out ledgers can be obtained at this endpoint.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Transfer\",\"sdk-method-name\":\"getFuturesAccountTransferOutLedger\",\"sdk-method-description\":\"Futures account transfer out ledgers can be obtained at this endpoint.\",\"api-rate-limit-weight\":20}" @@ -44797,7 +47368,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v1/withdrawals** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest a withdrawal list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\n:::\n\n:::tip[TIPS]\nDefault query for one month of data.\n:::\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Withdrawal\",\"sdk-method-name\":\"getWithdrawalHistoryOld\",\"sdk-method-description\":\"Request a deposit list via this endpoint. Items are paginated and sorted to show the latest first. See the Pagination section for retrieving additional entries after the first page.\",\"api-rate-limit-weight\":20}" @@ -44989,8 +47561,15 @@ "recAccountType" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"amount\": 0.01,\n \"recAccountType\": \"MAIN\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"amount\": 0.01,\n \"recAccountType\": \"MAIN\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/accounts/universal-transfer** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThe amount to be transferred will be deducted from the KuCoin Futures Account. Please ensure that you have sufficient funds in your KuCoin Futures Account, or the transfer will fail.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Transfer\",\"sdk-method-name\":\"futuresAccountTransferOut\",\"sdk-method-description\":\"The amount to be transferred will be deducted from the KuCoin Futures Account. Please ensure that you have sufficient funds in your KuCoin Futures Account, or the transfer will fail.\",\"api-rate-limit-weight\":20}" @@ -45089,8 +47668,15 @@ "payAccountType" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"amount\": 0.01,\n \"payAccountType\": \"MAIN\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"amount\": 0.01,\n \"payAccountType\": \"MAIN\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/accounts/universal-transfer** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThe amount to be transferred will be deducted from the payAccount. Please ensure that you have sufficient funds in your payAccount account, or the transfer will fail.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Transfer\",\"sdk-method-name\":\"futuresAccountTransferIn\",\"sdk-method-description\":\"The amount to be transferred will be deducted from the payAccount. Please ensure that you have sufficient funds in your payAccount account, or the transfer will fail.\",\"api-rate-limit-weight\":20}" @@ -45208,7 +47794,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -45216,7 +47803,10 @@ "name": "Success", "data": "{\"code\":\"200000\",\"data\":{\"address\":\"0x02028456f38e78609904e8a002c787ede7a73d7c\",\"memo\":null,\"chain\":\"ERC20\",\"chainId\":\"eth\",\"to\":\"MAIN\",\"currency\":\"ETH\"}}", "responseId": 10473, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -45255,18 +47845,18 @@ "type": "string", "description": "Deposit account type: main (funding account), trade (spot trading account); the default is main", "enum": [ - "main", - "trade" + "MAIN", + "TRADE" ], - "default": "main", + "default": "MAIN", "x-api-enum": [ { - "value": "main", + "value": "MAIN", "name": "main", "description": "Funding account" }, { - "value": "trade", + "value": "TRADE", "name": "trade", "description": "Spot account" } @@ -45277,8 +47867,15 @@ "currency" ] }, - "example": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\",\n \"to\": \"MAIN\"\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **POST /v3/deposit-address/create** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest via this endpoint the creation of a deposit address for a currency you intend to deposit.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Deposit\",\"sdk-method-name\":\"addDepositAddressV1\",\"sdk-method-description\":\"Request via this endpoint the creation of a deposit address for a currency you intend to deposit.\",\"api-rate-limit-weight\":20}" @@ -45404,8 +48001,15 @@ "amount" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"address\": \"TKFRQXSDc****16GmLrjJggwX8\",\n \"amount\": 3,\n \"chain\": \"trx\",\n \"isInner\": true\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"currency\": \"USDT\",\n \"address\": \"TKFRQXSDc****16GmLrjJggwX8\",\n \"amount\": 3,\n \"chain\": \"trx\",\n \"isInner\": true\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **POST /api/v3/withdrawals** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nUse this interface to withdraw the specified currency.\n:::\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Withdrawal\",\"api-rate-limit-pool\":\"Management\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Withdrawal\",\"sdk-method-name\":\"withdrawalV1\",\"sdk-method-description\":\"Use this interface to withdraw the specified currency.\",\"api-rate-limit-weight\":5}" @@ -45677,8 +48281,15 @@ "clientOid" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **POST /api/v1/hf/orders** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nPlace order to the Spot trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.(including stop orders).\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | Yes | clientOid, the unique identifier created by the client, use of UUID, with a maximum length of 128 bits. |\n| side | String | Yes | **buy** or **sell** |\n| symbol | String | Yes | symbol, e.g. ETH-BTC |\n| type | String | No | **limit** or **market** (default is **limit**) |\n| remark | String | No | remark, length cannot exceed 50 characters (ASCII) |\n| stp | String | No | self trade prevention, **CN**, **CO**, **CB** or **DC** |\n| tradeType | String | No | The type of trading : **TRADE**(Spot Trade), **MARGIN_TRADE** (Margin Trade). Default is **TRADE**. **Note: To improve the system performance and to accelerate order placing and processing, KuCoin has added a new interface for order placing of margin. For traders still using the current interface, please move to the new one as soon as possible. The current one will no longer accept margin orders by May 1st, 2021 (UTC). At the time, KuCoin will notify users via the announcement, please pay attention to it.** |\n\n##### Additional Request Parameters Required by `limit` Orders\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ------------ |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n##### Additional request parameters required by `market` orders\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderOld\",\"sdk-method-description\":\"Place order to the Spot trading system, you can place two major types of orders: limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":2}" @@ -45938,8 +48549,15 @@ "clientOid" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e493fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **POST /api/v1/hf/orders/test** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nOrder test endpoint, the request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.(including stop orders).\n:::\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | Yes | clientOid, the unique identifier created by the client, use of UUID, with a maximum length of 128 bits. |\n| side | String | Yes | **buy** or **sell** |\n| symbol | String | Yes | symbol, e.g. ETH-BTC |\n| type | String | No | **limit** or **market** (default is **limit**) |\n| remark | String | No | remark, length cannot exceed 50 characters (ASCII) |\n| stp | String | No | self trade prevention, **CN**, **CO**, **CB** or **DC** |\n| tradeType | String | No | The type of trading : **TRADE**(Spot Trade), **MARGIN_TRADE** (Margin Trade). Default is **TRADE**. **Note: To improve the system performance and to accelerate order placing and processing, KuCoin has added a new interface for order placing of margin. For traders still using the current interface, please move to the new one as soon as possible. The current one will no longer accept margin orders by May 1st, 2021 (UTC). At the time, KuCoin will notify users via the announcement, please pay attention to it.** |\n\n##### Additional Request Parameters Required by `limit` Orders\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ------------ |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy `GTC`, `GTT`, `IOC`, `FOK` (The default is `GTC`) |\n| cancelAfter | long | No | Cancel after `n` seconds,the order timing strategy is `GTT` |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is `IOC` or `FOK` |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n##### Additional request parameters required by `market` orders\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: `size` or `funds`) |\n| funds | String | No | (Select one out of two: `size` or `funds`) |", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderTestOld\",\"sdk-method-description\":\"Order test endpoint, the request parameters and return parameters of this endpoint are exactly the same as the order endpoint, and can be used to verify whether the signature is correct and other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\",\"api-rate-limit-weight\":2}" @@ -46313,8 +48931,15 @@ "symbol" ] }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderList\": [\n {\n \"clientOid\": \"3d07008668054da6b3cb12e432c2b13a\",\n \"side\": \"buy\",\n \"type\": \"limit\",\n \"price\": \"50000\",\n \"size\": \"0.0001\"\n },\n {\n \"clientOid\": \"37245dbe6e134b5c97732bfb36cd4a9d\",\n \"side\": \"buy\",\n \"type\": \"limit\",\n \"price\": \"49999\",\n \"size\": \"0.0001\"\n }\n ]\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderList\": [\n {\n \"clientOid\": \"3d07008668054da6b3cb12e432c2b13a\",\n \"side\": \"buy\",\n \"type\": \"limit\",\n \"price\": \"50000\",\n \"size\": \"0.0001\"\n },\n {\n \"clientOid\": \"37245dbe6e134b5c97732bfb36cd4a9d\",\n \"side\": \"buy\",\n \"type\": \"limit\",\n \"price\": \"49999\",\n \"size\": \"0.0001\"\n }\n ]\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **POST /api/v1/hf/orders/multi** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest via this endpoint to place 5 orders at the same time. The order type must be a limit order of the same symbol.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchAddOrdersOld\",\"sdk-method-description\":\"Request via this endpoint to place 5 orders at the same time. The order type must be a limit order of the same symbol.\",\"api-rate-limit-weight\":3}" @@ -46381,8 +49006,237 @@ "responseExamples": [ { "name": "Success", - "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"cancelledOrderIds\": [\r\n \"674a97dfef434f0007efc431\"\r\n ]\r\n }\r\n}", - "responseId": 10604, + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"cancelledOrderIds\": [\r\n \"674a97dfef434f0007efc431\"\r\n ]\r\n }\r\n}", + "responseId": 10604, + "ordering": 1 + } + ], + "requestBody": { + "type": "none", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": {} + }, + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" + }, + "description": ":::tip[]\nIt is recommended to use the **DELETE /api/v1/hf/orders/{orderId}** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThis endpoint can be used to cancel a spot order by orderId.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\n:::", + "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByOrderIdOld\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":3}" + } + }, + { + "name": "Cancel Order By ClientOid - Old", + "api": { + "id": "3470344", + "method": "delete", + "path": "/api/v1/order/client-order/{clientOid}", + "parameters": { + "query": [], + "path": [ + { + "id": "clientOid#0", + "name": "clientOid", + "required": true, + "description": "Client Order Id,unique identifier created by the user", + "example": "5c52e11203aa677f331e493fb", + "type": "string", + "enable": true + } + ], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "10571", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "clientOid": { + "type": "string", + "description": "Client Order Id,unique identifier created by the user" + }, + "cancelledOrderId": { + "type": "string", + "description": "The unique order id generated by the trading system" + }, + "cancelledOcoOrderIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "cancelledOrderId", + "clientOid", + "cancelledOcoOrderIds" + ] + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"cancelledOrderId\": \"67c3252a63d25e0007f91de9\",\r\n \"clientOid\": \"5c52e11203aa677f331e493fb\",\r\n \"cancelledOcoOrderIds\": null\r\n }\r\n}", + "responseId": 10571, + "ordering": 1 + } + ], + "requestBody": { + "type": "none", + "parameters": [], + "jsonSchema": { + "type": "object", + "properties": {} + }, + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" + }, + "description": ":::tip[]\nIt is recommended to use the **DELETE /api/v1/hf/orders/client-order/{clientOid}** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThis endpoint can be used to cancel a spot order by clientOid.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\n:::", + "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByClientOidOld\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\",\"api-rate-limit-weight\":3}" + } + }, + { + "name": "Batch Cancel Order - Old", + "api": { + "id": "3470345", + "method": "delete", + "path": "/api/v1/orders", + "parameters": { + "query": [ + { + "id": "KXIxHhD4qw", + "name": "symbol", + "required": false, + "description": "symbol", + "example": "BTC-USDT", + "type": "string", + "schema": { + "type": "string", + "examples": [ + "BTC-USDT", + "ETH-USDT", + "KCS-USDT" + ] + }, + "enable": true + }, + { + "required": false, + "description": "The type of trading :TRADE(Spot Trading), MARGIN_TRADE(Cross Margin Trading), MARGIN_ISOLATED_TRADE(Isolated Margin Trading), and the default is TRADE to cancel the spot trading orders.", + "type": "string", + "id": "Pt2HaiQzCP", + "enable": true, + "name": "tradeType", + "schema": { + "type": "string", + "enum": [ + "TRADE", + "MARGIN_TRADE", + "MARGIN_ISOLATED_TRADE" + ], + "default": "TRADE", + "x-api-enum": [ + { + "value": "TRADE", + "name": "TRADE", + "description": "Spot Trading" + }, + { + "value": "MARGIN_TRADE", + "name": "MARGIN_TRADE", + "description": "Cross Margin Trading" + }, + { + "value": "MARGIN_ISOLATED_TRADE", + "name": "MARGIN_ISOLATED_TRADE", + "description": "Isolated Margin Trading" + } + ] + }, + "example": "TRADE" + } + ], + "path": [], + "cookie": [], + "header": [] + }, + "responses": [ + { + "id": "10572", + "code": 200, + "name": "OK", + "headers": [], + "jsonSchema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "cancelledOrderIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "cancelledOrderIds" + ] + } + }, + "required": [ + "code", + "data" + ] + }, + "description": "", + "contentType": "json", + "mediaType": "" + } + ], + "responseExamples": [ + { + "name": "Success", + "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"cancelledOrderIds\": [\r\n \"674a8635b38d120007709c0f\",\r\n \"674a8630439c100007d3bce1\"\r\n ]\r\n }\r\n}", + "responseId": 10572, "ordering": 1 } ], @@ -46393,223 +49247,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" - }, - "description": ":::tip[]\nIt is recommended to use the **DELETE /api/v1/hf/orders/{orderId}** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThis endpoint can be used to cancel a spot order by orderId.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\n:::", - "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByOrderIdOld\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.\",\"api-rate-limit-weight\":3}" - } - }, - { - "name": "Cancel Order By ClientOid - Old", - "api": { - "id": "3470344", - "method": "delete", - "path": "/api/v1/order/client-order/{clientOid}", - "parameters": { - "query": [], - "path": [ + "mediaType": "", + "examples": [ { - "id": "clientOid#0", - "name": "clientOid", - "required": true, - "description": "Client Order Id,unique identifier created by the user", - "example": "5c52e11203aa677f331e493fb", - "type": "string", - "enable": true + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" } ], - "cookie": [], - "header": [] - }, - "responses": [ - { - "id": "10571", - "code": 200, - "name": "OK", - "headers": [], - "jsonSchema": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "clientOid": { - "type": "string", - "description": "Client Order Id,unique identifier created by the user" - }, - "cancelledOrderId": { - "type": "string", - "description": "The unique order id generated by the trading system" - }, - "cancelledOcoOrderIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "cancelledOrderId", - "clientOid", - "cancelledOcoOrderIds" - ] - } - }, - "required": [ - "code", - "data" - ] - }, - "description": "", - "contentType": "json", - "mediaType": "" - } - ], - "responseExamples": [ - { - "name": "Success", - "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"cancelledOrderId\": \"67c3252a63d25e0007f91de9\",\r\n \"clientOid\": \"5c52e11203aa677f331e493fb\",\r\n \"cancelledOcoOrderIds\": null\r\n }\r\n}", - "responseId": 10571, - "ordering": 1 - } - ], - "requestBody": { - "type": "none", - "parameters": [], - "jsonSchema": { - "type": "object", - "properties": {} - }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" - }, - "description": ":::tip[]\nIt is recommended to use the **DELETE /api/v1/hf/orders/client-order/{clientOid}** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nThis endpoint can be used to cancel a spot order by clientOid.\nThis endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\n:::", - "customApiFields": "{\"abandon\":\"normal\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelOrderByClientOidOld\",\"sdk-method-description\":\"This endpoint can be used to cancel a spot order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to websocket.\",\"api-rate-limit-weight\":3}" - } - }, - { - "name": "Batch Cancel Order - Old", - "api": { - "id": "3470345", - "method": "delete", - "path": "/api/v1/orders", - "parameters": { - "query": [ - { - "id": "KXIxHhD4qw", - "name": "symbol", - "required": false, - "description": "symbol", - "example": "BTC-USDT", - "type": "string", - "schema": { - "type": "string", - "examples": [ - "BTC-USDT", - "ETH-USDT", - "KCS-USDT" - ] - }, - "enable": true - }, - { - "required": false, - "description": "The type of trading :TRADE(Spot Trading), MARGIN_TRADE(Cross Margin Trading), MARGIN_ISOLATED_TRADE(Isolated Margin Trading), and the default is TRADE to cancel the spot trading orders.", - "type": "string", - "id": "Pt2HaiQzCP", - "enable": true, - "name": "tradeType", - "schema": { - "type": "string", - "enum": [ - "TRADE", - "MARGIN_TRADE", - "MARGIN_ISOLATED_TRADE" - ], - "default": "TRADE", - "x-api-enum": [ - { - "value": "TRADE", - "name": "TRADE", - "description": "Spot Trading" - }, - { - "value": "MARGIN_TRADE", - "name": "MARGIN_TRADE", - "description": "Cross Margin Trading" - }, - { - "value": "MARGIN_ISOLATED_TRADE", - "name": "MARGIN_ISOLATED_TRADE", - "description": "Isolated Margin Trading" - } - ] - }, - "example": "TRADE" - } - ], - "path": [], - "cookie": [], - "header": [] - }, - "responses": [ - { - "id": "10572", - "code": 200, - "name": "OK", - "headers": [], - "jsonSchema": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "cancelledOrderIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "cancelledOrderIds" - ] - } - }, - "required": [ - "code", - "data" - ] - }, - "description": "", - "contentType": "json", - "mediaType": "" - } - ], - "responseExamples": [ - { - "name": "Success", - "data": "{\r\n \"code\": \"200000\",\r\n \"data\": {\r\n \"cancelledOrderIds\": [\r\n \"674a8635b38d120007709c0f\",\r\n \"674a8630439c100007d3bce1\"\r\n ]\r\n }\r\n}", - "responseId": 10572, - "ordering": 1 - } - ], - "requestBody": { - "type": "none", - "parameters": [], - "jsonSchema": { - "type": "object", - "properties": {} - }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **DELETE /api/v1/hf/orders/cancelAll** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest via this endpoint to cancel all open orders. The response is a list of ids of the canceled orders.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Spot\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"batchCancelOrderOld\",\"sdk-method-description\":\"Request via this endpoint to cancel all open orders. The response is a list of ids of the canceled orders.\",\"api-rate-limit-weight\":20}" @@ -47028,8 +49674,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **GET /api/v1/hf/orders/active** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest your current order list via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\n:::\n\n:::tip[Tips]\nWhen you query orders in active status, there is no time limit. However, when you query orders in done status, the start and end time range cannot exceed 7 * 24 hours. An error will occur if the specified time window exceeds the range. If you specify the end time only, the system will automatically calculate the start time as end time minus 7 * 24 hours, and vice versa.\n\nThe history for canceled orders is only kept for one month. The history for filled orders is only kept for six months.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrdersListOld\",\"sdk-method-description\":\"Request your current order list via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\",\"api-rate-limit-weight\":2}" @@ -47225,8 +49878,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **GET /api/v1/hf/orders/active** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest 1000 orders in the last 24 hours via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getRecentOrdersListOld\",\"sdk-method-description\":\"Request your current order list via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\",\"api-rate-limit-weight\":3}" @@ -47428,8 +50088,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **GET /api/v1/hf/orders/{orderId}** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest a single order info by order ID via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByOrderIdOld\",\"sdk-method-description\":\"Request a single order info by order ID via this endpoint.\",\"api-rate-limit-weight\":2}" @@ -47631,8 +50298,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **GET /api/v1/hf/orders/client-order/{clientOid}** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest via this interface to check the information of a single active order via clientOid. The system will send a prompt that the order does not exist if the order does not exist or has been settled.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getOrderByClientOidOld\",\"sdk-method-description\":\"Request via this interface to check the information of a single active order via clientOid. The system will send a prompt that the order does not exist if the order does not exist or has been settled.\",\"api-rate-limit-weight\":3}" @@ -47962,8 +50636,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **GET /api/v1/hf/fills** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest recent fills via this endpoint.\nThe return value is the data after Pagination, sorted in descending order according to time.\n:::\n\n:::tip[Tips]\nThe system allows you to retrieve up to one week’s worth of data (starting from the last day by default). If the time period of the queried data exceeds one week (time range from the start to end time exceeding 7 * 24 hours), the system will prompt to remind you that you have exceeded the time limit. If you only specified the start time, the system will automatically calculate the end time (end time = start time + 7 * 24 hours). Conversely, if you only specified the end time, the system will calculate the start time (start time = end time - 7 * 24 hours) the same way.\n\nThe total number of items retrieved cannot exceed 50,000. If it is exceeded, please shorten the query time range.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getTradeHistoryOld\",\"sdk-method-description\":\"Request recent fills via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\",\"api-rate-limit-weight\":10}" @@ -48107,8 +50788,15 @@ "type": "object", "properties": {} }, - "example": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"BTC-USDT\",\n \"orderId\": \"670fd33bf9406e0007ab3945\",\n \"newPrice\": \"30000\",\n \"newSize\": \"0.0001\"\n}", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[]\nIt is recommended to use the **GET /api/v1/hf/fills** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest a list of 1000 fills in the last 24 hours via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Spot\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"getRecentTradeHistoryOld\",\"sdk-method-description\":\"Request a list of 1000 fills in the last 24 hours via this endpoint. The return value is the data after Pagination, sorted in descending order according to time.\",\"api-rate-limit-weight\":20}" @@ -48227,7 +50915,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/margin/accounts** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest margin account info via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getMarginAccountDetail\",\"sdk-method-description\":\"Request margin account info via this endpoint.\",\"api-rate-limit-weight\":40}" @@ -48508,8 +51197,15 @@ "clientOid" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e4193fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e4193fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **POST /api/v3/hf/margin/order** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nPlace order in the Cross-margin or Isolated-margin trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | Yes | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| type | String | No | Order type ‘limit’ and ‘market’, default is limit |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| marginModel | String | No | The type of trading, including cross (cross mode) and isolated (isolated mode). It is set at cross by default. |\n| autoBorrow | boolean | No | When Margin Account has inefficient balance, our system autoborrows inefficient assets and opens positions according to the lowest market interest rate. |\n| autoRepay | boolean | No | AutoPay allows returning borrowed assets when you close a position. Our system automatically triggers the repayment and the maximum repayment amount equals to the filled-order amount. |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n\n**Hidden Orders and Iceberg Orders (Hidden & Iceberg)**\n\nHidden orders and iceberg orders can be set in advanced settings (iceberg orders are a special type of hidden order). When placing limit orders or stop limit orders, you can choose to execute according to either hidden orders or iceberg orders.\n\nHidden orders are not shown in order books.\n\nUnlike hidden orders, iceberg orders are divided into visible and hidden portions. When engaging in iceberg orders, visible order sizes must be set. The minimum visible size for an iceberg order is 1/20 of the total order size.\n\nWhen matching, the visible portions of iceberg orders are matched first. Once the visible portions are fully matched, hidden portions will emerge. This will continue until the order is fully filled.\n\nNote:\n\n- The system will charge taker fees for hidden orders and iceberg orders.\n- If you simultaneously set iceberg orders and hidden orders, your order will default to an iceberg order for execution.\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderV1\",\"sdk-method-description\":\"Place order in the Cross-margin or Isolated-margin trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.\",\"api-rate-limit-weight\":5}" @@ -48790,8 +51486,15 @@ "clientOid" ] }, - "example": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e4193fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "//limit order\n{\n \"type\": \"limit\",\n \"symbol\": \"BTC-USDT\",\n \"side\": \"buy\",\n \"price\": \"50000\",\n \"size\": \"0.00001\",\n \"clientOid\": \"5c52e11203aa677f33e4193fb\",\n \"remark\": \"order remarks\"\n}\n\n//market order 1\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"size\": \"0.00001\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n\n//market order 2\n// {\n// \"type\": \"market\",\n// \"symbol\": \"BTC-USDT\",\n// \"side\": \"buy\",\n// \"funds\": \"1\",\n// \"clientOid\": \"5c52e11203aa677f33e493fc\",\n// \"remark\": \"order remarks\"\n// }\n", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **POST /api/v3/hf/margin/order/test** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nOrder test endpoint: This endpoint’s request and return parameters are identical to the order endpoint, and can be used to verify whether the signature is correct, among other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\n:::\n\n:::tip[Tips]\nPlease note that once your order enters the order book, the system will freeze the handling fees for the order ahead of time.\n\nBefore placing orders, please be sure to fully understand the meaning of the parameters for each trading pair.\n:::\n\n:::tip[Tips]\nThe maximum number of active orders per account is 2000, with a maximum of 200 active orders per trading pair.\n:::\n\n\n**Public order placement request parameters**\n\n| Param | Type | Mandatory | Description |\n| --------- | ------ | --------- | ----------- |\n| clientOid | String | Yes | Client Order ID, unique identifier created by the user, the use of UUID is recommended |\n| symbol | String | Yes | symbol |\n| side | String | Yes | ‘buy’ or ‘sell’ |\n| type | String | No | Order type ‘limit’ and ‘market’, default is limit |\n| stp | String | No | self trade prevention is divided into four strategies: ‘CN’, ‘CO’, ‘CB’, and ‘DC’ |\n| marginModel | String | No | The type of trading, including cross (cross mode) and isolated (isolated mode). It is set at cross by default. |\n| autoBorrow | boolean | No | When Margin Account has inefficient balance, our system autoborrows inefficient assets and opens positions according to the lowest market interest rate. |\n| autoRepay | boolean | No | AutoPay allows returning borrowed assets when you close a position. Our system automatically triggers the repayment and the maximum repayment amount equals to the filled-order amount. |\n\n**Additional Request Parameters Required by ‘limit’ Orders**\n\n| Param | Type | Mandatory | Description |\n| ----------- | ------- | --------- | ----------- |\n| price | String | Yes | Specify price for currency |\n| size | String | Yes | Specify quantity for currency |\n| timeInForce | String | No | Order timing strategy ‘GTC’, ‘GTT’, ‘IOC’, ‘FOK’ (the default is ‘GTC’) |\n| cancelAfter | long | No | Cancel after ‘n’ seconds, the order timing strategy is ‘GTT’ |\n| postOnly | boolean | No | passive order labels, this is disabled when the order timing strategy is ‘IOC’ or ‘FOK’ |\n| hidden | boolean | No | Hidden or not (not shown in order book) |\n| iceberg | boolean | No | Whether or not only visible portions of orders are shown in iceberg orders |\n| visibleSize | String | No | Maximum visible quantity in iceberg orders |\n\n**Additional request parameters required by ‘market’ orders**\n\n| Param | Type | Mandatory | Description |\n| ----- | ------ | --------- | ------------------------------------------ |\n| size | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n| funds | String | No | (Select one out of two: ‘size’ or ‘funds’) |\n\n\n\n**Hidden Orders and Iceberg Orders (Hidden & Iceberg)**\n\nHidden orders and iceberg orders can be set in advanced settings (iceberg orders are a special type of hidden order). When placing limit orders or stop limit orders, you can choose to execute according to either hidden orders or iceberg orders.\n\nHidden orders are not shown in order books.\n\nUnlike hidden orders, iceberg orders are divided into visible and hidden portions. When engaging in iceberg orders, visible order sizes must be set. The minimum visible size for an iceberg order is 1/20 of the total order size.\n\nWhen matching, the visible portions of iceberg orders are matched first. Once the visible portions are fully matched, hidden portions will emerge. This will continue until the order is fully filled.\n\nNote:\n\n- The system will charge taker fees for hidden orders and iceberg orders.\n- If you simultaneously set iceberg orders and hidden orders, your order will default to an iceberg order for execution.\n\n**Hold**\n\nFor limit price purchase orders, we will hold the amount of funds (price * size) required for your purchase order. Similarly, for limit price sell orders, we will also hold you sell order assets. When the transaction is executed, the service fees will be calculated. If you cancel a portion of a filled or unfilled order, then the remaining funds or amounts will be released and returned to your account. For market price buy/sell orders that require specific funds, we will hold the required funds in from your account. If only the size is specified, we may freeze (usually for a very short amount of time) all of the funds in your account prior to the order being filled or canceled.\n\n\n**Order Lifecycle**\n\nWhen an order placement request is successful (the matching engine receives the order) or denied (due to there being insufficient funds or illegal parameter values, etc.), the system will respond to the HTTP request. When an order is successfully placed, the order ID is returned. The order will be matched, which could result in it being fully or partially filled. When an order is fully or partially filled, the remaining portions of the order will be in an active state awaiting to be matched (this does not include IOC orders). Orders that are fully or partially filled (already canceled) will be put into the “done” state.\n\nUsers that have subscribed to the Market Data Channel can use the order ID (orderId) and client ID (clientOid) to identify messages.\n\n**Price Protection Mechanisms**\n\nPrice protection mechanisms ae enabled for order placements. Rules are detailed below:\n\n- If the spot trading market order/limit order placed by the user can be directly matched with an order in the current order book, the system will judge whether deviation between the price corresponding to the transaction depth and the spread exceeds the threshold value (the threshold value can be obtained using the symbol API endpoint);\n\n- If it is exceeded, for limit orders, the order will be directly canceled;\n\n- If it is a market order, then the system will partially execute the order. The execution limit will be the order size within the price range corresponding to the threshold value. The remaining orders will not be filled.\n\nFor example: If the threshold value is 10%, when a user places a market price purchase order in the KCS/USDT trading market for 10,000 USDT (the selling price is currently 1.20000), the system will determine that after the order is completely filled, the final price will be 1.40000. (1.40000-1.20000)/1.20000=16.7%>10%. The threshold value is 1.32000. The user’s market price purchase order will be filled only to a maximum of 1.32000. The remaining order portions will not be matched with orders in the order book. Note: This feature may not be able to determine depth with complete accuracy. If your order is not completely filled, it may be because the portion exceeding the threshold value was not filled.\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"Margin\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Margin\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"addOrderTestV1\",\"sdk-method-description\":\"Order test endpoint: This endpoint’s request and return parameters are identical to the order endpoint, and can be used to verify whether the signature is correct, among other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.\",\"api-rate-limit-weight\":5}" @@ -49056,7 +51759,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/isolated/accounts** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest the isolated margin account info list via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getIsolatedMarginAccountListV1\",\"sdk-method-description\":\"Request the isolated margin account info list via this endpoint.\",\"api-rate-limit-weight\":50}" @@ -49272,7 +51976,8 @@ "type": "object", "properties": {} }, - "mediaType": "" + "mediaType": "", + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **GET /api/v3/isolated/accounts** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nRequest isolated margin account info via this endpoint.\n:::", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Spot\",\"api-channel\":\"Private\",\"api-permission\":\"General\",\"api-rate-limit-pool\":\"Spot\",\"sdk-service\":\"Account\",\"sdk-sub-service\":\"Account\",\"sdk-method-name\":\"getIsolatedMarginAccountDetailV1\",\"sdk-method-description\":\"Request isolated margin account info via this endpoint.\",\"api-rate-limit-weight\":50}" @@ -49355,8 +52060,15 @@ "status" ] }, - "example": "{\n \"symbol\": \"XBTUSDTM\",\n \"status\": true\n}", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "{\n \"symbol\": \"XBTUSDTM\",\n \"status\": true\n}", + "mediaType": "application/json", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nCurrently, it is not recommended to use the Isolated margin + auto deposit margin. It is recommended to switch to cross margin mode.\nPlease refer to **POST /api/v2/position/changeMarginMode** endpoint\n:::\n\n:::info[Description]\nThis endpoint is only applicable to isolated margin and is no longer recommended. It is recommended to use cross margin instead.\n:::\n", "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Positions\",\"sdk-method-name\":\"modifyAutoDepositStatus\",\"sdk-method-description\":\"This endpoint is only applicable to isolated margin and is no longer recommended. It is recommended to use cross margin instead.\",\"api-rate-limit-weight\":4}" @@ -49369,7 +52081,6 @@ "method": "delete", "path": "/api/v1/orders", "parameters": { - "path": [], "query": [ { "id": "2KbksGFfyd", @@ -49377,9 +52088,11 @@ "required": false, "description": "To cancel all limit orders for a specific contract only, unless otherwise specified, all limit orders will be deleted. Please refer to [Get Symbol endpoint: symbol](apidog://link/endpoint/3470220) ", "example": "XBTUSDTM", - "type": "string" + "type": "string", + "enable": true } ], + "path": [], "cookie": [], "header": [] }, @@ -49418,7 +52131,8 @@ }, "description": "", "contentType": "json", - "mediaType": "" + "mediaType": "", + "oasExtensions": "" } ], "responseExamples": [ @@ -49426,7 +52140,10 @@ "name": "Success", "data": "{\n \"code\": \"200000\",\n \"data\": {\n \"cancelledOrderIds\": [\n \"235919172150824960\",\n \"235919172150824961\"\n ]\n }\n}", "responseId": 10701, - "ordering": 1 + "ordering": 1, + "description": "", + "oasKey": "", + "oasExtensions": "" } ], "requestBody": { @@ -49436,11 +52153,18 @@ "type": "object", "properties": {} }, - "example": "", - "mediaType": "" + "mediaType": "", + "examples": [ + { + "value": "", + "mediaType": "none", + "description": "" + } + ], + "oasExtensions": "" }, "description": ":::tip[TIPS]\nIt is recommended to use the **DELETE /api/v3/orders** endpoint instead of this endpoint\n:::\n\n:::info[Description]\nUsing this endpoint, all open orders (excluding stop orders) can be canceled in batches.\n\nThe response is a list of orderIDs of the canceled orders.\n:::\n", - "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllOrdersV1\",\"sdk-method-description\":\"Cancel all open orders (excluding stop orders). The response is a list of orderIDs of the canceled orders.\",\"api-rate-limit-weight\":200}" + "customApiFields": "{\"abandon\":\"abandon\",\"domain\":\"Futures\",\"api-channel\":\"Private\",\"api-permission\":\"Futures\",\"api-rate-limit-pool\":\"Futures\",\"sdk-service\":\"Futures\",\"sdk-sub-service\":\"Order\",\"sdk-method-name\":\"cancelAllOrdersV1\",\"sdk-method-description\":\"Cancel all open orders (excluding stop orders). The response is a list of orderIDs of the canceled orders.\",\"api-rate-limit-weight\":800}" } } ] @@ -49451,14 +52175,7 @@ "name": "Developing", "id": 348188, "description": "", - "items": [ - { - "name": "Websocket API", - "id": 348262, - "description": "", - "items": [] - } - ] + "items": [] } ] } @@ -50911,7 +53628,7 @@ }, "orderTime": { "type": "integer", - "description": "Order time (milliseconds)", + "description": "Gateway received the message time (milliseconds)", "format": "int64" }, "orderType": { @@ -51017,7 +53734,7 @@ }, "ts": { "type": "integer", - "description": "Push time (nanoseconds)", + "description": "Match engine received the message time\n (nanoseconds)", "format": "int64" }, "type": { @@ -51210,7 +53927,7 @@ }, "orderTime": { "type": "integer", - "description": "Order time (milliseconds)", + "description": "Gateway received the message time (milliseconds)", "format": "int64" }, "orderType": { @@ -51316,7 +54033,7 @@ }, "ts": { "type": "integer", - "description": "Push time (nanoseconds)", + "description": "Match engine received the message time\n (nanoseconds)", "format": "int64" }, "type": { @@ -51675,10 +54392,15 @@ }, "stop": { "type": "string", - "description": "Order type: loss: stop loss order, oco: oco order", + "description": "Order type", "enum": [ "loss", - "oco" + "entry", + "l_l_o", + "l_s_o", + "e_l_o", + "e_s_o", + "tso" ], "x-api-enum": [ { @@ -51687,9 +54409,34 @@ "description": "stop loss order" }, { - "value": "oco", - "name": "oco", - "description": "oco order" + "value": "entry", + "name": "entry", + "description": "Take profit order" + }, + { + "value": "l_l_o", + "name": "l_l_o", + "description": "Limit stop loss OCO order" + }, + { + "value": "l_s_o", + "name": "l_s_o", + "description": "Trigger stop loss OCO order" + }, + { + "value": "e_l_o", + "name": "e_l_o", + "description": "Limit stop profit OCO order" + }, + { + "value": "e_s_o", + "name": "e_s_o", + "description": "Trigger stop profit OCO order" + }, + { + "value": "tso", + "name": "tso", + "description": "Moving stop loss order" } ] }, @@ -53273,7 +56020,7 @@ "orderTime": { "type": "integer", "format": "int64", - "description": "Order time (nanoseconds)" + "description": "Gateway received the message time (milliseconds)" }, "size": { "type": "string", @@ -53320,7 +56067,7 @@ "ts": { "type": "integer", "format": "int64", - "description": "Push time (nanoseconds)" + "description": "Match engine received the message time\n (nanoseconds)" }, "liquidity": { "type": "string", @@ -53590,7 +56337,7 @@ "orderTime": { "type": "integer", "format": "int64", - "description": "Order time (nanoseconds)" + "description": "Gateway received the message time (milliseconds)" }, "size": { "type": "string", @@ -53637,7 +56384,7 @@ "ts": { "type": "integer", "format": "int64", - "description": "Push time (nanoseconds)" + "description": "Match engine received the message time\n (nanoseconds)" }, "liquidity": { "type": "string", @@ -54052,7 +56799,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "integer", @@ -54080,7 +56827,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin" }, "maintMargin": { "type": "number", @@ -54346,7 +57093,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "integer", @@ -54374,7 +57121,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin\n" }, "maintMargin": { "type": "number", @@ -54480,15 +57227,11 @@ }, "data": { "type": "object", - "properties": { - "SYMBOL": { - "type": "string", - "description": "The SYMBOL is the key with value \n\"CROSS\" or \"ISOLATED\"" - } - }, - "required": [ - "SYMBOL" - ] + "properties": {}, + "description": "The SYMBOL is the key with value \n\"CROSS\" or \"ISOLATED\"", + "additionalProperties": { + "type": "string" + } }, "subject": { "type": "string" @@ -54892,14 +57635,29 @@ "outTime": { "type": "integer", "description": "Out time by the websocket gateway (ms)" + }, + "msg": { + "type": "string", + "description": "Error return msg" + }, + "userRateLimit": { + "type": "object", + "properties": { + "limit": { + "type": "integer" + }, + "reset": { + "type": "integer" + }, + "remaining": { + "type": "integer" + } + } } }, "required": [ - "id", - "data", "inTime", - "outTime", - "op" + "outTime" ] } }, @@ -55007,14 +57765,29 @@ "outTime": { "type": "integer", "description": "Out time by the websocket gateway (ms)" + }, + "msg": { + "type": "string", + "description": "Error return msg" + }, + "userRateLimit": { + "type": "object", + "properties": { + "limit": { + "type": "string" + }, + "reset": { + "type": "string" + }, + "remaining": { + "type": "string" + } + } } }, "required": [ - "id", - "data", "inTime", - "outTime", - "op" + "outTime" ] } }, diff --git a/spec/rest/api/openapi-account-account.json b/spec/rest/api/openapi-account-account.json index 0b139301..cfa316e9 100644 --- a/spec/rest/api/openapi-account-account.json +++ b/spec/rest/api/openapi-account-account.json @@ -580,41 +580,7 @@ }, "status": { "type": "string", - "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing", - "enum": [ - "EFFECTIVE", - "BANKRUPTCY", - "LIQUIDATION", - "REPAY", - "BORROW" - ], - "x-api-enum": [ - { - "value": "EFFECTIVE", - "name": "EFFECTIVE", - "description": "Effective" - }, - { - "value": "BANKRUPTCY", - "name": "BANKRUPTCY", - "description": "Bankruptcy liquidation" - }, - { - "value": "LIQUIDATION", - "name": "LIQUIDATION", - "description": "Closing" - }, - { - "value": "REPAY", - "name": "REPAY", - "description": "Repayment" - }, - { - "value": "BORROW", - "name": "BORROW", - "description": "Borrowing" - } - ] + "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" }, "accounts": { "type": "array", @@ -652,6 +618,14 @@ "transferInEnabled": { "type": "boolean", "description": "Support transfer or not" + }, + "liabilityPrincipal": { + "type": "string", + "description": "Outstanding principal – the unpaid loan amount" + }, + "liabilityInterest": { + "type": "string", + "description": "Accrued interest – the unpaid interest amount" } }, "required": [ @@ -660,6 +634,8 @@ "available", "hold", "liability", + "liabilityPrincipal", + "liabilityInterest", "maxBorrowSize", "borrowEnabled", "transferInEnabled" @@ -697,7 +673,7 @@ "x-sdk-method-name": "getCrossMarginAccount", "x-sdk-method-description": "Request cross margin account info via this endpoint.", "x-api-rate-limit-weight": 15, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"0.02\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"accounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"total\\\": \\\"0.02\\\",\\n \\\"available\\\": \\\"0.02\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true\\n }\\n ]\\n }\\n}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"40.8648372\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"accounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"total\\\": \\\"38.68855864\\\",\\n \\\"available\\\": \\\"20.01916691\\\",\\n \\\"hold\\\": \\\"18.66939173\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"liabilityPrincipal\\\": \\\"0\\\",\\n \\\"liabilityInterest\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"163\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"quoteCurrency\\\": \\\"USDT\\\", \\\"queryType\\\": \\\"MARGIN\\\"}", "operationId": "006" } @@ -821,41 +797,7 @@ }, "status": { "type": "string", - "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing", - "enum": [ - "EFFECTIVE", - "BANKRUPTCY", - "LIQUIDATION", - "REPAY", - "BORROW" - ], - "x-api-enum": [ - { - "value": "EFFECTIVE", - "name": "EFFECTIVE", - "description": "Effective" - }, - { - "value": "BANKRUPTCY", - "name": "BANKRUPTCY", - "description": "Bankruptcy liquidation" - }, - { - "value": "LIQUIDATION", - "name": "LIQUIDATION", - "description": "Closing" - }, - { - "value": "REPAY", - "name": "REPAY", - "description": "Repayment" - }, - { - "value": "BORROW", - "name": "BORROW", - "description": "Borrowing" - } - ] + "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" }, "debtRatio": { "type": "string", @@ -895,6 +837,14 @@ "maxBorrowSize": { "type": "string", "description": "The user's remaining maximum loan amount" + }, + "liabilityPrincipal": { + "type": "string", + "description": "Outstanding principal" + }, + "liabilityInterest": { + "type": "string", + "description": "Outstanding interest" } }, "required": [ @@ -902,6 +852,8 @@ "borrowEnabled", "transferInEnabled", "liability", + "liabilityPrincipal", + "liabilityInterest", "total", "available", "hold", @@ -943,6 +895,12 @@ "maxBorrowSize": { "type": "string", "description": "The user's remaining maximum loan amount" + }, + "liabilityPrincipal": { + "type": "string" + }, + "liabilityInterest": { + "type": "string" } }, "required": [ @@ -950,6 +908,8 @@ "borrowEnabled", "transferInEnabled", "liability", + "liabilityPrincipal", + "liabilityInterest", "total", "available", "hold", @@ -957,14 +917,7 @@ ], "description": "quote asset" } - }, - "required": [ - "symbol", - "status", - "debtRatio", - "baseAsset", - "quoteAsset" - ] + } } } }, @@ -996,8 +949,8 @@ "x-sdk-method-name": "getIsolatedMarginAccount", "x-sdk-method-description": "Request isolated margin account info via this endpoint.", "x-api-rate-limit-weight": 15, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"0.01\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0\\\",\\n \\\"timestamp\\\": 1728725465994,\\n \\\"assets\\\": [\\n {\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"baseAsset\\\": {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0\\\",\\n \\\"total\\\": \\\"0\\\",\\n \\\"available\\\": \\\"0\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\"\\n },\\n \\\"quoteAsset\\\": {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0\\\",\\n \\\"total\\\": \\\"0.01\\\",\\n \\\"available\\\": \\\"0.01\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\"\\n }\\n }\\n ]\\n }\\n}", - "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\", \\\"quoteCurrency\\\": \\\"USDT\\\", \\\"queryType\\\": \\\"ISOLATED\\\"}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"4.97047372\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0.00038891\\\",\\n \\\"timestamp\\\": 1747303659773,\\n \\\"assets\\\": [\\n {\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"baseAsset\\\": {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0\\\",\\n \\\"liabilityPrincipal\\\": \\\"0\\\",\\n \\\"liabilityInterest\\\": \\\"0\\\",\\n \\\"total\\\": \\\"0\\\",\\n \\\"available\\\": \\\"0\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\"\\n },\\n \\\"quoteAsset\\\": {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0.00038891\\\",\\n \\\"liabilityPrincipal\\\": \\\"0.00038888\\\",\\n \\\"liabilityInterest\\\": \\\"0.00000003\\\",\\n \\\"total\\\": \\\"4.97047372\\\",\\n \\\"available\\\": \\\"4.97047372\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"44\\\"\\n }\\n }\\n ]\\n }\\n}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"quoteCurrency\\\": \\\"USDT\\\", \\\"queryType\\\": \\\"ISOLATED\\\"}", "operationId": "007" } }, @@ -1382,6 +1335,7 @@ "enum": [ "TRADE_EXCHANGE", "TRANSFER", + "SUB_TRANSFER", "RETURNED_FEES", "DEDUCTION_FEES", "OTHER" @@ -1390,27 +1344,32 @@ { "value": "TRADE_EXCHANGE", "name": "TRADE_EXCHANGE", - "description": "trade exchange" + "description": "Trade exchange" }, { "value": "TRANSFER", "name": "TRANSFER", - "description": "transfer" + "description": "Transfer" + }, + { + "value": "SUB_TRANSFER", + "name": "SUB_TRANSFER", + "description": "Sub transfer" }, { "value": "RETURNED_FEES", "name": "RETURNED_FEES", - "description": "returned fees" + "description": "Returned fees" }, { "value": "DEDUCTION_FEES", "name": "DEDUCTION_FEES", - "description": "deduction fees" + "description": "Deduction fees" }, { "value": "OTHER", "name": "OTHER", - "description": "other" + "description": "Other" } ] } diff --git a/spec/rest/api/openapi-account-deposit.json b/spec/rest/api/openapi-account-deposit.json index 2123a134..e6d7c4e3 100644 --- a/spec/rest/api/openapi-account-deposit.json +++ b/spec/rest/api/openapi-account-deposit.json @@ -1067,18 +1067,18 @@ "type": "string", "description": "Deposit account type: main (funding account), trade (spot trading account); the default is main", "enum": [ - "main", - "trade" + "MAIN", + "TRADE" ], - "default": "main", + "default": "MAIN", "x-api-enum": [ { - "value": "main", + "value": "MAIN", "name": "main", "description": "Funding account" }, { - "value": "trade", + "value": "TRADE", "name": "trade", "description": "Spot account" } @@ -1089,12 +1089,12 @@ "currency" ] }, - "example": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\"\n}" + "example": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\",\n \"to\": \"MAIN\"\n}" } } }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"address\\\":\\\"0x02028456f38e78609904e8a002c787ede7a73d7c\\\",\\\"memo\\\":null,\\\"chain\\\":\\\"ERC20\\\",\\\"chainId\\\":\\\"eth\\\",\\\"to\\\":\\\"MAIN\\\",\\\"currency\\\":\\\"ETH\\\"}}", - "x-request-example": "{\\\"currency\\\": \\\"ETH\\\", \\\"chain\\\": \\\"eth\\\"}", + "x-request-example": "{\\\"currency\\\": \\\"ETH\\\", \\\"chain\\\": \\\"eth\\\", \\\"to\\\": \\\"MAIN\\\"}", "operationId": "007" } }, diff --git a/spec/rest/api/openapi-account-subaccount.json b/spec/rest/api/openapi-account-subaccount.json index bcdf326a..02365f29 100644 --- a/spec/rest/api/openapi-account-subaccount.json +++ b/spec/rest/api/openapi-account-subaccount.json @@ -30,19 +30,19 @@ "properties": { "uid": { "type": "integer", - "description": "Sub-account UID" + "description": "Sub account user id" }, "subName": { "type": "string", - "description": "Sub-account name" + "description": "Sub account name" }, "remarks": { "type": "string", - "description": "Remarks" + "description": "Sub account name" }, "access": { "type": "string", - "description": "Permission" + "description": "permission" } }, "required": [ @@ -125,12 +125,12 @@ "access" ] }, - "example": "{\n \"password\": \"1234567\",\n \"remarks\": \"TheRemark\",\n \"subName\": \"Name1234567\",\n \"access\": \"Spot\"\n}" + "example": "{\n \"password\": \"q1234567\",\n \"access\": \"Spot\",\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\"\n}" } } }, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 10,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"userId\\\": \\\"63743f07e0c5230001761d08\\\",\\n \\\"uid\\\": 169579801,\\n \\\"subName\\\": \\\"testapi6\\\",\\n \\\"status\\\": 2,\\n \\\"type\\\": 0,\\n \\\"access\\\": \\\"All\\\",\\n \\\"createdAt\\\": 1668562696000,\\n \\\"remarks\\\": \\\"remarks\\\",\\n \\\"tradeTypes\\\": [\\n \\\"Spot\\\",\\n \\\"Futures\\\",\\n \\\"Margin\\\"\\n ],\\n \\\"openedTradeTypes\\\": [\\n \\\"Spot\\\"\\n ],\\n \\\"hostedStatus\\\": null\\n }\\n ]\\n }\\n}", - "x-request-example": "{\\\"password\\\": \\\"1234567\\\", \\\"remarks\\\": \\\"TheRemark\\\", \\\"subName\\\": \\\"Name1234567\\\", \\\"access\\\": \\\"Spot\\\"}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"uid\\\": 245730746,\\n \\\"subName\\\": \\\"subNameTest1\\\",\\n \\\"remarks\\\": \\\"TheRemark\\\",\\n \\\"access\\\": \\\"Spot\\\"\\n }\\n}", + "x-request-example": "{\\\"password\\\": \\\"q1234567\\\", \\\"access\\\": \\\"Spot\\\", \\\"subName\\\": \\\"subNameTest1\\\", \\\"remarks\\\": \\\"TheRemark\\\"}", "operationId": "001" } }, diff --git a/spec/rest/api/openapi-account-withdrawal.json b/spec/rest/api/openapi-account-withdrawal.json index 31e4bc62..0648c9ca 100644 --- a/spec/rest/api/openapi-account-withdrawal.json +++ b/spec/rest/api/openapi-account-withdrawal.json @@ -266,8 +266,7 @@ ] }, "amount": { - "type": "integer", - "format": "int64", + "type": "string", "description": "Withdrawal amount, a positive number which is a multiple of the amount precision" }, "memo": { @@ -337,12 +336,12 @@ "withdrawType" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": 3,\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}" + "example": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": \"3\",\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}" } } }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"withdrawalId\\\":\\\"670deec84d64da0007d7c946\\\"}}", - "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"toAddress\\\": \\\"TKFRQXSDcY****GmLrjJggwX8\\\", \\\"amount\\\": 3, \\\"withdrawType\\\": \\\"ADDRESS\\\", \\\"chain\\\": \\\"trx\\\", \\\"isInner\\\": true, \\\"remark\\\": \\\"this is Remark\\\"}", + "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"toAddress\\\": \\\"TKFRQXSDcY****GmLrjJggwX8\\\", \\\"amount\\\": \\\"3\\\", \\\"withdrawType\\\": \\\"ADDRESS\\\", \\\"chain\\\": \\\"trx\\\", \\\"isInner\\\": true, \\\"remark\\\": \\\"this is Remark\\\"}", "operationId": "002" } }, @@ -401,6 +400,237 @@ "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":null}", "x-request-example": "{\\\"withdrawalId\\\": \\\"670b891f7e0f440007730692\\\"}", "operationId": "003" + }, + "get": { + "summary": "Get Withdrawal History By ID", + "deprecated": false, + "description": "Request a withdrawal history by id via this endpoint.", + "tags": [], + "parameters": [ + { + "name": "withdrawalId", + "in": "path", + "description": "withdrawal ID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID" + }, + "uid": { + "type": "integer", + "description": "User ID" + }, + "currency": { + "type": "string", + "description": "A unique currency code that will never change" + }, + "chainId": { + "type": "string", + "description": "The chain id of currency", + "example": [ + "eth", + "bech32", + "btc", + "kcc", + "trx", + "bsc", + "arbitrum", + "ton", + "optimism" + ] + }, + "chainName": { + "type": "string", + "description": "Chain name of currency" + }, + "currencyName": { + "type": "string", + "description": "Currency name; will change after renaming" + }, + "status": { + "type": "string", + "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE" + }, + "failureReason": { + "type": "string", + "description": "Failure reason code" + }, + "failureReasonMsg": { + "type": "string", + "description": "Failure reason message" + }, + "address": { + "type": "string", + "description": "Withwrawal address" + }, + "memo": { + "type": "string", + "description": "Address remark. If there’s no remark, it is empty. " + }, + "isInner": { + "type": "boolean", + "description": "Internal withdrawal or not. " + }, + "amount": { + "type": "string", + "description": "Withwrawal amount" + }, + "fee": { + "type": "string", + "description": "Fees charged for withwrawal" + }, + "walletTxId": { + "type": "string", + "description": "Wallet Transaction ID" + }, + "addressRemark": { + "type": "string", + "description": "Address remark" + }, + "remark": { + "type": "string", + "description": "Remark" + }, + "createdAt": { + "type": "integer", + "format": "int64", + "description": "Creation Time (milliseconds)" + }, + "cancelType": { + "type": "string", + "enum": [ + "CANCELABLE", + "CANCELING", + "NON_CANCELABLE" + ], + "x-api-enum": [ + { + "value": "CANCELABLE", + "name": "CANCELABLE", + "description": "Cancellable" + }, + { + "value": "CANCELING", + "name": "CANCELING", + "description": "Cancelling" + }, + { + "value": "NON_CANCELABLE", + "name": "NON_CANCELABLE", + "description": "Non-Cancellable" + } + ] + }, + "taxes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Users in some regions need query this field" + }, + "taxDescription": { + "type": "string", + "description": "Tax description" + }, + "returnStatus": { + "type": "string", + "enum": [ + "NOT_RETURN", + "PROCESSING", + "SUCCESS" + ], + "description": "Return status", + "x-api-enum": [ + { + "value": "NOT_RETURN", + "name": "NOT_RETURN", + "description": "No returned" + }, + { + "value": "PROCESSING", + "name": "PROCESSING", + "description": "To be returned" + }, + { + "value": "SUCCESS", + "name": "SUCCESS", + "description": "Returned" + } + ] + }, + "returnAmount": { + "type": "string", + "description": "Return amount" + }, + "returnCurrency": { + "type": "string", + "description": "Return currency" + } + }, + "required": [ + "id", + "uid", + "currency", + "chainId", + "chainName", + "currencyName", + "status", + "failureReason", + "address", + "memo", + "isInner", + "amount", + "fee", + "remark", + "createdAt", + "cancelType", + "returnStatus", + "returnCurrency" + ] + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3471890", + "x-abandon": "normal", + "x-domain": "Spot", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Management", + "x-sdk-service": "Account", + "x-sdk-sub-service": "Withdrawal", + "x-sdk-method-name": "getWithdrawalHistoryById", + "x-sdk-method-description": "Request a withdrawal history by id via this endpoint.", + "x-api-rate-limit-weight": 20, + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"67e6515f7960ba0007b42025\\\",\\n \\\"uid\\\": 165111215,\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"chainId\\\": \\\"trx\\\",\\n \\\"chainName\\\": \\\"TRC20\\\",\\n \\\"currencyName\\\": \\\"USDT\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"failureReason\\\": \\\"\\\",\\n \\\"failureReasonMsg\\\": null,\\n \\\"address\\\": \\\"TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8\\\",\\n \\\"memo\\\": \\\"\\\",\\n \\\"isInner\\\": true,\\n \\\"amount\\\": \\\"3.00000000\\\",\\n \\\"fee\\\": \\\"0.00000000\\\",\\n \\\"walletTxId\\\": null,\\n \\\"addressRemark\\\": null,\\n \\\"remark\\\": \\\"this is Remark\\\",\\n \\\"createdAt\\\": 1743147359000,\\n \\\"cancelType\\\": \\\"NON_CANCELABLE\\\",\\n \\\"taxes\\\": null,\\n \\\"taxDescription\\\": null,\\n \\\"returnStatus\\\": \\\"NOT_RETURN\\\",\\n \\\"returnAmount\\\": null,\\n \\\"returnCurrency\\\": \\\"KCS\\\"\\n }\\n}", + "x-request-example": "{\\\"withdrawalId\\\": \\\"67e6515f7960ba0007b42025\\\"}", + "operationId": "005" } }, "/api/v1/withdrawals": { @@ -555,7 +785,7 @@ }, "chain": { "type": "string", - "description": "The id of currency", + "description": "The chain id of currency", "example": [ "eth", "bech32", @@ -570,6 +800,7 @@ }, "status": { "type": "string", + "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE", "enum": [ "REVIEW", "PROCESSING", @@ -577,38 +808,37 @@ "FAILURE", "SUCCESS" ], - "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE", "x-api-enum": [ { "value": "REVIEW", "name": "REVIEW", - "description": "" + "description": "REVIEW" }, { "value": "PROCESSING", "name": "PROCESSING", - "description": "" + "description": "PROCESSING" }, { "value": "WALLET_PROCESSING", "name": "WALLET_PROCESSING", - "description": "" + "description": "WALLET_PROCESSING" }, { "value": "FAILURE", "name": "FAILURE", - "description": "" + "description": "FAILURE" }, { "value": "SUCCESS", "name": "SUCCESS", - "description": "" + "description": "SUCCESS" } ] }, "address": { "type": "string", - "description": "Deposit address" + "description": "Withwrawal address" }, "memo": { "type": "string", @@ -620,15 +850,15 @@ }, "amount": { "type": "string", - "description": "Deposit amount" + "description": "Withwrawal amount" }, "fee": { "type": "string", - "description": "Fees charged for deposit" + "description": "Fees charged for withwrawal" }, "walletTxId": { "type": "string", - "description": "Wallet Txid" + "description": "Wallet Txid, If this is an internal\nwithdrawal, it is empty. " }, "createdAt": { "type": "integer", @@ -802,7 +1032,7 @@ }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"withdrawalId\\\":\\\"670a973cf07b3800070e216c\\\"}}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"address\\\": \\\"TKFRQXSDc****16GmLrjJggwX8\\\", \\\"amount\\\": 3, \\\"chain\\\": \\\"trx\\\", \\\"isInner\\\": true}", - "operationId": "006" + "operationId": "007" } }, "/api/v1/hist-withdrawals": { @@ -1020,7 +1250,7 @@ "x-api-rate-limit-weight": 20, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 50,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"createAt\\\": 1526723468,\\n \\\"amount\\\": \\\"0.534\\\",\\n \\\"address\\\": \\\"33xW37ZSW4tQvg443Pc7NLCAs167Yc2XUV\\\",\\n \\\"walletTxId\\\": \\\"aeacea864c020acf58e51606169240e96774838dcd4f7ce48acf38e3651323f4\\\",\\n \\\"isInner\\\": false,\\n \\\"status\\\": \\\"SUCCESS\\\"\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"status\\\": \\\"SUCCESS\\\", \\\"startAt\\\": 1728663338000, \\\"endAt\\\": 1728692138000, \\\"currentPage\\\": 1, \\\"pageSize\\\": 50}", - "operationId": "005" + "operationId": "006" } } }, diff --git a/spec/rest/api/openapi-broker-ndbroker.json b/spec/rest/api/openapi-broker-ndbroker.json index 40fa4ff8..75b17357 100644 --- a/spec/rest/api/openapi-broker-ndbroker.json +++ b/spec/rest/api/openapi-broker-ndbroker.json @@ -7,6 +7,424 @@ }, "tags": [], "paths": { + "/api/kyc/ndBroker/proxyClient/submit": { + "post": { + "summary": "Submit KYC", + "deprecated": false, + "description": "This endpointcan submit kyc information for a sub-account of nd broker", + "tags": [], + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "string" + } + }, + "required": [ + "code" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472406", + "x-abandon": "normal", + "x-domain": "Broker", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Broker", + "x-sdk-service": "Broker", + "x-sdk-sub-service": "NDBroker", + "x-sdk-method-name": "submitKYC", + "x-sdk-method-description": "This endpointcan submit kyc information for a sub-account of nd broker", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "clientUid": { + "type": "string", + "description": "client uid", + "example": [ + "226383154" + ] + }, + "firstName": { + "type": "string", + "description": "first Name" + }, + "lastName": { + "type": "string", + "description": "last Name" + }, + "issueCountry": { + "type": "string", + "description": "ISO country code", + "example": [ + "CN", + "US", + "DE", + "JP" + ] + }, + "birthDate": { + "type": "string", + "description": "Birth Date", + "example": [ + "2000-01-01" + ] + }, + "identityType": { + "type": "string", + "description": "Identity type", + "enum": [ + "idcard", + "drivinglicense", + "passport", + "bvn" + ], + "x-api-enum": [ + { + "value": "idcard", + "name": "idcard", + "description": "id card" + }, + { + "value": "drivinglicense", + "name": "drivinglicense", + "description": "driving license" + }, + { + "value": "passport", + "name": "passport", + "description": "passport" + }, + { + "value": "bvn", + "name": "bvn", + "description": "bvn" + } + ] + }, + "identityNumber": { + "type": "string", + "description": "Identity Number" + }, + "expireDate": { + "type": "string", + "description": "expire Date. If there is no expiration date, please fill in: 2099-01-01", + "example": [ + "2030-01-01", + "2099-01-01" + ] + }, + "frontPhoto": { + "type": "string", + "description": "**Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + "example": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + }, + "backendPhoto": { + "type": "string", + "description": "**Optional when identityType=passport/bvn,** Back photo of ID, same as above", + "example": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + }, + "facePhoto": { + "type": "string", + "description": "Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + "example": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + } + }, + "required": [ + "clientUid", + "firstName", + "lastName", + "issueCountry", + "birthDate", + "identityType", + "identityNumber", + "expireDate", + "frontPhoto", + "facePhoto", + "backendPhoto" + ] + }, + "example": "{\n \"clientUid\": \"226383154\",\n \"firstName\": \"Kaylah\",\n \"lastName\": \"Padberg\",\n \"issueCountry\": \"JP\",\n \"birthDate\": \"2000-01-01\",\n \"expireDate\": \"2030-01-01\",\n \"identityType\": \"passport\",\n \"identityNumber\": \"55\",\n \"facePhoto\": \"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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\",\n \"frontPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\",\n \"backendPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\"\n}" + } + } + }, + "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":null}", + "x-request-example": "{\\\"clientUid\\\": \\\"226383154\\\", \\\"firstName\\\": \\\"Kaylah\\\", \\\"lastName\\\": \\\"Padberg\\\", \\\"issueCountry\\\": \\\"JP\\\", \\\"birthDate\\\": \\\"2000-01-01\\\", \\\"expireDate\\\": \\\"2030-01-01\\\", \\\"identityType\\\": \\\"passport\\\", \\\"identityNumber\\\": \\\"55\\\", \\\"facePhoto\\\": \\\"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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\\\", \\\"frontPhoto\\\": \\\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\\\", \\\"backendPhoto\\\": \\\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\\\"}", + "operationId": "001" + } + }, + "/api/kyc/ndBroker/proxyClient/status/list": { + "get": { + "summary": "Get KYC Status", + "deprecated": false, + "description": "This endpoint can query the specified Kyc status", + "tags": [], + "parameters": [ + { + "name": "clientUids", + "in": "query", + "description": "Client uid, Use commas to separate multiple UIDs\n", + "required": true, + "schema": { + "type": "string", + "example": [ + "226383154", + "226383154,22341356" + ] + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "clientUid": { + "type": "integer", + "description": "client uid" + }, + "status": { + "type": "string", + "enum": [ + "NONE", + "PROCESS", + "PASS", + "REJECT" + ], + "description": "KYC status", + "x-api-enum": [ + { + "value": "NONE", + "name": "NONE", + "description": "KYC information not submitted" + }, + { + "value": "PROCESS", + "name": "PROCESS", + "description": "In progress" + }, + { + "value": "PASS", + "name": "PASS", + "description": "Passed" + }, + { + "value": "REJECT", + "name": "REJECT", + "description": "Rejected" + } + ] + }, + "rejectReason": { + "type": "string", + "description": "Reject Reason" + } + }, + "required": [ + "status", + "clientUid" + ] + } + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472407", + "x-abandon": "normal", + "x-domain": "Broker", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Broker", + "x-sdk-service": "Broker", + "x-sdk-sub-service": "NDBroker", + "x-sdk-method-name": "getKYCStatus", + "x-sdk-method-description": "This endpoint can query the specified Kyc status", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"clientUid\\\": 226383154,\\n \\\"status\\\": \\\"PROCESS\\\",\\n \\\"rejectReason\\\": null\\n }\\n ]\\n}", + "x-request-example": "{\\\"clientUids\\\": \\\"226383154\\\"}", + "operationId": "002" + } + }, + "/api/kyc/ndBroker/proxyClient/status/page": { + "get": { + "summary": "Get KYC Status List", + "deprecated": false, + "description": "This endpoint can query the specified Kyc status list", + "tags": [], + "parameters": [ + { + "name": "pageNumber", + "in": "query", + "description": "Page Number", + "required": false, + "schema": { + "type": "integer", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "description": "Page Size", + "required": false, + "schema": { + "type": "integer", + "default": 100, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "currentPage": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "totalNum": { + "type": "integer" + }, + "totalPage": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "clientUid": { + "type": "integer", + "description": "client uid" + }, + "status": { + "type": "string", + "enum": [ + "NONE", + "PROCESS", + "PASS", + "REJECT" + ], + "description": "KYC status", + "x-api-enum": [ + { + "value": "NONE", + "name": "NONE", + "description": "KYC information not submitted" + }, + { + "value": "PROCESS", + "name": "PROCESS", + "description": "In progress" + }, + { + "value": "PASS", + "name": "PASS", + "description": "Passed" + }, + { + "value": "REJECT", + "name": "REJECT", + "description": "Rejected" + } + ] + }, + "rejectReason": { + "type": "string", + "description": "Reject Reason" + } + }, + "required": [ + "clientUid", + "status" + ] + } + } + }, + "required": [ + "currentPage", + "pageSize", + "totalNum", + "totalPage", + "items" + ] + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472408", + "x-abandon": "normal", + "x-domain": "Broker", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Broker", + "x-sdk-service": "Broker", + "x-sdk-sub-service": "NDBroker", + "x-sdk-method-name": "getKYCStatusList", + "x-sdk-method-description": "This endpoint can query the specified Kyc status list", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 100,\\n \\\"totalNum\\\": 9,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"clientUid\\\": 226383154,\\n \\\"status\\\": \\\"PROCESS\\\",\\n \\\"rejectReason\\\": null\\n },\\n {\\n \\\"clientUid\\\": 232772137,\\n \\\"status\\\": \\\"REJECT\\\",\\n \\\"rejectReason\\\": \\\"frontPhoto:Picture is not clear/covered/incomplete\\\"\\n }\\n ]\\n }\\n}", + "x-request-example": "{\\\"pageNumber\\\": 1, \\\"pageSize\\\": 100}", + "operationId": "003" + } + }, "/api/v1/broker/nd/info": { "get": { "summary": "Get Broker Info", @@ -114,7 +532,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"accountSize\\\": 0,\\n \\\"maxAccountSize\\\": null,\\n \\\"level\\\": 0\\n }\\n}", "x-request-example": "{\\\"begin\\\": \\\"20240510\\\", \\\"end\\\": \\\"20241010\\\", \\\"tradeType\\\": \\\"1\\\"}", - "operationId": "001" + "operationId": "004" } }, "/api/v1/broker/nd/account": { @@ -205,7 +623,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"accountName\\\": \\\"Account15\\\",\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"createdAt\\\": 1729819381908,\\n \\\"level\\\": 0\\n }\\n}", "x-request-example": "{\\\"accountName\\\": \\\"Account1\\\"}", - "operationId": "002" + "operationId": "005" }, "get": { "summary": "Get sub-account", @@ -217,7 +635,7 @@ "name": "uid", "in": "query", "description": "Sub-account UID", - "required": true, + "required": false, "schema": { "type": "string" } @@ -338,7 +756,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 20,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"accountName\\\": \\\"Account15\\\",\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"createdAt\\\": 1729819382000,\\n \\\"level\\\": 0\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"currentPage\\\": 1, \\\"pageSize\\\": 20}", - "operationId": "003" + "operationId": "006" } }, "/api/v1/broker/nd/account/apikey": { @@ -505,7 +923,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"label\\\": \\\"This is remarks\\\",\\n \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\",\\n \\\"secretKey\\\": \\\"d694df2******5bae05b96\\\",\\n \\\"apiVersion\\\": 3,\\n \\\"permissions\\\": [\\n \\\"General\\\",\\n \\\"Spot\\\"\\n ],\\n \\\"ipWhitelist\\\": [\\n \\\"127.0.0.1\\\",\\n \\\"123.123.123.123\\\"\\n ],\\n \\\"createdAt\\\": 1729821494000\\n }\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"passphrase\\\": \\\"11223344\\\", \\\"ipWhitelist\\\": [\\\"127.0.0.1\\\", \\\"123.123.123.123\\\"], \\\"permissions\\\": [\\\"general\\\", \\\"spot\\\"], \\\"label\\\": \\\"This is remarks\\\"}", - "operationId": "004" + "operationId": "007" }, "get": { "summary": "Get sub-account API", @@ -640,7 +1058,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"label\\\": \\\"This is remarks\\\",\\n \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\",\\n \\\"apiVersion\\\": 3,\\n \\\"permissions\\\": [\\n \\\"General\\\",\\n \\\"Spot\\\"\\n ],\\n \\\"ipWhitelist\\\": [\\n \\\"127.**.1\\\",\\n \\\"203.**.154\\\"\\n ],\\n \\\"createdAt\\\": 1729821494000\\n }\\n ]\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\"}", - "operationId": "005" + "operationId": "008" }, "delete": { "summary": "Delete sub-account API", @@ -704,7 +1122,7 @@ "x-api-rate-limit-weight": 3, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\"}", - "operationId": "007" + "operationId": "010" } }, "/api/v1/broker/nd/account/update-apikey": { @@ -866,7 +1284,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"label\\\": \\\"This is remarks\\\",\\n \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\",\\n \\\"apiVersion\\\": 3,\\n \\\"permissions\\\": [\\n \\\"General\\\",\\n \\\"Spot\\\"\\n ],\\n \\\"ipWhitelist\\\": [\\n \\\"127.**.1\\\",\\n \\\"123.**.123\\\"\\n ],\\n \\\"createdAt\\\": 1729821494000\\n }\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\", \\\"ipWhitelist\\\": [\\\"127.0.0.1\\\", \\\"123.123.123.123\\\"], \\\"permissions\\\": [\\\"general\\\", \\\"spot\\\"], \\\"label\\\": \\\"This is remarks\\\"}", - "operationId": "006" + "operationId": "009" } }, "/api/v1/broker/nd/transfer": { @@ -1019,7 +1437,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"orderId\\\": \\\"671b4600c1e3dd000726866d\\\"\\n }\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"amount\\\": \\\"1\\\", \\\"clientOid\\\": \\\"e6c24d23-6bc2-401b-bf9e-55e2daddfbc1\\\", \\\"direction\\\": \\\"OUT\\\", \\\"accountType\\\": \\\"MAIN\\\", \\\"specialUid\\\": \\\"226383154\\\", \\\"specialAccountType\\\": \\\"MAIN\\\"}", - "operationId": "008" + "operationId": "011" } }, "/api/v3/broker/nd/transfer/detail": { @@ -1241,7 +1659,7 @@ "x-api-rate-limit-weight": 1, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"orderId\\\": \\\"671b4600c1e3dd000726866d\\\",\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"amount\\\": \\\"1\\\",\\n \\\"fromUid\\\": 165111215,\\n \\\"fromAccountType\\\": \\\"MAIN\\\",\\n \\\"fromAccountTag\\\": \\\"DEFAULT\\\",\\n \\\"toUid\\\": 226383154,\\n \\\"toAccountType\\\": \\\"MAIN\\\",\\n \\\"toAccountTag\\\": \\\"DEFAULT\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"reason\\\": null,\\n \\\"createdAt\\\": 1729840640000\\n }\\n}", "x-request-example": "{\\\"orderId\\\": \\\"671b4600c1e3dd000726866d\\\"}", - "operationId": "009" + "operationId": "012" } }, "/api/v1/asset/ndbroker/deposit/list": { @@ -1460,7 +1878,7 @@ "x-api-rate-limit-weight": 10, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"uid\\\": 165111215,\\n \\\"hash\\\": \\\"6724e363a492800007ec602b\\\",\\n \\\"address\\\": \\\"xxxxxxx@gmail.com\\\",\\n \\\"memo\\\": \\\"\\\",\\n \\\"amount\\\": \\\"3.0\\\",\\n \\\"fee\\\": \\\"0.0\\\",\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"isInner\\\": true,\\n \\\"walletTxId\\\": \\\"bbbbbbbbb\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"chain\\\": \\\"\\\",\\n \\\"remark\\\": \\\"\\\",\\n \\\"createdAt\\\": 1730470760000,\\n \\\"updatedAt\\\": 1730470760000\\n }\\n ]\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"status\\\": \\\"SUCCESS\\\", \\\"hash\\\": \\\"example_string_default_value\\\", \\\"startTimestamp\\\": 123456, \\\"endTimestamp\\\": 123456, \\\"limit\\\": 100}", - "operationId": "010" + "operationId": "013" } }, "/api/v3/broker/nd/deposit/detail": { @@ -1624,7 +2042,7 @@ "x-api-rate-limit-weight": 1, "x-response-example": "{\\n \\\"data\\\" : {\\n \\\"chain\\\" : \\\"trx\\\",\\n \\\"hash\\\" : \\\"30bb0e0b***4156c5188\\\",\\n \\\"walletTxId\\\" : \\\"30bb0***610d1030f\\\",\\n \\\"uid\\\" : 201496341,\\n \\\"updatedAt\\\" : 1713429174000,\\n \\\"amount\\\" : \\\"8.5\\\",\\n \\\"memo\\\" : \\\"\\\",\\n \\\"fee\\\" : \\\"0.0\\\",\\n \\\"address\\\" : \\\"THLPzUrbd1o***vP7d\\\",\\n \\\"remark\\\" : \\\"Deposit\\\",\\n \\\"isInner\\\" : false,\\n \\\"currency\\\" : \\\"USDT\\\",\\n \\\"status\\\" : \\\"SUCCESS\\\",\\n \\\"createdAt\\\" : 1713429173000\\n },\\n \\\"code\\\" : \\\"200000\\\"\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"hash\\\": \\\"30bb0e0b***4156c5188\\\"}", - "operationId": "011" + "operationId": "014" } }, "/api/v3/broker/nd/withdraw/detail": { @@ -1791,7 +2209,7 @@ "x-api-rate-limit-weight": 1, "x-response-example": "{\\n \\\"data\\\": {\\n \\\"id\\\": \\\"66617a2***3c9a\\\",\\n \\\"chain\\\": \\\"ton\\\",\\n \\\"walletTxId\\\": \\\"AJ***eRI=\\\",\\n \\\"uid\\\": 157267400,\\n \\\"amount\\\": \\\"1.00000000\\\",\\n \\\"memo\\\": \\\"7025734\\\",\\n \\\"fee\\\": \\\"0.00000000\\\",\\n \\\"address\\\": \\\"EQDn***dKbGzr\\\",\\n \\\"remark\\\": \\\"\\\",\\n \\\"isInner\\\": false,\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"createdAt\\\": 1717664288000,\\n \\\"updatedAt\\\": 1717664375000\\n },\\n \\\"code\\\": \\\"200000\\\"\\n}", "x-request-example": "{\\\"withdrawalId\\\": \\\"66617a2***3c9a\\\"}", - "operationId": "012" + "operationId": "015" } }, "/api/v1/broker/nd/rebase/download": { @@ -1891,7 +2309,7 @@ "x-api-rate-limit-weight": 3, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"url\\\": \\\"https://kc-v2-promotion.s3.ap-northeast-1.amazonaws.com/broker/671aec522593f600019766d0_file.csv?X-Amz-Security-Token=IQo*********2cd90f14efb\\\"\\n }\\n}", "x-request-example": "{\\\"begin\\\": \\\"20240610\\\", \\\"end\\\": \\\"20241010\\\", \\\"tradeType\\\": \\\"1\\\"}", - "operationId": "013" + "operationId": "016" } } }, diff --git a/spec/rest/api/openapi-futures-fundingfees.json b/spec/rest/api/openapi-futures-fundingfees.json index b4a9c03b..88bb197c 100644 --- a/spec/rest/api/openapi-futures-fundingfees.json +++ b/spec/rest/api/openapi-futures-fundingfees.json @@ -9,7 +9,7 @@ "paths": { "/api/v1/funding-rate/{symbol}/current": { "get": { - "summary": "Get Current Funding Rate.", + "summary": "Get Current Funding Rate", "deprecated": false, "description": "Get Current Funding Rate.", "tags": [], @@ -48,7 +48,7 @@ }, "timePoint": { "type": "integer", - "description": "The funding rate settlement time point of the previous cycle\n(milliseconds)\n", + "description": "The funding rate settlement time point of the previous cycle\n(milliseconds)\nBefore going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched.\n The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled.\n The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live.\n\n", "format": "int64" }, "value": { @@ -66,6 +66,31 @@ "fundingRateFloor": { "type": "number", "description": "Minimum Funding Rate" + }, + "period": { + "type": "integer", + "enum": [ + 1, + 0 + ], + "description": "Indicates whether the current funding fee is charged within this cycle", + "x-api-enum": [ + { + "value": 1, + "name": "1", + "description": "Indicates that funding will be charged in the current cycle" + }, + { + "value": 0, + "name": "0", + "description": "Indicates a cross-cycle expense record that is not charged in the current cycle." + } + ] + }, + "fundingTime": { + "type": "integer", + "description": "Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing.", + "format": "int64" } }, "required": [ @@ -75,7 +100,9 @@ "value", "predictedValue", "fundingRateCap", - "fundingRateFloor" + "fundingRateFloor", + "period", + "fundingTime" ] } }, @@ -99,7 +126,7 @@ "x-sdk-method-name": "getCurrentFundingRate", "x-sdk-method-description": "Get Current Funding Rate.", "x-api-rate-limit-weight": 2, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\".XBTUSDTMFPI8H\\\",\\n \\\"granularity\\\": 28800000,\\n \\\"timePoint\\\": 1731441600000,\\n \\\"value\\\": 6.41E-4,\\n \\\"predictedValue\\\": 5.2E-5,\\n \\\"fundingRateCap\\\": 0.003,\\n \\\"fundingRateFloor\\\": -0.003\\n }\\n}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\".XBTUSDTMFPI8H\\\",\\n \\\"granularity\\\": 28800000,\\n \\\"timePoint\\\": 1748462400000,\\n \\\"value\\\": 6.1E-5,\\n \\\"predictedValue\\\": 1.09E-4,\\n \\\"fundingRateCap\\\": 0.003,\\n \\\"fundingRateFloor\\\": -0.003,\\n \\\"period\\\": 0,\\n \\\"fundingTime\\\": 1748491200000\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", "operationId": "001" } diff --git a/spec/rest/api/openapi-futures-market.json b/spec/rest/api/openapi-futures-market.json index bdf44ba7..8556da3f 100644 --- a/spec/rest/api/openapi-futures-market.json +++ b/spec/rest/api/openapi-futures-market.json @@ -879,15 +879,10 @@ "takerFeeRate", "takerFixFee", "makerFixFee", - "settlementFee", "isDeleverage", "isQuanto", "isInverse", "markMethod", - "fairMethod", - "fundingBaseSymbol", - "fundingQuoteSymbol", - "fundingRateSymbol", "indexSymbol", "settlementSymbol", "status", diff --git a/spec/rest/api/openapi-futures-order.json b/spec/rest/api/openapi-futures-order.json index 37041b1b..cbe941ff 100644 --- a/spec/rest/api/openapi-futures-order.json +++ b/spec/rest/api/openapi-futures-order.json @@ -559,11 +559,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -812,7 +862,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelAllOrdersV1", "x-sdk-method-description": "Cancel all open orders (excluding stop orders). The response is a list of orderIDs of the canceled orders.", - "x-api-rate-limit-weight": 200, + "x-api-rate-limit-weight": 800, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"cancelledOrderIds\\\": [\\n \\\"235919172150824960\\\",\\n \\\"235919172150824961\\\"\\n ]\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", "operationId": "018" @@ -2364,11 +2414,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -2689,23 +2789,40 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", "description": "Trigger price type of stop orders", "enum": [ - "", "TP", "MP", - "IP" + "IP", + "" ], "x-api-enum": [ - { - "value": "", - "name": "NULL", - "description": "" - }, { "value": "TP", "name": "trade price", @@ -2720,6 +2837,11 @@ "value": "IP", "name": "index price", "description": "IP for index price, The index price can be obtained through relevant OPEN API for index services" + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" } ] }, @@ -3063,23 +3185,40 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", "description": "Trigger price type of stop orders", "enum": [ - "", "TP", "MP", - "IP" + "IP", + "" ], "x-api-enum": [ - { - "value": "", - "name": "NULL", - "description": "None" - }, { "value": "TP", "name": "trade price", @@ -3094,6 +3233,11 @@ "value": "IP", "name": "index price", "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" } ] }, @@ -3380,11 +3524,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders\n" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -3760,7 +3954,29 @@ }, "stop": { "type": "string", - "description": "A mark to the stop order type\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "feeRate": { "type": "string", @@ -4214,7 +4430,29 @@ }, "stop": { "type": "string", - "description": "A mark to the stop order type" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "feeRate": { "type": "string", diff --git a/spec/rest/api/openapi-futures-positions.json b/spec/rest/api/openapi-futures-positions.json index baa91401..322db8fb 100644 --- a/spec/rest/api/openapi-futures-positions.json +++ b/spec/rest/api/openapi-futures-positions.json @@ -216,6 +216,131 @@ "operationId": "002" } }, + "/api/v2/position/batchChangeMarginMode": { + "post": { + "summary": "Batch Switch Margin Mode", + "deprecated": false, + "description": "Batch modify the margin mode of the symbols.", + "tags": [], + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "marginMode": { + "type": "object", + "properties": {}, + "description": "Target Margin Model, Symbols that failed to be modified will also be included", + "additionalProperties": { + "type": "string" + } + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Error code" + }, + "msg": { + "type": "string", + "description": "Error message" + }, + "symbol": { + "type": "string", + "description": "Symbol" + } + } + }, + "description": "Symbol which modification failed" + } + }, + "required": [ + "marginMode", + "errors" + ] + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472403", + "x-abandon": "normal", + "x-domain": "Futures", + "x-api-channel": "Private", + "x-api-permission": "Futures", + "x-api-rate-limit-pool": "Futures", + "x-sdk-service": "Futures", + "x-sdk-sub-service": "Positions", + "x-sdk-method-name": "batchSwitchMarginMode", + "x-sdk-method-description": "Batch modify the margin mode of the symbols.", + "x-api-rate-limit-weight": 2, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "marginMode": { + "type": "string", + "description": "Modified margin model: ISOLATED (isolated), CROSS (cross margin).", + "enum": [ + "ISOLATED", + "CROSS" + ], + "x-api-enum": [ + { + "value": "ISOLATED", + "name": "ISOLATED", + "description": "Isolated Margin Mode" + }, + { + "value": "CROSS", + "name": "CROSS", + "description": "Cross Margin MOde" + } + ] + }, + "symbols": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) " + } + }, + "required": [ + "marginMode", + "symbols" + ] + }, + "example": "{\n \"marginMode\": \"ISOLATED\",\n \"symbols\": [\n \"XBTUSDTM\",\n \"ETHUSDTM\"\n ]\n}" + } + } + }, + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"marginMode\\\": {\\n \\\"ETHUSDTM\\\": \\\"ISOLATED\\\",\\n \\\"XBTUSDTM\\\": \\\"CROSS\\\"\\n },\\n \\\"errors\\\": [\\n {\\n \\\"code\\\": \\\"50002\\\",\\n \\\"msg\\\": \\\"exist.order.or.position\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\"\\n }\\n ]\\n }\\n}", + "x-request-example": "{\\\"marginMode\\\": \\\"ISOLATED\\\", \\\"symbols\\\": [\\\"XBTUSDTM\\\", \\\"ETHUSDTM\\\"]}", + "operationId": "003" + } + }, "/api/v2/getMaxOpenSize": { "get": { "summary": "Get Max Open Size", @@ -312,7 +437,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"maxBuyOpenSize\\\": 0,\\n \\\"maxSellOpenSize\\\": 0\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"price\\\": \\\"example_string_default_value\\\", \\\"leverage\\\": 123456}", - "operationId": "003" + "operationId": "004" } }, "/api/v1/position": { @@ -369,7 +494,7 @@ }, "openingTimestamp": { "type": "integer", - "description": "Open time\n", + "description": "First opening time", "format": "int64" }, "currentTimestamp": { @@ -509,7 +634,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "integer", @@ -545,7 +670,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin\n" }, "maintMargin": { "type": "number", @@ -613,7 +738,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"500000000000988255\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"autoDeposit\\\": false,\\n \\\"crossMode\\\": false,\\n \\\"maintMarginReq\\\": 0.005,\\n \\\"riskLimit\\\": 500000,\\n \\\"realLeverage\\\": 2.88,\\n \\\"delevPercentage\\\": 0.18,\\n \\\"openingTimestamp\\\": 1729155616322,\\n \\\"currentTimestamp\\\": 1729482542135,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": 67.4309,\\n \\\"currentComm\\\": 0.01925174,\\n \\\"unrealisedCost\\\": 67.4309,\\n \\\"realisedGrossCost\\\": 0.0,\\n \\\"realisedCost\\\": 0.01925174,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 68900.7,\\n \\\"markValue\\\": 68.9007,\\n \\\"posCost\\\": 67.4309,\\n \\\"posCross\\\": 0.01645214,\\n \\\"posCrossMargin\\\": 0,\\n \\\"posInit\\\": 22.4769666644,\\n \\\"posComm\\\": 0.0539546299,\\n \\\"posCommCommon\\\": 0.0539447199,\\n \\\"posLoss\\\": 0.03766885,\\n \\\"posMargin\\\": 22.5097045843,\\n \\\"posFunding\\\": -0.0212068,\\n \\\"posMaint\\\": 0.3931320569,\\n \\\"maintMargin\\\": 23.9795045843,\\n \\\"realisedGrossPnl\\\": 0.0,\\n \\\"realisedPnl\\\": -0.06166534,\\n \\\"unrealisedPnl\\\": 1.4698,\\n \\\"unrealisedPnlPcnt\\\": 0.0218,\\n \\\"unrealisedRoePcnt\\\": 0.0654,\\n \\\"avgEntryPrice\\\": 67430.9,\\n \\\"liquidationPrice\\\": 45314.33,\\n \\\"bankruptPrice\\\": 44975.16,\\n \\\"settleCurrency\\\": \\\"USDT\\\",\\n \\\"maintainMargin\\\": 0.005,\\n \\\"riskLimitLevel\\\": 2,\\n \\\"marginMode\\\": \\\"ISOLATED\\\",\\n \\\"positionSide\\\": \\\"BOTH\\\",\\n \\\"leverage\\\": 2.88\\n }\\n}\\n", "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\"}", - "operationId": "004" + "operationId": "005" } }, "/api/v1/positions": { @@ -626,7 +751,7 @@ { "name": "currency", "in": "query", - "description": "Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty", + "description": "Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty", "required": false, "schema": { "type": "string", @@ -677,7 +802,7 @@ }, "openingTimestamp": { "type": "integer", - "description": "Open time\n", + "description": "First opening time", "format": "int64" }, "currentTimestamp": { @@ -817,7 +942,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "number", @@ -853,7 +978,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin" }, "maintMargin": { "type": "number", @@ -922,7 +1047,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"id\\\": \\\"500000000001046430\\\",\\n \\\"symbol\\\": \\\"ETHUSDM\\\",\\n \\\"crossMode\\\": true,\\n \\\"delevPercentage\\\": 0.71,\\n \\\"openingTimestamp\\\": 1730635780702,\\n \\\"currentTimestamp\\\": 1730636040926,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": -4.069805E-4,\\n \\\"currentComm\\\": 2.441E-7,\\n \\\"unrealisedCost\\\": -4.069805E-4,\\n \\\"realisedGrossCost\\\": 0.0,\\n \\\"realisedCost\\\": 2.441E-7,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 2454.12,\\n \\\"markValue\\\": -4.07478E-4,\\n \\\"posCost\\\": -4.069805E-4,\\n \\\"posInit\\\": 4.06981E-5,\\n \\\"posMargin\\\": 4.07478E-5,\\n \\\"realisedGrossPnl\\\": 0.0,\\n \\\"realisedPnl\\\": -2.441E-7,\\n \\\"unrealisedPnl\\\": -4.975E-7,\\n \\\"unrealisedPnlPcnt\\\": -0.0012,\\n \\\"unrealisedRoePcnt\\\": -0.0122,\\n \\\"avgEntryPrice\\\": 2457.12,\\n \\\"liquidationPrice\\\": 1429.96,\\n \\\"bankruptPrice\\\": 1414.96,\\n \\\"settleCurrency\\\": \\\"ETH\\\",\\n \\\"isInverse\\\": true,\\n \\\"marginMode\\\": \\\"CROSS\\\",\\n \\\"positionSide\\\": \\\"BOTH\\\",\\n \\\"leverage\\\": 10\\n },\\n {\\n \\\"id\\\": \\\"500000000000988255\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"autoDeposit\\\": true,\\n \\\"crossMode\\\": false,\\n \\\"maintMarginReq\\\": 0.005,\\n \\\"riskLimit\\\": 500000,\\n \\\"realLeverage\\\": 2.97,\\n \\\"delevPercentage\\\": 0.5,\\n \\\"openingTimestamp\\\": 1729155616322,\\n \\\"currentTimestamp\\\": 1730636040926,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": 67.4309,\\n \\\"currentComm\\\": -0.15936162,\\n \\\"unrealisedCost\\\": 67.4309,\\n \\\"realisedGrossCost\\\": 0.0,\\n \\\"realisedCost\\\": -0.15936162,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 68323.06,\\n \\\"markValue\\\": 68.32306,\\n \\\"posCost\\\": 67.4309,\\n \\\"posCross\\\": 0.06225152,\\n \\\"posCrossMargin\\\": 0,\\n \\\"posInit\\\": 22.2769666644,\\n \\\"posComm\\\": 0.0539821899,\\n \\\"posCommCommon\\\": 0.0539447199,\\n \\\"posLoss\\\": 0.26210915,\\n \\\"posMargin\\\": 22.1310912243,\\n \\\"posFunding\\\": -0.19982016,\\n \\\"posMaint\\\": 0.4046228699,\\n \\\"maintMargin\\\": 23.0232512243,\\n \\\"realisedGrossPnl\\\": 0.0,\\n \\\"realisedPnl\\\": -0.2402787,\\n \\\"unrealisedPnl\\\": 0.89216,\\n \\\"unrealisedPnlPcnt\\\": 0.0132,\\n \\\"unrealisedRoePcnt\\\": 0.04,\\n \\\"avgEntryPrice\\\": 67430.9,\\n \\\"liquidationPrice\\\": 45704.44,\\n \\\"bankruptPrice\\\": 45353.8,\\n \\\"settleCurrency\\\": \\\"USDT\\\",\\n \\\"isInverse\\\": false,\\n \\\"maintainMargin\\\": 0.005,\\n \\\"marginMode\\\": \\\"ISOLATED\\\",\\n \\\"positionSide\\\": \\\"BOTH\\\",\\n \\\"leverage\\\": 2.97\\n }\\n ]\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\"}", - "operationId": "005" + "operationId": "006" } }, "/api/v1/history-positions": { @@ -1178,7 +1303,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 10,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"closeId\\\": \\\"500000000036305465\\\",\\n \\\"userId\\\": \\\"633559791e1cbc0001f319bc\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"settleCurrency\\\": \\\"USDT\\\",\\n \\\"leverage\\\": \\\"1.0\\\",\\n \\\"type\\\": \\\"CLOSE_LONG\\\",\\n \\\"pnl\\\": \\\"0.51214413\\\",\\n \\\"realisedGrossCost\\\": \\\"-0.5837\\\",\\n \\\"realisedGrossCostNew\\\": \\\"-0.5837\\\",\\n \\\"withdrawPnl\\\": \\\"0.0\\\",\\n \\\"tradeFee\\\": \\\"0.03766066\\\",\\n \\\"fundingFee\\\": \\\"-0.03389521\\\",\\n \\\"openTime\\\": 1735549162120,\\n \\\"closeTime\\\": 1735589352069,\\n \\\"openPrice\\\": \\\"93859.8\\\",\\n \\\"closePrice\\\": \\\"94443.5\\\",\\n \\\"marginMode\\\": \\\"CROSS\\\",\\n \\\"tax\\\": \\\"0.0\\\",\\n \\\"roe\\\": null,\\n \\\"liquidAmount\\\": null,\\n \\\"liquidPrice\\\": null,\\n \\\"side\\\": \\\"LONG\\\"\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\", \\\"from\\\": 123456, \\\"to\\\": 123456, \\\"limit\\\": 10, \\\"pageId\\\": 1}", - "operationId": "006" + "operationId": "007" } }, "/api/v1/margin/maxWithdrawMargin": { @@ -1236,7 +1361,7 @@ "x-api-rate-limit-weight": 10, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": \\\"21.1135719252\\\"\\n}", "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\"}", - "operationId": "007" + "operationId": "008" } }, "/api/v2/getCrossUserLeverage": { @@ -1307,7 +1432,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"leverage\\\": \\\"3\\\"\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", - "operationId": "008" + "operationId": "009" } }, "/api/v2/changeCrossUserLeverage": { @@ -1378,7 +1503,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"leverage\\\": \\\"10\\\"}", - "operationId": "009" + "operationId": "010" } }, "/api/v1/position/margin/deposit-margin": { @@ -1645,7 +1770,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"6200c9b83aecfb000152ddcd\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"autoDeposit\\\": false,\\n \\\"maintMarginReq\\\": 0.005,\\n \\\"riskLimit\\\": 500000,\\n \\\"realLeverage\\\": 18.72,\\n \\\"crossMode\\\": false,\\n \\\"delevPercentage\\\": 0.66,\\n \\\"openingTimestamp\\\": 1646287090131,\\n \\\"currentTimestamp\\\": 1646295055021,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": 43.388,\\n \\\"currentComm\\\": 0.0260328,\\n \\\"unrealisedCost\\\": 43.388,\\n \\\"realisedGrossCost\\\": 0,\\n \\\"realisedCost\\\": 0.0260328,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 43536.65,\\n \\\"markValue\\\": 43.53665,\\n \\\"posCost\\\": 43.388,\\n \\\"posCross\\\": 0.000024985,\\n \\\"posInit\\\": 2.1694,\\n \\\"posComm\\\": 0.02733446,\\n \\\"posLoss\\\": 0,\\n \\\"posMargin\\\": 2.19675944,\\n \\\"posMaint\\\": 0.24861326,\\n \\\"maintMargin\\\": 2.34540944,\\n \\\"realisedGrossPnl\\\": 0,\\n \\\"realisedPnl\\\": -0.0260328,\\n \\\"unrealisedPnl\\\": 0.14865,\\n \\\"unrealisedPnlPcnt\\\": 0.0034,\\n \\\"unrealisedRoePcnt\\\": 0.0685,\\n \\\"avgEntryPrice\\\": 43388,\\n \\\"liquidationPrice\\\": 41440,\\n \\\"bankruptPrice\\\": 41218,\\n \\\"userId\\\": 1234321123,\\n \\\"settleCurrency\\\": \\\"USDT\\\"\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"string\\\", \\\"margin\\\": 0, \\\"bizNo\\\": \\\"string\\\"}", - "operationId": "010" + "operationId": "011" } }, "/api/v1/margin/withdrawMargin": { @@ -1717,7 +1842,138 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": \\\"0.1\\\"\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"withdrawAmount\\\": \\\"0.0000001\\\"}", - "operationId": "011" + "operationId": "012" + } + }, + "/api/v2/batchGetCrossOrderLimit": { + "get": { + "summary": "Get Cross Margin Risk Limit", + "deprecated": false, + "description": "Batch get cross margin risk limit.", + "tags": [], + "parameters": [ + { + "name": "symbol", + "in": "query", + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP)", + "required": true, + "schema": { + "type": "string", + "example": [ + "XBTUSDTM", + "XBTUSDTM,ETHUSDTM" + ] + } + }, + { + "name": "totalMargin", + "in": "query", + "description": "The position opening amount, in the contract's settlement currency.\nDefaults to 10,000 in margin currency for max position calculation.\nFor USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "leverage", + "in": "query", + "description": "Calculates the max position size at the specified leverage.\nDefaults to the symbol’s max cross leverage.", + "required": false, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "symbol": { + "type": "string", + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220)" + }, + "maxOpenSize": { + "type": "integer", + "description": "Maximum amount of open position(Unit is **lots**)\n" + }, + "maxOpenValue": { + "type": "string", + "description": "Maximum value of open position(Unit is **quoteCcy**)\n" + }, + "totalMargin": { + "type": "string", + "description": "Margin amount used for max position calculation." + }, + "price": { + "type": "string", + "description": "Price used for max position calculation. Defaults to latest transaction price" + }, + "leverage": { + "type": "string", + "description": "Leverage used for max position calculation." + }, + "mmr": { + "type": "string", + "description": "Maintenance Margin Rate" + }, + "imr": { + "type": "string", + "description": "Initial Margin Rate" + }, + "currency": { + "type": "string", + "description": "Margin Currency" + } + }, + "required": [ + "symbol", + "maxOpenSize", + "maxOpenValue", + "totalMargin", + "price", + "leverage", + "mmr", + "imr", + "currency" + ] + } + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472655", + "x-abandon": "normal", + "x-domain": "Futures", + "x-api-channel": "Private", + "x-api-permission": "Futures", + "x-api-rate-limit-pool": "Futures", + "x-sdk-service": "Futures", + "x-sdk-sub-service": "Positions", + "x-sdk-method-name": "getCrossMarginRiskLimit", + "x-sdk-method-description": "Batch get cross margin risk limit.", + "x-api-rate-limit-weight": 2, + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"maxOpenSize\\\": 12102,\\n \\\"maxOpenValue\\\": \\\"1234549.2240000000\\\",\\n \\\"totalMargin\\\": \\\"10000\\\",\\n \\\"price\\\": \\\"102012\\\",\\n \\\"leverage\\\": \\\"125.00\\\",\\n \\\"mmr\\\": \\\"0.00416136\\\",\\n \\\"imr\\\": \\\"0.008\\\",\\n \\\"currency\\\": \\\"USDT\\\"\\n },\\n {\\n \\\"symbol\\\": \\\"ETHUSDTM\\\",\\n \\\"maxOpenSize\\\": 38003,\\n \\\"maxOpenValue\\\": \\\"971508.6920000000\\\",\\n \\\"totalMargin\\\": \\\"10000\\\",\\n \\\"price\\\": \\\"2556.4\\\",\\n \\\"leverage\\\": \\\"100.00\\\",\\n \\\"mmr\\\": \\\"0.0054623236\\\",\\n \\\"imr\\\": \\\"0.01\\\",\\n \\\"currency\\\": \\\"USDT\\\"\\n }\\n ]\\n}", + "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"totalMargin\\\": \\\"example_string_default_value\\\", \\\"leverage\\\": 123456}", + "operationId": "013" } }, "/api/v1/contracts/risk-limit/{symbol}": { @@ -1816,7 +2072,7 @@ "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 1,\\n \\\"maxRiskLimit\\\": 100000,\\n \\\"minRiskLimit\\\": 0,\\n \\\"maxLeverage\\\": 125,\\n \\\"initialMargin\\\": 0.008,\\n \\\"maintainMargin\\\": 0.004\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 2,\\n \\\"maxRiskLimit\\\": 500000,\\n \\\"minRiskLimit\\\": 100000,\\n \\\"maxLeverage\\\": 100,\\n \\\"initialMargin\\\": 0.01,\\n \\\"maintainMargin\\\": 0.005\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 3,\\n \\\"maxRiskLimit\\\": 1000000,\\n \\\"minRiskLimit\\\": 500000,\\n \\\"maxLeverage\\\": 75,\\n \\\"initialMargin\\\": 0.014,\\n \\\"maintainMargin\\\": 0.007\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 4,\\n \\\"maxRiskLimit\\\": 2000000,\\n \\\"minRiskLimit\\\": 1000000,\\n \\\"maxLeverage\\\": 50,\\n \\\"initialMargin\\\": 0.02,\\n \\\"maintainMargin\\\": 0.01\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 5,\\n \\\"maxRiskLimit\\\": 3000000,\\n \\\"minRiskLimit\\\": 2000000,\\n \\\"maxLeverage\\\": 30,\\n \\\"initialMargin\\\": 0.034,\\n \\\"maintainMargin\\\": 0.017\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 6,\\n \\\"maxRiskLimit\\\": 5000000,\\n \\\"minRiskLimit\\\": 3000000,\\n \\\"maxLeverage\\\": 20,\\n \\\"initialMargin\\\": 0.05,\\n \\\"maintainMargin\\\": 0.025\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 7,\\n \\\"maxRiskLimit\\\": 8000000,\\n \\\"minRiskLimit\\\": 5000000,\\n \\\"maxLeverage\\\": 10,\\n \\\"initialMargin\\\": 0.1,\\n \\\"maintainMargin\\\": 0.05\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 8,\\n \\\"maxRiskLimit\\\": 12000000,\\n \\\"minRiskLimit\\\": 8000000,\\n \\\"maxLeverage\\\": 5,\\n \\\"initialMargin\\\": 0.2,\\n \\\"maintainMargin\\\": 0.1\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 9,\\n \\\"maxRiskLimit\\\": 20000000,\\n \\\"minRiskLimit\\\": 12000000,\\n \\\"maxLeverage\\\": 4,\\n \\\"initialMargin\\\": 0.25,\\n \\\"maintainMargin\\\": 0.125\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 10,\\n \\\"maxRiskLimit\\\": 30000000,\\n \\\"minRiskLimit\\\": 20000000,\\n \\\"maxLeverage\\\": 3,\\n \\\"initialMargin\\\": 0.334,\\n \\\"maintainMargin\\\": 0.167\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 11,\\n \\\"maxRiskLimit\\\": 40000000,\\n \\\"minRiskLimit\\\": 30000000,\\n \\\"maxLeverage\\\": 2,\\n \\\"initialMargin\\\": 0.5,\\n \\\"maintainMargin\\\": 0.25\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 12,\\n \\\"maxRiskLimit\\\": 50000000,\\n \\\"minRiskLimit\\\": 40000000,\\n \\\"maxLeverage\\\": 1,\\n \\\"initialMargin\\\": 1.0,\\n \\\"maintainMargin\\\": 0.5\\n }\\n ]\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", - "operationId": "012" + "operationId": "014" } }, "/api/v1/position/risk-limit-level/change": { @@ -1888,7 +2144,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"level\\\": 2}", - "operationId": "013" + "operationId": "015" } }, "/api/v1/position/margin/auto-deposit-status": { @@ -1963,7 +2219,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"status\\\": true}", - "operationId": "014" + "operationId": "016" } } }, diff --git a/spec/rest/api/openapi-margin-order.json b/spec/rest/api/openapi-margin-order.json index b7392ac1..4e054b06 100644 --- a/spec/rest/api/openapi-margin-order.json +++ b/spec/rest/api/openapi-margin-order.json @@ -72,7 +72,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "addOrder", "x-sdk-method-description": "Place order in the Cross-margin or Isolated-margin trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "requestBody": { "content": { "application/json": { @@ -336,7 +336,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "addOrderTest", "x-sdk-method-description": " Order test endpoint: This endpoint’s request and return parameters are identical to the order endpoint, and can be used to verify whether the signature is correct, among other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "requestBody": { "content": { "application/json": { @@ -542,15 +542,6 @@ "description": "This endpoint can be used to cancel a margin order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", "tags": [], "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "The unique order id generated by the trading system", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -564,6 +555,15 @@ "KCS-USDT" ] } + }, + { + "name": "orderId", + "in": "path", + "description": "The unique order id generated by the trading system", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -609,9 +609,9 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelOrderByOrderId", "x-sdk-method-description": "This endpoint can be used to cancel a margin order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"orderId\\\":\\\"671663e02188630007e21c9c\\\"}}", - "x-request-example": "{\\\"orderId\\\": \\\"671663e02188630007e21c9c\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"orderId\\\": \\\"671663e02188630007e21c9c\\\"}", "operationId": "003" }, "get": { @@ -620,15 +620,6 @@ "description": "This endpoint can be used to obtain information for a single Margin order using the order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "tags": [], "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "The unique order id generated by the trading system", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -642,6 +633,15 @@ "KCS-USDT" ] } + }, + { + "name": "orderId", + "in": "path", + "description": "The unique order id generated by the trading system", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -954,7 +954,7 @@ "x-sdk-method-description": "This endpoint can be used to obtain information for a single Margin order using the order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"671667306afcdb000723107f\\\",\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"opType\\\": \\\"DEAL\\\",\\n \\\"type\\\": \\\"limit\\\",\\n \\\"side\\\": \\\"buy\\\",\\n \\\"price\\\": \\\"50000\\\",\\n \\\"size\\\": \\\"0.00001\\\",\\n \\\"funds\\\": \\\"0.5\\\",\\n \\\"dealSize\\\": \\\"0\\\",\\n \\\"dealFunds\\\": \\\"0\\\",\\n \\\"fee\\\": \\\"0\\\",\\n \\\"feeCurrency\\\": \\\"USDT\\\",\\n \\\"stp\\\": null,\\n \\\"stop\\\": null,\\n \\\"stopTriggered\\\": false,\\n \\\"stopPrice\\\": \\\"0\\\",\\n \\\"timeInForce\\\": \\\"GTC\\\",\\n \\\"postOnly\\\": false,\\n \\\"hidden\\\": false,\\n \\\"iceberg\\\": false,\\n \\\"visibleSize\\\": \\\"0\\\",\\n \\\"cancelAfter\\\": 0,\\n \\\"channel\\\": \\\"API\\\",\\n \\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\",\\n \\\"remark\\\": null,\\n \\\"tags\\\": null,\\n \\\"cancelExist\\\": false,\\n \\\"createdAt\\\": 1729521456248,\\n \\\"lastUpdatedAt\\\": 1729651011877,\\n \\\"tradeType\\\": \\\"MARGIN_TRADE\\\",\\n \\\"inOrderBook\\\": true,\\n \\\"cancelledSize\\\": \\\"0\\\",\\n \\\"cancelledFunds\\\": \\\"0\\\",\\n \\\"remainSize\\\": \\\"0.00001\\\",\\n \\\"remainFunds\\\": \\\"0.5\\\",\\n \\\"tax\\\": \\\"0\\\",\\n \\\"active\\\": true\\n }\\n}", - "x-request-example": "{\\\"orderId\\\": \\\"671667306afcdb000723107f\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"orderId\\\": \\\"671667306afcdb000723107f\\\"}", "operationId": "010" } }, @@ -965,15 +965,6 @@ "description": "This endpoint can be used to cancel a margin order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", "tags": [], "parameters": [ - { - "name": "clientOid", - "in": "path", - "description": "Client Order Id, unique identifier created by the user", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -987,6 +978,15 @@ "KCS-USDT" ] } + }, + { + "name": "clientOid", + "in": "path", + "description": "Client Order Id, unique identifier created by the user", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -1032,9 +1032,9 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelOrderByClientOid", "x-sdk-method-description": "This endpoint can be used to cancel a margin order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"clientOid\\\":\\\"5c52e11203aa677f33e1493fb\\\"}}", - "x-request-example": "{\\\"clientOid\\\": \\\"5c52e11203aa677f33e1493fb\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"clientOid\\\": \\\"5c52e11203aa677f33e1493fb\\\"}", "operationId": "004" }, "get": { @@ -1043,15 +1043,6 @@ "description": "This endpoint can be used to obtain information for a single Margin order using the client order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "tags": [], "parameters": [ - { - "name": "clientOid", - "in": "path", - "description": "Client Order Id, unique identifier created by the user", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -1065,6 +1056,15 @@ "KCS-USDT" ] } + }, + { + "name": "clientOid", + "in": "path", + "description": "Client Order Id, unique identifier created by the user", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -1376,7 +1376,7 @@ "x-sdk-method-description": "This endpoint can be used to obtain information for a single Margin order using the client order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"671667306afcdb000723107f\\\",\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"opType\\\": \\\"DEAL\\\",\\n \\\"type\\\": \\\"limit\\\",\\n \\\"side\\\": \\\"buy\\\",\\n \\\"price\\\": \\\"50000\\\",\\n \\\"size\\\": \\\"0.00001\\\",\\n \\\"funds\\\": \\\"0.5\\\",\\n \\\"dealSize\\\": \\\"0\\\",\\n \\\"dealFunds\\\": \\\"0\\\",\\n \\\"fee\\\": \\\"0\\\",\\n \\\"feeCurrency\\\": \\\"USDT\\\",\\n \\\"stp\\\": null,\\n \\\"stop\\\": null,\\n \\\"stopTriggered\\\": false,\\n \\\"stopPrice\\\": \\\"0\\\",\\n \\\"timeInForce\\\": \\\"GTC\\\",\\n \\\"postOnly\\\": false,\\n \\\"hidden\\\": false,\\n \\\"iceberg\\\": false,\\n \\\"visibleSize\\\": \\\"0\\\",\\n \\\"cancelAfter\\\": 0,\\n \\\"channel\\\": \\\"API\\\",\\n \\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\",\\n \\\"remark\\\": null,\\n \\\"tags\\\": null,\\n \\\"cancelExist\\\": false,\\n \\\"createdAt\\\": 1729521456248,\\n \\\"lastUpdatedAt\\\": 1729651011877,\\n \\\"tradeType\\\": \\\"MARGIN_TRADE\\\",\\n \\\"inOrderBook\\\": true,\\n \\\"cancelledSize\\\": \\\"0\\\",\\n \\\"cancelledFunds\\\": \\\"0\\\",\\n \\\"remainSize\\\": \\\"0.00001\\\",\\n \\\"remainFunds\\\": \\\"0.5\\\",\\n \\\"tax\\\": \\\"0\\\",\\n \\\"active\\\": true\\n }\\n}", - "x-request-example": "{\\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\"}", "operationId": "011" } }, @@ -1461,7 +1461,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelAllOrdersBySymbol", "x-sdk-method-description": "This interface can cancel all open Margin orders by symbol. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", - "x-api-rate-limit-weight": 10, + "x-api-rate-limit-weight": 5, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":\\\"success\\\"}", "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"tradeType\\\": \\\"MARGIN_TRADE\\\"}", "operationId": "005" @@ -1551,6 +1551,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "getSymbolsWithOpenOrder", "x-sdk-method-description": "This interface can query all Margin symbols that have active orders.", + "x-api-rate-limit-weight": 4, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbolSize\\\": 1,\\n \\\"symbols\\\": [\\n \\\"BTC-USDT\\\"\\n ]\\n }\\n}", "x-request-example": "{\\\"tradeType\\\": \\\"MARGIN_TRADE\\\"}", "operationId": "006" diff --git a/spec/rest/api/openapi-spot-market.json b/spec/rest/api/openapi-spot-market.json index b87f4a35..f329285a 100644 --- a/spec/rest/api/openapi-spot-market.json +++ b/spec/rest/api/openapi-spot-market.json @@ -390,15 +390,6 @@ "description": "Request the currency details of a specified currency via this endpoint.", "tags": [], "parameters": [ - { - "name": "currency", - "in": "path", - "description": "Path parameter, Currency", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "chain", "in": "query", @@ -418,6 +409,15 @@ "optimism" ] } + }, + { + "name": "currency", + "in": "path", + "description": "Path parameter, Currency", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -535,7 +535,6 @@ "required": [ "chainName", "withdrawalMinSize", - "depositMinSize", "withdrawFeeRate", "withdrawalMinFee", "isWithdrawEnabled", @@ -544,8 +543,6 @@ "preConfirms", "contractAddress", "withdrawPrecision", - "maxWithdraw", - "maxDeposit", "needTag", "chainId" ] @@ -558,8 +555,6 @@ "name", "fullName", "precision", - "confirms", - "contractAddress", "isMarginEnabled", "isDebitEnabled", "chains" @@ -587,7 +582,7 @@ "x-sdk-method-description": "Request the currency details of a specified currency via this endpoint.", "x-api-rate-limit-weight": 3, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"currency\\\":\\\"BTC\\\",\\\"name\\\":\\\"BTC\\\",\\\"fullName\\\":\\\"Bitcoin\\\",\\\"precision\\\":8,\\\"confirms\\\":null,\\\"contractAddress\\\":null,\\\"isMarginEnabled\\\":true,\\\"isDebitEnabled\\\":true,\\\"chains\\\":[{\\\"chainName\\\":\\\"BTC\\\",\\\"withdrawalMinSize\\\":\\\"0.001\\\",\\\"depositMinSize\\\":\\\"0.0002\\\",\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.0005\\\",\\\"isWithdrawEnabled\\\":true,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":3,\\\"preConfirms\\\":1,\\\"contractAddress\\\":\\\"\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":null,\\\"needTag\\\":false,\\\"chainId\\\":\\\"btc\\\"},{\\\"chainName\\\":\\\"Lightning Network\\\",\\\"withdrawalMinSize\\\":\\\"0.00001\\\",\\\"depositMinSize\\\":\\\"0.00001\\\",\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.000015\\\",\\\"isWithdrawEnabled\\\":true,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":1,\\\"preConfirms\\\":1,\\\"contractAddress\\\":\\\"\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":\\\"0.03\\\",\\\"needTag\\\":false,\\\"chainId\\\":\\\"btcln\\\"},{\\\"chainName\\\":\\\"KCC\\\",\\\"withdrawalMinSize\\\":\\\"0.0008\\\",\\\"depositMinSize\\\":null,\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.00002\\\",\\\"isWithdrawEnabled\\\":true,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":20,\\\"preConfirms\\\":20,\\\"contractAddress\\\":\\\"0xfa93c12cd345c658bc4644d1d4e1b9615952258c\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":null,\\\"needTag\\\":false,\\\"chainId\\\":\\\"kcc\\\"},{\\\"chainName\\\":\\\"BTC-Segwit\\\",\\\"withdrawalMinSize\\\":\\\"0.0008\\\",\\\"depositMinSize\\\":\\\"0.0002\\\",\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.0005\\\",\\\"isWithdrawEnabled\\\":false,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":2,\\\"preConfirms\\\":2,\\\"contractAddress\\\":\\\"\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":null,\\\"needTag\\\":false,\\\"chainId\\\":\\\"bech32\\\"}]}}", - "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"chain\\\": \\\"eth\\\"}", + "x-request-example": "{\\\"chain\\\": \\\"eth\\\", \\\"currency\\\": \\\"BTC\\\"}", "operationId": "002" } }, @@ -726,8 +721,6 @@ "required": [ "chainName", "withdrawalMinSize", - "depositMinSize", - "withdrawFeeRate", "withdrawalMinFee", "isWithdrawEnabled", "isDepositEnabled", @@ -735,10 +728,9 @@ "preConfirms", "contractAddress", "withdrawPrecision", - "maxWithdraw", - "maxDeposit", "needTag", - "chainId" + "chainId", + "withdrawFeeRate" ] }, "description": "Chain list" @@ -1005,13 +997,7 @@ "makerFeeCoefficient", "takerFeeCoefficient", "st", - "callauctionIsEnabled", - "callauctionPriceFloor", - "callauctionPriceCeiling", - "callauctionFirstStageStartTime", - "callauctionSecondStageStartTime", - "callauctionThirdStageStartTime", - "tradingStartTime" + "callauctionIsEnabled" ] } }, @@ -1270,13 +1256,7 @@ "makerFeeCoefficient", "takerFeeCoefficient", "st", - "callauctionIsEnabled", - "callauctionPriceFloor", - "callauctionPriceCeiling", - "callauctionFirstStageStartTime", - "callauctionSecondStageStartTime", - "callauctionThirdStageStartTime", - "tradingStartTime" + "callauctionIsEnabled" ] } } @@ -2256,19 +2236,19 @@ }, "time": { "type": "integer", - "format": "int64", - "description": "Timestamp (ms)" + "description": "Timestamp (ms)", + "format": "int64" } }, "required": [ - "symbol", - "estimatedPrice", - "estimatedSize", "sellOrderRangeLowPrice", "sellOrderRangeHighPrice", "buyOrderRangeLowPrice", "buyOrderRangeHighPrice", - "time" + "time", + "symbol", + "estimatedPrice", + "estimatedSize" ] } }, diff --git a/spec/rest/api/openapi-spot-order.json b/spec/rest/api/openapi-spot-order.json index 831e8686..aa75148f 100644 --- a/spec/rest/api/openapi-spot-order.json +++ b/spec/rest/api/openapi-spot-order.json @@ -247,7 +247,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -257,7 +257,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -630,7 +630,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -640,7 +640,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -902,7 +902,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -912,7 +912,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -1174,7 +1174,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -1182,7 +1182,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -1498,7 +1498,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -1508,7 +1508,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -2834,7 +2834,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "modifyOrder", "x-sdk-method-description": "This interface can modify the price and quantity of the order according to orderId or clientOid. The implementation of this interface is: Cancel the order and place a new order on the same trading pair, and return the modification result to the client synchronously. When the quantity of the new order updated by the user is less than the filled quantity of this order, the order will be considered as completed, and the order will be canceled, and no new order will be placed.", - "x-api-rate-limit-weight": 3, + "x-api-rate-limit-weight": 1, "requestBody": { "content": { "application/json": { diff --git a/spec/rest/api/openapi-viplending-viplending.json b/spec/rest/api/openapi-viplending-viplending.json index f52bc922..c4241eb7 100644 --- a/spec/rest/api/openapi-viplending-viplending.json +++ b/spec/rest/api/openapi-viplending-viplending.json @@ -244,7 +244,7 @@ "x-abandon": "normal", "x-domain": "Spot", "x-api-channel": "Private", - "x-api-permission": "General", + "x-api-permission": "Spot", "x-api-rate-limit-pool": "Management", "x-sdk-service": "VIPLending", "x-sdk-sub-service": "VIPLending", @@ -327,7 +327,7 @@ "x-abandon": "normal", "x-domain": "Spot", "x-api-channel": "Private", - "x-api-permission": "General", + "x-api-permission": "Spot", "x-api-rate-limit-pool": "Management", "x-sdk-service": "VIPLending", "x-sdk-sub-service": "VIPLending", diff --git a/spec/rest/entry/openapi-account.json b/spec/rest/entry/openapi-account.json index 8c6b98a8..09206476 100644 --- a/spec/rest/entry/openapi-account.json +++ b/spec/rest/entry/openapi-account.json @@ -580,41 +580,7 @@ }, "status": { "type": "string", - "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing", - "enum": [ - "EFFECTIVE", - "BANKRUPTCY", - "LIQUIDATION", - "REPAY", - "BORROW" - ], - "x-api-enum": [ - { - "value": "EFFECTIVE", - "name": "EFFECTIVE", - "description": "Effective" - }, - { - "value": "BANKRUPTCY", - "name": "BANKRUPTCY", - "description": "Bankruptcy liquidation" - }, - { - "value": "LIQUIDATION", - "name": "LIQUIDATION", - "description": "Closing" - }, - { - "value": "REPAY", - "name": "REPAY", - "description": "Repayment" - }, - { - "value": "BORROW", - "name": "BORROW", - "description": "Borrowing" - } - ] + "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" }, "accounts": { "type": "array", @@ -652,6 +618,14 @@ "transferInEnabled": { "type": "boolean", "description": "Support transfer or not" + }, + "liabilityPrincipal": { + "type": "string", + "description": "Outstanding principal – the unpaid loan amount" + }, + "liabilityInterest": { + "type": "string", + "description": "Accrued interest – the unpaid interest amount" } }, "required": [ @@ -660,6 +634,8 @@ "available", "hold", "liability", + "liabilityPrincipal", + "liabilityInterest", "maxBorrowSize", "borrowEnabled", "transferInEnabled" @@ -697,7 +673,7 @@ "x-sdk-method-name": "getCrossMarginAccount", "x-sdk-method-description": "Request cross margin account info via this endpoint.", "x-api-rate-limit-weight": 15, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"0.02\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"accounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"total\\\": \\\"0.02\\\",\\n \\\"available\\\": \\\"0.02\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true\\n }\\n ]\\n }\\n}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"40.8648372\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"accounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"total\\\": \\\"38.68855864\\\",\\n \\\"available\\\": \\\"20.01916691\\\",\\n \\\"hold\\\": \\\"18.66939173\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"liabilityPrincipal\\\": \\\"0\\\",\\n \\\"liabilityInterest\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"163\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"quoteCurrency\\\": \\\"USDT\\\", \\\"queryType\\\": \\\"MARGIN\\\"}", "operationId": "006" } @@ -821,41 +797,7 @@ }, "status": { "type": "string", - "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing", - "enum": [ - "EFFECTIVE", - "BANKRUPTCY", - "LIQUIDATION", - "REPAY", - "BORROW" - ], - "x-api-enum": [ - { - "value": "EFFECTIVE", - "name": "EFFECTIVE", - "description": "Effective" - }, - { - "value": "BANKRUPTCY", - "name": "BANKRUPTCY", - "description": "Bankruptcy liquidation" - }, - { - "value": "LIQUIDATION", - "name": "LIQUIDATION", - "description": "Closing" - }, - { - "value": "REPAY", - "name": "REPAY", - "description": "Repayment" - }, - { - "value": "BORROW", - "name": "BORROW", - "description": "Borrowing" - } - ] + "description": "Position status; EFFECTIVE-effective, BANKRUPTCY-bankruptcy liquidation, LIQUIDATION-closing, REPAY-repayment, BORROW-borrowing" }, "debtRatio": { "type": "string", @@ -895,6 +837,14 @@ "maxBorrowSize": { "type": "string", "description": "The user's remaining maximum loan amount" + }, + "liabilityPrincipal": { + "type": "string", + "description": "Outstanding principal" + }, + "liabilityInterest": { + "type": "string", + "description": "Outstanding interest" } }, "required": [ @@ -902,6 +852,8 @@ "borrowEnabled", "transferInEnabled", "liability", + "liabilityPrincipal", + "liabilityInterest", "total", "available", "hold", @@ -943,6 +895,12 @@ "maxBorrowSize": { "type": "string", "description": "The user's remaining maximum loan amount" + }, + "liabilityPrincipal": { + "type": "string" + }, + "liabilityInterest": { + "type": "string" } }, "required": [ @@ -950,6 +908,8 @@ "borrowEnabled", "transferInEnabled", "liability", + "liabilityPrincipal", + "liabilityInterest", "total", "available", "hold", @@ -957,14 +917,7 @@ ], "description": "quote asset" } - }, - "required": [ - "symbol", - "status", - "debtRatio", - "baseAsset", - "quoteAsset" - ] + } } } }, @@ -996,8 +949,8 @@ "x-sdk-method-name": "getIsolatedMarginAccount", "x-sdk-method-description": "Request isolated margin account info via this endpoint.", "x-api-rate-limit-weight": 15, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"0.01\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0\\\",\\n \\\"timestamp\\\": 1728725465994,\\n \\\"assets\\\": [\\n {\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"baseAsset\\\": {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0\\\",\\n \\\"total\\\": \\\"0\\\",\\n \\\"available\\\": \\\"0\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\"\\n },\\n \\\"quoteAsset\\\": {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0\\\",\\n \\\"total\\\": \\\"0.01\\\",\\n \\\"available\\\": \\\"0.01\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\"\\n }\\n }\\n ]\\n }\\n}", - "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\", \\\"quoteCurrency\\\": \\\"USDT\\\", \\\"queryType\\\": \\\"ISOLATED\\\"}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalAssetOfQuoteCurrency\\\": \\\"4.97047372\\\",\\n \\\"totalLiabilityOfQuoteCurrency\\\": \\\"0.00038891\\\",\\n \\\"timestamp\\\": 1747303659773,\\n \\\"assets\\\": [\\n {\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"status\\\": \\\"EFFECTIVE\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"baseAsset\\\": {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0\\\",\\n \\\"liabilityPrincipal\\\": \\\"0\\\",\\n \\\"liabilityInterest\\\": \\\"0\\\",\\n \\\"total\\\": \\\"0\\\",\\n \\\"available\\\": \\\"0\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\"\\n },\\n \\\"quoteAsset\\\": {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"borrowEnabled\\\": true,\\n \\\"transferInEnabled\\\": true,\\n \\\"liability\\\": \\\"0.00038891\\\",\\n \\\"liabilityPrincipal\\\": \\\"0.00038888\\\",\\n \\\"liabilityInterest\\\": \\\"0.00000003\\\",\\n \\\"total\\\": \\\"4.97047372\\\",\\n \\\"available\\\": \\\"4.97047372\\\",\\n \\\"hold\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"44\\\"\\n }\\n }\\n ]\\n }\\n}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"quoteCurrency\\\": \\\"USDT\\\", \\\"queryType\\\": \\\"ISOLATED\\\"}", "operationId": "007" } }, @@ -1382,6 +1335,7 @@ "enum": [ "TRADE_EXCHANGE", "TRANSFER", + "SUB_TRANSFER", "RETURNED_FEES", "DEDUCTION_FEES", "OTHER" @@ -1390,27 +1344,32 @@ { "value": "TRADE_EXCHANGE", "name": "TRADE_EXCHANGE", - "description": "trade exchange" + "description": "Trade exchange" }, { "value": "TRANSFER", "name": "TRANSFER", - "description": "transfer" + "description": "Transfer" + }, + { + "value": "SUB_TRANSFER", + "name": "SUB_TRANSFER", + "description": "Sub transfer" }, { "value": "RETURNED_FEES", "name": "RETURNED_FEES", - "description": "returned fees" + "description": "Returned fees" }, { "value": "DEDUCTION_FEES", "name": "DEDUCTION_FEES", - "description": "deduction fees" + "description": "Deduction fees" }, { "value": "OTHER", "name": "OTHER", - "description": "other" + "description": "Other" } ] } @@ -1967,19 +1926,19 @@ "properties": { "uid": { "type": "integer", - "description": "Sub-account UID" + "description": "Sub account user id" }, "subName": { "type": "string", - "description": "Sub-account name" + "description": "Sub account name" }, "remarks": { "type": "string", - "description": "Remarks" + "description": "Sub account name" }, "access": { "type": "string", - "description": "Permission" + "description": "permission" } }, "required": [ @@ -2062,12 +2021,12 @@ "access" ] }, - "example": "{\n \"password\": \"1234567\",\n \"remarks\": \"TheRemark\",\n \"subName\": \"Name1234567\",\n \"access\": \"Spot\"\n}" + "example": "{\n \"password\": \"q1234567\",\n \"access\": \"Spot\",\n \"subName\": \"subNameTest1\",\n \"remarks\": \"TheRemark\"\n}" } } }, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 10,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"userId\\\": \\\"63743f07e0c5230001761d08\\\",\\n \\\"uid\\\": 169579801,\\n \\\"subName\\\": \\\"testapi6\\\",\\n \\\"status\\\": 2,\\n \\\"type\\\": 0,\\n \\\"access\\\": \\\"All\\\",\\n \\\"createdAt\\\": 1668562696000,\\n \\\"remarks\\\": \\\"remarks\\\",\\n \\\"tradeTypes\\\": [\\n \\\"Spot\\\",\\n \\\"Futures\\\",\\n \\\"Margin\\\"\\n ],\\n \\\"openedTradeTypes\\\": [\\n \\\"Spot\\\"\\n ],\\n \\\"hostedStatus\\\": null\\n }\\n ]\\n }\\n}", - "x-request-example": "{\\\"password\\\": \\\"1234567\\\", \\\"remarks\\\": \\\"TheRemark\\\", \\\"subName\\\": \\\"Name1234567\\\", \\\"access\\\": \\\"Spot\\\"}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"uid\\\": 245730746,\\n \\\"subName\\\": \\\"subNameTest1\\\",\\n \\\"remarks\\\": \\\"TheRemark\\\",\\n \\\"access\\\": \\\"Spot\\\"\\n }\\n}", + "x-request-example": "{\\\"password\\\": \\\"q1234567\\\", \\\"access\\\": \\\"Spot\\\", \\\"subName\\\": \\\"subNameTest1\\\", \\\"remarks\\\": \\\"TheRemark\\\"}", "operationId": "013" } }, @@ -4436,8 +4395,7 @@ ] }, "amount": { - "type": "integer", - "format": "int64", + "type": "string", "description": "Withdrawal amount, a positive number which is a multiple of the amount precision" }, "memo": { @@ -4507,12 +4465,12 @@ "withdrawType" ] }, - "example": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": 3,\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}" + "example": "{\n \"currency\": \"USDT\",\n \"toAddress\": \"TKFRQXSDcY****GmLrjJggwX8\",\n \"amount\": \"3\",\n \"withdrawType\": \"ADDRESS\",\n \"chain\": \"trx\",\n \"isInner\": true,\n \"remark\": \"this is Remark\"\n}" } } }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"withdrawalId\\\":\\\"670deec84d64da0007d7c946\\\"}}", - "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"toAddress\\\": \\\"TKFRQXSDcY****GmLrjJggwX8\\\", \\\"amount\\\": 3, \\\"withdrawType\\\": \\\"ADDRESS\\\", \\\"chain\\\": \\\"trx\\\", \\\"isInner\\\": true, \\\"remark\\\": \\\"this is Remark\\\"}", + "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"toAddress\\\": \\\"TKFRQXSDcY****GmLrjJggwX8\\\", \\\"amount\\\": \\\"3\\\", \\\"withdrawType\\\": \\\"ADDRESS\\\", \\\"chain\\\": \\\"trx\\\", \\\"isInner\\\": true, \\\"remark\\\": \\\"this is Remark\\\"}", "operationId": "028" } }, @@ -4571,6 +4529,237 @@ "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":null}", "x-request-example": "{\\\"withdrawalId\\\": \\\"670b891f7e0f440007730692\\\"}", "operationId": "029" + }, + "get": { + "summary": "Get Withdrawal History By ID", + "deprecated": false, + "description": "Request a withdrawal history by id via this endpoint.", + "tags": [], + "parameters": [ + { + "name": "withdrawalId", + "in": "path", + "description": "withdrawal ID", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique ID" + }, + "uid": { + "type": "integer", + "description": "User ID" + }, + "currency": { + "type": "string", + "description": "A unique currency code that will never change" + }, + "chainId": { + "type": "string", + "description": "The chain id of currency", + "example": [ + "eth", + "bech32", + "btc", + "kcc", + "trx", + "bsc", + "arbitrum", + "ton", + "optimism" + ] + }, + "chainName": { + "type": "string", + "description": "Chain name of currency" + }, + "currencyName": { + "type": "string", + "description": "Currency name; will change after renaming" + }, + "status": { + "type": "string", + "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE" + }, + "failureReason": { + "type": "string", + "description": "Failure reason code" + }, + "failureReasonMsg": { + "type": "string", + "description": "Failure reason message" + }, + "address": { + "type": "string", + "description": "Withwrawal address" + }, + "memo": { + "type": "string", + "description": "Address remark. If there’s no remark, it is empty. " + }, + "isInner": { + "type": "boolean", + "description": "Internal withdrawal or not. " + }, + "amount": { + "type": "string", + "description": "Withwrawal amount" + }, + "fee": { + "type": "string", + "description": "Fees charged for withwrawal" + }, + "walletTxId": { + "type": "string", + "description": "Wallet Transaction ID" + }, + "addressRemark": { + "type": "string", + "description": "Address remark" + }, + "remark": { + "type": "string", + "description": "Remark" + }, + "createdAt": { + "type": "integer", + "format": "int64", + "description": "Creation Time (milliseconds)" + }, + "cancelType": { + "type": "string", + "enum": [ + "CANCELABLE", + "CANCELING", + "NON_CANCELABLE" + ], + "x-api-enum": [ + { + "value": "CANCELABLE", + "name": "CANCELABLE", + "description": "Cancellable" + }, + { + "value": "CANCELING", + "name": "CANCELING", + "description": "Cancelling" + }, + { + "value": "NON_CANCELABLE", + "name": "NON_CANCELABLE", + "description": "Non-Cancellable" + } + ] + }, + "taxes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Users in some regions need query this field" + }, + "taxDescription": { + "type": "string", + "description": "Tax description" + }, + "returnStatus": { + "type": "string", + "enum": [ + "NOT_RETURN", + "PROCESSING", + "SUCCESS" + ], + "description": "Return status", + "x-api-enum": [ + { + "value": "NOT_RETURN", + "name": "NOT_RETURN", + "description": "No returned" + }, + { + "value": "PROCESSING", + "name": "PROCESSING", + "description": "To be returned" + }, + { + "value": "SUCCESS", + "name": "SUCCESS", + "description": "Returned" + } + ] + }, + "returnAmount": { + "type": "string", + "description": "Return amount" + }, + "returnCurrency": { + "type": "string", + "description": "Return currency" + } + }, + "required": [ + "id", + "uid", + "currency", + "chainId", + "chainName", + "currencyName", + "status", + "failureReason", + "address", + "memo", + "isInner", + "amount", + "fee", + "remark", + "createdAt", + "cancelType", + "returnStatus", + "returnCurrency" + ] + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3471890", + "x-abandon": "normal", + "x-domain": "Spot", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Management", + "x-sdk-service": "Account", + "x-sdk-sub-service": "Withdrawal", + "x-sdk-method-name": "getWithdrawalHistoryById", + "x-sdk-method-description": "Request a withdrawal history by id via this endpoint.", + "x-api-rate-limit-weight": 20, + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"67e6515f7960ba0007b42025\\\",\\n \\\"uid\\\": 165111215,\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"chainId\\\": \\\"trx\\\",\\n \\\"chainName\\\": \\\"TRC20\\\",\\n \\\"currencyName\\\": \\\"USDT\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"failureReason\\\": \\\"\\\",\\n \\\"failureReasonMsg\\\": null,\\n \\\"address\\\": \\\"TKFRQXSDcY4kd3QLzw7uK16GmLrjJggwX8\\\",\\n \\\"memo\\\": \\\"\\\",\\n \\\"isInner\\\": true,\\n \\\"amount\\\": \\\"3.00000000\\\",\\n \\\"fee\\\": \\\"0.00000000\\\",\\n \\\"walletTxId\\\": null,\\n \\\"addressRemark\\\": null,\\n \\\"remark\\\": \\\"this is Remark\\\",\\n \\\"createdAt\\\": 1743147359000,\\n \\\"cancelType\\\": \\\"NON_CANCELABLE\\\",\\n \\\"taxes\\\": null,\\n \\\"taxDescription\\\": null,\\n \\\"returnStatus\\\": \\\"NOT_RETURN\\\",\\n \\\"returnAmount\\\": null,\\n \\\"returnCurrency\\\": \\\"KCS\\\"\\n }\\n}", + "x-request-example": "{\\\"withdrawalId\\\": \\\"67e6515f7960ba0007b42025\\\"}", + "operationId": "031" } }, "/api/v1/withdrawals": { @@ -4725,7 +4914,7 @@ }, "chain": { "type": "string", - "description": "The id of currency", + "description": "The chain id of currency", "example": [ "eth", "bech32", @@ -4740,6 +4929,7 @@ }, "status": { "type": "string", + "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE", "enum": [ "REVIEW", "PROCESSING", @@ -4747,38 +4937,37 @@ "FAILURE", "SUCCESS" ], - "description": "Status. Available value: REVIEW, PROCESSING, WALLET_PROCESSING, SUCCESS and FAILURE", "x-api-enum": [ { "value": "REVIEW", "name": "REVIEW", - "description": "" + "description": "REVIEW" }, { "value": "PROCESSING", "name": "PROCESSING", - "description": "" + "description": "PROCESSING" }, { "value": "WALLET_PROCESSING", "name": "WALLET_PROCESSING", - "description": "" + "description": "WALLET_PROCESSING" }, { "value": "FAILURE", "name": "FAILURE", - "description": "" + "description": "FAILURE" }, { "value": "SUCCESS", "name": "SUCCESS", - "description": "" + "description": "SUCCESS" } ] }, "address": { "type": "string", - "description": "Deposit address" + "description": "Withwrawal address" }, "memo": { "type": "string", @@ -4790,15 +4979,15 @@ }, "amount": { "type": "string", - "description": "Deposit amount" + "description": "Withwrawal amount" }, "fee": { "type": "string", - "description": "Fees charged for deposit" + "description": "Fees charged for withwrawal" }, "walletTxId": { "type": "string", - "description": "Wallet Txid" + "description": "Wallet Txid, If this is an internal\nwithdrawal, it is empty. " }, "createdAt": { "type": "integer", @@ -4972,7 +5161,7 @@ }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"withdrawalId\\\":\\\"670a973cf07b3800070e216c\\\"}}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"address\\\": \\\"TKFRQXSDc****16GmLrjJggwX8\\\", \\\"amount\\\": 3, \\\"chain\\\": \\\"trx\\\", \\\"isInner\\\": true}", - "operationId": "048" + "operationId": "049" } }, "/api/v1/accounts/transferable": { @@ -5132,7 +5321,7 @@ "x-api-rate-limit-weight": 20, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"currency\\\":\\\"USDT\\\",\\\"balance\\\":\\\"10.5\\\",\\\"available\\\":\\\"10.5\\\",\\\"holds\\\":\\\"0\\\",\\\"transferable\\\":\\\"10.5\\\"}}", "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"type\\\": \\\"MAIN\\\", \\\"tag\\\": \\\"ETH-USDT\\\"}", - "operationId": "031" + "operationId": "032" } }, "/api/v3/accounts/universal-transfer": { @@ -5375,7 +5564,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"orderId\\\": \\\"6705f7248c6954000733ecac\\\"\\n }\\n}", "x-request-example": "{\\\"clientOid\\\": \\\"64ccc0f164781800010d8c09\\\", \\\"type\\\": \\\"PARENT_TO_SUB\\\", \\\"currency\\\": \\\"USDT\\\", \\\"amount\\\": \\\"0.01\\\", \\\"fromAccountType\\\": \\\"TRADE\\\", \\\"toUserId\\\": \\\"63743f07e0c5230001761d08\\\", \\\"toAccountType\\\": \\\"TRADE\\\"}", - "operationId": "032" + "operationId": "033" } }, "/api/v1/base-fee": { @@ -5466,7 +5655,7 @@ "x-api-rate-limit-weight": 3, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"takerFeeRate\\\": \\\"0.001\\\",\\n \\\"makerFeeRate\\\": \\\"0.001\\\"\\n }\\n}", "x-request-example": "{\\\"currencyType\\\": 1}", - "operationId": "033" + "operationId": "034" } }, "/api/v1/trade-fees": { @@ -5557,7 +5746,7 @@ "x-api-rate-limit-weight": 3, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":[{\\\"symbol\\\":\\\"BTC-USDT\\\",\\\"takerFeeRate\\\":\\\"0.001\\\",\\\"makerFeeRate\\\":\\\"0.001\\\"},{\\\"symbol\\\":\\\"ETH-USDT\\\",\\\"takerFeeRate\\\":\\\"0.001\\\",\\\"makerFeeRate\\\":\\\"0.001\\\"}]}", "x-request-example": "{\\\"symbols\\\": \\\"BTC-USDT,ETH-USDT\\\"}", - "operationId": "034" + "operationId": "035" }, "patch": { "summary": "Get Actual Fee - Futures", @@ -5636,7 +5825,7 @@ "x-api-rate-limit-weight": 3, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"symbol\\\":\\\"XBTUSDTM\\\",\\\"takerFeeRate\\\":\\\"0.0006\\\",\\\"makerFeeRate\\\":\\\"0.0002\\\"}}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", - "operationId": "035", + "operationId": "036", "x-original-method": "get" } }, @@ -5715,7 +5904,7 @@ "x-sdk-method-description": "You can get the user info of all sub-account via this interface; it is recommended to use the GET /api/v2/sub/user interface for paging query", "x-api-rate-limit-weight": 20, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"userId\\\": \\\"63743f07e0c5230001761d08\\\",\\n \\\"uid\\\": 169579801,\\n \\\"subName\\\": \\\"testapi6\\\",\\n \\\"type\\\": 0,\\n \\\"remarks\\\": \\\"remarks\\\",\\n \\\"access\\\": \\\"All\\\"\\n },\\n {\\n \\\"userId\\\": \\\"670538a31037eb000115b076\\\",\\n \\\"uid\\\": 225139445,\\n \\\"subName\\\": \\\"Name1234567\\\",\\n \\\"type\\\": 0,\\n \\\"remarks\\\": \\\"TheRemark\\\",\\n \\\"access\\\": \\\"All\\\"\\n }\\n ]\\n}", - "operationId": "036" + "operationId": "037" } }, "/api/v1/sub-accounts": { @@ -5909,7 +6098,7 @@ "x-sdk-method-description": "This endpoint returns the account info of all sub-users.", "x-api-rate-limit-weight": 20, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"subUserId\\\": \\\"63743f07e0c5230001761d08\\\",\\n \\\"subName\\\": \\\"testapi6\\\",\\n \\\"mainAccounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"balance\\\": \\\"0.01\\\",\\n \\\"available\\\": \\\"0.01\\\",\\n \\\"holds\\\": \\\"0\\\",\\n \\\"baseCurrency\\\": \\\"BTC\\\",\\n \\\"baseCurrencyPrice\\\": \\\"62489.8\\\",\\n \\\"baseAmount\\\": \\\"0.00000016\\\",\\n \\\"tag\\\": \\\"DEFAULT\\\"\\n }\\n ],\\n \\\"tradeAccounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"balance\\\": \\\"0.01\\\",\\n \\\"available\\\": \\\"0.01\\\",\\n \\\"holds\\\": \\\"0\\\",\\n \\\"baseCurrency\\\": \\\"BTC\\\",\\n \\\"baseCurrencyPrice\\\": \\\"62489.8\\\",\\n \\\"baseAmount\\\": \\\"0.00000016\\\",\\n \\\"tag\\\": \\\"DEFAULT\\\"\\n }\\n ],\\n \\\"marginAccounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"balance\\\": \\\"0.01\\\",\\n \\\"available\\\": \\\"0.01\\\",\\n \\\"holds\\\": \\\"0\\\",\\n \\\"baseCurrency\\\": \\\"BTC\\\",\\n \\\"baseCurrencyPrice\\\": \\\"62489.8\\\",\\n \\\"baseAmount\\\": \\\"0.00000016\\\",\\n \\\"tag\\\": \\\"DEFAULT\\\"\\n }\\n ],\\n \\\"tradeHFAccounts\\\": []\\n },\\n {\\n \\\"subUserId\\\": \\\"670538a31037eb000115b076\\\",\\n \\\"subName\\\": \\\"Name1234567\\\",\\n \\\"mainAccounts\\\": [],\\n \\\"tradeAccounts\\\": [],\\n \\\"marginAccounts\\\": [],\\n \\\"tradeHFAccounts\\\": []\\n },\\n {\\n \\\"subUserId\\\": \\\"66b0c0905fc1480001c14c36\\\",\\n \\\"subName\\\": \\\"LTkucoin1491\\\",\\n \\\"mainAccounts\\\": [],\\n \\\"tradeAccounts\\\": [],\\n \\\"marginAccounts\\\": [],\\n \\\"tradeHFAccounts\\\": []\\n }\\n ]\\n}", - "operationId": "037" + "operationId": "038" } }, "/api/v2/deposit-addresses": { @@ -6067,7 +6256,7 @@ "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"address\\\": \\\"0x02028456*****87ede7a73d7c\\\",\\n \\\"memo\\\": \\\"\\\",\\n \\\"chain\\\": \\\"ERC20\\\",\\n \\\"chainId\\\": \\\"eth\\\",\\n \\\"to\\\": \\\"MAIN\\\",\\n \\\"currency\\\": \\\"ETH\\\",\\n \\\"contractAddress\\\": \\\"\\\"\\n }\\n ]\\n}", "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"chain\\\": \\\"eth\\\"}", - "operationId": "038" + "operationId": "039" } }, "/api/v1/deposit-addresses": { @@ -6223,7 +6412,7 @@ "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"address\\\": \\\"0xea220bf61c3c2b0adc2cfa29fec3d2677745a379\\\",\\n \\\"memo\\\": \\\"\\\",\\n \\\"chain\\\": \\\"ERC20\\\",\\n \\\"chainId\\\": \\\"eth\\\",\\n \\\"to\\\": \\\"MAIN\\\",\\n \\\"currency\\\": \\\"USDT\\\"\\n }\\n}", "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"chain\\\": \\\"eth\\\"}", - "operationId": "039" + "operationId": "040" }, "post": { "summary": "Add Deposit Address - V1", @@ -6379,18 +6568,18 @@ "type": "string", "description": "Deposit account type: main (funding account), trade (spot trading account); the default is main", "enum": [ - "main", - "trade" + "MAIN", + "TRADE" ], - "default": "main", + "default": "MAIN", "x-api-enum": [ { - "value": "main", + "value": "MAIN", "name": "main", "description": "Funding account" }, { - "value": "trade", + "value": "TRADE", "name": "trade", "description": "Spot account" } @@ -6401,13 +6590,13 @@ "currency" ] }, - "example": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\"\n}" + "example": "{\n \"currency\": \"ETH\",\n \"chain\": \"eth\",\n \"to\": \"MAIN\"\n}" } } }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"address\\\":\\\"0x02028456f38e78609904e8a002c787ede7a73d7c\\\",\\\"memo\\\":null,\\\"chain\\\":\\\"ERC20\\\",\\\"chainId\\\":\\\"eth\\\",\\\"to\\\":\\\"MAIN\\\",\\\"currency\\\":\\\"ETH\\\"}}", - "x-request-example": "{\\\"currency\\\": \\\"ETH\\\", \\\"chain\\\": \\\"eth\\\"}", - "operationId": "047" + "x-request-example": "{\\\"currency\\\": \\\"ETH\\\", \\\"chain\\\": \\\"eth\\\", \\\"to\\\": \\\"MAIN\\\"}", + "operationId": "048" } }, "/api/v2/accounts/sub-transfer": { @@ -6607,7 +6796,7 @@ }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"orderId\\\":\\\"670be6b0b1b9080007040a9b\\\"}}", "x-request-example": "{\\\"clientOid\\\": \\\"64ccc0f164781800010d8c09\\\", \\\"currency\\\": \\\"USDT\\\", \\\"amount\\\": \\\"0.01\\\", \\\"direction\\\": \\\"OUT\\\", \\\"accountType\\\": \\\"MAIN\\\", \\\"subAccountType\\\": \\\"MAIN\\\", \\\"subUserId\\\": \\\"63743f07e0c5230001761d08\\\"}", - "operationId": "040" + "operationId": "041" } }, "/api/v1/hist-deposits": { @@ -6798,7 +6987,7 @@ "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 50,\\n \\\"totalNum\\\": 0,\\n \\\"totalPage\\\": 0,\\n \\\"items\\\": [\\n {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"createAt\\\": 1528536998,\\n \\\"amount\\\": \\\"0.03266638\\\",\\n \\\"walletTxId\\\": \\\"55c643bc2c68d6f17266383ac1be9e454038864b929ae7cee0bc408cc5c869e8@12ffGWmMMD1zA1WbFm7Ho3JZ1w6NYXjpFk@234\\\",\\n \\\"isInner\\\": false,\\n \\\"status\\\": \\\"SUCCESS\\\"\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"status\\\": \\\"SUCCESS\\\", \\\"startAt\\\": 1728663338000, \\\"endAt\\\": 1728692138000}", - "operationId": "041" + "operationId": "042" } }, "/api/v2/accounts/inner-transfer": { @@ -6994,7 +7183,7 @@ }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"orderId\\\":\\\"670beb3482a1bb0007dec644\\\"}}", "x-request-example": "{\\\"clientOid\\\": \\\"64ccc0f164781800010d8c09\\\", \\\"currency\\\": \\\"USDT\\\", \\\"amount\\\": \\\"0.01\\\", \\\"from\\\": \\\"main\\\", \\\"to\\\": \\\"trade\\\"}", - "operationId": "042" + "operationId": "043" } }, "/api/v1/transfer-list": { @@ -7244,7 +7433,7 @@ "x-api-rate-limit-weight": 20, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"currentPage\\\":1,\\\"pageSize\\\":50,\\\"totalNum\\\":1,\\\"totalPage\\\":1,\\\"items\\\":[{\\\"applyId\\\":\\\"670bf84c577f6c00017a1c48\\\",\\\"currency\\\":\\\"USDT\\\",\\\"recRemark\\\":\\\"\\\",\\\"recSystem\\\":\\\"KUCOIN\\\",\\\"status\\\":\\\"SUCCESS\\\",\\\"amount\\\":\\\"0.01\\\",\\\"reason\\\":\\\"\\\",\\\"offset\\\":1519769124134806,\\\"createdAt\\\":1728837708000,\\\"remark\\\":\\\"\\\"}]}}", "x-request-example": "{\\\"currency\\\": \\\"XBT\\\", \\\"type\\\": \\\"MAIN\\\", \\\"tag\\\": [\\\"mock_a\\\", \\\"mock_b\\\"], \\\"startAt\\\": 1728663338000, \\\"endAt\\\": 1728692138000, \\\"currentPage\\\": 1, \\\"pageSize\\\": 50}", - "operationId": "043" + "operationId": "044" } }, "/api/v1/hist-withdrawals": { @@ -7462,7 +7651,7 @@ "x-api-rate-limit-weight": 20, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 50,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"createAt\\\": 1526723468,\\n \\\"amount\\\": \\\"0.534\\\",\\n \\\"address\\\": \\\"33xW37ZSW4tQvg443Pc7NLCAs167Yc2XUV\\\",\\n \\\"walletTxId\\\": \\\"aeacea864c020acf58e51606169240e96774838dcd4f7ce48acf38e3651323f4\\\",\\n \\\"isInner\\\": false,\\n \\\"status\\\": \\\"SUCCESS\\\"\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"status\\\": \\\"SUCCESS\\\", \\\"startAt\\\": 1728663338000, \\\"endAt\\\": 1728692138000, \\\"currentPage\\\": 1, \\\"pageSize\\\": 50}", - "operationId": "044" + "operationId": "045" } }, "/api/v3/transfer-out": { @@ -7653,7 +7842,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"applyId\\\": \\\"670bf84c577f6c00017a1c48\\\",\\n \\\"bizNo\\\": \\\"670bf84c577f6c00017a1c47\\\",\\n \\\"payAccountType\\\": \\\"CONTRACT\\\",\\n \\\"payTag\\\": \\\"DEFAULT\\\",\\n \\\"remark\\\": \\\"\\\",\\n \\\"recAccountType\\\": \\\"MAIN\\\",\\n \\\"recTag\\\": \\\"DEFAULT\\\",\\n \\\"recRemark\\\": \\\"\\\",\\n \\\"recSystem\\\": \\\"KUCOIN\\\",\\n \\\"status\\\": \\\"PROCESSING\\\",\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"amount\\\": \\\"0.01\\\",\\n \\\"fee\\\": \\\"0\\\",\\n \\\"sn\\\": 1519769124134806,\\n \\\"reason\\\": \\\"\\\",\\n \\\"createdAt\\\": 1728837708000,\\n \\\"updatedAt\\\": 1728837708000\\n }\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"amount\\\": 0.01, \\\"recAccountType\\\": \\\"MAIN\\\"}", - "operationId": "045" + "operationId": "046" } }, "/api/v1/transfer-in": { @@ -7751,7 +7940,7 @@ }, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":null}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"amount\\\": 0.01, \\\"payAccountType\\\": \\\"MAIN\\\"}", - "operationId": "046" + "operationId": "047" } }, "/api/v1/margin/account": { @@ -7848,7 +8037,7 @@ "x-sdk-method-description": "Request margin account info via this endpoint.", "x-api-rate-limit-weight": 40, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"accounts\\\": [\\n {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"totalBalance\\\": \\\"0.03\\\",\\n \\\"availableBalance\\\": \\\"0.02\\\",\\n \\\"holdBalance\\\": \\\"0.01\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"maxBorrowSize\\\": \\\"0\\\"\\n }\\n ]\\n }\\n}", - "operationId": "049" + "operationId": "050" } }, "/api/v1/isolated/accounts": { @@ -8099,7 +8288,7 @@ "x-api-rate-limit-weight": 50, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"totalConversionBalance\\\": \\\"0.01\\\",\\n \\\"liabilityConversionBalance\\\": \\\"0\\\",\\n \\\"assets\\\": [\\n {\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"status\\\": \\\"CLEAR\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"baseAsset\\\": {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"totalBalance\\\": \\\"0\\\",\\n \\\"holdBalance\\\": \\\"0\\\",\\n \\\"availableBalance\\\": \\\"0\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"interest\\\": \\\"0\\\",\\n \\\"borrowableAmount\\\": \\\"0\\\"\\n },\\n \\\"quoteAsset\\\": {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"totalBalance\\\": \\\"0.01\\\",\\n \\\"holdBalance\\\": \\\"0\\\",\\n \\\"availableBalance\\\": \\\"0.01\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"interest\\\": \\\"0\\\",\\n \\\"borrowableAmount\\\": \\\"0\\\"\\n }\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"balanceCurrency\\\": \\\"USDT\\\"}", - "operationId": "050" + "operationId": "051" } }, "/api/v1/isolated/account/{symbol}": { @@ -8305,7 +8494,7 @@ "x-api-rate-limit-weight": 50, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"status\\\": \\\"CLEAR\\\",\\n \\\"debtRatio\\\": \\\"0\\\",\\n \\\"baseAsset\\\": {\\n \\\"currency\\\": \\\"BTC\\\",\\n \\\"totalBalance\\\": \\\"0\\\",\\n \\\"holdBalance\\\": \\\"0\\\",\\n \\\"availableBalance\\\": \\\"0\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"interest\\\": \\\"0\\\",\\n \\\"borrowableAmount\\\": \\\"0\\\"\\n },\\n \\\"quoteAsset\\\": {\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"totalBalance\\\": \\\"0.01\\\",\\n \\\"holdBalance\\\": \\\"0\\\",\\n \\\"availableBalance\\\": \\\"0.01\\\",\\n \\\"liability\\\": \\\"0\\\",\\n \\\"interest\\\": \\\"0\\\",\\n \\\"borrowableAmount\\\": \\\"0\\\"\\n }\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\"}", - "operationId": "051" + "operationId": "052" } } }, diff --git a/spec/rest/entry/openapi-broker.json b/spec/rest/entry/openapi-broker.json index 1e624fb3..7498eb9e 100644 --- a/spec/rest/entry/openapi-broker.json +++ b/spec/rest/entry/openapi-broker.json @@ -107,6 +107,424 @@ "operationId": "001" } }, + "/api/kyc/ndBroker/proxyClient/submit": { + "post": { + "summary": "Submit KYC", + "deprecated": false, + "description": "This endpointcan submit kyc information for a sub-account of nd broker", + "tags": [], + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "string" + } + }, + "required": [ + "code" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472406", + "x-abandon": "normal", + "x-domain": "Broker", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Broker", + "x-sdk-service": "Broker", + "x-sdk-sub-service": "NDBroker", + "x-sdk-method-name": "submitKYC", + "x-sdk-method-description": "This endpointcan submit kyc information for a sub-account of nd broker", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "clientUid": { + "type": "string", + "description": "client uid", + "example": [ + "226383154" + ] + }, + "firstName": { + "type": "string", + "description": "first Name" + }, + "lastName": { + "type": "string", + "description": "last Name" + }, + "issueCountry": { + "type": "string", + "description": "ISO country code", + "example": [ + "CN", + "US", + "DE", + "JP" + ] + }, + "birthDate": { + "type": "string", + "description": "Birth Date", + "example": [ + "2000-01-01" + ] + }, + "identityType": { + "type": "string", + "description": "Identity type", + "enum": [ + "idcard", + "drivinglicense", + "passport", + "bvn" + ], + "x-api-enum": [ + { + "value": "idcard", + "name": "idcard", + "description": "id card" + }, + { + "value": "drivinglicense", + "name": "drivinglicense", + "description": "driving license" + }, + { + "value": "passport", + "name": "passport", + "description": "passport" + }, + { + "value": "bvn", + "name": "bvn", + "description": "bvn" + } + ] + }, + "identityNumber": { + "type": "string", + "description": "Identity Number" + }, + "expireDate": { + "type": "string", + "description": "expire Date. If there is no expiration date, please fill in: 2099-01-01", + "example": [ + "2030-01-01", + "2099-01-01" + ] + }, + "frontPhoto": { + "type": "string", + "description": "**Optional when identityType=bvn,** Front photo of the ID card, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + "example": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + }, + "backendPhoto": { + "type": "string", + "description": "**Optional when identityType=passport/bvn,** Back photo of ID, same as above", + "example": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + }, + "facePhoto": { + "type": "string", + "description": "Selfie photo, in base64 format, PNG or JPG is recommended, and the size cannot exceed 2MB. If it exceeds 2MB, it is recommended to adjust the resolution and compress it to less than 2MB", + "example": [ + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJCh..." + ] + } + }, + "required": [ + "clientUid", + "firstName", + "lastName", + "issueCountry", + "birthDate", + "identityType", + "identityNumber", + "expireDate", + "frontPhoto", + "facePhoto", + "backendPhoto" + ] + }, + "example": "{\n \"clientUid\": \"226383154\",\n \"firstName\": \"Kaylah\",\n \"lastName\": \"Padberg\",\n \"issueCountry\": \"JP\",\n \"birthDate\": \"2000-01-01\",\n \"expireDate\": \"2030-01-01\",\n \"identityType\": \"passport\",\n \"identityNumber\": \"55\",\n \"facePhoto\": \"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg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\",\n \"frontPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\",\n \"backendPhoto\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\"\n}" + } + } + }, + "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":null}", + "x-request-example": "{\\\"clientUid\\\": \\\"226383154\\\", \\\"firstName\\\": \\\"Kaylah\\\", \\\"lastName\\\": \\\"Padberg\\\", \\\"issueCountry\\\": \\\"JP\\\", \\\"birthDate\\\": \\\"2000-01-01\\\", \\\"expireDate\\\": \\\"2030-01-01\\\", \\\"identityType\\\": \\\"passport\\\", \\\"identityNumber\\\": \\\"55\\\", \\\"facePhoto\\\": \\\"data:image/jpeg;base64,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/vPIPPPPPGclPYwUOPPPPPPPPPPPPPPPPPPOAlcrX4jYCt9j6kpjOcPfYpLrzwdPPPPPPPPPPPPPPPPFm9ycCZQ3Po/b/rPXvy/eSp/vvm0fPPPPPPPPPPPPPPJdPvXqtV63d/8A777777pf6yF/77L/AE888888888888884U2++J8ak28u+++++++ryOv++++elO88888888888888Xl+++taYej+1I3w3+zINfDe++++MAcU888888888888oq++++++N9Uv999dBxZsmdd++++++uHU888888888888k5+++++++++++++++++++++++/wDffpYvHPPPPPPPPPPOMpfvvvvvvvvvvvvvvvvvvvvvvJ7Nfk2dPPPPPPPPPPODBuPvvvvPPvvvvvvvvvvvvvvvviyc+3pHPPPPPPPPPPKNEGOeybPWffvvvvvvvvvddf8A7776owaCTzzzzzzzzzzyzzS6WuZzArnT77777777ZCCPz76bgQpzzzzzzzzzzzzzzwxCMyIobTHnvvHLHb57hQRw/wDbzpUE88888888888888888sUYie0UcMPMPtdK4oIQUodWZN8M88888888888888888s4s4c8Y888888840skc8gU88888888888888888888888cgcwQ8888888884YMcUI888888888888888888888888888c888888888888I8Uc888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888++++888888888888888888888888888888888888888+6A8++88888888888888888888888888888888888888uAM+++8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888/8QAIxEBAAICAQUBAQADAAAAAAAAAQARITFBECBAUWEwUHGAkP/aAAgBAwEBPxD/AIRJpAFvTI/yeKZjfBL3Uwkf42kgQF1Ll+ohymjH+KCQutRYjMHNY6lZiJv+GbBDBXSrKmSFdQIlldNApJdx/CVDqixg4Jbt7Tt/My3D+HmKgCzuQcui32heCD3VQ64iqfIUMsRThAM5brLdkIzBHXYEV9yBAC3L2QcVzYPFAXDvBBAwyuJaBAqagCLglqF3ZUteGZf2nPU+UH4YLymkii89hvUnWM4egpqIUtkvy8IBaPQahDL0lgrA1MNp1lUcLcEuGS3H0T5w9c+Uo6G56mT6dAsRUh2oMUweAAtjumuhFcMGycuEFxXAzKFkeZf/AIbdHf8Ali0WwKocR+yF6gS7uX2ceBe4uwK/INri7qiOJRSAE/HfGGfuE2jugI1fuJgAE/fHnPaj+RBlhwVE7JQyWp2RPMEgaRoF4T54jwiPGBQWgEvcsD3WKFiD2P3sB3imp9oHpn2QGAoA5n2h099k+3Qirll97jUACj97l5CukuLqK66Mi/AVryLEzWqA7OILUShg/dBD5G01MQJ0Tz/R4OYMMZoRCo9nYBB1VFG0j+QLgmmJlmFYPakFTCNQqngrW5vGa12+on8aAQWg6hUIrTropXQjVh4Z3IGT3Dei8olzEuInuE+J8Z8oJahh97TYYlNR0cpd6/g0SnqU9d67aT4Q2h/uJ//EACoRAQACAQIGAgEDBQAAAAAAAAEAESExQRAgMEBRYVBxoWCAgZCRscHh/9oACAECAQE/EP6EQG4SpwwPxO+aJei3KFmLW+H1tmAgqGRmOGHEaTUQ0+Ggttw0kI8JoTME0Jd/B3DEVvB2shkbxLmLqipvhiljCu3+CNslVwIsdeVZHwf87z08HBXwS0WzPmYip5TWARIpYSq5VAtiNrvqWAp9wBas7hFRHg6BhEb1Y5yZjKKNTkYlOZ41BLNV4+Yt8NqN4jsTQnavINtrGyH1MfUhN5KmQFMoK4AxNcRPmVgmziWSnmeyagxCjERx+R4ldjVh2iq0+uCDrDcFMq3ZHgWJ14f3Ul7IZqi66ioGuJoWWiRVRpLeZbzLeZbzLeFSwTdn+OAsssOg+3yzG3I7URl2CuiAbdeJ/KYr0jZh2ihkmIj4IPgdDVNP84TO1mQ1tX/XLoHuF6lFG/XMwhvvIjDeE9RBK5hlaR+ZRD0dZChG0Wo5fj/vNAfvqxMxkzdyy3rnc2lUVyCZ1lRFstS4HeWxF8E4ntHwz1T1T1T0QXaJGJkIeW3OgoUJ+T1CAtuvW3zz1FNpbtwl8KxbHpnpnonqgW00IgBp0AS4yt69R3AC2ZKuG2cK6d+uawUHruGbsFiFC102iINFwAuW0HWNYqE7gpmSGvG0Co+phTlmvYYByQC1C7UW0Kircbjc2gemoZYlSxSoAWPKRVzI2Y1yV2ALpKlMTCq65BrJPIR0hDGWXwYw4lyOKANkOq432TQLxlPM9ebsiNZuEF0gTee6UiCI/rlYqmuSG2EMPwFpbzPdPbL5bglDFt/2yKZUr9P/AP/EAC4QAQABAwMCBAcAAwADAAAAAAERACExQVFhcYEQkaGxIDBAUMHR8GDh8YCQoP/aAAgBAQABPxD/AOvRCJc1jtSvWLYqA9YZPookr9h9LD3U74PJ8yj18h7qnbOF/wACh6eype9jyo8f6o0Hurix5L0D6qwEWKncqT/CYGlkfkwHUl5op2B4UntOo+HLIdxgO89KMxllKbhgdilkv8RUt63Y2yvWM96GSEmXmhLyKPEoMcy6XeYWgEn+DJ7QIIvYOXgplYKqxTeXWtZfd0pXdrPjFvkzQ3qR4UYnrsNuxKUD0bw/xctzUn+BvjK1ABKvFJ4rczwg3RN8DFSPwu/gJdbEXIZ4lpSjPypoOeoQnDucNmk15YFpiU2epjbYN2xv/gSakgMsM7wOlKxdqKjihRh8CghEgHFofeh6xxA2A4uPzBpRGEcUXB0Uu1s7rgFnW92W5/wEtD1AaINS6Js70bFMVLWFkEbTDSJv9CzMAYtq0RyY+mT6qnVukUkgssMJdzFN2tKJjMb+G3pT8CGOwpnopz8xwzQzbDsOLtwXnUNy46f4A4aylBituLAUrUya49ugDmKDl8kAEAS7FWMMKUPKmvUEw/iCkEOlFQXoyTeVOqFBEzCdiD5irV1+aTN8MJkR0RoYMCwOCGmrZnSPvyxQ19IVLxhXXSgm0BuliDK0Cxgmo/yYhouV75gwTF4orslEe+7SbQIoVLQeVrB1Iox02tn2jYl2YcYqyeV7IoO3rNEFi7GyOr03qAgA621ede9LmHm6KcvzgISeaJDqRJyFBPmtKiRPvbilNsT2Bt3Ypk3VQYluDfeV7U9TCg5JdhwdikAewCWvvnL/AMqGWfI4zKyll1xUpKRZAWsQMHB6VCC+QmS49m48lPxJuoQumMRlbHFW9BfI4YneR6JQ+3QIBwFRUxuFnpWb5ww0MAHT5PYHcn/X70rMKUFlXasb2MesUtd0m2lXM9yS4VvLgloSVTZc5Bl8+1HtmDugCx4C6UItHKvGEbjxSzehOqEaMudZT0Km4PamHcdQTvSTFhuEkOpJ0KGfDUbvahB8vz2cgazA53gGe1EwkSR+8PK8eAuquCmbbyyxyLoaaZqDUibB0hq42Gs6WAMBANgKCKvU3oZTFx/FNXRFKjKr1adqhGd5o2rPQXE7JTO3w3AvcVEeChnAn0pyHK/PUbUuKRKys7Xrd3+8HkGeyexMS6xG7UpxB7CX53IOi7UIKav4TkJmzHXT4JSSZGCidYfJT2pDaM8B4qiST/Rv4oXaAs2Gp7FcPOF5pSSEEsjaKRH5ZUgSDNiR6/dw2CjtAJWrCES6SEux5VFME8APx8IxoUqTFiab2EK6KLiQaVOAKkgLDMWW7LzytNH18t8SywLEnaKiLZrSryoXumB3bUhveMmYv63zgDpRuauxKbpd/tqCJjLnmpXhAWXSKw9eaD4ZBzbJt7U/KKP+s9QHu+7s7gJTF1j1aDFYvRYj6loxR4vgBgIIWiIn8uaFs+TB4gQ85qHF3U+E2o+GKiKgkpuCgZ3wLdYdKKKIiZPlFJhm2H7uhBKdnBehTMQEbsseQ0fDGaWg7VJuZAQiSoViQRO9FBBNiZ70Z+SWopZoywEgedPyShgXA7KT3fdwgkXrkPzTp8NZFPSawJ+FMZMjQgmAFGKj5SsWpwUKTd2P4j5RQkWfSD7+j7wA4xh3vZB7IpesT290Se9GPig+XMb1JWdtxD8oFmgRv+q4nZDt94NnpyS2/TJOnNFzNIzYhOxhO4aXqxjHzUIkEsE/AghrAtZW2oc9Gpr6/KLiNWN0+Q+lA0KBgAgPvBXgk83K2Kby0rCK2RIcO0UIYZkRG7LgfPX5jUGImwJh1EqdikBFBpSGQxpJxMUCja69QUdgoW5Nxk7r2psylJVWnyRLT/aMhZlYAA45U4fJEzesI5Jq+GbTqdhFSLg4D80qc2tU8oEOi0bnuGaJslzufcrlfkQB1qXtwazwJA83SgNghQHbAO5zTGQUaHy9AjrWMMPQYt5wj6jSiDQ7EJf8mR0vR8qYrFdBpLfNQyONiJllpOJ0qC4kEwQBWILSyxlq8I5hBtsc6tApZe5PRBRpc7IfOaOKJZzdhyetBbuY3kqiyJqY0p67BLjCluTnDp9vCVqml3abEBYZN+bfyUicOQSPTB2KlYuuf9LgKPzYQk25lf7owp4ovNB3Z4pphuztoCz3vUhUykaImKKC6RwOBnqX4aFM0lg4T5LWQBR6APesPllYTSmFaKyPyL0zUkqz3fOXbFF3jE0IBoQf6zps1EuE8WYNJHXZTWsZUan66nD+Ibim4nUV56gqxgDdy1Sb/aFigN8bhixMECdXN4mKNSJXQDBY91eogkNkkvX24oIiCYLNg2C73rcrdzLmoh8LmCL3yOM75ir5aoVlZtyO6m96DEZu+QAHzWnS7EW81PSlqLVnJw2XFkOulRAQbckI9uK2jwajyr9k0EkJkvwyDwx8bUoIs7BEfzrT8sTT0CorK0be13Q7UTfIJY35Vby7/E9Q1jCL9h6xScN8gUwT2ZoJCNLnuNPecIvYpQg6r0SaLcJCw9lLPRoUuoYB1JXkdahbs9n8Zg1k1J9lQDW+reylmPTJkwS1O1okk9P0PQoyeZYX+X8UgELcZjKkt9BaLWHMeqkMcDEM6fm9So0LYOa4vLgxZWZKAVgWA0DFTpfqYQqb3ZsVzJjk7TjtFQM18y03z5OSnVfwXLimULjfEa0lj4c4dBxRkNop5lIwiDKA0NblGmm6yh+z6U6Q7CM6wKbKMCHyaBiEZxFTeHO1TUkXvSUsdF4eFq8FRJYOA6jp4Q/BFFRUtqQTlzYEFESmJW0zDDWN6TZK6usY5aLKDOusnVfiJKm1EBRYcGSDqvOr+ijeWDqrlf2LUYoKc1bTshI1PKoxYHnDyilCJxdFGqF+qY5qBawAhmJ2TfZrQ5pRo8P2NY2q66Wsoxy7aulXtQ+X/bsewUIkOdVqu7RQAN6m6AHu04/KX82KalS2bjSHQPlQ04gwAgA7USFYFpGvShwpUcAMRlO+fKiKRlTyNygozoNU2G1WDMMGMFhff0R6UgEYRLkZqGHijZyx+acnvQxOWOL1LxfR96WqBLfe4qdCsYb1okIN196m37r/AFQUH9BkqaqOBobADHFc3yoyRuVqb9qr351GC0dT9FHgV3fdThEupfiainiF90VwOijpH+6HMzouMYf69KUcxAmB0M9V+KMVPz+EpseB83pWMgBXXXq+3XwMfCIgUQjea1EmNhtn9fLajm47X0k85wetDRA5IhI/YVgmmomICJY5dmsbZadzWu/LlYscUEHADV3eefF5eDuGH4o1WfJYUaMxeqX4WsqR8CMukN/FSXQP5v3RbrSCBIQjqUhiiNocdGad9yoWS+9AINI66PrV4FIdZH4a0/skbKZe9J5o4aN3mjoL8yVqHNDNOwP6aLYpByTX/Jr/AJJX/FK7FFsWqXdpvUG1aRp4qGkuhGfSaFQIQ8tjsvl8RMLPDdPc6edJEtQOM7WXtWH+qD4WtKQc0UJJa7JpHiIfPeoGssixOS64cjq0pB+wYc9QCvZtg1eKUPl6ct7xlwH4LEjvIyrdcr/Wo8XZ5e6iekh4C+9TSQzE5peZo/gHpEJEdqmS1Lonq0kIEyoZ1qA76mTsxSE0LNjaU5G8LHO7T5kZidiBE5T6u1RawhkpcXO+lC5ryP4RSYxIg30Kuoq5ManQMUYWKAU/OkjDLuRTyFnI7Afy+EDISz1mMB/ypt8eiRv+goCEIL911eaPkRQVhIEkTpR0D/oTPkSHpTfSh0PYkdvrzIItEpicwZtljuSJW5KC++gG2xUf++6lqnVaMUU4oxXqXuq6omwETLTNvwehzSPY1QdovlbXOmElM0ITcPR1lzz0TY3IF5VHHLjfJVI8qKZMwLhMCS3tQ0ujmIgBtAQtRxDK1QU7A35KlmUYi9um7UKgwXIdCodvALq0XmrBkE8WlDB9A+ijI6KHxUiEAZMwDq1OI5/NAnAXfNoxRcK+5040p+WHyxArep61Mmt6cNnunX64HpkIh6u0hL+Uog4GT2BgwHQoJJBMV9RaCoPBxRikI1nyH+1ZH/M380V8UCRG0JSbhQjdrrlDvcb7IEfSYMSDE3bm9DEXkwQgbSxWuKikLRRFETS6LpbSoIME6GDGCfKNqBlBrMt4C0u/BtVrSoKkT0onu8z9qTBDQt0FR9BNqj2oZ5WungjMekCocaqTrApqp/FFgwXB6zbfeij4yZABKuhvQYnoLvToVAL9SdYhbU2XNgg9Ayc/9oTUlQXlse1TnI00YA/W7/VkMrG4raKW8VhwqDglV5WiAMVX2Dg0+NiS5nlBPZq9U2vhQ9ZqDgJSZ57Nh36jjBSTOT9zpO9XYu7MJAOAUiKKCRNy14w0azLS31vcoSWnJZ4m2pTViPveAlvd5oj5fLaS1LJlWjwn6C3pVHoQh6qKdKRaAGVqEygqCO8mzQ70qaGTEIfxtQVFBHxsZBQ8AvRasz0yUsBwuvYKRyOQkYREbcU2xBDEaRxcTvVjty8iLT2Q7VIu1k7X6yJ0AEq6FRpuqyYOjpwl1qJWbnKgnDd/1Tdo+KGxOX7BH0WgQ02EWmEkskt+adRFHJJMsuqvBUsrVF3Ylyq53aiRFRfUT1g606LELJHtTChfUYdsVkWP5tTZWEqvLHpUrMmByfupSZSesX+js6DRk3SgSglRgArMHYEFocI79KUrcFhWbI2286n5T22BxMoA7xHepSMJxNkXcPNomIKUSPSlAoRHSudV8lAfHYgE+c0xixZ+spm7pFys50uBxwp1atILSW6xWBHyALFidRIT1pOMzFJGy0T1obU2QJw2eY1Ja8symQ3An+irMYtCGC/nUm6V+yraPg0gRcJ5GT3oNZb6Nz3+F+Xp4Zr1/wBqAKViwCZpgfwPJ87cPOmiIsDdmo9mvTIRQfJaSRq9YnOLcbccUnISDT2kvJRAix65aVaksOblhleXNGdkA+1nST6pw0YjiFhNp1k71i10oiXV7q03o+Q2GJCJM1Jw2ZJ+WPSgpHoF6hKcQ3wKO8UMG6hDuTTFC7IeTSVneYfelrt6/rqI+qwEe3WhXiJJMbUann/3RWVn8a0W5d6XbqwfinNzt/rScN5D+qhgG8H80T5+n2q/7n6qBkPhL8V/S/qv6v0r+j9KAZen6KYi/k/VQzPwfopFNNgnvUEF39sDT3kQqK96mDbeVioOEhm86ZaAAAgKPlNFaetciAQ1GBapBCPzPlRwBGndEvYfahY0wBb4NORCEKhqwdka792mpneSL3MXveBH6ie+fRln/CnrNsdEt8ytKj5mKBn/AFWEnQmp8XdD7UA3zd/xSmVHf/VQXoiUpcOhPzS8odB/NYDkfs1oV0/YoG+dSmSB5V+KUeXr7JU9PM0QesX7pNfXqlx3aHS/k4on/k8qJ/QUIjsyfzSSQRrFEVLmbh71HTGsBPkFPmwIv1NRenRD0qKigj50pZ7UhU85fKh2ZDUKYO+PKpX8haxc7+gVPmgCnSxdkqCpf2BMrqRHanxIgClh3n6g5aAnP4RaiLN85UD80Yv9bBqKjisYox4I8Iox9EOa8bMGVOm+i0SYOdLIZ7exQcRVtcUlIJChv+iKnnTu+oELEfKtHnRJmndhX3Kn7vjNQgTumX6dq9lColO2O3gpzMCAJVelTbyEYkD5Qves4InGAS9bvf6deaOamIIAhbJbON634X84elEt9w2C4SV2DWnmHYEqeSFGB9kHzijVlIMPZeSjxOeiDdLPP0mpTZ7KyGx3lFtYa08J6BBUucW0o7HNM3sWbszEPkH6dNfUMB++NaBVVBoVyVwdkZvNQ4ChABIpp0q1sSfOr+fuBPmnYASvlVjMcwjY7avDQvPBNBYwBLdZaQRgZSp0k06R3p0EAmRok5Ew9GhsnG1HXwVBTNNHGZZCx2L96gt4RcEh93eoouh8V4OosHer3oUjLBtgHYK0Db1AjzcvP0zHlmgRKroBRhj2QVgIylsOBtq1cxWW8vY0T1BaZc14/kOtcbv0fcNY7DaL+k0UoIpO/wDBNGPAvwBgRMEL5PlT8lSBOwR4NZD+gXqZclmb8rp7FGNDKQAQHlW9D5XcAJLu7u8VOzIFSLsmdbOjqoIx9K4aZuUdXLWbnLoaNJbYArfmNw4ml10KkTTDFQSSUw9n3CcfO6EhKIfSOJfcWTlpNJiDQ6wrD14pxAyhOxxY71JBFOwPSdgle9FRAzzz3zUzUGJpE3B+32aUzDILwI8V4OzQYqPqTlQ6vgM9YojFvSS+RO77xLpRtBAGAMH0zCwcmxq1Ju0Ty0JdIeVGiGewQehTek4mm1CDrZdyvLCkbD0jz+4OKGCac1/JxSYJNke8I92nuwKbxJ0bYp4yJVOAnA/XgKxRmgZoxCrWhgfvvQvAVp1O43pe0mYA1WhQfIw3WmcTKtp2KtXu5LEFNhEBocr9P6wHBRKcvMdUi9b9qCx4EJXdQFqTueoUC0oehHGgpS9JZRx5B+FUe6ArG9x/0PQpOkaDvutbY9P1UI3qIvRomWNwe3eiqVofZ9RNTU/MZ0o4xvmzd+/OpxlhdiUUcHFTN9JrC2B1DP8AyjfhTZcy+UiOJ3ovV6dZRnLs5eXioWkEm944HAdhdaEA+n9HjxB961ROjAUzey35oUpWZA+HWh2wrYCWBriJyc1GuZiw2mBIY870zGiLk3k07ViMGAfKijU48mSzWMvE0tx3LwcGlYHjNDDR45mVuCYabhjCaLc8uKPpJoyjSiAqdk5iCjzLU0IR1AfWojukg7SVHDvYPVSKyNKUj3KPlQNFf89PXWXAHv01ESCwxh2OKgmJJiyc6b6zFEQgFgEBV3F2YaumXnBrTQnoks1s1qp5iVD4WaACAOAPqM1ppFYcYsAXAY7anqRSdzC1llcY4oeQ5AdvU5KbeGRapR64eaxv+ObexXeiPWj62RZTzMNKZWD2hIJ7UuZUqsr1pprT4Cl6pIGEpwSFNhpz1Nf90Y+izz3ijNHCgv2y+1Gy3fB6YFJdalippXenLheMn1VmmSRCg6k4fSiAoRuJ8X4zS7fQCkolkRPNn0p4m51jtgKekIS4TvGDlpmlgKT1ZehzmgAABAFjFNfVHAGq6FQRkMyiY7lZetFvnihcxN4LAW9Wj6mFmKkVv7ZUdLqzzUn3RhbKbnmG9M2laMzszQtuc76CtHlQMaSgIl8+hv6VHiM0+LSyy9KIIWQYJODilqfBWPBCpLVYHLUyDH/OE9ailPEXQRYeGGkjwmmKnhGO3ck70UUCjOWp2ZO1T9C8uFEw7zYc69Mypc0tT8JClMPlpVofy1CLZHkZ+BpNIedkNU3bcUvm1m6GiCCpIQpAB6z6UNVMwB3CfKlFX4DpAec0JEsAm3goqKweYMNhA6m7xG9KA37lGt2+DiXUoII+sQ6V0IbfupNoEESXgawSGpJdgrjGMLi3k1ONNK3aeK+zzTfAYDgg830qFPgIloKxmToFO4uGnUJq0GmlPQBeBMlGhIPlWq7ltMJz4jagwxnBQvHRHzqIonDn58boDq2PYY78UpLs+ITR1AwCVpOEtk91R4qGadoHKss0R2x0TxZlETpNMbKi5M22su00WtbAIbkVZcAnYrG1RHhjNqL7iKHQ6nc0NYKdDCy9y99KPkCJYEB5fXwIoLAK9KuC7tknpNZqWJlN7sd4qAqCnBPN6XgZKUIQNsgT4DlC49YCjzTy8SrkQJwApKblMoFkCOwihVBHSj0NEANxT6RWCfmQfVqyf4/cFZdOQelFn+LaTTwKfwQKZjpX7qHw/wDG9FT0gtDFm7KA4R6XrNYzSxU6vXIl6sdvEJQMtSXORF18t9h2qFm7xK7wS+1Z2rGHk1FoEDZ/0nybUnijTHcCz6NMQqR18S8GcwDqd05jP4PizdfbelRC+llZmrlE4FNjsBT1o8csV9ZpIYTI16XpUjfEknmTjIHO8It0w3zhdOv2GKYsFK4iC6gP4pZ8CZIzRJHTIQfNVMk+IlMVTc193xFCYuK9SqFceSElKyhut5pU3KufzaoSzZD1nrTxE0k/Mir82Y/qKkQ/C+9pU+FGsX0Kk5eNPYqzJ1YD+aPmD/JFLwYaH4ysMJsfrptXgRfinZcGpi86Szl3KvM0+FwphgFHIBXnboFOfAmwUKwmtF9EM2d/QnjAJpRGosqwBMS5qW2uW2tfAip/CkzPrM8rPSiBslKAnLAAvltVhbrGHVMG+q9Kmi26PxXOAye1BoA5CKhQBj7HPaiIuXVdCROopPGJKF6F1uog9o1qVP6ZEwz4LL4lGNOrpUP/AJy+svK57VPgVlzcDQWP4t8MVFR4R4R4GPFD4bdhA+dZVp4NMyAo7TWmxCPg994inqeIxU28RKVhggWjBWLH+N5pRsRsL9UlJu34sUMOMQfmj0oyEaLygqKPs8qSDCYr9gD2oWjzRAY8tuPEYpQYKBu2cdkpcBhkMneKE0VDStwWnnNLbxXnnGIgDqtJpNMW+85joH0AXgqNRyVODKDqoT3ifHBTZiYpIEC1gEzvO3jCoC+uhYG27Si1zyjK+vipAqsAa1M5J02RH1+3k70XyCwZkZNo2ukZ+QGR0xNNGYsCC7N0Y4S6kBH0GFqdPlyWABPJ5j8FkUHrtk9ZIShs4uvXCX7RT+Pks3uVv6VbrBqbQH3b+ILim5NAwOIPWCNpoID7eCDhpySzoTq2Ba4Oba24tLB1G9RUfA8fJcjYChlBbcjEjY63hsS6UMBAYPoigtCTXSeG48LS0SZ4PfrrUfBPwCo+TKGADVWhY0qjCYHUC7yv3GKMhlgXWzc6YqVJ1XE2vD1gommWD75jQRSPQ84oLvYGeYfepV9FhzaQA8w1Nl5nN9LKTGCDigBx9Gg0cC5iAjKabLMdKaGkRSbPI6JZpEyfEen6tbABlqHxCt5BldJz2LatCPukXqL1H07SJPaNZbNzpjcam9FbYNjUOstqMNmPwQVKgvQFlsPHYFp1fXQu4GO6UissIVto4GbAd6CP8Qgoi/QME2RpS+3VM94osIGRW9ygylAcHYqDb/02Pif4nPwH+IuKTqU/Af4m+Ef+DH//2Q==\\\", \\\"frontPhoto\\\": \\\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\\\", \\\"backendPhoto\\\": \\\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQ....\\\"}", + "operationId": "002" + } + }, + "/api/kyc/ndBroker/proxyClient/status/list": { + "get": { + "summary": "Get KYC Status", + "deprecated": false, + "description": "This endpoint can query the specified Kyc status", + "tags": [], + "parameters": [ + { + "name": "clientUids", + "in": "query", + "description": "Client uid, Use commas to separate multiple UIDs\n", + "required": true, + "schema": { + "type": "string", + "example": [ + "226383154", + "226383154,22341356" + ] + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "clientUid": { + "type": "integer", + "description": "client uid" + }, + "status": { + "type": "string", + "enum": [ + "NONE", + "PROCESS", + "PASS", + "REJECT" + ], + "description": "KYC status", + "x-api-enum": [ + { + "value": "NONE", + "name": "NONE", + "description": "KYC information not submitted" + }, + { + "value": "PROCESS", + "name": "PROCESS", + "description": "In progress" + }, + { + "value": "PASS", + "name": "PASS", + "description": "Passed" + }, + { + "value": "REJECT", + "name": "REJECT", + "description": "Rejected" + } + ] + }, + "rejectReason": { + "type": "string", + "description": "Reject Reason" + } + }, + "required": [ + "status", + "clientUid" + ] + } + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472407", + "x-abandon": "normal", + "x-domain": "Broker", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Broker", + "x-sdk-service": "Broker", + "x-sdk-sub-service": "NDBroker", + "x-sdk-method-name": "getKYCStatus", + "x-sdk-method-description": "This endpoint can query the specified Kyc status", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"clientUid\\\": 226383154,\\n \\\"status\\\": \\\"PROCESS\\\",\\n \\\"rejectReason\\\": null\\n }\\n ]\\n}", + "x-request-example": "{\\\"clientUids\\\": \\\"226383154\\\"}", + "operationId": "003" + } + }, + "/api/kyc/ndBroker/proxyClient/status/page": { + "get": { + "summary": "Get KYC Status List", + "deprecated": false, + "description": "This endpoint can query the specified Kyc status list", + "tags": [], + "parameters": [ + { + "name": "pageNumber", + "in": "query", + "description": "Page Number", + "required": false, + "schema": { + "type": "integer", + "default": 1 + } + }, + { + "name": "pageSize", + "in": "query", + "description": "Page Size", + "required": false, + "schema": { + "type": "integer", + "default": 100, + "maximum": 100, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "currentPage": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "totalNum": { + "type": "integer" + }, + "totalPage": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "clientUid": { + "type": "integer", + "description": "client uid" + }, + "status": { + "type": "string", + "enum": [ + "NONE", + "PROCESS", + "PASS", + "REJECT" + ], + "description": "KYC status", + "x-api-enum": [ + { + "value": "NONE", + "name": "NONE", + "description": "KYC information not submitted" + }, + { + "value": "PROCESS", + "name": "PROCESS", + "description": "In progress" + }, + { + "value": "PASS", + "name": "PASS", + "description": "Passed" + }, + { + "value": "REJECT", + "name": "REJECT", + "description": "Rejected" + } + ] + }, + "rejectReason": { + "type": "string", + "description": "Reject Reason" + } + }, + "required": [ + "clientUid", + "status" + ] + } + } + }, + "required": [ + "currentPage", + "pageSize", + "totalNum", + "totalPage", + "items" + ] + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472408", + "x-abandon": "normal", + "x-domain": "Broker", + "x-api-channel": "Private", + "x-api-permission": "General", + "x-api-rate-limit-pool": "Broker", + "x-sdk-service": "Broker", + "x-sdk-sub-service": "NDBroker", + "x-sdk-method-name": "getKYCStatusList", + "x-sdk-method-description": "This endpoint can query the specified Kyc status list", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 100,\\n \\\"totalNum\\\": 9,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"clientUid\\\": 226383154,\\n \\\"status\\\": \\\"PROCESS\\\",\\n \\\"rejectReason\\\": null\\n },\\n {\\n \\\"clientUid\\\": 232772137,\\n \\\"status\\\": \\\"REJECT\\\",\\n \\\"rejectReason\\\": \\\"frontPhoto:Picture is not clear/covered/incomplete\\\"\\n }\\n ]\\n }\\n}", + "x-request-example": "{\\\"pageNumber\\\": 1, \\\"pageSize\\\": 100}", + "operationId": "004" + } + }, "/api/v1/broker/nd/info": { "get": { "summary": "Get Broker Info", @@ -214,7 +632,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"accountSize\\\": 0,\\n \\\"maxAccountSize\\\": null,\\n \\\"level\\\": 0\\n }\\n}", "x-request-example": "{\\\"begin\\\": \\\"20240510\\\", \\\"end\\\": \\\"20241010\\\", \\\"tradeType\\\": \\\"1\\\"}", - "operationId": "002" + "operationId": "005" } }, "/api/v1/broker/nd/account": { @@ -305,7 +723,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"accountName\\\": \\\"Account15\\\",\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"createdAt\\\": 1729819381908,\\n \\\"level\\\": 0\\n }\\n}", "x-request-example": "{\\\"accountName\\\": \\\"Account1\\\"}", - "operationId": "003" + "operationId": "006" }, "get": { "summary": "Get sub-account", @@ -317,7 +735,7 @@ "name": "uid", "in": "query", "description": "Sub-account UID", - "required": true, + "required": false, "schema": { "type": "string" } @@ -438,7 +856,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 20,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"accountName\\\": \\\"Account15\\\",\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"createdAt\\\": 1729819382000,\\n \\\"level\\\": 0\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"currentPage\\\": 1, \\\"pageSize\\\": 20}", - "operationId": "004" + "operationId": "007" } }, "/api/v1/broker/nd/account/apikey": { @@ -605,7 +1023,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"label\\\": \\\"This is remarks\\\",\\n \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\",\\n \\\"secretKey\\\": \\\"d694df2******5bae05b96\\\",\\n \\\"apiVersion\\\": 3,\\n \\\"permissions\\\": [\\n \\\"General\\\",\\n \\\"Spot\\\"\\n ],\\n \\\"ipWhitelist\\\": [\\n \\\"127.0.0.1\\\",\\n \\\"123.123.123.123\\\"\\n ],\\n \\\"createdAt\\\": 1729821494000\\n }\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"passphrase\\\": \\\"11223344\\\", \\\"ipWhitelist\\\": [\\\"127.0.0.1\\\", \\\"123.123.123.123\\\"], \\\"permissions\\\": [\\\"general\\\", \\\"spot\\\"], \\\"label\\\": \\\"This is remarks\\\"}", - "operationId": "005" + "operationId": "008" }, "get": { "summary": "Get sub-account API", @@ -740,7 +1158,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"label\\\": \\\"This is remarks\\\",\\n \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\",\\n \\\"apiVersion\\\": 3,\\n \\\"permissions\\\": [\\n \\\"General\\\",\\n \\\"Spot\\\"\\n ],\\n \\\"ipWhitelist\\\": [\\n \\\"127.**.1\\\",\\n \\\"203.**.154\\\"\\n ],\\n \\\"createdAt\\\": 1729821494000\\n }\\n ]\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\"}", - "operationId": "006" + "operationId": "009" }, "delete": { "summary": "Delete sub-account API", @@ -804,7 +1222,7 @@ "x-api-rate-limit-weight": 3, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\"}", - "operationId": "008" + "operationId": "011" } }, "/api/v1/broker/nd/account/update-apikey": { @@ -966,7 +1384,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"uid\\\": \\\"226383154\\\",\\n \\\"label\\\": \\\"This is remarks\\\",\\n \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\",\\n \\\"apiVersion\\\": 3,\\n \\\"permissions\\\": [\\n \\\"General\\\",\\n \\\"Spot\\\"\\n ],\\n \\\"ipWhitelist\\\": [\\n \\\"127.**.1\\\",\\n \\\"123.**.123\\\"\\n ],\\n \\\"createdAt\\\": 1729821494000\\n }\\n}", "x-request-example": "{\\\"uid\\\": \\\"226383154\\\", \\\"apiKey\\\": \\\"671afb36cee20f00015cfaf1\\\", \\\"ipWhitelist\\\": [\\\"127.0.0.1\\\", \\\"123.123.123.123\\\"], \\\"permissions\\\": [\\\"general\\\", \\\"spot\\\"], \\\"label\\\": \\\"This is remarks\\\"}", - "operationId": "007" + "operationId": "010" } }, "/api/v1/broker/nd/transfer": { @@ -1119,7 +1537,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"orderId\\\": \\\"671b4600c1e3dd000726866d\\\"\\n }\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"amount\\\": \\\"1\\\", \\\"clientOid\\\": \\\"e6c24d23-6bc2-401b-bf9e-55e2daddfbc1\\\", \\\"direction\\\": \\\"OUT\\\", \\\"accountType\\\": \\\"MAIN\\\", \\\"specialUid\\\": \\\"226383154\\\", \\\"specialAccountType\\\": \\\"MAIN\\\"}", - "operationId": "009" + "operationId": "012" } }, "/api/v3/broker/nd/transfer/detail": { @@ -1341,7 +1759,7 @@ "x-api-rate-limit-weight": 1, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"orderId\\\": \\\"671b4600c1e3dd000726866d\\\",\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"amount\\\": \\\"1\\\",\\n \\\"fromUid\\\": 165111215,\\n \\\"fromAccountType\\\": \\\"MAIN\\\",\\n \\\"fromAccountTag\\\": \\\"DEFAULT\\\",\\n \\\"toUid\\\": 226383154,\\n \\\"toAccountType\\\": \\\"MAIN\\\",\\n \\\"toAccountTag\\\": \\\"DEFAULT\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"reason\\\": null,\\n \\\"createdAt\\\": 1729840640000\\n }\\n}", "x-request-example": "{\\\"orderId\\\": \\\"671b4600c1e3dd000726866d\\\"}", - "operationId": "010" + "operationId": "013" } }, "/api/v1/asset/ndbroker/deposit/list": { @@ -1560,7 +1978,7 @@ "x-api-rate-limit-weight": 10, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"uid\\\": 165111215,\\n \\\"hash\\\": \\\"6724e363a492800007ec602b\\\",\\n \\\"address\\\": \\\"xxxxxxx@gmail.com\\\",\\n \\\"memo\\\": \\\"\\\",\\n \\\"amount\\\": \\\"3.0\\\",\\n \\\"fee\\\": \\\"0.0\\\",\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"isInner\\\": true,\\n \\\"walletTxId\\\": \\\"bbbbbbbbb\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"chain\\\": \\\"\\\",\\n \\\"remark\\\": \\\"\\\",\\n \\\"createdAt\\\": 1730470760000,\\n \\\"updatedAt\\\": 1730470760000\\n }\\n ]\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"status\\\": \\\"SUCCESS\\\", \\\"hash\\\": \\\"example_string_default_value\\\", \\\"startTimestamp\\\": 123456, \\\"endTimestamp\\\": 123456, \\\"limit\\\": 100}", - "operationId": "011" + "operationId": "014" } }, "/api/v3/broker/nd/deposit/detail": { @@ -1724,7 +2142,7 @@ "x-api-rate-limit-weight": 1, "x-response-example": "{\\n \\\"data\\\" : {\\n \\\"chain\\\" : \\\"trx\\\",\\n \\\"hash\\\" : \\\"30bb0e0b***4156c5188\\\",\\n \\\"walletTxId\\\" : \\\"30bb0***610d1030f\\\",\\n \\\"uid\\\" : 201496341,\\n \\\"updatedAt\\\" : 1713429174000,\\n \\\"amount\\\" : \\\"8.5\\\",\\n \\\"memo\\\" : \\\"\\\",\\n \\\"fee\\\" : \\\"0.0\\\",\\n \\\"address\\\" : \\\"THLPzUrbd1o***vP7d\\\",\\n \\\"remark\\\" : \\\"Deposit\\\",\\n \\\"isInner\\\" : false,\\n \\\"currency\\\" : \\\"USDT\\\",\\n \\\"status\\\" : \\\"SUCCESS\\\",\\n \\\"createdAt\\\" : 1713429173000\\n },\\n \\\"code\\\" : \\\"200000\\\"\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\", \\\"hash\\\": \\\"30bb0e0b***4156c5188\\\"}", - "operationId": "012" + "operationId": "015" } }, "/api/v3/broker/nd/withdraw/detail": { @@ -1891,7 +2309,7 @@ "x-api-rate-limit-weight": 1, "x-response-example": "{\\n \\\"data\\\": {\\n \\\"id\\\": \\\"66617a2***3c9a\\\",\\n \\\"chain\\\": \\\"ton\\\",\\n \\\"walletTxId\\\": \\\"AJ***eRI=\\\",\\n \\\"uid\\\": 157267400,\\n \\\"amount\\\": \\\"1.00000000\\\",\\n \\\"memo\\\": \\\"7025734\\\",\\n \\\"fee\\\": \\\"0.00000000\\\",\\n \\\"address\\\": \\\"EQDn***dKbGzr\\\",\\n \\\"remark\\\": \\\"\\\",\\n \\\"isInner\\\": false,\\n \\\"currency\\\": \\\"USDT\\\",\\n \\\"status\\\": \\\"SUCCESS\\\",\\n \\\"createdAt\\\": 1717664288000,\\n \\\"updatedAt\\\": 1717664375000\\n },\\n \\\"code\\\": \\\"200000\\\"\\n}", "x-request-example": "{\\\"withdrawalId\\\": \\\"66617a2***3c9a\\\"}", - "operationId": "013" + "operationId": "016" } }, "/api/v1/broker/nd/rebase/download": { @@ -1991,7 +2409,7 @@ "x-api-rate-limit-weight": 3, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"url\\\": \\\"https://kc-v2-promotion.s3.ap-northeast-1.amazonaws.com/broker/671aec522593f600019766d0_file.csv?X-Amz-Security-Token=IQo*********2cd90f14efb\\\"\\n }\\n}", "x-request-example": "{\\\"begin\\\": \\\"20240610\\\", \\\"end\\\": \\\"20241010\\\", \\\"tradeType\\\": \\\"1\\\"}", - "operationId": "014" + "operationId": "017" } } }, diff --git a/spec/rest/entry/openapi-futures.json b/spec/rest/entry/openapi-futures.json index 61e956f5..815b2159 100644 --- a/spec/rest/entry/openapi-futures.json +++ b/spec/rest/entry/openapi-futures.json @@ -879,15 +879,10 @@ "takerFeeRate", "takerFixFee", "makerFixFee", - "settlementFee", "isDeleverage", "isQuanto", "isInverse", "markMethod", - "fairMethod", - "fundingBaseSymbol", - "fundingQuoteSymbol", - "fundingRateSymbol", "indexSymbol", "settlementSymbol", "status", @@ -3070,11 +3065,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -3323,10 +3368,10 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelAllOrdersV1", "x-sdk-method-description": "Cancel all open orders (excluding stop orders). The response is a list of orderIDs of the canceled orders.", - "x-api-rate-limit-weight": 200, + "x-api-rate-limit-weight": 800, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"cancelledOrderIds\\\": [\\n \\\"235919172150824960\\\",\\n \\\"235919172150824961\\\"\\n ]\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", - "operationId": "052" + "operationId": "054" } }, "/api/v1/orders/test": { @@ -4875,11 +4920,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -5200,23 +5295,40 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", "description": "Trigger price type of stop orders", "enum": [ - "", "TP", "MP", - "IP" + "IP", + "" ], "x-api-enum": [ - { - "value": "", - "name": "NULL", - "description": "" - }, { "value": "TP", "name": "trade price", @@ -5231,6 +5343,11 @@ "value": "IP", "name": "index price", "description": "IP for index price, The index price can be obtained through relevant OPEN API for index services" + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" } ] }, @@ -5574,23 +5691,40 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", "description": "Trigger price type of stop orders", "enum": [ - "", "TP", "MP", - "IP" + "IP", + "" ], "x-api-enum": [ - { - "value": "", - "name": "NULL", - "description": "None" - }, { "value": "TP", "name": "trade price", @@ -5605,6 +5739,11 @@ "value": "IP", "name": "index price", "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" } ] }, @@ -5891,11 +6030,61 @@ }, "stop": { "type": "string", - "description": "Stop order type (stop limit or stop market)\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopPriceType": { "type": "string", - "description": "Trigger price type of stop orders\n" + "description": "Trigger price type of stop orders", + "enum": [ + "TP", + "MP", + "IP", + "" + ], + "x-api-enum": [ + { + "value": "TP", + "name": "trade price", + "description": "TP for trade price, The last trade price is the last price at which an order was filled. This price can be found in the latest match message." + }, + { + "value": "MP", + "name": "mark price", + "description": "MP for mark price. The mark price can be obtained through relevant OPEN API for index services." + }, + { + "value": "IP", + "name": "index price", + "description": "IP for index price. The index price can be obtained through relevant OPEN API for index services." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "stopTriggered": { "type": "boolean", @@ -6271,7 +6460,29 @@ }, "stop": { "type": "string", - "description": "A mark to the stop order type\n" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "feeRate": { "type": "string", @@ -6725,7 +6936,29 @@ }, "stop": { "type": "string", - "description": "A mark to the stop order type" + "description": "A mark to the stop order type", + "enum": [ + "down", + "up", + "" + ], + "x-api-enum": [ + { + "value": "down", + "name": "down", + "description": "Triggers when the price reaches or goes below the stopPrice." + }, + { + "value": "up", + "name": "up", + "description": "Triggers when the price reaches or goes above the stopPrice." + }, + { + "value": "", + "name": "None", + "description": "Not a stop order" + } + ] }, "feeRate": { "type": "string", @@ -7148,6 +7381,131 @@ "operationId": "034" } }, + "/api/v2/position/batchChangeMarginMode": { + "post": { + "summary": "Batch Switch Margin Mode", + "deprecated": false, + "description": "Batch modify the margin mode of the symbols.", + "tags": [], + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "object", + "properties": { + "marginMode": { + "type": "object", + "properties": {}, + "description": "Target Margin Model, Symbols that failed to be modified will also be included", + "additionalProperties": { + "type": "string" + } + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Error code" + }, + "msg": { + "type": "string", + "description": "Error message" + }, + "symbol": { + "type": "string", + "description": "Symbol" + } + } + }, + "description": "Symbol which modification failed" + } + }, + "required": [ + "marginMode", + "errors" + ] + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472403", + "x-abandon": "normal", + "x-domain": "Futures", + "x-api-channel": "Private", + "x-api-permission": "Futures", + "x-api-rate-limit-pool": "Futures", + "x-sdk-service": "Futures", + "x-sdk-sub-service": "Positions", + "x-sdk-method-name": "batchSwitchMarginMode", + "x-sdk-method-description": "Batch modify the margin mode of the symbols.", + "x-api-rate-limit-weight": 2, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "marginMode": { + "type": "string", + "description": "Modified margin model: ISOLATED (isolated), CROSS (cross margin).", + "enum": [ + "ISOLATED", + "CROSS" + ], + "x-api-enum": [ + { + "value": "ISOLATED", + "name": "ISOLATED", + "description": "Isolated Margin Mode" + }, + { + "value": "CROSS", + "name": "CROSS", + "description": "Cross Margin MOde" + } + ] + }, + "symbols": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Symbol list of the contract, Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220) " + } + }, + "required": [ + "marginMode", + "symbols" + ] + }, + "example": "{\n \"marginMode\": \"ISOLATED\",\n \"symbols\": [\n \"XBTUSDTM\",\n \"ETHUSDTM\"\n ]\n}" + } + } + }, + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"marginMode\\\": {\\n \\\"ETHUSDTM\\\": \\\"ISOLATED\\\",\\n \\\"XBTUSDTM\\\": \\\"CROSS\\\"\\n },\\n \\\"errors\\\": [\\n {\\n \\\"code\\\": \\\"50002\\\",\\n \\\"msg\\\": \\\"exist.order.or.position\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\"\\n }\\n ]\\n }\\n}", + "x-request-example": "{\\\"marginMode\\\": \\\"ISOLATED\\\", \\\"symbols\\\": [\\\"XBTUSDTM\\\", \\\"ETHUSDTM\\\"]}", + "operationId": "035" + } + }, "/api/v2/getMaxOpenSize": { "get": { "summary": "Get Max Open Size", @@ -7244,7 +7602,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"maxBuyOpenSize\\\": 0,\\n \\\"maxSellOpenSize\\\": 0\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"price\\\": \\\"example_string_default_value\\\", \\\"leverage\\\": 123456}", - "operationId": "035" + "operationId": "036" } }, "/api/v1/position": { @@ -7301,7 +7659,7 @@ }, "openingTimestamp": { "type": "integer", - "description": "Open time\n", + "description": "First opening time", "format": "int64" }, "currentTimestamp": { @@ -7441,7 +7799,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "integer", @@ -7477,7 +7835,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin\n" }, "maintMargin": { "type": "number", @@ -7545,7 +7903,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"500000000000988255\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"autoDeposit\\\": false,\\n \\\"crossMode\\\": false,\\n \\\"maintMarginReq\\\": 0.005,\\n \\\"riskLimit\\\": 500000,\\n \\\"realLeverage\\\": 2.88,\\n \\\"delevPercentage\\\": 0.18,\\n \\\"openingTimestamp\\\": 1729155616322,\\n \\\"currentTimestamp\\\": 1729482542135,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": 67.4309,\\n \\\"currentComm\\\": 0.01925174,\\n \\\"unrealisedCost\\\": 67.4309,\\n \\\"realisedGrossCost\\\": 0.0,\\n \\\"realisedCost\\\": 0.01925174,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 68900.7,\\n \\\"markValue\\\": 68.9007,\\n \\\"posCost\\\": 67.4309,\\n \\\"posCross\\\": 0.01645214,\\n \\\"posCrossMargin\\\": 0,\\n \\\"posInit\\\": 22.4769666644,\\n \\\"posComm\\\": 0.0539546299,\\n \\\"posCommCommon\\\": 0.0539447199,\\n \\\"posLoss\\\": 0.03766885,\\n \\\"posMargin\\\": 22.5097045843,\\n \\\"posFunding\\\": -0.0212068,\\n \\\"posMaint\\\": 0.3931320569,\\n \\\"maintMargin\\\": 23.9795045843,\\n \\\"realisedGrossPnl\\\": 0.0,\\n \\\"realisedPnl\\\": -0.06166534,\\n \\\"unrealisedPnl\\\": 1.4698,\\n \\\"unrealisedPnlPcnt\\\": 0.0218,\\n \\\"unrealisedRoePcnt\\\": 0.0654,\\n \\\"avgEntryPrice\\\": 67430.9,\\n \\\"liquidationPrice\\\": 45314.33,\\n \\\"bankruptPrice\\\": 44975.16,\\n \\\"settleCurrency\\\": \\\"USDT\\\",\\n \\\"maintainMargin\\\": 0.005,\\n \\\"riskLimitLevel\\\": 2,\\n \\\"marginMode\\\": \\\"ISOLATED\\\",\\n \\\"positionSide\\\": \\\"BOTH\\\",\\n \\\"leverage\\\": 2.88\\n }\\n}\\n", "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\"}", - "operationId": "036" + "operationId": "037" } }, "/api/v1/positions": { @@ -7558,7 +7916,7 @@ { "name": "currency", "in": "query", - "description": "Currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty", + "description": "Quote currency code, Please refer to [rootSymbol](https://www.kucoin.com/docs-new/api-221752070) , such as USDT,XBT. Query all positions when empty", "required": false, "schema": { "type": "string", @@ -7609,7 +7967,7 @@ }, "openingTimestamp": { "type": "integer", - "description": "Open time\n", + "description": "First opening time", "format": "int64" }, "currentTimestamp": { @@ -7749,7 +8107,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "number", @@ -7785,7 +8143,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin" }, "maintMargin": { "type": "number", @@ -7854,7 +8212,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"id\\\": \\\"500000000001046430\\\",\\n \\\"symbol\\\": \\\"ETHUSDM\\\",\\n \\\"crossMode\\\": true,\\n \\\"delevPercentage\\\": 0.71,\\n \\\"openingTimestamp\\\": 1730635780702,\\n \\\"currentTimestamp\\\": 1730636040926,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": -4.069805E-4,\\n \\\"currentComm\\\": 2.441E-7,\\n \\\"unrealisedCost\\\": -4.069805E-4,\\n \\\"realisedGrossCost\\\": 0.0,\\n \\\"realisedCost\\\": 2.441E-7,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 2454.12,\\n \\\"markValue\\\": -4.07478E-4,\\n \\\"posCost\\\": -4.069805E-4,\\n \\\"posInit\\\": 4.06981E-5,\\n \\\"posMargin\\\": 4.07478E-5,\\n \\\"realisedGrossPnl\\\": 0.0,\\n \\\"realisedPnl\\\": -2.441E-7,\\n \\\"unrealisedPnl\\\": -4.975E-7,\\n \\\"unrealisedPnlPcnt\\\": -0.0012,\\n \\\"unrealisedRoePcnt\\\": -0.0122,\\n \\\"avgEntryPrice\\\": 2457.12,\\n \\\"liquidationPrice\\\": 1429.96,\\n \\\"bankruptPrice\\\": 1414.96,\\n \\\"settleCurrency\\\": \\\"ETH\\\",\\n \\\"isInverse\\\": true,\\n \\\"marginMode\\\": \\\"CROSS\\\",\\n \\\"positionSide\\\": \\\"BOTH\\\",\\n \\\"leverage\\\": 10\\n },\\n {\\n \\\"id\\\": \\\"500000000000988255\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"autoDeposit\\\": true,\\n \\\"crossMode\\\": false,\\n \\\"maintMarginReq\\\": 0.005,\\n \\\"riskLimit\\\": 500000,\\n \\\"realLeverage\\\": 2.97,\\n \\\"delevPercentage\\\": 0.5,\\n \\\"openingTimestamp\\\": 1729155616322,\\n \\\"currentTimestamp\\\": 1730636040926,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": 67.4309,\\n \\\"currentComm\\\": -0.15936162,\\n \\\"unrealisedCost\\\": 67.4309,\\n \\\"realisedGrossCost\\\": 0.0,\\n \\\"realisedCost\\\": -0.15936162,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 68323.06,\\n \\\"markValue\\\": 68.32306,\\n \\\"posCost\\\": 67.4309,\\n \\\"posCross\\\": 0.06225152,\\n \\\"posCrossMargin\\\": 0,\\n \\\"posInit\\\": 22.2769666644,\\n \\\"posComm\\\": 0.0539821899,\\n \\\"posCommCommon\\\": 0.0539447199,\\n \\\"posLoss\\\": 0.26210915,\\n \\\"posMargin\\\": 22.1310912243,\\n \\\"posFunding\\\": -0.19982016,\\n \\\"posMaint\\\": 0.4046228699,\\n \\\"maintMargin\\\": 23.0232512243,\\n \\\"realisedGrossPnl\\\": 0.0,\\n \\\"realisedPnl\\\": -0.2402787,\\n \\\"unrealisedPnl\\\": 0.89216,\\n \\\"unrealisedPnlPcnt\\\": 0.0132,\\n \\\"unrealisedRoePcnt\\\": 0.04,\\n \\\"avgEntryPrice\\\": 67430.9,\\n \\\"liquidationPrice\\\": 45704.44,\\n \\\"bankruptPrice\\\": 45353.8,\\n \\\"settleCurrency\\\": \\\"USDT\\\",\\n \\\"isInverse\\\": false,\\n \\\"maintainMargin\\\": 0.005,\\n \\\"marginMode\\\": \\\"ISOLATED\\\",\\n \\\"positionSide\\\": \\\"BOTH\\\",\\n \\\"leverage\\\": 2.97\\n }\\n ]\\n}", "x-request-example": "{\\\"currency\\\": \\\"USDT\\\"}", - "operationId": "037" + "operationId": "038" } }, "/api/v1/history-positions": { @@ -8110,7 +8468,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"currentPage\\\": 1,\\n \\\"pageSize\\\": 10,\\n \\\"totalNum\\\": 1,\\n \\\"totalPage\\\": 1,\\n \\\"items\\\": [\\n {\\n \\\"closeId\\\": \\\"500000000036305465\\\",\\n \\\"userId\\\": \\\"633559791e1cbc0001f319bc\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"settleCurrency\\\": \\\"USDT\\\",\\n \\\"leverage\\\": \\\"1.0\\\",\\n \\\"type\\\": \\\"CLOSE_LONG\\\",\\n \\\"pnl\\\": \\\"0.51214413\\\",\\n \\\"realisedGrossCost\\\": \\\"-0.5837\\\",\\n \\\"realisedGrossCostNew\\\": \\\"-0.5837\\\",\\n \\\"withdrawPnl\\\": \\\"0.0\\\",\\n \\\"tradeFee\\\": \\\"0.03766066\\\",\\n \\\"fundingFee\\\": \\\"-0.03389521\\\",\\n \\\"openTime\\\": 1735549162120,\\n \\\"closeTime\\\": 1735589352069,\\n \\\"openPrice\\\": \\\"93859.8\\\",\\n \\\"closePrice\\\": \\\"94443.5\\\",\\n \\\"marginMode\\\": \\\"CROSS\\\",\\n \\\"tax\\\": \\\"0.0\\\",\\n \\\"roe\\\": null,\\n \\\"liquidAmount\\\": null,\\n \\\"liquidPrice\\\": null,\\n \\\"side\\\": \\\"LONG\\\"\\n }\\n ]\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\", \\\"from\\\": 123456, \\\"to\\\": 123456, \\\"limit\\\": 10, \\\"pageId\\\": 1}", - "operationId": "038" + "operationId": "039" } }, "/api/v1/margin/maxWithdrawMargin": { @@ -8168,7 +8526,7 @@ "x-api-rate-limit-weight": 10, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": \\\"21.1135719252\\\"\\n}", "x-request-example": "{\\\"symbol\\\": \\\"example_string_default_value\\\"}", - "operationId": "039" + "operationId": "040" } }, "/api/v2/getCrossUserLeverage": { @@ -8239,7 +8597,7 @@ "x-api-rate-limit-weight": 2, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"leverage\\\": \\\"3\\\"\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", - "operationId": "040" + "operationId": "041" } }, "/api/v2/changeCrossUserLeverage": { @@ -8310,7 +8668,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"leverage\\\": \\\"10\\\"}", - "operationId": "041" + "operationId": "042" } }, "/api/v1/position/margin/deposit-margin": { @@ -8577,7 +8935,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"6200c9b83aecfb000152ddcd\\\",\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"autoDeposit\\\": false,\\n \\\"maintMarginReq\\\": 0.005,\\n \\\"riskLimit\\\": 500000,\\n \\\"realLeverage\\\": 18.72,\\n \\\"crossMode\\\": false,\\n \\\"delevPercentage\\\": 0.66,\\n \\\"openingTimestamp\\\": 1646287090131,\\n \\\"currentTimestamp\\\": 1646295055021,\\n \\\"currentQty\\\": 1,\\n \\\"currentCost\\\": 43.388,\\n \\\"currentComm\\\": 0.0260328,\\n \\\"unrealisedCost\\\": 43.388,\\n \\\"realisedGrossCost\\\": 0,\\n \\\"realisedCost\\\": 0.0260328,\\n \\\"isOpen\\\": true,\\n \\\"markPrice\\\": 43536.65,\\n \\\"markValue\\\": 43.53665,\\n \\\"posCost\\\": 43.388,\\n \\\"posCross\\\": 0.000024985,\\n \\\"posInit\\\": 2.1694,\\n \\\"posComm\\\": 0.02733446,\\n \\\"posLoss\\\": 0,\\n \\\"posMargin\\\": 2.19675944,\\n \\\"posMaint\\\": 0.24861326,\\n \\\"maintMargin\\\": 2.34540944,\\n \\\"realisedGrossPnl\\\": 0,\\n \\\"realisedPnl\\\": -0.0260328,\\n \\\"unrealisedPnl\\\": 0.14865,\\n \\\"unrealisedPnlPcnt\\\": 0.0034,\\n \\\"unrealisedRoePcnt\\\": 0.0685,\\n \\\"avgEntryPrice\\\": 43388,\\n \\\"liquidationPrice\\\": 41440,\\n \\\"bankruptPrice\\\": 41218,\\n \\\"userId\\\": 1234321123,\\n \\\"settleCurrency\\\": \\\"USDT\\\"\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"string\\\", \\\"margin\\\": 0, \\\"bizNo\\\": \\\"string\\\"}", - "operationId": "042" + "operationId": "043" } }, "/api/v1/margin/withdrawMargin": { @@ -8649,7 +9007,138 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": \\\"0.1\\\"\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"withdrawAmount\\\": \\\"0.0000001\\\"}", - "operationId": "043" + "operationId": "044" + } + }, + "/api/v2/batchGetCrossOrderLimit": { + "get": { + "summary": "Get Cross Margin Risk Limit", + "deprecated": false, + "description": "Batch get cross margin risk limit.", + "tags": [], + "parameters": [ + { + "name": "symbol", + "in": "query", + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220), (You may add up to 50 symbols. Use a halfwidth comma to each IP)", + "required": true, + "schema": { + "type": "string", + "example": [ + "XBTUSDTM", + "XBTUSDTM,ETHUSDTM" + ] + } + }, + { + "name": "totalMargin", + "in": "query", + "description": "The position opening amount, in the contract's settlement currency.\nDefaults to 10,000 in margin currency for max position calculation.\nFor USDT/USDC, it's 10,000 USD; for others, it's 10,000 divided by the token's USDT price.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "leverage", + "in": "query", + "description": "Calculates the max position size at the specified leverage.\nDefaults to the symbol’s max cross leverage.", + "required": false, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "symbol": { + "type": "string", + "description": "Symbol of the contract. Please refer to [Get Symbol endpoint: symbol](https://www.kucoin.com/docs-new/api-3470220)" + }, + "maxOpenSize": { + "type": "integer", + "description": "Maximum amount of open position(Unit is **lots**)\n" + }, + "maxOpenValue": { + "type": "string", + "description": "Maximum value of open position(Unit is **quoteCcy**)\n" + }, + "totalMargin": { + "type": "string", + "description": "Margin amount used for max position calculation." + }, + "price": { + "type": "string", + "description": "Price used for max position calculation. Defaults to latest transaction price" + }, + "leverage": { + "type": "string", + "description": "Leverage used for max position calculation." + }, + "mmr": { + "type": "string", + "description": "Maintenance Margin Rate" + }, + "imr": { + "type": "string", + "description": "Initial Margin Rate" + }, + "currency": { + "type": "string", + "description": "Margin Currency" + } + }, + "required": [ + "symbol", + "maxOpenSize", + "maxOpenValue", + "totalMargin", + "price", + "leverage", + "mmr", + "imr", + "currency" + ] + } + } + }, + "required": [ + "code", + "data" + ] + } + } + } + } + }, + "x-api-doc": "https://www.kucoin.com/docs-new/api-3472655", + "x-abandon": "normal", + "x-domain": "Futures", + "x-api-channel": "Private", + "x-api-permission": "Futures", + "x-api-rate-limit-pool": "Futures", + "x-sdk-service": "Futures", + "x-sdk-sub-service": "Positions", + "x-sdk-method-name": "getCrossMarginRiskLimit", + "x-sdk-method-description": "Batch get cross margin risk limit.", + "x-api-rate-limit-weight": 2, + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"maxOpenSize\\\": 12102,\\n \\\"maxOpenValue\\\": \\\"1234549.2240000000\\\",\\n \\\"totalMargin\\\": \\\"10000\\\",\\n \\\"price\\\": \\\"102012\\\",\\n \\\"leverage\\\": \\\"125.00\\\",\\n \\\"mmr\\\": \\\"0.00416136\\\",\\n \\\"imr\\\": \\\"0.008\\\",\\n \\\"currency\\\": \\\"USDT\\\"\\n },\\n {\\n \\\"symbol\\\": \\\"ETHUSDTM\\\",\\n \\\"maxOpenSize\\\": 38003,\\n \\\"maxOpenValue\\\": \\\"971508.6920000000\\\",\\n \\\"totalMargin\\\": \\\"10000\\\",\\n \\\"price\\\": \\\"2556.4\\\",\\n \\\"leverage\\\": \\\"100.00\\\",\\n \\\"mmr\\\": \\\"0.0054623236\\\",\\n \\\"imr\\\": \\\"0.01\\\",\\n \\\"currency\\\": \\\"USDT\\\"\\n }\\n ]\\n}", + "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"totalMargin\\\": \\\"example_string_default_value\\\", \\\"leverage\\\": 123456}", + "operationId": "045" } }, "/api/v1/contracts/risk-limit/{symbol}": { @@ -8748,7 +9237,7 @@ "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 1,\\n \\\"maxRiskLimit\\\": 100000,\\n \\\"minRiskLimit\\\": 0,\\n \\\"maxLeverage\\\": 125,\\n \\\"initialMargin\\\": 0.008,\\n \\\"maintainMargin\\\": 0.004\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 2,\\n \\\"maxRiskLimit\\\": 500000,\\n \\\"minRiskLimit\\\": 100000,\\n \\\"maxLeverage\\\": 100,\\n \\\"initialMargin\\\": 0.01,\\n \\\"maintainMargin\\\": 0.005\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 3,\\n \\\"maxRiskLimit\\\": 1000000,\\n \\\"minRiskLimit\\\": 500000,\\n \\\"maxLeverage\\\": 75,\\n \\\"initialMargin\\\": 0.014,\\n \\\"maintainMargin\\\": 0.007\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 4,\\n \\\"maxRiskLimit\\\": 2000000,\\n \\\"minRiskLimit\\\": 1000000,\\n \\\"maxLeverage\\\": 50,\\n \\\"initialMargin\\\": 0.02,\\n \\\"maintainMargin\\\": 0.01\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 5,\\n \\\"maxRiskLimit\\\": 3000000,\\n \\\"minRiskLimit\\\": 2000000,\\n \\\"maxLeverage\\\": 30,\\n \\\"initialMargin\\\": 0.034,\\n \\\"maintainMargin\\\": 0.017\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 6,\\n \\\"maxRiskLimit\\\": 5000000,\\n \\\"minRiskLimit\\\": 3000000,\\n \\\"maxLeverage\\\": 20,\\n \\\"initialMargin\\\": 0.05,\\n \\\"maintainMargin\\\": 0.025\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 7,\\n \\\"maxRiskLimit\\\": 8000000,\\n \\\"minRiskLimit\\\": 5000000,\\n \\\"maxLeverage\\\": 10,\\n \\\"initialMargin\\\": 0.1,\\n \\\"maintainMargin\\\": 0.05\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 8,\\n \\\"maxRiskLimit\\\": 12000000,\\n \\\"minRiskLimit\\\": 8000000,\\n \\\"maxLeverage\\\": 5,\\n \\\"initialMargin\\\": 0.2,\\n \\\"maintainMargin\\\": 0.1\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 9,\\n \\\"maxRiskLimit\\\": 20000000,\\n \\\"minRiskLimit\\\": 12000000,\\n \\\"maxLeverage\\\": 4,\\n \\\"initialMargin\\\": 0.25,\\n \\\"maintainMargin\\\": 0.125\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 10,\\n \\\"maxRiskLimit\\\": 30000000,\\n \\\"minRiskLimit\\\": 20000000,\\n \\\"maxLeverage\\\": 3,\\n \\\"initialMargin\\\": 0.334,\\n \\\"maintainMargin\\\": 0.167\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 11,\\n \\\"maxRiskLimit\\\": 40000000,\\n \\\"minRiskLimit\\\": 30000000,\\n \\\"maxLeverage\\\": 2,\\n \\\"initialMargin\\\": 0.5,\\n \\\"maintainMargin\\\": 0.25\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"level\\\": 12,\\n \\\"maxRiskLimit\\\": 50000000,\\n \\\"minRiskLimit\\\": 40000000,\\n \\\"maxLeverage\\\": 1,\\n \\\"initialMargin\\\": 1.0,\\n \\\"maintainMargin\\\": 0.5\\n }\\n ]\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", - "operationId": "044" + "operationId": "046" } }, "/api/v1/position/risk-limit-level/change": { @@ -8820,12 +9309,12 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"level\\\": 2}", - "operationId": "045" + "operationId": "047" } }, "/api/v1/funding-rate/{symbol}/current": { "get": { - "summary": "Get Current Funding Rate.", + "summary": "Get Current Funding Rate", "deprecated": false, "description": "Get Current Funding Rate.", "tags": [], @@ -8864,7 +9353,7 @@ }, "timePoint": { "type": "integer", - "description": "The funding rate settlement time point of the previous cycle\n(milliseconds)\n", + "description": "The funding rate settlement time point of the previous cycle\n(milliseconds)\nBefore going live, the system will pre-generate the first funding rate record to ensure the billing cycle can start immediately after the contract is launched.\n The timePoint field represents the time the funding rate data was generated, not the actual time it takes effect or is settled.\n The first actual settlement will occur at the designated settlement time (00:00 / 08:00 / 14:00) after the contract goes live.\n\n", "format": "int64" }, "value": { @@ -8882,6 +9371,31 @@ "fundingRateFloor": { "type": "number", "description": "Minimum Funding Rate" + }, + "period": { + "type": "integer", + "enum": [ + 1, + 0 + ], + "description": "Indicates whether the current funding fee is charged within this cycle", + "x-api-enum": [ + { + "value": 1, + "name": "1", + "description": "Indicates that funding will be charged in the current cycle" + }, + { + "value": 0, + "name": "0", + "description": "Indicates a cross-cycle expense record that is not charged in the current cycle." + } + ] + }, + "fundingTime": { + "type": "integer", + "description": "Indicates the next funding fee settlement time point, which can be used to synchronize periodic settlement timing.", + "format": "int64" } }, "required": [ @@ -8891,7 +9405,9 @@ "value", "predictedValue", "fundingRateCap", - "fundingRateFloor" + "fundingRateFloor", + "period", + "fundingTime" ] } }, @@ -8915,9 +9431,9 @@ "x-sdk-method-name": "getCurrentFundingRate", "x-sdk-method-description": "Get Current Funding Rate.", "x-api-rate-limit-weight": 2, - "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\".XBTUSDTMFPI8H\\\",\\n \\\"granularity\\\": 28800000,\\n \\\"timePoint\\\": 1731441600000,\\n \\\"value\\\": 6.41E-4,\\n \\\"predictedValue\\\": 5.2E-5,\\n \\\"fundingRateCap\\\": 0.003,\\n \\\"fundingRateFloor\\\": -0.003\\n }\\n}", + "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbol\\\": \\\".XBTUSDTMFPI8H\\\",\\n \\\"granularity\\\": 28800000,\\n \\\"timePoint\\\": 1748462400000,\\n \\\"value\\\": 6.1E-5,\\n \\\"predictedValue\\\": 1.09E-4,\\n \\\"fundingRateCap\\\": 0.003,\\n \\\"fundingRateFloor\\\": -0.003,\\n \\\"period\\\": 0,\\n \\\"fundingTime\\\": 1748491200000\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\"}", - "operationId": "046" + "operationId": "048" } }, "/api/v1/contract/funding-rates": { @@ -9017,7 +9533,7 @@ "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": [\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 2.1E-4,\\n \\\"timepoint\\\": 1702296000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 3.47E-4,\\n \\\"timepoint\\\": 1702267200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.52E-4,\\n \\\"timepoint\\\": 1702238400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 5.13E-4,\\n \\\"timepoint\\\": 1702209600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.21E-4,\\n \\\"timepoint\\\": 1702180800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 5.06E-4,\\n \\\"timepoint\\\": 1702152000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 7.68E-4,\\n \\\"timepoint\\\": 1702123200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.82E-4,\\n \\\"timepoint\\\": 1702094400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.0E-4,\\n \\\"timepoint\\\": 1702065600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 5.46E-4,\\n \\\"timepoint\\\": 1702036800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 7.97E-4,\\n \\\"timepoint\\\": 1702008000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 5.76E-4,\\n \\\"timepoint\\\": 1701979200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.22E-4,\\n \\\"timepoint\\\": 1701950400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 3.92E-4,\\n \\\"timepoint\\\": 1701921600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.1E-4,\\n \\\"timepoint\\\": 1701892800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.48E-4,\\n \\\"timepoint\\\": 1701864000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 3.68E-4,\\n \\\"timepoint\\\": 1701835200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 3.51E-4,\\n \\\"timepoint\\\": 1701806400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.44E-4,\\n \\\"timepoint\\\": 1701777600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.25E-4,\\n \\\"timepoint\\\": 1701748800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": -8.2E-5,\\n \\\"timepoint\\\": 1701720000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.64E-4,\\n \\\"timepoint\\\": 1701691200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 4.14E-4,\\n \\\"timepoint\\\": 1701662400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 2.44E-4,\\n \\\"timepoint\\\": 1701633600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.99E-4,\\n \\\"timepoint\\\": 1701604800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.79E-4,\\n \\\"timepoint\\\": 1701576000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 8.7E-5,\\n \\\"timepoint\\\": 1701547200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.6E-5,\\n \\\"timepoint\\\": 1701518400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": -3.7E-5,\\n \\\"timepoint\\\": 1701489600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.5E-5,\\n \\\"timepoint\\\": 1701460800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 6.8E-5,\\n \\\"timepoint\\\": 1701432000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 7.2E-5,\\n \\\"timepoint\\\": 1701403200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.45E-4,\\n \\\"timepoint\\\": 1701374400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.41E-4,\\n \\\"timepoint\\\": 1701345600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 9.4E-5,\\n \\\"timepoint\\\": 1701316800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.08E-4,\\n \\\"timepoint\\\": 1701288000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 7.6E-5,\\n \\\"timepoint\\\": 1701259200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.0E-5,\\n \\\"timepoint\\\": 1701230400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.0E-5,\\n \\\"timepoint\\\": 1701201600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.16E-4,\\n \\\"timepoint\\\": 1701172800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 2.04E-4,\\n \\\"timepoint\\\": 1701144000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 2.3E-4,\\n \\\"timepoint\\\": 1701115200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 6.2E-5,\\n \\\"timepoint\\\": 1701086400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.33E-4,\\n \\\"timepoint\\\": 1701057600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 8.0E-5,\\n \\\"timepoint\\\": 1701028800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.11E-4,\\n \\\"timepoint\\\": 1701000000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 7.4E-5,\\n \\\"timepoint\\\": 1700971200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.01E-4,\\n \\\"timepoint\\\": 1700942400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 3.9E-5,\\n \\\"timepoint\\\": 1700913600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.1E-5,\\n \\\"timepoint\\\": 1700884800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 3.0E-6,\\n \\\"timepoint\\\": 1700856000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.03E-4,\\n \\\"timepoint\\\": 1700827200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 3.0E-6,\\n \\\"timepoint\\\": 1700798400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 6.7E-5,\\n \\\"timepoint\\\": 1700769600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.47E-4,\\n \\\"timepoint\\\": 1700740800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 7.8E-5,\\n \\\"timepoint\\\": 1700712000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.39E-4,\\n \\\"timepoint\\\": 1700683200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 7.5E-5,\\n \\\"timepoint\\\": 1700654400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.11E-4,\\n \\\"timepoint\\\": 1700625600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 9.8E-5,\\n \\\"timepoint\\\": 1700596800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.18E-4,\\n \\\"timepoint\\\": 1700568000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.16E-4,\\n \\\"timepoint\\\": 1700539200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.6E-4,\\n \\\"timepoint\\\": 1700510400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.92E-4,\\n \\\"timepoint\\\": 1700481600000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.13E-4,\\n \\\"timepoint\\\": 1700452800000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 2.47E-4,\\n \\\"timepoint\\\": 1700424000000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 2.3E-4,\\n \\\"timepoint\\\": 1700395200000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 2.63E-4,\\n \\\"timepoint\\\": 1700366400000\\n },\\n {\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"fundingRate\\\": 1.32E-4,\\n \\\"timepoint\\\": 1700337600000\\n }\\n ]\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"from\\\": 1700310700000, \\\"to\\\": 1702310700000}", - "operationId": "047" + "operationId": "049" } }, "/api/v1/funding-history": { @@ -9223,7 +9739,7 @@ "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"dataList\\\": [\\n {\\n \\\"id\\\": 1472387374042586,\\n \\\"symbol\\\": \\\"XBTUSDTM\\\",\\n \\\"timePoint\\\": 1731470400000,\\n \\\"fundingRate\\\": 6.41E-4,\\n \\\"markPrice\\\": 87139.92,\\n \\\"positionQty\\\": 1,\\n \\\"positionCost\\\": 87.13992,\\n \\\"funding\\\": -0.05585669,\\n \\\"settleCurrency\\\": \\\"USDT\\\",\\n \\\"context\\\": \\\"{\\\\\\\"marginMode\\\\\\\": \\\\\\\"ISOLATED\\\\\\\", \\\\\\\"positionSide\\\\\\\": \\\\\\\"BOTH\\\\\\\"}\\\",\\n \\\"marginMode\\\": \\\"ISOLATED\\\"\\n }\\n ],\\n \\\"hasMore\\\": true\\n }\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"startAt\\\": 1700310700000, \\\"endAt\\\": 1702310700000, \\\"reverse\\\": true, \\\"offset\\\": 123456, \\\"forward\\\": true, \\\"maxCount\\\": 123456}", - "operationId": "048" + "operationId": "050" } }, "/api/v1/bullet-public": { @@ -9324,7 +9840,7 @@ "x-sdk-method-description": "This interface can obtain the token required for Websocket to establish a Futures connection. If you need use public channels (e.g. all public market data), please make request as follows to obtain the server list and public token", "x-api-rate-limit-weight": 10, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"token\\\":\\\"2neAiuYvAU61ZDXANAGAsiL4-iAExhsBXZxftpOeh_55i3Ysy2q2LEsEWU64mdzUOPusi34M_wGoSf7iNyEWJ6dACm4ny9vJtLTRq_YsRUlG5ADnAawegdiYB9J6i9GjsxUuhPw3Blq6rhZlGykT3Vp1phUafnulOOpts-MEmEF-3bpfetLOAjsMMBS5qwTWJBvJHl5Vs9Y=.gJEIAywPXFr_4L-WG10eug==\\\",\\\"instanceServers\\\":[{\\\"endpoint\\\":\\\"wss://ws-api-futures.kucoin.com/\\\",\\\"encrypt\\\":true,\\\"protocol\\\":\\\"websocket\\\",\\\"pingInterval\\\":18000,\\\"pingTimeout\\\":10000}]}}", - "operationId": "049" + "operationId": "051" } }, "/api/v1/bullet-private": { @@ -9425,7 +9941,7 @@ "x-sdk-method-description": "This interface can obtain the token required for Websocket to establish a Futures private connection. If you need use private channels (e.g. account balance notice), please make request as follows to obtain the server list and private token", "x-api-rate-limit-weight": 10, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"token\\\": \\\"2neAiuYvAU737TOajb2U3uT8AEZqSWYe0fBD4LoHuXJDSC7gIzJiH4kNTWhCPISWo6nDpAe7aUaaHJ4fG8oRjFgMfUI2sM4IySWHrBceFocY8pKy2REU1HwZIngtMdMrjqPnP-biofFWbNaP1cl0X1pZc2SQ-33hDH1LgNP-yg8bktVoIG0dIxSN4m3uzO8u.ueCCihQ5_4GPpXKxWTDiFQ==\\\",\\n \\\"instanceServers\\\": [\\n {\\n \\\"endpoint\\\": \\\"wss://ws-api-futures.kucoin.com/\\\",\\n \\\"encrypt\\\": true,\\n \\\"protocol\\\": \\\"websocket\\\",\\n \\\"pingInterval\\\": 18000,\\n \\\"pingTimeout\\\": 10000\\n }\\n ]\\n }\\n}", - "operationId": "050" + "operationId": "052" } }, "/api/v1/position/margin/auto-deposit-status": { @@ -9500,7 +10016,7 @@ }, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": true\\n}", "x-request-example": "{\\\"symbol\\\": \\\"XBTUSDTM\\\", \\\"status\\\": true}", - "operationId": "051" + "operationId": "053" } } }, diff --git a/spec/rest/entry/openapi-margin.json b/spec/rest/entry/openapi-margin.json index 58115e4d..81aa6326 100644 --- a/spec/rest/entry/openapi-margin.json +++ b/spec/rest/entry/openapi-margin.json @@ -661,7 +661,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "addOrder", "x-sdk-method-description": "Place order in the Cross-margin or Isolated-margin trading system. You can place two major types of order: Limit and market. Orders can only be placed if your account has sufficient funds. Once an order is placed, your funds will be put on hold for the duration of the order. The amount of funds on hold depends on the order type and parameters specified.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "requestBody": { "content": { "application/json": { @@ -925,7 +925,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "addOrderTest", "x-sdk-method-description": " Order test endpoint: This endpoint’s request and return parameters are identical to the order endpoint, and can be used to verify whether the signature is correct, among other operations. After placing an order, the order will not enter the matching system, and the order cannot be queried.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "requestBody": { "content": { "application/json": { @@ -1131,15 +1131,6 @@ "description": "This endpoint can be used to cancel a margin order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", "tags": [], "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "The unique order id generated by the trading system", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -1153,6 +1144,15 @@ "KCS-USDT" ] } + }, + { + "name": "orderId", + "in": "path", + "description": "The unique order id generated by the trading system", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -1198,9 +1198,9 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelOrderByOrderId", "x-sdk-method-description": "This endpoint can be used to cancel a margin order by orderId. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"orderId\\\":\\\"671663e02188630007e21c9c\\\"}}", - "x-request-example": "{\\\"orderId\\\": \\\"671663e02188630007e21c9c\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"orderId\\\": \\\"671663e02188630007e21c9c\\\"}", "operationId": "009" }, "get": { @@ -1209,15 +1209,6 @@ "description": "This endpoint can be used to obtain information for a single Margin order using the order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "tags": [], "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "The unique order id generated by the trading system", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -1231,6 +1222,15 @@ "KCS-USDT" ] } + }, + { + "name": "orderId", + "in": "path", + "description": "The unique order id generated by the trading system", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -1543,7 +1543,7 @@ "x-sdk-method-description": "This endpoint can be used to obtain information for a single Margin order using the order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"671667306afcdb000723107f\\\",\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"opType\\\": \\\"DEAL\\\",\\n \\\"type\\\": \\\"limit\\\",\\n \\\"side\\\": \\\"buy\\\",\\n \\\"price\\\": \\\"50000\\\",\\n \\\"size\\\": \\\"0.00001\\\",\\n \\\"funds\\\": \\\"0.5\\\",\\n \\\"dealSize\\\": \\\"0\\\",\\n \\\"dealFunds\\\": \\\"0\\\",\\n \\\"fee\\\": \\\"0\\\",\\n \\\"feeCurrency\\\": \\\"USDT\\\",\\n \\\"stp\\\": null,\\n \\\"stop\\\": null,\\n \\\"stopTriggered\\\": false,\\n \\\"stopPrice\\\": \\\"0\\\",\\n \\\"timeInForce\\\": \\\"GTC\\\",\\n \\\"postOnly\\\": false,\\n \\\"hidden\\\": false,\\n \\\"iceberg\\\": false,\\n \\\"visibleSize\\\": \\\"0\\\",\\n \\\"cancelAfter\\\": 0,\\n \\\"channel\\\": \\\"API\\\",\\n \\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\",\\n \\\"remark\\\": null,\\n \\\"tags\\\": null,\\n \\\"cancelExist\\\": false,\\n \\\"createdAt\\\": 1729521456248,\\n \\\"lastUpdatedAt\\\": 1729651011877,\\n \\\"tradeType\\\": \\\"MARGIN_TRADE\\\",\\n \\\"inOrderBook\\\": true,\\n \\\"cancelledSize\\\": \\\"0\\\",\\n \\\"cancelledFunds\\\": \\\"0\\\",\\n \\\"remainSize\\\": \\\"0.00001\\\",\\n \\\"remainFunds\\\": \\\"0.5\\\",\\n \\\"tax\\\": \\\"0\\\",\\n \\\"active\\\": true\\n }\\n}", - "x-request-example": "{\\\"orderId\\\": \\\"671667306afcdb000723107f\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"orderId\\\": \\\"671667306afcdb000723107f\\\"}", "operationId": "016" } }, @@ -1554,15 +1554,6 @@ "description": "This endpoint can be used to cancel a margin order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", "tags": [], "parameters": [ - { - "name": "clientOid", - "in": "path", - "description": "Client Order Id, unique identifier created by the user", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -1576,6 +1567,15 @@ "KCS-USDT" ] } + }, + { + "name": "clientOid", + "in": "path", + "description": "Client Order Id, unique identifier created by the user", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -1621,9 +1621,9 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelOrderByClientOid", "x-sdk-method-description": "This endpoint can be used to cancel a margin order by clientOid. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", - "x-api-rate-limit-weight": 5, + "x-api-rate-limit-weight": 2, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"clientOid\\\":\\\"5c52e11203aa677f33e1493fb\\\"}}", - "x-request-example": "{\\\"clientOid\\\": \\\"5c52e11203aa677f33e1493fb\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"clientOid\\\": \\\"5c52e11203aa677f33e1493fb\\\"}", "operationId": "010" }, "get": { @@ -1632,15 +1632,6 @@ "description": "This endpoint can be used to obtain information for a single Margin order using the client order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "tags": [], "parameters": [ - { - "name": "clientOid", - "in": "path", - "description": "Client Order Id, unique identifier created by the user", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "symbol", "in": "query", @@ -1654,6 +1645,15 @@ "KCS-USDT" ] } + }, + { + "name": "clientOid", + "in": "path", + "description": "Client Order Id, unique identifier created by the user", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -1965,7 +1965,7 @@ "x-sdk-method-description": "This endpoint can be used to obtain information for a single Margin order using the client order ID. After the user successfully places an order, the order is in the Active state, and the user can use inOrderBook to determine whether the order has entered the order. Canceled or fully filled orders are marked as completed Done status.", "x-api-rate-limit-weight": 5, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"id\\\": \\\"671667306afcdb000723107f\\\",\\n \\\"symbol\\\": \\\"BTC-USDT\\\",\\n \\\"opType\\\": \\\"DEAL\\\",\\n \\\"type\\\": \\\"limit\\\",\\n \\\"side\\\": \\\"buy\\\",\\n \\\"price\\\": \\\"50000\\\",\\n \\\"size\\\": \\\"0.00001\\\",\\n \\\"funds\\\": \\\"0.5\\\",\\n \\\"dealSize\\\": \\\"0\\\",\\n \\\"dealFunds\\\": \\\"0\\\",\\n \\\"fee\\\": \\\"0\\\",\\n \\\"feeCurrency\\\": \\\"USDT\\\",\\n \\\"stp\\\": null,\\n \\\"stop\\\": null,\\n \\\"stopTriggered\\\": false,\\n \\\"stopPrice\\\": \\\"0\\\",\\n \\\"timeInForce\\\": \\\"GTC\\\",\\n \\\"postOnly\\\": false,\\n \\\"hidden\\\": false,\\n \\\"iceberg\\\": false,\\n \\\"visibleSize\\\": \\\"0\\\",\\n \\\"cancelAfter\\\": 0,\\n \\\"channel\\\": \\\"API\\\",\\n \\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\",\\n \\\"remark\\\": null,\\n \\\"tags\\\": null,\\n \\\"cancelExist\\\": false,\\n \\\"createdAt\\\": 1729521456248,\\n \\\"lastUpdatedAt\\\": 1729651011877,\\n \\\"tradeType\\\": \\\"MARGIN_TRADE\\\",\\n \\\"inOrderBook\\\": true,\\n \\\"cancelledSize\\\": \\\"0\\\",\\n \\\"cancelledFunds\\\": \\\"0\\\",\\n \\\"remainSize\\\": \\\"0.00001\\\",\\n \\\"remainFunds\\\": \\\"0.5\\\",\\n \\\"tax\\\": \\\"0\\\",\\n \\\"active\\\": true\\n }\\n}", - "x-request-example": "{\\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\", \\\"symbol\\\": \\\"BTC-USDT\\\"}", + "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"clientOid\\\": \\\"5c52e11203aa677f33e493fb\\\"}", "operationId": "017" } }, @@ -2050,7 +2050,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "cancelAllOrdersBySymbol", "x-sdk-method-description": "This interface can cancel all open Margin orders by symbol. This endpoint only sends cancellation requests. The results of the requests must be obtained by checking the order status or subscribing to Websocket.", - "x-api-rate-limit-weight": 10, + "x-api-rate-limit-weight": 5, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":\\\"success\\\"}", "x-request-example": "{\\\"symbol\\\": \\\"BTC-USDT\\\", \\\"tradeType\\\": \\\"MARGIN_TRADE\\\"}", "operationId": "011" @@ -2140,6 +2140,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "getSymbolsWithOpenOrder", "x-sdk-method-description": "This interface can query all Margin symbols that have active orders.", + "x-api-rate-limit-weight": 4, "x-response-example": "{\\n \\\"code\\\": \\\"200000\\\",\\n \\\"data\\\": {\\n \\\"symbolSize\\\": 1,\\n \\\"symbols\\\": [\\n \\\"BTC-USDT\\\"\\n ]\\n }\\n}", "x-request-example": "{\\\"tradeType\\\": \\\"MARGIN_TRADE\\\"}", "operationId": "012" diff --git a/spec/rest/entry/openapi-spot.json b/spec/rest/entry/openapi-spot.json index 4eef1ce6..a65a5829 100644 --- a/spec/rest/entry/openapi-spot.json +++ b/spec/rest/entry/openapi-spot.json @@ -390,15 +390,6 @@ "description": "Request the currency details of a specified currency via this endpoint.", "tags": [], "parameters": [ - { - "name": "currency", - "in": "path", - "description": "Path parameter, Currency", - "required": true, - "schema": { - "type": "string" - } - }, { "name": "chain", "in": "query", @@ -418,6 +409,15 @@ "optimism" ] } + }, + { + "name": "currency", + "in": "path", + "description": "Path parameter, Currency", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -535,7 +535,6 @@ "required": [ "chainName", "withdrawalMinSize", - "depositMinSize", "withdrawFeeRate", "withdrawalMinFee", "isWithdrawEnabled", @@ -544,8 +543,6 @@ "preConfirms", "contractAddress", "withdrawPrecision", - "maxWithdraw", - "maxDeposit", "needTag", "chainId" ] @@ -558,8 +555,6 @@ "name", "fullName", "precision", - "confirms", - "contractAddress", "isMarginEnabled", "isDebitEnabled", "chains" @@ -587,7 +582,7 @@ "x-sdk-method-description": "Request the currency details of a specified currency via this endpoint.", "x-api-rate-limit-weight": 3, "x-response-example": "{\\\"code\\\":\\\"200000\\\",\\\"data\\\":{\\\"currency\\\":\\\"BTC\\\",\\\"name\\\":\\\"BTC\\\",\\\"fullName\\\":\\\"Bitcoin\\\",\\\"precision\\\":8,\\\"confirms\\\":null,\\\"contractAddress\\\":null,\\\"isMarginEnabled\\\":true,\\\"isDebitEnabled\\\":true,\\\"chains\\\":[{\\\"chainName\\\":\\\"BTC\\\",\\\"withdrawalMinSize\\\":\\\"0.001\\\",\\\"depositMinSize\\\":\\\"0.0002\\\",\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.0005\\\",\\\"isWithdrawEnabled\\\":true,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":3,\\\"preConfirms\\\":1,\\\"contractAddress\\\":\\\"\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":null,\\\"needTag\\\":false,\\\"chainId\\\":\\\"btc\\\"},{\\\"chainName\\\":\\\"Lightning Network\\\",\\\"withdrawalMinSize\\\":\\\"0.00001\\\",\\\"depositMinSize\\\":\\\"0.00001\\\",\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.000015\\\",\\\"isWithdrawEnabled\\\":true,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":1,\\\"preConfirms\\\":1,\\\"contractAddress\\\":\\\"\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":\\\"0.03\\\",\\\"needTag\\\":false,\\\"chainId\\\":\\\"btcln\\\"},{\\\"chainName\\\":\\\"KCC\\\",\\\"withdrawalMinSize\\\":\\\"0.0008\\\",\\\"depositMinSize\\\":null,\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.00002\\\",\\\"isWithdrawEnabled\\\":true,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":20,\\\"preConfirms\\\":20,\\\"contractAddress\\\":\\\"0xfa93c12cd345c658bc4644d1d4e1b9615952258c\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":null,\\\"needTag\\\":false,\\\"chainId\\\":\\\"kcc\\\"},{\\\"chainName\\\":\\\"BTC-Segwit\\\",\\\"withdrawalMinSize\\\":\\\"0.0008\\\",\\\"depositMinSize\\\":\\\"0.0002\\\",\\\"withdrawFeeRate\\\":\\\"0\\\",\\\"withdrawalMinFee\\\":\\\"0.0005\\\",\\\"isWithdrawEnabled\\\":false,\\\"isDepositEnabled\\\":true,\\\"confirms\\\":2,\\\"preConfirms\\\":2,\\\"contractAddress\\\":\\\"\\\",\\\"withdrawPrecision\\\":8,\\\"maxWithdraw\\\":null,\\\"maxDeposit\\\":null,\\\"needTag\\\":false,\\\"chainId\\\":\\\"bech32\\\"}]}}", - "x-request-example": "{\\\"currency\\\": \\\"BTC\\\", \\\"chain\\\": \\\"eth\\\"}", + "x-request-example": "{\\\"chain\\\": \\\"eth\\\", \\\"currency\\\": \\\"BTC\\\"}", "operationId": "002" } }, @@ -726,8 +721,6 @@ "required": [ "chainName", "withdrawalMinSize", - "depositMinSize", - "withdrawFeeRate", "withdrawalMinFee", "isWithdrawEnabled", "isDepositEnabled", @@ -735,10 +728,9 @@ "preConfirms", "contractAddress", "withdrawPrecision", - "maxWithdraw", - "maxDeposit", "needTag", - "chainId" + "chainId", + "withdrawFeeRate" ] }, "description": "Chain list" @@ -1005,13 +997,7 @@ "makerFeeCoefficient", "takerFeeCoefficient", "st", - "callauctionIsEnabled", - "callauctionPriceFloor", - "callauctionPriceCeiling", - "callauctionFirstStageStartTime", - "callauctionSecondStageStartTime", - "callauctionThirdStageStartTime", - "tradingStartTime" + "callauctionIsEnabled" ] } }, @@ -1270,13 +1256,7 @@ "makerFeeCoefficient", "takerFeeCoefficient", "st", - "callauctionIsEnabled", - "callauctionPriceFloor", - "callauctionPriceCeiling", - "callauctionFirstStageStartTime", - "callauctionSecondStageStartTime", - "callauctionThirdStageStartTime", - "tradingStartTime" + "callauctionIsEnabled" ] } } @@ -2256,19 +2236,19 @@ }, "time": { "type": "integer", - "format": "int64", - "description": "Timestamp (ms)" + "description": "Timestamp (ms)", + "format": "int64" } }, "required": [ - "symbol", - "estimatedPrice", - "estimatedSize", "sellOrderRangeLowPrice", "sellOrderRangeHighPrice", "buyOrderRangeLowPrice", "buyOrderRangeHighPrice", - "time" + "time", + "symbol", + "estimatedPrice", + "estimatedSize" ] } }, @@ -6563,7 +6543,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -6573,7 +6553,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -6946,7 +6926,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -6956,7 +6936,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -7218,7 +7198,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < the server reaches time, this order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -7228,7 +7208,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP, Need to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP, Need to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -7490,7 +7470,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -7498,7 +7478,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -7814,7 +7794,7 @@ }, "allowMaxTimeWindow": { "type": "integer", - "description": "The order will fail if it times out after the specified duration in milliseconds. Specifically, if clientTimestamp + allowMaxTimeWindow (in milliseconds) is less than the time the server receives the message, the order will fail.", + "description": "Order failed after timeout of specified milliseconds, If clientTimestamp + allowMaxTimeWindow < Gateway received the message time, this order will fail.", "format": "int64", "example": [ 10, @@ -7824,7 +7804,7 @@ }, "clientTimestamp": { "type": "integer", - "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if iceberg is specified.", + "description": "Equal to KC-API-TIMESTAMP. Needs to be defined if allowMaxTimeWindow is specified.", "format": "int64", "example": [ 1740711735178 @@ -9150,7 +9130,7 @@ "x-sdk-sub-service": "Order", "x-sdk-method-name": "modifyOrder", "x-sdk-method-description": "This interface can modify the price and quantity of the order according to orderId or clientOid. The implementation of this interface is: Cancel the order and place a new order on the same trading pair, and return the modification result to the client synchronously. When the quantity of the new order updated by the user is less than the filled quantity of this order, the order will be considered as completed, and the order will be canceled, and no new order will be placed.", - "x-api-rate-limit-weight": 3, + "x-api-rate-limit-weight": 1, "requestBody": { "content": { "application/json": { diff --git a/spec/rest/entry/openapi-viplending.json b/spec/rest/entry/openapi-viplending.json index 2191c8ce..69d71964 100644 --- a/spec/rest/entry/openapi-viplending.json +++ b/spec/rest/entry/openapi-viplending.json @@ -244,7 +244,7 @@ "x-abandon": "normal", "x-domain": "Spot", "x-api-channel": "Private", - "x-api-permission": "General", + "x-api-permission": "Spot", "x-api-rate-limit-pool": "Management", "x-sdk-service": "VIPLending", "x-sdk-sub-service": "VIPLending", @@ -327,7 +327,7 @@ "x-abandon": "normal", "x-domain": "Spot", "x-api-channel": "Private", - "x-api-permission": "General", + "x-api-permission": "Spot", "x-api-rate-limit-pool": "Management", "x-sdk-service": "VIPLending", "x-sdk-sub-service": "VIPLending", diff --git a/spec/ws/openapi-futures-private.json b/spec/ws/openapi-futures-private.json index cc9f64b9..5ac99239 100644 --- a/spec/ws/openapi-futures-private.json +++ b/spec/ws/openapi-futures-private.json @@ -384,7 +384,7 @@ "orderTime": { "type": "integer", "format": "int64", - "description": "Order time (nanoseconds)" + "description": "Gateway received the message time (milliseconds)" }, "size": { "type": "string", @@ -431,7 +431,7 @@ "ts": { "type": "integer", "format": "int64", - "description": "Push time (nanoseconds)" + "description": "Match engine received the message time\n (nanoseconds)" }, "liquidity": { "type": "string", @@ -691,7 +691,7 @@ "orderTime": { "type": "integer", "format": "int64", - "description": "Order time (nanoseconds)" + "description": "Gateway received the message time (milliseconds)" }, "size": { "type": "string", @@ -738,7 +738,7 @@ "ts": { "type": "integer", "format": "int64", - "description": "Push time (nanoseconds)" + "description": "Match engine received the message time\n (nanoseconds)" }, "liquidity": { "type": "string", @@ -1133,7 +1133,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "integer", @@ -1161,7 +1161,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin" }, "maintMargin": { "type": "number", @@ -1417,7 +1417,7 @@ }, "maintMarginReq": { "type": "number", - "description": "Maintenance margin requirement **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin requirement\n" }, "riskLimit": { "type": "integer", @@ -1445,7 +1445,7 @@ }, "posMaint": { "type": "number", - "description": "Maintenance margin **Only applicable to Isolated Margin**\n" + "description": "Maintenance margin\n" }, "maintMargin": { "type": "number", @@ -1541,15 +1541,11 @@ }, "data": { "type": "object", - "properties": { - "SYMBOL": { - "type": "string", - "description": "The SYMBOL is the key with value \n\"CROSS\" or \"ISOLATED\"" - } - }, - "required": [ - "SYMBOL" - ] + "properties": {}, + "description": "The SYMBOL is the key with value \n\"CROSS\" or \"ISOLATED\"", + "additionalProperties": { + "type": "string" + } }, "subject": { "type": "string" diff --git a/spec/ws/openapi-spot-private.json b/spec/ws/openapi-spot-private.json index b02f003b..f986fa70 100644 --- a/spec/ws/openapi-spot-private.json +++ b/spec/ws/openapi-spot-private.json @@ -178,7 +178,7 @@ }, "orderTime": { "type": "integer", - "description": "Order time (milliseconds)", + "description": "Gateway received the message time (milliseconds)", "format": "int64" }, "orderType": { @@ -284,7 +284,7 @@ }, "ts": { "type": "integer", - "description": "Push time (nanoseconds)", + "description": "Match engine received the message time\n (nanoseconds)", "format": "int64" }, "type": { @@ -467,7 +467,7 @@ }, "orderTime": { "type": "integer", - "description": "Order time (milliseconds)", + "description": "Gateway received the message time (milliseconds)", "format": "int64" }, "orderType": { @@ -573,7 +573,7 @@ }, "ts": { "type": "integer", - "description": "Push time (nanoseconds)", + "description": "Match engine received the message time\n (nanoseconds)", "format": "int64" }, "type": { @@ -912,10 +912,15 @@ }, "stop": { "type": "string", - "description": "Order type: loss: stop loss order, oco: oco order", + "description": "Order type", "enum": [ "loss", - "oco" + "entry", + "l_l_o", + "l_s_o", + "e_l_o", + "e_s_o", + "tso" ], "x-api-enum": [ { @@ -924,9 +929,34 @@ "description": "stop loss order" }, { - "value": "oco", - "name": "oco", - "description": "oco order" + "value": "entry", + "name": "entry", + "description": "Take profit order" + }, + { + "value": "l_l_o", + "name": "l_l_o", + "description": "Limit stop loss OCO order" + }, + { + "value": "l_s_o", + "name": "l_s_o", + "description": "Trigger stop loss OCO order" + }, + { + "value": "e_l_o", + "name": "e_l_o", + "description": "Limit stop profit OCO order" + }, + { + "value": "e_s_o", + "name": "e_s_o", + "description": "Trigger stop profit OCO order" + }, + { + "value": "tso", + "name": "tso", + "description": "Moving stop loss order" } ] },