@yuants/vendor-huobi 0.18.3 → 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.
@@ -5,8 +5,32 @@ const utils_1 = require("@yuants/utils");
5
5
  // Huobi API 根域名
6
6
  const SWAP_API_ROOT = 'api.hbdm.com';
7
7
  const SPOT_API_ROOT = 'api.huobi.pro';
8
+ const acquire = (bucketId, meta) => {
9
+ const bucket = (0, utils_1.tokenBucket)(bucketId);
10
+ (0, utils_1.scopeError)('HUOBI_API_RATE_LIMIT', Object.assign(Object.assign({}, meta), { bucketId }), () => bucket.acquireSync(1));
11
+ };
12
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=474
13
+ // 行情类:同一个 IP,总共 1s 最多 800 个请求(合约业务共享总额度)
14
+ const marketDataIPAllBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_ALL';
15
+ (0, utils_1.tokenBucket)(marketDataIPAllBucketId, {
16
+ capacity: 800,
17
+ refillInterval: 1000,
18
+ refillAmount: 800,
19
+ });
20
+ // 行情类:按业务线拆分(用于交割/币本位永续/U本位分开限频)
21
+ const marketDataSpotBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_SPOT';
22
+ (0, utils_1.tokenBucket)(marketDataSpotBucketId, { capacity: 800, refillInterval: 1000, refillAmount: 800 });
23
+ const marketDataLinearSwapBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_LINEAR_SWAP';
24
+ (0, utils_1.tokenBucket)(marketDataLinearSwapBucketId, { capacity: 800, refillInterval: 1000, refillAmount: 800 });
25
+ // 非行情类公开接口:同一个 IP,3s 最多 120 次请求
26
+ const nonMarketDataIPBucketId = 'HUOBI_PUBLIC_NON_MARKET_IP_3S_ALL';
27
+ (0, utils_1.tokenBucket)(nonMarketDataIPBucketId, {
28
+ capacity: 120,
29
+ refillInterval: 3000,
30
+ refillAmount: 120,
31
+ });
8
32
  /**
9
- * 公共 API 请求方法
33
+ * 公共 API 请求方法(不负责限流;限流由调用点选择对应 helper)
10
34
  */
11
35
  async function publicRequest(method, path, api_root, params) {
12
36
  const url = new URL(`https://${api_root}${path}`);
@@ -32,6 +56,52 @@ async function publicRequest(method, path, api_root, params) {
32
56
  throw e;
33
57
  }
34
58
  }
59
+ const spotMarketRequest = async (method, path, params) => {
60
+ const meta = {
61
+ method,
62
+ api_root: SPOT_API_ROOT,
63
+ path,
64
+ business: 'spot',
65
+ interfaceType: 'market',
66
+ };
67
+ acquire(marketDataIPAllBucketId, meta);
68
+ acquire(marketDataSpotBucketId, meta);
69
+ return publicRequest(method, path, SPOT_API_ROOT, params);
70
+ };
71
+ const spotNonMarketRequest = async (method, path, params) => {
72
+ const meta = {
73
+ method,
74
+ api_root: SPOT_API_ROOT,
75
+ path,
76
+ business: 'spot',
77
+ interfaceType: 'non-market',
78
+ };
79
+ acquire(nonMarketDataIPBucketId, meta);
80
+ return publicRequest(method, path, SPOT_API_ROOT, params);
81
+ };
82
+ const linearSwapMarketRequest = async (method, path, params) => {
83
+ const meta = {
84
+ method,
85
+ api_root: SWAP_API_ROOT,
86
+ path,
87
+ business: 'linear-swap',
88
+ interfaceType: 'market',
89
+ };
90
+ acquire(marketDataIPAllBucketId, meta);
91
+ acquire(marketDataLinearSwapBucketId, meta);
92
+ return publicRequest(method, path, SWAP_API_ROOT, params);
93
+ };
94
+ const linearSwapNonMarketRequest = async (method, path, params) => {
95
+ const meta = {
96
+ method,
97
+ api_root: SWAP_API_ROOT,
98
+ path,
99
+ business: 'linear-swap',
100
+ interfaceType: 'non-market',
101
+ };
102
+ acquire(nonMarketDataIPBucketId, meta);
103
+ return publicRequest(method, path, SWAP_API_ROOT, params);
104
+ };
35
105
  // ==================== 公共 API 方法 ====================
36
106
  /**
37
107
  * 获取永续合约产品信息
@@ -39,7 +109,7 @@ async function publicRequest(method, path, api_root, params) {
39
109
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72f34-77b5-11ed-9966-0242ac110003
40
110
  */
41
111
  function getPerpetualContractSymbols(params) {
42
- return publicRequest('GET', '/linear-swap-api/v1/swap_contract_info', SWAP_API_ROOT, params);
112
+ return linearSwapNonMarketRequest('GET', '/linear-swap-api/v1/swap_contract_info', params);
43
113
  }
44
114
  exports.getPerpetualContractSymbols = getPerpetualContractSymbols;
45
115
  /**
@@ -48,7 +118,7 @@ exports.getPerpetualContractSymbols = getPerpetualContractSymbols;
48
118
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec47f16-7773-11ed-9966-0242ac110003
49
119
  */
50
120
  function getSpotSymbols() {
51
- return publicRequest('GET', '/v2/settings/common/symbols', SPOT_API_ROOT);
121
+ return spotNonMarketRequest('GET', '/v2/settings/common/symbols');
52
122
  }
53
123
  exports.getSpotSymbols = getSpotSymbols;
