@yuants/vendor-huobi 0.18.2 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,32 @@
1
- import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';
1
+ import { encodeBase64, formatTime, HmacSHA256, scopeError, tokenBucket } from '@yuants/utils';
2
+ const SPOT_API_ROOT = 'api.huobi.pro';
3
+ const LINEAR_SWAP_API_ROOT = 'api.hbdm.com';
2
4
  export const getDefaultCredential = () => {
3
5
  return {
4
6
  access_key: process.env.ACCESS_KEY,
5
7
  secret_key: process.env.SECRET_KEY,
6
8
  };
7
9
  };
8
- export const privateRequest = async (credential, method, path, api_root, params) => {
10
+ const createdBuckets = new Set();
11
+ const getOrCreatePrivateBucket = (bucketId) => {
12
+ if (!createdBuckets.has(bucketId)) {
13
+ createdBuckets.add(bucketId);
14
+ tokenBucket(bucketId, { capacity: 36, refillAmount: 36, refillInterval: 3000 });
15
+ }
16
+ return tokenBucket(bucketId);
17
+ };
18
+ const acquirePrivate = (bucketId, meta) => {
19
+ const bucket = getOrCreatePrivateBucket(bucketId);
20
+ scopeError('HUOBI_API_RATE_LIMIT', Object.assign(Object.assign({}, meta), { bucketId }), () => bucket.acquireSync(1));
21
+ };
22
+ const privateRequestWithRateLimit = async (credential, interfaceType, business, method, path, api_root, params) => {
23
+ const meta = { method, api_root, path, business, interfaceType, access_key: credential.access_key };
24
+ const interfaceTypeUpper = interfaceType.toUpperCase();
25
+ const businessUpper = business.toUpperCase();
26
+ const globalBucketId = `HUOBI_PRIVATE_${interfaceTypeUpper}_UID_3S_ALL:${credential.access_key}`;
27
+ const businessBucketId = `HUOBI_PRIVATE_${interfaceTypeUpper}_UID_3S_${businessUpper}:${credential.access_key}`;
28
+ acquirePrivate(globalBucketId, meta);
29
+ acquirePrivate(businessBucketId, meta);
9
30
  const requestParams = `AccessKeyId=${credential.access_key}&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(new Date().toISOString().split('.')[0])}${method === 'GET' && params !== undefined
10
31
  ? `&${Object.entries(params)
11
32
  .filter(([, v]) => v !== undefined)
@@ -34,13 +55,17 @@ export const privateRequest = async (credential, method, path, api_root, params)
34
55
  throw e;
35
56
  }
36
57
  };
58
+ const spotPrivateQueryRequest = (credential, method, path, params) => privateRequestWithRateLimit(credential, 'query', 'spot', method, path, SPOT_API_ROOT, params);
59
+ const spotPrivateTradeRequest = (credential, method, path, params) => privateRequestWithRateLimit(credential, 'trade', 'spot', method, path, SPOT_API_ROOT, params);
60
+ const linearSwapPrivateQueryRequest = (credential, method, path, params) => privateRequestWithRateLimit(credential, 'query', 'linear-swap', method, path, LINEAR_SWAP_API_ROOT, params);
61
+ const linearSwapPrivateTradeRequest = (credential, method, path, params) => privateRequestWithRateLimit(credential, 'trade', 'linear-swap', method, path, LINEAR_SWAP_API_ROOT, params);
37
62
  /**
38
63
  * 获取账户信息
39
64
  *
40
65
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003
41
66
  */
42
67
  export const getAccount = (credential) => {
43
- return privateRequest(credential, 'GET', '/v1/account/accounts', 'api.huobi.pro');
68
+ return spotPrivateQueryRequest(credential, 'GET', '/v1/account/accounts');
44
69
  };
45
70
  /**
46
71
  * 获取用户ID
@@ -48,7 +73,7 @@ export const getAccount = (credential) => {
48
73
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003
49
74
  */
50
75
  export const getUid = (credential) => {
51
- return privateRequest(credential, 'GET', '/v2/user/uid', 'api.huobi.pro');
76
+ return spotPrivateQueryRequest(credential, 'GET', '/v2/user/uid');
52
77
  };
53
78
  /**
54
79
  * 获取统一账户信息
@@ -56,7 +81,7 @@ export const getUid = (credential) => {
56
81
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003
57
82
  */
58
83
  export const getUnifiedAccountInfo = (credential) => {
59
- return privateRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info', 'api.hbdm.com');
84
+ return linearSwapPrivateQueryRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info');
60
85
  };
61
86
  /**
62
87
  * 获取合约持仓信息
@@ -64,7 +89,7 @@ export const getUnifiedAccountInfo = (credential) => {
64
89
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003
65
90
  */
66
91
  export const getSwapCrossPositionInfo = (credential, params) => {
67
- return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_position_info', 'api.hbdm.com', params);
92
+ return linearSwapPrivateQueryRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_position_info', params);
68
93
  };
69
94
  /**
70
95
  * 获取合约挂单
@@ -72,7 +97,7 @@ export const getSwapCrossPositionInfo = (credential, params) => {
72
97
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003
73
98
  */
74
99
  export const getSwapOpenOrders = (credential, params) => {
75
- return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_openorders', 'api.hbdm.com', params);
100
+ return linearSwapPrivateQueryRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_openorders', params);
76
101
  };
77
102
  /**
78
103
  * 获取现货账户余额
@@ -80,7 +105,7 @@ export const getSwapOpenOrders = (credential, params) => {
80
105
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003
81
106
  */
82
107
  export const getSpotAccountBalance = (credential, account_uid) => {
83
- return privateRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`, 'api.huobi.pro');
108
+ return spotPrivateQueryRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`);
84
109
  };
85
110
  /**
86
111
  * 获取杠杆借贷信息
@@ -88,7 +113,7 @@ export const getSpotAccountBalance = (credential, account_uid) => {
88
113
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003
89
114
  */