54
124
  /**
@@ -57,7 +127,7 @@ exports.getSpotSymbols = getSpotSymbols;
57
127
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003
58
128
  */
59
129
  function getSpotTick(params) {
60
- return publicRequest('GET', `/market/detail/merged`, SPOT_API_ROOT, params);
130
+ return spotMarketRequest('GET', `/market/detail/merged`, params);
61
131
  }
62
132
  exports.getSpotTick = getSpotTick;
63
133
  /**
@@ -68,7 +138,7 @@ exports.getSpotTick = getSpotTick;
68
138
  * Note: HTX spot KLine uses unix seconds in `data[].id`
69
139
  */
70
140
  function getSpotHistoryKline(params) {
71
- return publicRequest('GET', `/market/history/kline`, SPOT_API_ROOT, params);
141
+ return spotMarketRequest('GET', `/market/history/kline`, params);
72
142
  }
73
143
  exports.getSpotHistoryKline = getSpotHistoryKline;
74
144
  /**
@@ -76,14 +146,14 @@ exports.getSpotHistoryKline = getSpotHistoryKline;
76
146
  *
77
147
  * 接口权限: 读取
78
148
  *
79
- * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多240次请求(所有该IP的非行情类的公开接口请求共享3秒240次的额度)
149
+ * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多120次请求(所有该IP的非行情类的公开接口请求共享3秒120次的额度)
80
150
  *
81
151
  * 接口描述: 该接口支持全仓模式和逐仓模式
82
152
  *
83
153
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71b45-77b5-11ed-9966-0242ac110003
84
154
  */