90
115
  export const getCrossMarginLoanInfo = (credential) => {
91
- return privateRequest(credential, 'GET', '/v1/cross-margin/loan-info', 'api.huobi.pro');
116
+ return spotPrivateQueryRequest(credential, 'GET', '/v1/cross-margin/loan-info');
92
117
  };
93
118
  /**
94
119
  * 现货下单
@@ -96,7 +121,7 @@ export const getCrossMarginLoanInfo = (credential) => {
96
121
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003
97
122
  */
98
123
  export const postSpotOrder = (credential, params) => {
99
- return privateRequest(credential, 'POST', `/v1/order/auto/place`, 'api.huobi.pro', params);
124
+ return spotPrivateTradeRequest(credential, 'POST', `/v1/order/auto/place`, params);
100
125
  };
101
126
  /**
102
127
  * 合约下单
@@ -104,7 +129,7 @@ export const postSpotOrder = (credential, params) => {
104
129
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003
105
130
  */
106
131
  export const postSwapOrder = (credential, params) => {
107
- return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', 'api.hbdm.com', params);
132
+ return linearSwapPrivateTradeRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', params);
108
133
  };
109
134
  /**
110
135
  * 获取现货存款地址
@@ -112,7 +137,7 @@ export const postSwapOrder = (credential, params) => {
112
137
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003
113
138
  */
114
139
  export const getSpotAccountDepositAddresses = (credential, params) => {
115
- return privateRequest(credential, 'GET', `/v2/account/deposit/address`, 'api.huobi.pro', params);
140
+ return spotPrivateQueryRequest(credential, 'GET', `/v2/account/deposit/address`, params);
116
141
  };
117
142
  /**
118
143
  * 获取账户流水
@@ -120,7 +145,7 @@ export const getSpotAccountDepositAddresses = (credential, params) => {
120
145
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003
121
146
  */
122
147
  export const getAccountLedger = (credential, params) => {
123
- return privateRequest(credential, 'GET', `/v2/account/ledger`, 'api.huobi.pro', params);
148
+ return spotPrivateQueryRequest(credential, 'GET', `/v2/account/ledger`, params);
124
149
  };
125
150
  /**
126
151
  * 超级杠杆转出
@@ -128,7 +153,7 @@ export const getAccountLedger = (credential, params) => {
128
153
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003
129
154
  */
130
155
  export const postSuperMarginAccountTransferOut = (credential, params) => {
131
- return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, 'api.huobi.pro', params);
156
+ return spotPrivateTradeRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, params);
132
157
  };
133
158
  /**
134
159
  * 超级杠杆转入
@@ -136,7 +161,7 @@ export const postSuperMarginAccountTransferOut = (credential, params) => {
136
161
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003
137
162
  */
138
163
  export const postSuperMarginAccountTransferIn = (credential, params) => {
139
- return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, 'api.huobi.pro', params);
164
+ return spotPrivateTradeRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, params);
140
165
  };
141
166
  /**
142
167
  * 现货账户转账
@@ -144,7 +169,7 @@ export const postSuperMarginAccountTransferIn = (credential, params) => {
144
169
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003
145
170
  */
146
171
  export const postSpotAccountTransfer = (credential, params) => {
147
- return privateRequest(credential, 'POST', `/v2/account/transfer`, 'api.huobi.pro', params);
172
+ return spotPrivateTradeRequest(credential, 'POST', `/v2/account/transfer`, params);
148
173
  };
149
174
  /**
150
175
  * 借贷
@@ -152,7 +177,7 @@ export const postSpotAccountTransfer = (credential, params) => {
152
177
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003
153
178
  */
154
179
  export const postBorrow = (credential, params) => {
155
- return privateRequest(credential, 'POST', `/v1/cross-margin/orders`, 'api.huobi.pro', params);
180
+ return spotPrivateTradeRequest(credential, 'POST', `/v1/cross-margin/orders`, params);
156
181
  };
157
182
  /**
158
183
  * 提现
@@ -160,7 +185,7 @@ export const postBorrow = (credential, params) => {
160
185
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003
161
186
  */
162
187
  export const postWithdraw = (credential, params) => {
163
- return privateRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, 'api.huobi.pro', params);
188
+ return spotPrivateTradeRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, params);
164
189
  };
165
190
  /**
166
191
  * 获取充提历史
@@ -168,7 +193,7 @@ export const postWithdraw = (credential, params) => {
168
193
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003
169
194
  */
170
195
  export const getDepositWithdrawHistory = (credential, params) => {
171
- return privateRequest(credential, 'GET', `/v1/query/deposit-withdraw`, 'api.huobi.pro', params);
196
+ return spotPrivateQueryRequest(credential, 'GET', `/v1/query/deposit-withdraw`, params);
172
197
  };
173
198
  /**
174
199
  * 资产划转(母子用户之间)
@@ -180,7 +205,7 @@ export const getDepositWithdrawHistory = (credential, params) => {
180
205
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003
181
206
  */
182
207
  export const postSubUserTransfer = (credential, params) => {
183
- return privateRequest(credential, 'POST', '/v1/subuser/transfer', 'api.huobi.pro', params);
208
+ return spotPrivateTradeRequest(credential, 'POST', '/v1/subuser/transfer', params);
184
209
  };
185
210
  /**
186
211
  * 获取子用户列表
@@ -190,7 +215,7 @@ export const postSubUserTransfer = (credential, params) => {
190
215
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003
191
216
  */
192
217
  export const getSubUserList = (credential, params) => {
193
- return privateRequest(credential, 'GET', `/v2/sub-user/user-list`, 'api.huobi.pro', params);
218
+ return spotPrivateQueryRequest(credential, 'GET', `/v2/sub-user/user-list`, params);
194
219
  };
195
220
  /**
196
221
  * 账户类型查询
@@ -207,7 +232,7 @@ export const getSubUserList = (credential, params) => {
207
232
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003
208
233
  */
209
234
  export const getSwapUnifiedAccountType = (credential) => {
210
- return privateRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type', 'api.hbdm.com');
235
+ return linearSwapPrivateQueryRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type');
211
236
  };
212
237
  /**
213
238
  * 账户类型更改接口
@@ -223,7 +248,7 @@ export const getSwapUnifiedAccountType = (credential) => {
223
248
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003
224
249
  */
225
250
  export const postSwapSwitchAccountType = (credential, params) => {
226
- return privateRequest(credential, 'POST', '/linear-swap-api/v3/swap_switch_account_type', 'api.hbdm.com', params);
251
+ return linearSwapPrivateTradeRequest(credential, 'POST', '/linear-swap-api/v3/swap_switch_account_type', params);
227
252
  };
228
253
  /**
229
254
  * APIv2币链参考信息
@@ -231,7 +256,7 @@ export const postSwapSwitchAccountType = (credential, params) => {
231
256
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003
232
257
  */
233
258
  export const getV2ReferenceCurrencies = (credential, params) => {
234
- return privateRequest(credential, 'GET', '/v2/reference/currencies', 'api.huobi.pro', params);
259
+ return spotPrivateQueryRequest(credential, 'GET', '/v2/reference/currencies', params);
235
260
  };
236
261
  /**
237
262
  * 获取账户历史
@@ -239,6 +264,6 @@ export const getV2ReferenceCurrencies = (credential, params) => {
239
264
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003
240
265
  */
241
266
  export const getAccountHistory = (credential, params) => {
242
- return privateRequest(credential, 'GET', '/v1/account/history', 'api.huobi.pro', params);
267
+ return spotPrivateQueryRequest(credential, 'GET', '/v1/account/history', params);
243
268
  };