85
155
  function getSwapBatchFundingRate(params) {
86
- return publicRequest('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, SWAP_API_ROOT, params);
156
+ return linearSwapNonMarketRequest('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, params);
87
157
  }
88
158
  exports.getSwapBatchFundingRate = getSwapBatchFundingRate;
89
159
  /**
@@ -104,7 +174,7 @@ exports.getSwapBatchFundingRate = getSwapBatchFundingRate;
104
174
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73c34-77b5-11ed-9966-0242ac110003
105
175
  */
106
176
  function getSwapMarketTrade(params) {
107
- return publicRequest('GET', `/linear-swap-ex/market/trade`, SWAP_API_ROOT, params);
177
+ return linearSwapMarketRequest('GET', `/linear-swap-ex/market/trade`, params);
108
178
  }
109
179
  exports.getSwapMarketTrade = getSwapMarketTrade;
110
180
  /**
@@ -113,7 +183,7 @@ exports.getSwapMarketTrade = getSwapMarketTrade;
113
183
  * https://huobiapi.github.io/docs/usdt_swap/v1/cn/#3218e7531a
114
184
  */
115
185
  function getSwapOpenInterest(params) {
116
- return publicRequest('GET', '/linear-swap-api/v1/swap_open_interest', SWAP_API_ROOT, params);
186
+ return linearSwapMarketRequest('GET', '/linear-swap-api/v1/swap_open_interest', params);
117
187
  }
118
188
  exports.getSwapOpenInterest = getSwapOpenInterest;
119
189
  /**
@@ -134,7 +204,7 @@ exports.getSwapOpenInterest = getSwapOpenInterest;
134
204
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb735e0-77b5-11ed-9966-0242ac110003
135
205
  */
136
206
  function getSwapMarketBbo(params) {
137
- return publicRequest('GET', `/linear-swap-ex/market/bbo`, SWAP_API_ROOT, params);
207
+ return linearSwapMarketRequest('GET', `/linear-swap-ex/market/bbo`, params);
138
208
  }
139
209
  exports.getSwapMarketBbo = getSwapMarketBbo;
140
210
  /**
@@ -145,7 +215,7 @@ exports.getSwapMarketBbo = getSwapMarketBbo;
145
215
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=5d51f1f9-77b6-11ed-9966-0242ac110003
146
216
  */
147
217
  function getSwapHistoricalFundingRate(params) {
148
- return publicRequest('GET', `/linear-swap-api/v1/swap_historical_funding_rate`, SWAP_API_ROOT, params);
218
+ return linearSwapNonMarketRequest('GET', `/linear-swap-api/v1/swap_historical_funding_rate`, params);
149
219
  }
150
220
  exports.getSwapHistoricalFundingRate = getSwapHistoricalFundingRate;
151
221
  /**
@@ -154,7 +224,7 @@ exports.getSwapHistoricalFundingRate = getSwapHistoricalFundingRate;
154
224
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73746-77b5-11ed-9966-0242ac110003
155
225
  */
156
226
  function getSwapHistoryKline(params) {
157
- return publicRequest('GET', `/linear-swap-ex/market/history/kline`, SWAP_API_ROOT, params);
227
+ return linearSwapMarketRequest('GET', `/linear-swap-ex/market/history/kline`, params);
158
228
  }
159
229
  exports.getSwapHistoryKline = getSwapHistoryKline;
160
230
  /**
@@ -163,7 +233,7 @@ exports.getSwapHistoryKline = getSwapHistoryKline;
163
233
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72290-77b5-11ed-9966-0242ac110003
164
234
  */
165
235
  function getSwapCrossLadderMargin(params) {
166
- return publicRequest('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', SWAP_API_ROOT, params);
236
+ return linearSwapNonMarketRequest('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', params);
167
237
  }
168
238
  exports.getSwapCrossLadderMargin = getSwapCrossLadderMargin;
169
239
  /**
@@ -172,7 +242,7 @@ exports.getSwapCrossLadderMargin = getSwapCrossLadderMargin;
172
242
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003
173
243
  */
174
244
  function getV2ReferenceCurrencies(params) {
175
- return publicRequest('GET', '/v2/reference/currencies', SPOT_API_ROOT, params);
245
+ return spotNonMarketRequest('GET', '/v2/reference/currencies', params);
176
246
  }
177
247
  exports.getV2ReferenceCurrencies = getV2ReferenceCurrencies;
178
248
  /**
@@ -181,6 +251,6 @@ exports.getV2ReferenceCurrencies = getV2ReferenceCurrencies;
181
251
  * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40374-7773-11ed-9966-0242ac110003
182
252
  *
183
253
  */
184
- const getSpotMarketTickers = () => publicRequest('GET', '/market/tickers', SPOT_API_ROOT);
254
+ const getSpotMarketTickers = () => spotMarketRequest('GET', '/market/tickers');
185
255
  exports.getSpotMarketTickers = getSpotMarketTickers;
186
256
  //# sourceMappingURL=public-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":";;;AAAA,yCAA2C;AAE3C,gBAAgB;AAChB,MAAM,aAAa,GAAG,cAAc,CAAC;AACrC,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,IAAY,EAAE,QAAgB,EAAE,MAAY;IACvF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC;IAElD,IAAI,MAAM,KAAK,KAAK,EAAE;QACpB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;YACjD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;SACvC;KACF;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE5D,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;QAChC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,IAAI,SAAS;KACxB,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAEnF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC3B;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAClG,MAAM,CAAC,CAAC;KACT;AACH,CAAC;AAED,sDAAsD;AAEtD;;;;GAIG;AACH,SAAgB,2BAA2B,CAAC,MAM3C;IAmBC,OAAO,aAAa,CAAC,KAAK,EAAE,wCAAwC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAC/F,CAAC;AA1BD,kEA0BC;AAED;;;;GAIG;AACH,SAAgB,cAAc;IAyC5B,OAAO,aAAa,CAAC,KAAK,EAAE,6BAA6B,EAAE,aAAa,CAAC,CAAC;AAC5E,CAAC;AA1CD,wCA0CC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,MAA0B;IAMpD,OAAO,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAPD,kCAOC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,MAMnC;IAeC,OAAO,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAtBD,kDAsBC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,uBAAuB,CAAC,MAAkC;IAcxE,OAAO,aAAa,CAAC,KAAK,EAAE,6CAA6C,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACpG,CAAC;AAfD,0DAeC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,kBAAkB,CAAC,MAA0D;IAqB3F,OAAO,aAAa,CAAC,KAAK,EAAE,8BAA8B,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACrF,CAAC;AAtBD,gDAsBC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,MAKnC;IAiBC,OAAO,aAAa,CAAC,KAAK,EAAE,wCAAwC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAC/F,CAAC;AAvBD,kDAuBC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,gBAAgB,CAAC,MAAkC;IAajE,OAAO,aAAa,CAAC,KAAK,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACnF,CAAC;AAdD,4CAcC;AAED;;;;;;GAMG;AACH,SAAgB,4BAA4B,CAAC,MAI5C;IAkBC,OAAO,aAAa,CAAC,KAAK,EAAE,kDAAkD,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACzG,CAAC;AAvBD,oEAuBC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,MAMnC;IAeC,OAAO,aAAa,CAAC,KAAK,EAAE,sCAAsC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAC7F,CAAC;AAtBD,kDAsBC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,MAKxC;IAIC,OAAO,aAAa,CAAC,KAAK,EAAE,8CAA8C,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACrG,CAAC;AAVD,4DAUC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,MAAsD;IAkC7F,OAAO,aAAa,CAAC,KAAK,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAnCD,4DAmCC;AAED;;;;;GAKG;AACI,MAAM,oBAAoB,GAAG,GAiBjC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAjBhD,QAAA,oBAAoB,wBAiB4B","sourcesContent":["import { formatTime } from '@yuants/utils';\n\n// Huobi API 根域名\nconst SWAP_API_ROOT = 'api.hbdm.com';\nconst SPOT_API_ROOT = 'api.huobi.pro';\n\n/**\n * 公共 API 请求方法\n */\nasync function publicRequest(method: string, path: string, api_root: string, params?: any) {\n const url = new URL(`https://${api_root}${path}`);\n\n if (method === 'GET') {\n for (const [k, v] of Object.entries(params || {})) {\n url.searchParams.append(k, String(v));\n }\n }\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n console.info(formatTime(Date.now()), method, url.href, body);\n\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n console.info(formatTime(Date.now()), 'PublicResponse', url.toString(), res.status);\n\n const retStr = await res.text();\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// ==================== 公共 API 方法 ====================\n\n/**\n * 获取永续合约产品信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72f34-77b5-11ed-9966-0242ac110003\n */\nexport function getPerpetualContractSymbols(params?: {\n contract_code?: string;\n support_margin_mode?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n}): Promise<{\n status: string;\n data: {\n symbol: string;\n contract_code: string;\n contract_size: number;\n price_tick: number;\n settlement_date: string;\n delivery_time: string;\n create_date: string;\n contract_status: number;\n support_margin_mode: string;\n contract_type: string;\n pair: string;\n business_type: string;\n delivery_date: string;\n }[];\n ts: string;\n}> {\n return publicRequest('GET', '/linear-swap-api/v1/swap_contract_info', SWAP_API_ROOT, params);\n}\n\n/**\n * 获取现货产品信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec47f16-7773-11ed-9966-0242ac110003\n */\nexport function getSpotSymbols(): Promise<{\n status: string;\n data: {\n si: string;\n scr: string;\n sc: string;\n dn: string;\n bc: string;\n bcdn: string;\n qc: string;\n qcdn: string;\n state: string;\n whe: boolean;\n cd: boolean;\n te: boolean;\n toa: number;\n sp: string;\n w: number;\n ttp: number;\n tap: number;\n tpp: number;\n fp: number;\n suspend_desc: string;\n transfer_board_desc: string;\n tags: string;\n lr: number;\n smlr: number;\n flr: string;\n wr: string;\n d: number;\n elr: number;\n p: any;\n castate: string;\n ca1oa: number;\n ca2oa: number;\n }[];\n ts: string;\n full: number;\n err_code: string;\n err_msg: string;\n}> {\n return publicRequest('GET', '/v2/settings/common/symbols', SPOT_API_ROOT);\n}\n\n/**\n * 获取现货行情\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003\n */\nexport function getSpotTick(params: { symbol: string }): Promise<{\n status: string;\n tick: {\n close: number;\n };\n}> {\n return publicRequest('GET', `/market/detail/merged`, SPOT_API_ROOT, params);\n}\n\n/**\n * 【现货】获取K线数据\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3ff18-7773-11ed-9966-0242ac110003\n *\n * Note: HTX spot KLine uses unix seconds in `data[].id`\n */\nexport function getSpotHistoryKline(params: {\n symbol: string;\n period: string;\n size?: number;\n from?: number;\n to?: number;\n}): Promise<{\n status: string;\n ch?: string;\n ts: number;\n data: {\n id: number;\n open: number;\n close: number;\n low: number;\n high: number;\n vol: number;\n amount?: number;\n count?: number;\n }[];\n}> {\n return publicRequest('GET', `/market/history/kline`, SPOT_API_ROOT, params);\n}\n\n/**\n * 【通用】批量获取合约资金费率\n *\n * 接口权限: 读取\n *\n * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多240次请求(所有该IP的非行情类的公开接口请求共享3秒240次的额度)\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71b45-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapBatchFundingRate(params: { contract_code?: string }): Promise<{\n status: string;\n ts: number;\n data: {\n estimated_rate: null;\n funding_rate: string;\n contract_code: string;\n symbol: string;\n fee_asset: string;\n funding_time: string;\n next_funding_time: null;\n trade_partition: string;\n }[];\n}> {\n return publicRequest('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, SWAP_API_ROOT, params);\n}\n\n/**\n * 【通用】获取市场最近成交记录\n *\n * 接口权限: 读取\n *\n * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:\n *\n * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。\n *\n * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73c34-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapMarketTrade(params: { contract_code?: string; business_type?: string }): Promise<{\n ch: string;\n status: string;\n tick: {\n data: {\n amount: string;\n quantity: string;\n trade_turnover: string;\n ts: number;\n id: number;\n price: string;\n direction: string;\n contract_code: string;\n business_type: string;\n trade_partition: string;\n }[];\n id: number;\n ts: number;\n };\n ts: number;\n}> {\n return publicRequest('GET', `/linear-swap-ex/market/trade`, SWAP_API_ROOT, params);\n}\n\n/**\n * 获得当前合约的总持仓量\n *\n * https://huobiapi.github.io/docs/usdt_swap/v1/cn/#3218e7531a\n */\nexport function getSwapOpenInterest(params: {\n contract_code?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n}): Promise<{\n status: string;\n data: {\n volume: number;\n amount: number;\n symbol: string;\n value: number;\n contract_code: string;\n trade_amount: number;\n trade_volume: number;\n trade_turnover: number;\n business_type: string;\n pair: string;\n contract_type: string;\n }[];\n ts: number;\n}> {\n return publicRequest('GET', '/linear-swap-api/v1/swap_open_interest', SWAP_API_ROOT, params);\n}\n\n/**\n * 【通用】获取市场最优挂单\n *\n * 接口权限: 读取\n *\n * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:\n *\n * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。\n *\n * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb735e0-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapMarketBbo(params: { contract_code?: string }): Promise<{\n status: string;\n ticks: {\n trade_partition: string;\n business_type: string;\n contract_code: string;\n ask: number[] | null;\n bid: number[] | null;\n mrid: number;\n ts: number;\n }[];\n ts: number;\n}> {\n return publicRequest('GET', `/linear-swap-ex/market/bbo`, SWAP_API_ROOT, params);\n}\n\n/**\n * 获取合约的历史资金费率\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=5d51f1f9-77b6-11ed-9966-0242ac110003\n */\nexport function getSwapHistoricalFundingRate(params: {\n contract_code: string;\n page_index?: number;\n page_size?: number;\n}): Promise<{\n status: string;\n ts: number;\n data: {\n data: {\n symbol: string;\n contract_code: string;\n fee_asset: string;\n funding_time: string;\n funding_rate: string;\n realized_rate: string;\n avg_premium_index: string;\n }[];\n total_page: number;\n current_page: number;\n total_size: number;\n };\n}> {\n return publicRequest('GET', `/linear-swap-api/v1/swap_historical_funding_rate`, SWAP_API_ROOT, params);\n}\n\n/**\n * 【通用】获取K线数据\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73746-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapHistoryKline(params: {\n contract_code: string;\n period: string;\n size?: number;\n from?: number;\n to?: number;\n}): Promise<{\n status: string;\n ch?: string;\n ts: number;\n data: {\n id: number;\n open: number;\n close: number;\n low: number;\n high: number;\n vol: number;\n amount?: number;\n count?: number;\n }[];\n}> {\n return publicRequest('GET', `/linear-swap-ex/market/history/kline`, SWAP_API_ROOT, params);\n}\n\n/**\n * 【全仓】获取平台阶梯保证金\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72290-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapCrossLadderMargin(params?: {\n contract_code?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n}): Promise<{\n status: string;\n data: Array<{ contract_code: string; pair: string; list: Array<{ lever_rate: number }> }>;\n}> {\n return publicRequest('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', SWAP_API_ROOT, params);\n}\n\n/**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\nexport function getV2ReferenceCurrencies(params: { currency?: string; authorizedUser?: string }): 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 publicRequest('GET', '/v2/reference/currencies', SPOT_API_ROOT, params);\n}\n\n/**\n * 【现货】获取市场所有交易对的最新行情\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40374-7773-11ed-9966-0242ac110003\n *\n */\nexport const getSpotMarketTickers = (): Promise<{\n data: {\n symbol: string;\n open: number;\n high: number;\n low: number;\n close: number;\n amount: number;\n vol: number;\n count: number;\n bid: number;\n bidSize: number;\n ask: number;\n askSize: number;\n }[];\n status: string;\n ts: number;\n}> => publicRequest('GET', '/market/tickers', SPOT_API_ROOT);\n"]}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatTime, scopeError, tokenBucket } from '@yuants/utils';\n\n// Huobi API 根域名\nconst SWAP_API_ROOT = 'api.hbdm.com';\nconst SPOT_API_ROOT = 'api.huobi.pro';\n\ntype HuobiBusiness = 'spot' | 'linear-swap';\ntype HuobiPublicInterfaceType = 'market' | 'non-market';\n\nconst acquire = (bucketId: string, meta: Record<string, unknown>) => {\n const bucket = tokenBucket(bucketId);\n scopeError('HUOBI_API_RATE_LIMIT', { ...meta, bucketId }, () => bucket.acquireSync(1));\n};\n\n// https://www.htx.com/zh-cn/opend/newApiPages/?id=474\n// 行情类:同一个 IP,总共 1s 最多 800 个请求(合约业务共享总额度)\nconst marketDataIPAllBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_ALL';\ntokenBucket(marketDataIPAllBucketId, {\n capacity: 800,\n refillInterval: 1000,\n refillAmount: 800,\n});\n\n// 行情类:按业务线拆分(用于交割/币本位永续/U本位分开限频)\nconst marketDataSpotBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_SPOT';\ntokenBucket(marketDataSpotBucketId, { capacity: 800, refillInterval: 1000, refillAmount: 800 });\n\nconst marketDataLinearSwapBucketId = 'HUOBI_PUBLIC_MARKET_IP_1S_LINEAR_SWAP';\ntokenBucket(marketDataLinearSwapBucketId, { capacity: 800, refillInterval: 1000, refillAmount: 800 });\n\n// 非行情类公开接口:同一个 IP,3s 最多 120 次请求\nconst nonMarketDataIPBucketId = 'HUOBI_PUBLIC_NON_MARKET_IP_3S_ALL';\ntokenBucket(nonMarketDataIPBucketId, {\n capacity: 120,\n refillInterval: 3000,\n refillAmount: 120,\n});\n\n/**\n * 公共 API 请求方法(不负责限流;限流由调用点选择对应 helper)\n */\nasync function publicRequest(method: string, path: string, api_root: string, params?: any) {\n const url = new URL(`https://${api_root}${path}`);\n\n if (method === 'GET') {\n for (const [k, v] of Object.entries(params || {})) {\n url.searchParams.append(k, String(v));\n }\n }\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n console.info(formatTime(Date.now()), method, url.href, body);\n\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n console.info(formatTime(Date.now()), 'PublicResponse', url.toString(), res.status);\n\n const retStr = await res.text();\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 spotMarketRequest = async (method: string, path: string, params?: any) => {\n const meta = {\n method,\n api_root: SPOT_API_ROOT,\n path,\n business: 'spot' as HuobiBusiness,\n interfaceType: 'market' as HuobiPublicInterfaceType,\n };\n acquire(marketDataIPAllBucketId, meta);\n acquire(marketDataSpotBucketId, meta);\n return publicRequest(method, path, SPOT_API_ROOT, params);\n};\n\nconst spotNonMarketRequest = async (method: string, path: string, params?: any) => {\n const meta = {\n method,\n api_root: SPOT_API_ROOT,\n path,\n business: 'spot' as HuobiBusiness,\n interfaceType: 'non-market' as HuobiPublicInterfaceType,\n };\n acquire(nonMarketDataIPBucketId, meta);\n return publicRequest(method, path, SPOT_API_ROOT, params);\n};\n\nconst linearSwapMarketRequest = async (method: string, path: string, params?: any) => {\n const meta = {\n method,\n api_root: SWAP_API_ROOT,\n path,\n business: 'linear-swap' as HuobiBusiness,\n interfaceType: 'market' as HuobiPublicInterfaceType,\n };\n acquire(marketDataIPAllBucketId, meta);\n acquire(marketDataLinearSwapBucketId, meta);\n return publicRequest(method, path, SWAP_API_ROOT, params);\n};\n\nconst linearSwapNonMarketRequest = async (method: string, path: string, params?: any) => {\n const meta = {\n method,\n api_root: SWAP_API_ROOT,\n path,\n business: 'linear-swap' as HuobiBusiness,\n interfaceType: 'non-market' as HuobiPublicInterfaceType,\n };\n acquire(nonMarketDataIPBucketId, meta);\n return publicRequest(method, path, SWAP_API_ROOT, params);\n};\n\n// ==================== 公共 API 方法 ====================\n\n/**\n * 获取永续合约产品信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72f34-77b5-11ed-9966-0242ac110003\n */\nexport function getPerpetualContractSymbols(params?: {\n contract_code?: string;\n support_margin_mode?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n}): Promise<{\n status: string;\n data: {\n symbol: string;\n contract_code: string;\n contract_size: number;\n price_tick: number;\n settlement_date: string;\n delivery_time: string;\n create_date: string;\n contract_status: number;\n support_margin_mode: string;\n contract_type: string;\n pair: string;\n business_type: string;\n delivery_date: string;\n }[];\n ts: string;\n}> {\n return linearSwapNonMarketRequest('GET', '/linear-swap-api/v1/swap_contract_info', params);\n}\n\n/**\n * 获取现货产品信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec47f16-7773-11ed-9966-0242ac110003\n */\nexport function getSpotSymbols(): Promise<{\n status: string;\n data: {\n si: string;\n scr: string;\n sc: string;\n dn: string;\n bc: string;\n bcdn: string;\n qc: string;\n qcdn: string;\n state: string;\n whe: boolean;\n cd: boolean;\n te: boolean;\n toa: number;\n sp: string;\n w: number;\n ttp: number;\n tap: number;\n tpp: number;\n fp: number;\n suspend_desc: string;\n transfer_board_desc: string;\n tags: string;\n lr: number;\n smlr: number;\n flr: string;\n wr: string;\n d: number;\n elr: number;\n p: any;\n castate: string;\n ca1oa: number;\n ca2oa: number;\n }[];\n ts: string;\n full: number;\n err_code: string;\n err_msg: string;\n}> {\n return spotNonMarketRequest('GET', '/v2/settings/common/symbols');\n}\n\n/**\n * 获取现货行情\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003\n */\nexport function getSpotTick(params: { symbol: string }): Promise<{\n status: string;\n tick: {\n close: number;\n };\n}> {\n return spotMarketRequest('GET', `/market/detail/merged`, params);\n}\n\n/**\n * 【现货】获取K线数据\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3ff18-7773-11ed-9966-0242ac110003\n *\n * Note: HTX spot KLine uses unix seconds in `data[].id`\n */\nexport function getSpotHistoryKline(params: {\n symbol: string;\n period: string;\n size?: number;\n from?: number;\n to?: number;\n}): Promise<{\n status: string;\n ch?: string;\n ts: number;\n data: {\n id: number;\n open: number;\n close: number;\n low: number;\n high: number;\n vol: number;\n amount?: number;\n count?: number;\n }[];\n}> {\n return spotMarketRequest('GET', `/market/history/kline`, params);\n}\n\n/**\n * 【通用】批量获取合约资金费率\n *\n * 接口权限: 读取\n *\n * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多120次请求(所有该IP的非行情类的公开接口请求共享3秒120次的额度)\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71b45-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapBatchFundingRate(params: { contract_code?: string }): Promise<{\n status: string;\n ts: number;\n data: {\n estimated_rate: null;\n funding_rate: string;\n contract_code: string;\n symbol: string;\n fee_asset: string;\n funding_time: string;\n next_funding_time: null;\n trade_partition: string;\n }[];\n}> {\n return linearSwapNonMarketRequest('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, params);\n}\n\n/**\n * 【通用】获取市场最近成交记录\n *\n * 接口权限: 读取\n *\n * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:\n *\n * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。\n *\n * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73c34-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapMarketTrade(params: { contract_code?: string; business_type?: string }): Promise<{\n ch: string;\n status: string;\n tick: {\n data: {\n amount: string;\n quantity: string;\n trade_turnover: string;\n ts: number;\n id: number;\n price: string;\n direction: string;\n contract_code: string;\n business_type: string;\n trade_partition: string;\n }[];\n id: number;\n ts: number;\n };\n ts: number;\n}> {\n return linearSwapMarketRequest('GET', `/linear-swap-ex/market/trade`, params);\n}\n\n/**\n * 获得当前合约的总持仓量\n *\n * https://huobiapi.github.io/docs/usdt_swap/v1/cn/#3218e7531a\n */\nexport function getSwapOpenInterest(params: {\n contract_code?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n}): Promise<{\n status: string;\n data: {\n volume: number;\n amount: number;\n symbol: string;\n value: number;\n contract_code: string;\n trade_amount: number;\n trade_volume: number;\n trade_turnover: number;\n business_type: string;\n pair: string;\n contract_type: string;\n }[];\n ts: number;\n}> {\n return linearSwapMarketRequest('GET', '/linear-swap-api/v1/swap_open_interest', params);\n}\n\n/**\n * 【通用】获取市场最优挂单\n *\n * 接口权限: 读取\n *\n * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:\n *\n * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。\n *\n * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb735e0-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapMarketBbo(params: { contract_code?: string }): Promise<{\n status: string;\n ticks: {\n trade_partition: string;\n business_type: string;\n contract_code: string;\n ask: number[] | null;\n bid: number[] | null;\n mrid: number;\n ts: number;\n }[];\n ts: number;\n}> {\n return linearSwapMarketRequest('GET', `/linear-swap-ex/market/bbo`, params);\n}\n\n/**\n * 获取合约的历史资金费率\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=5d51f1f9-77b6-11ed-9966-0242ac110003\n */\nexport function getSwapHistoricalFundingRate(params: {\n contract_code: string;\n page_index?: number;\n page_size?: number;\n}): Promise<{\n status: string;\n ts: number;\n data: {\n data: {\n symbol: string;\n contract_code: string;\n fee_asset: string;\n funding_time: string;\n funding_rate: string;\n realized_rate: string;\n avg_premium_index: string;\n }[];\n total_page: number;\n current_page: number;\n total_size: number;\n };\n}> {\n return linearSwapNonMarketRequest('GET', `/linear-swap-api/v1/swap_historical_funding_rate`, params);\n}\n\n/**\n * 【通用】获取K线数据\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73746-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapHistoryKline(params: {\n contract_code: string;\n period: string;\n size?: number;\n from?: number;\n to?: number;\n}): Promise<{\n status: string;\n ch?: string;\n ts: number;\n data: {\n id: number;\n open: number;\n close: number;\n low: number;\n high: number;\n vol: number;\n amount?: number;\n count?: number;\n }[];\n}> {\n return linearSwapMarketRequest('GET', `/linear-swap-ex/market/history/kline`, params);\n}\n\n/**\n * 【全仓】获取平台阶梯保证金\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72290-77b5-11ed-9966-0242ac110003\n */\nexport function getSwapCrossLadderMargin(params?: {\n contract_code?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n}): Promise<{\n status: string;\n data: Array<{ contract_code: string; pair: string; list: Array<{ lever_rate: number }> }>;\n}> {\n return linearSwapNonMarketRequest('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', params);\n}\n\n/**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\nexport function getV2ReferenceCurrencies(params: { currency?: string; authorizedUser?: string }): 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 spotNonMarketRequest('GET', '/v2/reference/currencies', params);\n}\n\n/**\n * 【现货】获取市场所有交易对的最新行情\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40374-7773-11ed-9966-0242ac110003\n *\n */\nexport const getSpotMarketTickers = (): Promise<{\n data: {\n symbol: string;\n open: number;\n high: number;\n low: number;\n close: number;\n amount: number;\n vol: number;\n count: number;\n bid: number;\n bidSize: number;\n ask: number;\n askSize: number;\n }[];\n status: string;\n ts: number;\n}> => spotMarketRequest('GET', '/market/tickers');\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuants/vendor-huobi",
3
- "version": "0.18.3",
3
+ "version": "0.18.4",
4
4
  "main": "lib/index.js",
5
5
  "files": [
6
6
  "dist",
@@ -8,19 +8,19 @@
8
8
  "temp"
9
9
  ],
10
10
  "dependencies": {
11
- "@yuants/protocol": "0.53.6",
12
- "@yuants/data-account": "0.11.3",
13
- "@yuants/data-order": "0.7.4",
14
- "@yuants/data-ohlc": "0.5.2",
15
- "@yuants/transfer": "0.2.43",
16
- "@yuants/utils": "0.18.0",
17
- "@yuants/cache": "0.3.7",
18
- "@yuants/sql": "0.9.34",
19
- "@yuants/data-product": "0.5.4",
20
- "@yuants/data-series": "0.3.56",
21
- "@yuants/data-interest-rate": "0.2.2",
22
- "@yuants/data-quote": "0.4.3",
23
- "@yuants/exchange": "0.8.4",
11
+ "@yuants/protocol": "0.53.7",
12
+ "@yuants/data-account": "0.11.4",
13
+ "@yuants/data-order": "0.7.5",
14
+ "@yuants/data-ohlc": "0.5.3",
15
+ "@yuants/transfer": "0.2.44",
16
+ "@yuants/utils": "0.19.0",
17
+ "@yuants/cache": "0.3.8",
18
+ "@yuants/sql": "0.9.35",
19
+ "@yuants/data-product": "0.5.5",
20
+ "@yuants/data-series": "0.3.57",
21
+ "@yuants/data-interest-rate": "0.2.3",
22
+ "@yuants/data-quote": "0.4.4",
23
+ "@yuants/exchange": "0.8.5",
24
24
  "rxjs": "~7.5.6"
25
25
  },
26
26
  "devDependencies": {
@@ -30,7 +30,7 @@
30
30
  "@rushstack/heft-node-rig": "~1.10.7",
31
31
  "@types/heft-jest": "1.0.3",
32
32
  "@types/node": "22",
33
- "@yuants/extension": "0.2.35",
33
+ "@yuants/extension": "0.2.36",
34
34
  "@yuants/tool-kit": "0.2.1",
35
35
  "typescript": "~4.7.4"
36
36
  },
@@ -1,18 +1,18 @@
1
1
  {
2
- "apps/vendor-huobi/CHANGELOG.json": "3a067914dc6c4903715c1fdd11d6f7b8b61790c9",
3
- "apps/vendor-huobi/CHANGELOG.md": "6423ae74483cb4262edd8c9a5b8fb2934fd77e41",
2
+ "apps/vendor-huobi/CHANGELOG.json": "a436aa5550f8b22a561fa3a579b17924303b8004",
3
+ "apps/vendor-huobi/CHANGELOG.md": "558cf94f68db6f5db1874cc0034e2807da474213",
4
4
  "apps/vendor-huobi/README.md": "d7bf0149513114eab5500a6b5c9e7cba10565572",
5
5
  "apps/vendor-huobi/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
6
6
  "apps/vendor-huobi/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
7
7
  "apps/vendor-huobi/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
8
8
  "apps/vendor-huobi/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
9
9
  "apps/vendor-huobi/etc/vendor-huobi.api.md": "dc8cbf2a044a227b30a4ee9701b0c97328244724",
10
- "apps/vendor-huobi/package.json": "40c4ed9a9b56b8335050c3de518be215dff188b0",
10
+ "apps/vendor-huobi/package.json": "325907129caa6382980bf4c9a08c1ea2c7275c13",
11
11
  "apps/vendor-huobi/src/__archived/account-info.ts": "5c325d3bb8839476c11f25693326ce05f3321ebd",
12
12
  "apps/vendor-huobi/src/__archived/api.ts": "8366151dc881b177d0478fb328a601a11e33cd35",
13
13
  "apps/vendor-huobi/src/__archived/transfer.ts": "fd299ad82ff31344460967f2a938b8f36c879259",
14
- "apps/vendor-huobi/src/api/private-api.ts": "509a56b3501c76813c7cbf8cd3b2b851d5cb5957",
15
- "apps/vendor-huobi/src/api/public-api.ts": "730d77c55ae5bf5022c5ccdc964f874131f8b341",
14
+ "apps/vendor-huobi/src/api/private-api.ts": "de66773ec7ce9d7301b98b7d773b6a31ff1e7f35",
15
+ "apps/vendor-huobi/src/api/public-api.ts": "7141d4c6369a59b062b2b0e5a475af9abb1ec31b",
16
16
  "apps/vendor-huobi/src/index.ts": "997283c933e2df8c6d35ce3d2f40d7d0c33c469b",
17
17
  "apps/vendor-huobi/src/services/accounts/spot.ts": "9b214135dd375822ea5ef03c0fee108873ccc264",
18
18
  "apps/vendor-huobi/src/services/accounts/super-margin.ts": "ff885947334f43085aacb6e8c37b997afee2b7f6",
@@ -29,19 +29,19 @@
29
29
  "apps/vendor-huobi/src/services/uid.ts": "b71c27a6a0debdd9365dea35306f4763327aca2f",
30
30
  "apps/vendor-huobi/tsconfig.json": "81da8f78196974b5d15da0edb6b2d9f48641063c",
31
31
  "apps/vendor-huobi/.rush/temp/shrinkwrap-deps.json": "237a816d6e825b5bd2a0fc742f5d055c19e37d3d",
32
- "libraries/protocol/temp/package-deps.json": "ad2b09da06aa0b6d98e9ca145c3da7c8418f30d1",
33
- "libraries/data-account/temp/package-deps.json": "ec07276e124d707820e348948c8689cd4b4d5a84",
34
- "libraries/data-order/temp/package-deps.json": "d2826719d6e1f86ad64cfe6556a0f61352e02897",
35
- "libraries/data-ohlc/temp/package-deps.json": "f6a0a2248e237fe960daf27c93071ec1c3235fa3",
36
- "libraries/transfer/temp/package-deps.json": "52cd9bb451ece058b39c7a7b08dd3fef1a57b934",
37
- "libraries/utils/temp/package-deps.json": "6afd4e6b9f8348c0c24e05f7289101fc6b8fa5a9",
38
- "libraries/cache/temp/package-deps.json": "8faf993aa54072a8cc7773ca9502618ec1660be1",
39
- "libraries/sql/temp/package-deps.json": "1fb8bcfa1bd3912150e7567770b065794a3b2138",
40
- "libraries/data-product/temp/package-deps.json": "77b545e27fbd147bf5fded94beb5baaa33687563",
41
- "libraries/data-series/temp/package-deps.json": "6744fc1995bb77846daccced427210187b5e774f",
42
- "libraries/data-interest-rate/temp/package-deps.json": "d1a26e2ed8d3ecd147e0b3a897927720d7760597",
43
- "libraries/data-quote/temp/package-deps.json": "5aa2671e9a9e7b94827a8891049c4af5eefe757e",
44
- "libraries/exchange/temp/package-deps.json": "8315951811f0278801081fe8e48ba07213af6816",
45
- "libraries/extension/temp/package-deps.json": "d0a314f466619661a85b5fa9cc12ffe0b427864b",
32
+ "libraries/protocol/temp/package-deps.json": "765a1ba74dfa437b95a8685a308a09df6de49706",
33
+ "libraries/data-account/temp/package-deps.json": "ef7f802f6cec62965d3a5ea3365df131b9ed46a0",
34
+ "libraries/data-order/temp/package-deps.json": "9940b4267bcaaba4f3e0db2d2e07f575ea8afa34",
35
+ "libraries/data-ohlc/temp/package-deps.json": "048949cb4791307628bbf35de8edd31480b8cd5e",
36
+ "libraries/transfer/temp/package-deps.json": "f4c5d1fc1bed3061cee9e67381ab36749fb9118f",
37
+ "libraries/utils/temp/package-deps.json": "ae24e0f28d8238425131202aa7e46e2fc6ba3ae2",
38
+ "libraries/cache/temp/package-deps.json": "3fe087e264b56a7a72d25df93f942e69de6ab765",
39
+ "libraries/sql/temp/package-deps.json": "35ac4d78347c54d6c247d31dd77a1d88cfaed20f",
40
+ "libraries/data-product/temp/package-deps.json": "d527946b0136eb9ad0ee4451d31ea2c18eb88fa3",
41
+ "libraries/data-series/temp/package-deps.json": "5148dcf1033142f34a1dff17076a7a031052cb21",
42
+ "libraries/data-interest-rate/temp/package-deps.json": "82005a4c9b295c0eab9599127946dd8c915adc64",
43
+ "libraries/data-quote/temp/package-deps.json": "1b8805efdca7fee957cf36c414a0c53d5faa454b",
44
+ "libraries/exchange/temp/package-deps.json": "c27614f8a83ec352ddc52e5e2f0f9c04ecc80a1e",
45
+ "libraries/extension/temp/package-deps.json": "0655b86a4838124dba78913552adf2425484e900",
46
46
  "tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
47
47
  }