244
269
  //# sourceMappingURL=private-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n}\n\nexport const getDefaultCredential = (): ICredential => {\n return {\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n };\n};\n\nexport const privateRequest = async (\n credential: ICredential,\n method: string,\n path: string,\n api_root: string,\n params?: any,\n) => {\n const requestParams = `AccessKeyId=${\n credential.access_key\n }&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(\n new Date().toISOString().split('.')[0],\n )}${\n method === 'GET' && params !== undefined\n ? `&${Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&')}`\n : ''\n }`;\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n const requestString = `${method}\\n${api_root}\\n${path}\\n${requestParams}`;\n\n const str = encodeBase64(\n await HmacSHA256(\n new TextEncoder().encode(requestString),\n new TextEncoder().encode(credential.secret_key),\n ),\n );\n\n const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);\n // url.searchParams.sort();\n console.info(formatTime(Date.now()), method, url.href, body);\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n const retStr = await res.text();\n console.info(formatTime(Date.now()), 'PrivateResponse', url.toString(), res.status);\n try {\n return JSON.parse(retStr);\n } catch (e) {\n console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);\n throw e;\n }\n};\n\n/**\n * 获取账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003\n */\nexport const getAccount = (\n credential: ICredential,\n): Promise<{\n status: string;\n data: {\n id: number;\n type: string;\n state: string;\n subtype: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/accounts', 'api.huobi.pro');\n};\n\n/**\n * 获取用户ID\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003\n */\nexport const getUid = (credential: ICredential): Promise<{ data: number; code: number }> => {\n return privateRequest(credential, 'GET', '/v2/user/uid', 'api.huobi.pro');\n};\n\n/**\n * 获取统一账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003\n */\nexport const getUnifiedAccountInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n msg: string;\n data: {\n margin_asset: string;\n margin_balance: number;\n cross_margin_static: number;\n cross_profit_unreal: number;\n withdraw_available: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info', 'api.hbdm.com');\n};\n\n/**\n * 获取合约持仓信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapCrossPositionInfo = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n contract_type: string;\n },\n): Promise<{\n status: string;\n ts: number;\n data: {\n symbol: string;\n contract_code: string;\n volume: number;\n available: number;\n frozen: number;\n cost_open: number;\n cost_hold: number;\n profit_unreal: number;\n profit_rate: number;\n lever_rate: number;\n position_margin: number;\n direction: string;\n profit: number;\n last_price: number;\n margin_asset: string;\n margin_mode: string;\n margin_account: string;\n contract_type: string;\n pair: string;\n business_type: string;\n position_mode: string;\n adl_risk_percent: string;\n liquidation_price?: number;\n }[];\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_position_info',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取合约挂单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapOpenOrders = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n page_index?: number;\n page_size?: number;\n sort_by?: string;\n trade_type?: string;\n },\n): Promise<{\n status: string;\n data: {\n orders: {\n order_id_str: string;\n contract_code: string;\n order_price_type: string;\n direction: string;\n offset: string;\n volume: number;\n created_at: number;\n price: number;\n trade_volume: number;\n }[];\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_openorders',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取现货账户余额\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountBalance = (\n credential: ICredential,\n account_uid: number,\n): Promise<{\n status: string;\n data: {\n list: {\n currency: string;\n balance: string;\n type: string;\n }[];\n };\n}> => {\n return privateRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`, 'api.huobi.pro');\n};\n\n/**\n * 获取杠杆借贷信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003\n */\nexport const getCrossMarginLoanInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n data: {\n currency: string;\n 'loanable-amt': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/cross-margin/loan-info', 'api.huobi.pro');\n};\n\n/**\n * 现货下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotOrder = (\n credential: ICredential,\n params: {\n symbol: string;\n 'account-id': string;\n amount: string;\n market_amount?: string;\n 'borrow-amount'?: string;\n type: string;\n 'trade-purpose': string;\n price?: string;\n source: string;\n 'client-order-id'?: string;\n },\n): Promise<{ success: boolean; code: number; message: string; data: { orderId: number } }> => {\n return privateRequest(credential, 'POST', `/v1/order/auto/place`, 'api.huobi.pro', params);\n};\n\n/**\n * 合约下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapOrder = (\n credential: ICredential,\n params: {\n contract_code: string;\n contract_type: string;\n price?: number;\n volume: number;\n offset: string;\n direction: string;\n lever_rate: number;\n order_price_type: string;\n channel_code?: string;\n },\n): Promise<{ status: string; ts: number; data: { order_id: number; order_id_str: string } }> => {\n return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', 'api.hbdm.com', params);\n};\n\n/**\n * 获取现货存款地址\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountDepositAddresses = (\n credential: ICredential,\n params: { currency: string },\n): Promise<{\n code: number;\n message: string;\n data: {\n currency: string;\n chain: string;\n address: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/deposit/address`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户流水\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003\n */\nexport const getAccountLedger = (\n credential: ICredential,\n params: { accountId: string; currency: string },\n): Promise<{\n status: string;\n data: {\n transactTime: number;\n transactAmt: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/ledger`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转出\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferOut = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转入\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferIn = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, 'api.huobi.pro', params);\n};\n\n/**\n * 现货账户转账\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotAccountTransfer = (\n credential: ICredential,\n params: {\n from: string;\n to: string;\n currency: string;\n amount: number;\n 'margin-account': string;\n },\n): Promise<{ success: boolean; data: number; code: number; message: string }> => {\n return privateRequest(credential, 'POST', `/v2/account/transfer`, 'api.huobi.pro', params);\n};\n\n/**\n * 借贷\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003\n */\nexport const postBorrow = (\n credential: ICredential,\n params: { currency: string; amount: string },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/orders`, 'api.huobi.pro', params);\n};\n\n/**\n * 提现\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003\n */\nexport const postWithdraw = (\n credential: ICredential,\n params: {\n address: string;\n amount: string;\n currency: string;\n fee: string;\n chain: string;\n },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取充提历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003\n */\nexport const getDepositWithdrawHistory = (\n credential: ICredential,\n params: {\n currency: string;\n type: string;\n from?: string;\n size?: string;\n direct?: string;\n },\n): Promise<{\n status: string;\n 'error-code': string;\n 'error-msg': string;\n data: {\n id: number;\n type: string;\n currency: string;\n 'tx-hash': string;\n chain: string;\n amount: string;\n address: string;\n 'address-tag': string;\n fee: string;\n state: string;\n 'create-at': number;\n 'update-at': number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v1/query/deposit-withdraw`, 'api.huobi.pro', params);\n};\n\n/**\n * 资产划转(母子用户之间)\n *\n * 接口权限: 交易\n *\n * 限频: 2次/2s\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003\n */\nexport const postSubUserTransfer = (\n credential: ICredential,\n params: {\n 'sub-uid': number;\n currency: string;\n amount: number;\n 'client-order-id'?: string;\n type: string;\n },\n): Promise<{\n data: number;\n status: string;\n}> => {\n return privateRequest(credential, 'POST', '/v1/subuser/transfer', 'api.huobi.pro', params);\n};\n\n/**\n * 获取子用户列表\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003\n */\nexport const getSubUserList = (\n credential: ICredential,\n params?: { fromId?: number },\n): Promise<{\n code: number;\n message?: string;\n data: {\n uid: number;\n userState: string;\n subUserName: string;\n note: string;\n }[];\n nextId?: number;\n ok: boolean;\n}> => {\n return privateRequest(credential, 'GET', `/v2/sub-user/user-list`, 'api.huobi.pro', params);\n};\n\n/**\n * 账户类型查询\n *\n * 是否验签: 是\n *\n * 接口权限: 读取\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。\n * 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapUnifiedAccountType = (\n credential: ICredential,\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type', 'api.hbdm.com');\n};\n\n/**\n * 账户类型更改接口\n *\n * 是否验签: 是\n *\n * 接口权限: 交易\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapSwitchAccountType = (\n credential: ICredential,\n params: { account_type: number },\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v3/swap_switch_account_type',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\nexport const getV2ReferenceCurrencies = (\n credential: ICredential,\n params: {\n currency?: string;\n authorizedUser?: string;\n },\n): Promise<{\n code: number;\n data: {\n currency: string;\n assetType: number;\n chains: {\n chain: string;\n displayName: string;\n fullName: string;\n baseChain?: string;\n baseChainProtocol?: string;\n isDynamic?: boolean;\n numOfConfirmations: number;\n numOfFastConfirmations: number;\n depositStatus: string;\n minDepositAmt: string;\n withdrawStatus: string;\n minWithdrawAmt: string;\n withdrawPrecision: number;\n maxWithdrawAmt: string;\n withdrawQuotaPerDay: string;\n withdrawQuotaPerYear: null;\n withdrawQuotaTotal: null;\n withdrawFeeType: string;\n transactFeeWithdraw?: string;\n addrWithTag: boolean;\n addrDepositTag: boolean;\n minTransactFeeWithdraw?: string;\n transactFeeRateWithdraw?: string;\n maxTransactFeeWithdraw?: string;\n }[];\n instStatus: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v2/reference/currencies', 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003\n */\nexport const getAccountHistory = (\n credential: ICredential,\n params: {\n 'account-id': string;\n currency?: string;\n 'transact-types'?: number;\n 'start-time'?: number;\n 'end-time'?: number;\n sort?: 'asc' | 'desc';\n size?: number;\n 'from-id'?: number;\n },\n): Promise<{\n // code: number;\n 'transact-amt': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n 'record-id': string;\n status: string;\n data: {\n 'account-id': string;\n currency: string;\n 'record-id': string;\n 'transact-amt': string;\n 'transact-type': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/history', 'api.huobi.pro', params);\n};\n"]}
1
+ {"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeBase64, formatTime, HmacSHA256, scopeError, tokenBucket } from '@yuants/utils';\n\nconst SPOT_API_ROOT = 'api.huobi.pro';\nconst LINEAR_SWAP_API_ROOT = 'api.hbdm.com';\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n}\n\nexport const getDefaultCredential = (): ICredential => {\n return {\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n };\n};\n\n// https://www.htx.com/zh-cn/opend/newApiPages/?id=474\ntype HuobiBusiness = 'spot' | 'linear-swap';\ntype HuobiPrivateInterfaceType = 'trade' | 'query';\n\nconst createdBuckets = new Set<string>();\nconst getOrCreatePrivateBucket = (bucketId: string) => {\n if (!createdBuckets.has(bucketId)) {\n createdBuckets.add(bucketId);\n tokenBucket(bucketId, { capacity: 36, refillAmount: 36, refillInterval: 3000 });\n }\n return tokenBucket(bucketId);\n};\n\nconst acquirePrivate = (bucketId: string, meta: Record<string, unknown>) => {\n const bucket = getOrCreatePrivateBucket(bucketId);\n scopeError('HUOBI_API_RATE_LIMIT', { ...meta, bucketId }, () => bucket.acquireSync(1));\n};\n\nconst privateRequestWithRateLimit = async (\n credential: ICredential,\n interfaceType: HuobiPrivateInterfaceType,\n business: HuobiBusiness,\n method: string,\n path: string,\n api_root: string,\n params?: any,\n) => {\n const meta = { method, api_root, path, business, interfaceType, access_key: credential.access_key };\n\n const interfaceTypeUpper = interfaceType.toUpperCase();\n const businessUpper = business.toUpperCase();\n const globalBucketId = `HUOBI_PRIVATE_${interfaceTypeUpper}_UID_3S_ALL:${credential.access_key}`;\n const businessBucketId = `HUOBI_PRIVATE_${interfaceTypeUpper}_UID_3S_${businessUpper}:${credential.access_key}`;\n acquirePrivate(globalBucketId, meta);\n acquirePrivate(businessBucketId, meta);\n\n const requestParams = `AccessKeyId=${\n credential.access_key\n }&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(\n new Date().toISOString().split('.')[0],\n )}${\n method === 'GET' && params !== undefined\n ? `&${Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&')}`\n : ''\n }`;\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n const requestString = `${method}\\n${api_root}\\n${path}\\n${requestParams}`;\n\n const str = encodeBase64(\n await HmacSHA256(\n new TextEncoder().encode(requestString),\n new TextEncoder().encode(credential.secret_key),\n ),\n );\n\n const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);\n // url.searchParams.sort();\n console.info(formatTime(Date.now()), method, url.href, body);\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n const retStr = await res.text();\n console.info(formatTime(Date.now()), 'PrivateResponse', url.toString(), res.status);\n try {\n return JSON.parse(retStr);\n } catch (e) {\n console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);\n throw e;\n }\n};\n\nconst spotPrivateQueryRequest = (credential: ICredential, method: string, path: string, params?: any) =>\n privateRequestWithRateLimit(credential, 'query', 'spot', method, path, SPOT_API_ROOT, params);\n\nconst spotPrivateTradeRequest = (credential: ICredential, method: string, path: string, params?: any) =>\n privateRequestWithRateLimit(credential, 'trade', 'spot', method, path, SPOT_API_ROOT, params);\n\nconst linearSwapPrivateQueryRequest = (credential: ICredential, method: string, path: string, params?: any) =>\n privateRequestWithRateLimit(credential, 'query', 'linear-swap', method, path, LINEAR_SWAP_API_ROOT, params);\n\nconst linearSwapPrivateTradeRequest = (credential: ICredential, method: string, path: string, params?: any) =>\n privateRequestWithRateLimit(credential, 'trade', 'linear-swap', method, path, LINEAR_SWAP_API_ROOT, params);\n\n/**\n * 获取账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003\n */\nexport const getAccount = (\n credential: ICredential,\n): Promise<{\n status: string;\n data: {\n id: number;\n type: string;\n state: string;\n subtype: string;\n }[];\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', '/v1/account/accounts');\n};\n\n/**\n * 获取用户ID\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003\n */\nexport const getUid = (credential: ICredential): Promise<{ data: number; code: number }> => {\n return spotPrivateQueryRequest(credential, 'GET', '/v2/user/uid');\n};\n\n/**\n * 获取统一账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003\n */\nexport const getUnifiedAccountInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n msg: string;\n data: {\n margin_asset: string;\n margin_balance: number;\n margin_static: number;\n cross_margin_static: number;\n cross_profit_unreal: number;\n withdraw_available: number;\n }[];\n}> => {\n return linearSwapPrivateQueryRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info');\n};\n\n/**\n * 获取合约持仓信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapCrossPositionInfo = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n contract_type: string;\n },\n): Promise<{\n status: string;\n ts: number;\n data: {\n symbol: string;\n contract_code: string;\n volume: number;\n available: number;\n frozen: number;\n cost_open: number;\n cost_hold: number;\n profit_unreal: number;\n profit_rate: number;\n lever_rate: number;\n position_margin: number;\n direction: string;\n profit: number;\n last_price: number;\n margin_asset: string;\n margin_mode: string;\n margin_account: string;\n contract_type: string;\n pair: string;\n business_type: string;\n position_mode: string;\n adl_risk_percent: string;\n liquidation_price?: number;\n }[];\n}> => {\n return linearSwapPrivateQueryRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_position_info',\n params,\n );\n};\n\n/**\n * 获取合约挂单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapOpenOrders = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n page_index?: number;\n page_size?: number;\n sort_by?: string;\n trade_type?: string;\n },\n): Promise<{\n status: string;\n data: {\n orders: {\n order_id_str: string;\n contract_code: string;\n order_price_type: string;\n direction: string;\n offset: string;\n volume: number;\n created_at: number;\n price: number;\n trade_volume: number;\n }[];\n };\n}> => {\n return linearSwapPrivateQueryRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_openorders',\n params,\n );\n};\n\n/**\n * 获取现货账户余额\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountBalance = (\n credential: ICredential,\n account_uid: number,\n): Promise<{\n status: string;\n data: {\n list: {\n currency: string;\n balance: string;\n type: string;\n }[];\n };\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`);\n};\n\n/**\n * 获取杠杆借贷信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003\n */\nexport const getCrossMarginLoanInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n data: {\n currency: string;\n 'loanable-amt': string;\n }[];\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', '/v1/cross-margin/loan-info');\n};\n\n/**\n * 现货下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotOrder = (\n credential: ICredential,\n params: {\n symbol: string;\n 'account-id': string;\n amount: string;\n market_amount?: string;\n 'borrow-amount'?: string;\n type: string;\n 'trade-purpose': string;\n price?: string;\n source: string;\n 'client-order-id'?: string;\n },\n): Promise<{ success: boolean; code: number; message: string; data: { orderId: number } }> => {\n return spotPrivateTradeRequest(credential, 'POST', `/v1/order/auto/place`, params);\n};\n\n/**\n * 合约下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapOrder = (\n credential: ICredential,\n params: {\n contract_code: string;\n contract_type: string;\n price?: number;\n volume: number;\n offset: string;\n direction: string;\n lever_rate: number;\n order_price_type: string;\n channel_code?: string;\n },\n): Promise<{ status: string; ts: number; data: { order_id: number; order_id_str: string } }> => {\n return linearSwapPrivateTradeRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', params);\n};\n\n/**\n * 获取现货存款地址\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountDepositAddresses = (\n credential: ICredential,\n params: { currency: string },\n): Promise<{\n code: number;\n message: string;\n data: {\n currency: string;\n chain: string;\n address: string;\n }[];\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', `/v2/account/deposit/address`, params);\n};\n\n/**\n * 获取账户流水\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003\n */\nexport const getAccountLedger = (\n credential: ICredential,\n params: { accountId: string; currency: string },\n): Promise<{\n status: string;\n data: {\n transactTime: number;\n transactAmt: number;\n }[];\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', `/v2/account/ledger`, params);\n};\n\n/**\n * 超级杠杆转出\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferOut = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return spotPrivateTradeRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, params);\n};\n\n/**\n * 超级杠杆转入\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferIn = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return spotPrivateTradeRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, params);\n};\n\n/**\n * 现货账户转账\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotAccountTransfer = (\n credential: ICredential,\n params: {\n from: string;\n to: string;\n currency: string;\n amount: number;\n 'margin-account': string;\n },\n): Promise<{ success: boolean; data: number; code: number; message: string }> => {\n return spotPrivateTradeRequest(credential, 'POST', `/v2/account/transfer`, params);\n};\n\n/**\n * 借贷\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003\n */\nexport const postBorrow = (\n credential: ICredential,\n params: { currency: string; amount: string },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return spotPrivateTradeRequest(credential, 'POST', `/v1/cross-margin/orders`, params);\n};\n\n/**\n * 提现\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003\n */\nexport const postWithdraw = (\n credential: ICredential,\n params: {\n address: string;\n amount: string;\n currency: string;\n fee: string;\n chain: string;\n },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return spotPrivateTradeRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, params);\n};\n\n/**\n * 获取充提历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003\n */\nexport const getDepositWithdrawHistory = (\n credential: ICredential,\n params: {\n currency: string;\n type: string;\n from?: string;\n size?: string;\n direct?: string;\n },\n): Promise<{\n status: string;\n 'error-code': string;\n 'error-msg': string;\n data: {\n id: number;\n type: string;\n currency: string;\n 'tx-hash': string;\n chain: string;\n amount: string;\n address: string;\n 'address-tag': string;\n fee: string;\n state: string;\n 'create-at': number;\n 'update-at': number;\n }[];\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', `/v1/query/deposit-withdraw`, params);\n};\n\n/**\n * 资产划转(母子用户之间)\n *\n * 接口权限: 交易\n *\n * 限频: 2次/2s\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003\n */\nexport const postSubUserTransfer = (\n credential: ICredential,\n params: {\n 'sub-uid': number;\n currency: string;\n amount: number;\n 'client-order-id'?: string;\n type: string;\n },\n): Promise<{\n data: number;\n status: string;\n}> => {\n return spotPrivateTradeRequest(credential, 'POST', '/v1/subuser/transfer', params);\n};\n\n/**\n * 获取子用户列表\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003\n */\nexport const getSubUserList = (\n credential: ICredential,\n params?: { fromId?: number },\n): Promise<{\n code: number;\n message?: string;\n data: {\n uid: number;\n userState: string;\n subUserName: string;\n note: string;\n }[];\n nextId?: number;\n ok: boolean;\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', `/v2/sub-user/user-list`, params);\n};\n\n/**\n * 账户类型查询\n *\n * 是否验签: 是\n *\n * 接口权限: 读取\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。\n * 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapUnifiedAccountType = (\n credential: ICredential,\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return linearSwapPrivateQueryRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type');\n};\n\n/**\n * 账户类型更改接口\n *\n * 是否验签: 是\n *\n * 接口权限: 交易\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapSwitchAccountType = (\n credential: ICredential,\n params: { account_type: number },\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return linearSwapPrivateTradeRequest(\n credential,\n 'POST',\n '/linear-swap-api/v3/swap_switch_account_type',\n params,\n );\n};\n\n/**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\nexport const getV2ReferenceCurrencies = (\n credential: ICredential,\n params: {\n currency?: string;\n authorizedUser?: string;\n },\n): Promise<{\n code: number;\n data: {\n currency: string;\n assetType: number;\n chains: {\n chain: string;\n displayName: string;\n fullName: string;\n baseChain?: string;\n baseChainProtocol?: string;\n isDynamic?: boolean;\n numOfConfirmations: number;\n numOfFastConfirmations: number;\n depositStatus: string;\n minDepositAmt: string;\n withdrawStatus: string;\n minWithdrawAmt: string;\n withdrawPrecision: number;\n maxWithdrawAmt: string;\n withdrawQuotaPerDay: string;\n withdrawQuotaPerYear: null;\n withdrawQuotaTotal: null;\n withdrawFeeType: string;\n transactFeeWithdraw?: string;\n addrWithTag: boolean;\n addrDepositTag: boolean;\n minTransactFeeWithdraw?: string;\n transactFeeRateWithdraw?: string;\n maxTransactFeeWithdraw?: string;\n }[];\n instStatus: string;\n }[];\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', '/v2/reference/currencies', params);\n};\n\n/**\n * 获取账户历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003\n */\nexport const getAccountHistory = (\n credential: ICredential,\n params: {\n 'account-id': string;\n currency?: string;\n 'transact-types'?: number;\n 'start-time'?: number;\n 'end-time'?: number;\n sort?: 'asc' | 'desc';\n size?: number;\n 'from-id'?: number;\n },\n): Promise<{\n // code: number;\n 'transact-amt': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n 'record-id': string;\n status: string;\n data: {\n 'account-id': string;\n currency: string;\n 'record-id': string;\n 'transact-amt': string;\n 'transact-type': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n }[];\n}> => {\n return spotPrivateQueryRequest(credential, 'GET', '/v1/account/history', params);\n};\n"]}
@@ -1,9 +1,33 @@
1
- import { formatTime } from '@yuants/utils';
1
+ import { formatTime, scopeError, tokenBucket } from '@yuants/utils';
2
2
  // Huobi API 根域名
3
3
  const SWAP_API_ROOT = 'api.hbdm.com';
4
4
  const SPOT_API_ROOT = 'api.huobi.pro';
5
+ const acquire = (bucketId, meta) => {
6
+ const bucket = tokenBucket(bucketId);
7
+ scopeError('HUOBI_API_RATE_LIMIT', Object.assign(Object.assign({}, meta), { bucketId }), () => bucket.acquireSync(1));
8
+ };
9
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=474
10
+ // 行情类:同一个 IP,总共 1s 最多 800 个请求(合约业务共享总额度)
11
+ const marketDataIPAllBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_ALL';
12
+ tokenBucket(marketDataIPAllBucketId, {
13
+ capacity: 800,
14
+ refillInterval: 1000,
15
+ refillAmount: 800,
16
+ });
17
+ // 行情类:按业务线拆分(用于交割/币本位永续/U本位分开限频)
18
+ const marketDataSpotBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_SPOT';
19
+ tokenBucket(marketDataSpotBucketId, { capacity: 800, refillInterval: 1000, refillAmount: 800 });
20
+ const marketDataLinearSwapBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_LINEAR_SWAP';
21
+ tokenBucket(marketDataLinearSwapBucketId, { capacity: 800, refillInterval: 1000, refillAmount: 800 });
22
+ // 非行情类公开接口:同一个 IP,3s 最多 120 次请求
23
+ const nonMarketDataIPBucketId = 'HUOBI_PUBLIC_NON_MARKET_IP_3S_ALL';
24
+ tokenBucket(nonMarketDataIPBucketId, {
25
+ capacity: 120,
26
+ refillInterval: 3000,
27
+ refillAmount: 120,
28
+ });
5
29
  /**
6
- * 公共 API 请求方法
30
+ * 公共 API 请求方法(不负责限流;限流由调用点选择对应 helper)
7
31
  */
8
32
  async function publicRequest(method, path, api_root, params) {
9
33
  const url = new URL(`https://${api_root}${path}`);
@@ -29,6 +53,52 @@ async function publicRequest(method, path, api_root, params) {
29
53
  throw e;
30
54
  }
31
55
  }
56
+ const spotMarketRequest = async (method, path, params) => {
57
+ const meta = {
58
+ method,
59
+ api_root: SPOT_API_ROOT,
60
+ path,
61
+ business: 'spot',
62
+ interfaceType: 'market',
63
+ };
64
+ acquire(marketDataIPAllBucketId, meta);
65
+ acquire(marketDataSpotBucketId, meta);
66
+ return publicRequest(method, path, SPOT_API_ROOT, params);
67
+ };
68
+ const spotNonMarketRequest = async (method, path, params) => {
69
+ const meta = {
70
+ method,
71
+ api_root: SPOT_API_ROOT,
72
+ path,
73
+ business: 'spot',
74
+ interfaceType: 'non-market',
75
+ };
76
+ acquire(nonMarketDataIPBucketId, meta);
77
+ return publicRequest(method, path, SPOT_API_ROOT, params);
78
+ };
79
+ const linearSwapMarketRequest = async (method, path, params) => {
80
+ const meta = {
81
+ method,
82
+ api_root: SWAP_API_ROOT,
83
+ path,
84
+ business: 'linear-swap',
85
+ interfaceType: 'market',
86
+ };
87
+ acquire(marketDataIPAllBucketId, meta);
88
+ acquire(marketDataLinearSwapBucketId, meta);
89
+ return publicRequest(method, path, SWAP_API_ROOT, params);
90
+ };
91
+ const linearSwapNonMarketRequest = async (method, path, params) => {
92
+ const meta = {
93
+ method,
94
+ api_root: SWAP_API_ROOT,
95
+ path,
96
+ business: 'linear-swap',
97
+ interfaceType: 'non-market',
98
+ };
99
+ acquire(nonMarketDataIPBucketId, meta);
100
+ return publicRequest(method, path, SWAP_API_ROOT, params);
101
+ };
32
102
  // ==================== 公共 API 方法 ====================
33
103
  /**
34
104
  * 获取永续合约产品信息
@@ -36,7 +106,7 @@ async function publicRequest(method, path, api_root, params) {
36
106
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72f34-77b5-11ed-9966-0242ac110003
37
107
  */
38
108
  export function getPerpetualContractSymbols(params) {
39
- return publicRequest('GET', '/linear-swap-api/v1/swap_contract_info', SWAP_API_ROOT, params);
109
+ return linearSwapNonMarketRequest('GET', '/linear-swap-api/v1/swap_contract_info', params);
40
110
  }
41
111
  /**
42
112
  * 获取现货产品信息
@@ -44,7 +114,7 @@ export function getPerpetualContractSymbols(params) {
44
114
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec47f16-7773-11ed-9966-0242ac110003
45
115
  */
46
116
  export function getSpotSymbols() {
47
- return publicRequest('GET', '/v2/settings/common/symbols', SPOT_API_ROOT);
117
+ return spotNonMarketRequest('GET', '/v2/settings/common/symbols');
48
118
  }
49
119
  /**
50
120
  * 获取现货行情
@@ -52,7 +122,7 @@ export function getSpotSymbols() {
52
122
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003
53
123
  */
54
124
  export function getSpotTick(params) {
55
- return publicRequest('GET', `/market/detail/merged`, SPOT_API_ROOT, params);
125
+ return spotMarketRequest('GET', `/market/detail/merged`, params);
56
126
  }
57
127
  /**
58
128
  * 【现货】获取K线数据
@@ -62,21 +132,21 @@ export function getSpotTick(params) {
62
132
  * Note: HTX spot KLine uses unix seconds in `data[].id`
63
133
  */
64
134
  export function getSpotHistoryKline(params) {
65
- return publicRequest('GET', `/market/history/kline`, SPOT_API_ROOT, params);
135
+ return spotMarketRequest('GET', `/market/history/kline`, params);
66
136
  }
67
137
  /**
68
138
  * 【通用】批量获取合约资金费率
69
139
  *
70
140
  * 接口权限: 读取
71
141
  *
72
- * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多240次请求(所有该IP的非行情类的公开接口请求共享3秒240次的额度)
142
+ * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多120次请求(所有该IP的非行情类的公开接口请求共享3秒120次的额度)
73
143
  *
74
144
  * 接口描述: 该接口支持全仓模式和逐仓模式
75
145
  *
76
146
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71b45-77b5-11ed-9966-0242ac110003
77
147
  */
78
148
  export function getSwapBatchFundingRate(params) {
79
- return publicRequest('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, SWAP_API_ROOT, params);
149
+ return linearSwapNonMarketRequest('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, params);
80
150
  }
81
151
  /**
82
152
  * 【通用】获取市场最近成交记录
@@ -96,7 +166,7 @@ export function getSwapBatchFundingRate(params) {
96
166
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73c34-77b5-11ed-9966-0242ac110003
97
167
  */
98
168
  export function getSwapMarketTrade(params) {
99
- return publicRequest('GET', `/linear-swap-ex/market/trade`, SWAP_API_ROOT, params);
169
+ return linearSwapMarketRequest('GET', `/linear-swap-ex/market/trade`, params);
100
170
  }
101
171
  /**
102
172
  * 获得当前合约的总持仓量
@@ -104,7 +174,7 @@ export function getSwapMarketTrade(params) {
104
174
  * https://huobiapi.github.io/docs/usdt_swap/v1/cn/#3218e7531a
105
175
  */
106
176
  export function getSwapOpenInterest(params) {
107
- return publicRequest('GET', '/linear-swap-api/v1/swap_open_interest', SWAP_API_ROOT, params);
177
+ return linearSwapMarketRequest('GET', '/linear-swap-api/v1/swap_open_interest', params);
108
178
  }
109
179
  /**
110
180
  * 【通用】获取市场最优挂单
@@ -124,7 +194,7 @@ export function getSwapOpenInterest(params) {
124
194
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb735e0-77b5-11ed-9966-0242ac110003
125
195
  */
126
196
  export function getSwapMarketBbo(params) {
127
- return publicRequest('GET', `/linear-swap-ex/market/bbo`, SWAP_API_ROOT, params);
197
+ return linearSwapMarketRequest('GET', `/linear-swap-ex/market/bbo`, params);
128
198
  }
129
199
  /**
130
200
  * 获取合约的历史资金费率
@@ -134,7 +204,7 @@ export function getSwapMarketBbo(params) {
134
204
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=5d51f1f9-77b6-11ed-9966-0242ac110003
135
205
  */
136
206
  export function getSwapHistoricalFundingRate(params) {
137
- return publicRequest('GET', `/linear-swap-api/v1/swap_historical_funding_rate`, SWAP_API_ROOT, params);
207
+ return linearSwapNonMarketRequest('GET', `/linear-swap-api/v1/swap_historical_funding_rate`, params);
138
208
  }
139
209
  /**
140
210
  * 【通用】获取K线数据
@@ -142,7 +212,7 @@ export function getSwapHistoricalFundingRate(params) {
142
212
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73746-77b5-11ed-9966-0242ac110003
143
213
  */
144
214
  export function getSwapHistoryKline(params) {
145
- return publicRequest('GET', `/linear-swap-ex/market/history/kline`, SWAP_API_ROOT, params);
215
+ return linearSwapMarketRequest('GET', `/linear-swap-ex/market/history/kline`, params);
146
216
  }
147
217
  /**
148
218
  * 【全仓】获取平台阶梯保证金
@@ -150,7 +220,7 @@ export function getSwapHistoryKline(params) {
150
220
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72290-77b5-11ed-9966-0242ac110003
151
221
  */
152
222
  export function getSwapCrossLadderMargin(params) {
153
- return publicRequest('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', SWAP_API_ROOT, params);
223
+ return linearSwapNonMarketRequest('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', params);
154
224
  }
155
225
  /**
156
226
  * APIv2币链参考信息
@@ -158,7 +228,7 @@ export function getSwapCrossLadderMargin(params) {
158
228
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003
159
229
  */
160
230
  export function getV2ReferenceCurrencies(params) {
161
- return publicRequest('GET', '/v2/reference/currencies', SPOT_API_ROOT, params);
231
+ return spotNonMarketRequest('GET', '/v2/reference/currencies', params);
162
232
  }
163
233
  /**
164
234
  * 【现货】获取市场所有交易对的最新行情
@@ -166,5 +236,5 @@ export function getV2ReferenceCurrencies(params) {
166
236
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40374-7773-11ed-9966-0242ac110003
167
237
  *
168
238
  */
169
- export const getSpotMarketTickers = () => publicRequest('GET', '/market/tickers', SPOT_API_ROOT);
239
+ export const getSpotMarketTickers = () => spotMarketRequest('GET', '/market/tickers');
170
240
  //# sourceMappingURL=public-api.js.map