@yuants/vendor-okx 0.23.24 → 0.23.26

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.
Files changed (139) hide show
  1. package/dist/account.js +16 -138
  2. package/dist/account.js.map +1 -1
  3. package/dist/accountInfos/earning.js +15 -0
  4. package/dist/accountInfos/earning.js.map +1 -0
  5. package/dist/accountInfos/funding.js +46 -0
  6. package/dist/accountInfos/funding.js.map +1 -0
  7. package/dist/accountInfos/index.js +7 -0
  8. package/dist/accountInfos/index.js.map +1 -0
  9. package/dist/accountInfos/loan.js +46 -0
  10. package/dist/accountInfos/loan.js.map +1 -0
  11. package/dist/accountInfos/strategy.js +56 -0
  12. package/dist/accountInfos/strategy.js.map +1 -0
  13. package/dist/accountInfos/trading.js +84 -0
  14. package/dist/accountInfos/trading.js.map +1 -0
  15. package/dist/accountInfos/types.js +2 -0
  16. package/dist/accountInfos/types.js.map +1 -0
  17. package/dist/api.js +444 -402
  18. package/dist/api.js.map +1 -1
  19. package/dist/index.js +5 -4
  20. package/dist/index.js.map +1 -1
  21. package/dist/loan-account.js +4 -45
  22. package/dist/loan-account.js.map +1 -1
  23. package/dist/market-order.js +1 -1
  24. package/dist/market-order.js.map +1 -1
  25. package/dist/order-actions.js +39 -0
  26. package/dist/order-actions.js.map +1 -0
  27. package/dist/order.js +3 -3
  28. package/dist/order.js.map +1 -1
  29. package/dist/orders/cancelOrder.js +13 -0
  30. package/dist/orders/cancelOrder.js.map +1 -0
  31. package/dist/orders/modifyOrder.js +58 -0
  32. package/dist/orders/modifyOrder.js.map +1 -0
  33. package/dist/orders/submitOrder.js +107 -0
  34. package/dist/orders/submitOrder.js.map +1 -0
  35. package/dist/public-api.js.map +1 -1
  36. package/dist/quote.js.map +1 -1
  37. package/dist/services.js +3 -2
  38. package/dist/services.js.map +1 -1
  39. package/dist/strategy-account.js +8 -61
  40. package/dist/strategy-account.js.map +1 -1
  41. package/dist/trade.js +6 -5
  42. package/dist/trade.js.map +1 -1
  43. package/dist/transfer.js +279 -0
  44. package/dist/transfer.js.map +1 -0
  45. package/dist/websocket.js.map +1 -1
  46. package/lib/account.d.ts +4 -2
  47. package/lib/account.d.ts.map +1 -1
  48. package/lib/account.js +15 -138
  49. package/lib/account.js.map +1 -1
  50. package/lib/accountInfos/earning.d.ts +4 -0
  51. package/lib/accountInfos/earning.d.ts.map +1 -0
  52. package/lib/accountInfos/earning.js +19 -0
  53. package/lib/accountInfos/earning.js.map +1 -0
  54. package/lib/accountInfos/funding.d.ts +4 -0
  55. package/lib/accountInfos/funding.d.ts.map +1 -0
  56. package/lib/accountInfos/funding.js +50 -0
  57. package/lib/accountInfos/funding.js.map +1 -0
  58. package/lib/accountInfos/index.d.ts +8 -0
  59. package/lib/accountInfos/index.d.ts.map +1 -0
  60. package/lib/accountInfos/index.js +16 -0
  61. package/lib/accountInfos/index.js.map +1 -0
  62. package/lib/accountInfos/loan.d.ts +4 -0
  63. package/lib/accountInfos/loan.d.ts.map +1 -0
  64. package/lib/accountInfos/loan.js +50 -0
  65. package/lib/accountInfos/loan.js.map +1 -0
  66. package/lib/accountInfos/strategy.d.ts +4 -0
  67. package/lib/accountInfos/strategy.d.ts.map +1 -0
  68. package/lib/accountInfos/strategy.js +60 -0
  69. package/lib/accountInfos/strategy.js.map +1 -0
  70. package/lib/accountInfos/trading.d.ts +5 -0
  71. package/lib/accountInfos/trading.d.ts.map +1 -0
  72. package/lib/accountInfos/trading.js +88 -0
  73. package/lib/accountInfos/trading.js.map +1 -0
  74. package/lib/accountInfos/types.d.ts +6 -0
  75. package/lib/accountInfos/types.d.ts.map +1 -0
  76. package/lib/accountInfos/types.js +3 -0
  77. package/lib/accountInfos/types.js.map +1 -0
  78. package/lib/api.d.ts +1252 -1264
  79. package/lib/api.d.ts.map +1 -1
  80. package/lib/api.js +477 -404
  81. package/lib/api.js.map +1 -1
  82. package/lib/index.d.ts +5 -4
  83. package/lib/index.d.ts.map +1 -1
  84. package/lib/index.js +5 -4
  85. package/lib/index.js.map +1 -1
  86. package/lib/loan-account.js +3 -44
  87. package/lib/loan-account.js.map +1 -1
  88. package/lib/market-order.d.ts.map +1 -1
  89. package/lib/market-order.js +1 -1
  90. package/lib/market-order.js.map +1 -1
  91. package/lib/order-actions.d.ts +2 -0
  92. package/lib/order-actions.d.ts.map +1 -0
  93. package/lib/order-actions.js +41 -0
  94. package/lib/order-actions.js.map +1 -0
  95. package/lib/order.js +2 -2
  96. package/lib/order.js.map +1 -1
  97. package/lib/orders/cancelOrder.d.ts +4 -0
  98. package/lib/orders/cancelOrder.d.ts.map +1 -0
  99. package/lib/orders/cancelOrder.js +17 -0
  100. package/lib/orders/cancelOrder.js.map +1 -0
  101. package/lib/orders/modifyOrder.d.ts +4 -0
  102. package/lib/orders/modifyOrder.d.ts.map +1 -0
  103. package/lib/orders/modifyOrder.js +62 -0
  104. package/lib/orders/modifyOrder.js.map +1 -0
  105. package/lib/orders/submitOrder.d.ts +4 -0
  106. package/lib/orders/submitOrder.d.ts.map +1 -0
  107. package/lib/orders/submitOrder.js +111 -0
  108. package/lib/orders/submitOrder.js.map +1 -0
  109. package/lib/public-api.js.map +1 -1
  110. package/lib/quote.d.ts +1 -1
  111. package/lib/quote.d.ts.map +1 -1
  112. package/lib/quote.js.map +1 -1
  113. package/lib/services.js +2 -1
  114. package/lib/services.js.map +1 -1
  115. package/lib/strategy-account.d.ts +2 -2
  116. package/lib/strategy-account.d.ts.map +1 -1
  117. package/lib/strategy-account.js +7 -60
  118. package/lib/strategy-account.js.map +1 -1
  119. package/lib/trade.js +6 -5
  120. package/lib/trade.js.map +1 -1
  121. package/lib/transfer.d.ts +2 -0
  122. package/lib/transfer.d.ts.map +1 -0
  123. package/lib/transfer.js +281 -0
  124. package/lib/transfer.js.map +1 -0
  125. package/lib/websocket.js.map +1 -1
  126. package/package.json +13 -12
  127. package/temp/package-deps.json +40 -29
  128. package/dist/legacy_index.js +0 -563
  129. package/dist/legacy_index.js.map +0 -1
  130. package/dist/logger.js +0 -91
  131. package/dist/logger.js.map +0 -1
  132. package/lib/legacy_index.d.ts +0 -2
  133. package/lib/legacy_index.d.ts.map +0 -1
  134. package/lib/legacy_index.js +0 -565
  135. package/lib/legacy_index.js.map +0 -1
  136. package/lib/logger.d.ts +0 -21
  137. package/lib/logger.d.ts.map +0 -1
  138. package/lib/logger.js +0 -98
  139. package/lib/logger.js.map +0 -1
package/lib/trade.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"trade.js","sourceRoot":"","sources":["../src/trade.ts"],"names":[],"mappings":"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","sourcesContent":["import { defer, first, of, repeat, retry, tap, timeout } from 'rxjs';\nimport { client } from './api';\nimport { ITrade } from '@yuants/data-trade';\nimport { accountUid$ } from './account';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';\nimport { Terminal } from '@yuants/protocol';\nimport { IProduct } from '@yuants/data-product';\nconst tradeParser = async (accountId: string, params: Record<string, string>): Promise<ITrade[]> => {\n const tradeList: ITrade[] = [];\n const result = await client.getAccountBillsArchive(params);\n const productIdToProduct = new Map<string, IProduct>();\n const productIdSet = new Set<string>();\n if (result.code === '0' && result.data) {\n const data = result.data;\n const mapTradeIdToBillList = new Map<string, typeof data>();\n data.forEach((item) => {\n productIdSet.add(encodePath(item.instType, item.instId));\n mapTradeIdToBillList.set(item.tradeId, [...(mapTradeIdToBillList.get(item.tradeId) ?? []), item]);\n });\n if (productIdSet.size > 0) {\n const productList = await requestSQL<IProduct[]>(\n Terminal.fromNodeEnv(),\n `\n select * from product where product_id in (${Array.from(productIdSet)\n .map((productId) => escapeSQL(productId))\n .join(',')})\n `,\n );\n if (productList.length > 0) {\n productList.forEach((p) => productIdToProduct.set(p.product_id, p));\n }\n }\n mapTradeIdToBillList.forEach(async (v, tradeId) => {\n if (!((v[0].instType === 'SPOT' && v.length === 2) || v[0].instType === 'SWAP')) return;\n\n const trade: ITrade = {\n id: tradeId,\n account_id: accountId,\n product_id: '',\n direction: '',\n traded_volume: '',\n traded_price: '',\n traded_value: '',\n post_volume: '',\n fee: '',\n fee_currency: '',\n created_at: '0',\n };\n\n v.forEach((bill) => {\n trade.created_at = Math.max(Number(trade.created_at), Number(bill.ts)).toString();\n trade.product_id = encodePath(bill.instType, bill.instId);\n trade.traded_price = bill.px;\n if (bill.instType === 'SWAP') {\n if (bill.subType === '1') trade.direction = 'OPEN_LONG';\n if (bill.subType === '2') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '3') trade.direction = 'OPEN_LONG';\n if (bill.subType === '4') trade.direction = 'OPEN_SHORT';\n if (bill.subType === '5') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '6') trade.direction = 'CLOSE_SHORT';\n trade.traded_volume = bill.sz;\n trade.traded_value = (Number(bill.sz) * Number(bill.px)).toString();\n }\n if (bill.instType === 'SPOT') {\n if (bill.subType === '1') {\n if (bill.ccy !== 'USDT') {\n trade.direction = 'OPEN_LONG';\n } else {\n trade.direction = 'CLOSE_LONG';\n }\n }\n\n if (bill.ccy !== 'USDT') {\n trade.traded_volume = bill.sz;\n }\n if (bill.ccy === 'USDT') {\n trade.traded_value = bill.sz;\n }\n }\n // fee\n if (bill.fee !== '0') {\n trade.fee = Math.abs(Number(bill.fee)).toString();\n trade.fee_currency = bill.ccy;\n }\n });\n trade.created_at = formatTime(Number(trade.created_at));\n if (productIdToProduct.has(trade.product_id)) {\n trade.traded_value = (\n +trade.traded_value * +(productIdToProduct.get(trade.product_id)?.value_scale ?? 1)\n ).toString();\n } else {\n throw new Error(`Not Found Product With Product Id: ${trade.product_id}`);\n }\n tradeList.push(trade);\n });\n }\n return tradeList;\n};\n\nconst getAccountTradeWithAccountId = async (accountId: string) => {\n const currentTrade = await requestSQL<ITrade[]>(\n Terminal.fromNodeEnv(),\n `\n select * from trade where account_id=${escapeSQL(accountId)} order by created_at desc limit 1;\n `,\n );\n const params: Record<string, string> = {\n type: '2',\n begin: (new Date().getTime() - 1000 * 60 * 60 * 24 * 30 * 3).toString(),\n };\n if (currentTrade.length === 1) {\n params['begin'] = new Date(currentTrade[0].created_at ?? 0).getTime().toString();\n }\n console.log(formatTime(Date.now()), 'getAccountTrade', `params: ${JSON.stringify(params)}`);\n const tradeList = await tradeParser(accountId, params);\n console.log(formatTime(Date.now()), 'getAccountTrade', `tradeList: ${JSON.stringify(tradeList)}`);\n await requestSQL(\n Terminal.fromNodeEnv(),\n buildInsertManyIntoTableSQL(tradeList, 'trade', {\n columns: [\n 'id',\n 'account_id',\n 'product_id',\n 'traded_volume',\n 'traded_value',\n 'traded_price',\n 'direction',\n 'fee',\n 'fee_currency',\n 'created_at',\n ],\n conflictKeys: ['id'],\n }),\n );\n};\n\ndefer(() => accountUid$)\n .pipe(first())\n .subscribe((uid) => {\n const account_id = `okx/${uid}/trading`;\n console.log(formatTime(Date.now()), 'getAccountTrade', `AccountID: ${account_id}`);\n defer(() => getAccountTradeWithAccountId(account_id))\n .pipe(\n //\n timeout(10_000), // 超时设定:10 秒\n tap({\n error: (err) => {\n console.error(formatTime(Date.now()), 'getAccountTradeError', err);\n },\n }),\n repeat({ delay: 30_000 }),\n retry({ delay: 5000 }),\n )\n .subscribe();\n });\n"]}
1
+ {"version":3,"file":"trade.js","sourceRoot":"","sources":["../src/trade.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct } from '@yuants/data-product';\nimport { ITrade } from '@yuants/data-trade';\nimport { Terminal } from '@yuants/protocol';\nimport { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, first, repeat, retry, tap, timeout } from 'rxjs';\nimport { accountUid$ } from './account';\nimport { getAccountBillsArchive, getDefaultCredential } from './api';\n\nconst tradeParser = async (accountId: string, params: Record<string, string>): Promise<ITrade[]> => {\n const tradeList: ITrade[] = [];\n const credential = getDefaultCredential();\n const result = await getAccountBillsArchive(credential, params);\n const productIdToProduct = new Map<string, IProduct>();\n const productIdSet = new Set<string>();\n if (result.code === '0' && result.data) {\n const data = result.data;\n const mapTradeIdToBillList = new Map<string, typeof data>();\n data.forEach((item) => {\n productIdSet.add(encodePath(item.instType, item.instId));\n mapTradeIdToBillList.set(item.tradeId, [...(mapTradeIdToBillList.get(item.tradeId) ?? []), item]);\n });\n if (productIdSet.size > 0) {\n const productList = await requestSQL<IProduct[]>(\n Terminal.fromNodeEnv(),\n `\n select * from product where product_id in (${Array.from(productIdSet)\n .map((productId) => escapeSQL(productId))\n .join(',')})\n `,\n );\n if (productList.length > 0) {\n productList.forEach((p) => productIdToProduct.set(p.product_id, p));\n }\n }\n mapTradeIdToBillList.forEach(async (v, tradeId) => {\n if (!((v[0].instType === 'SPOT' && v.length === 2) || v[0].instType === 'SWAP')) return;\n\n const trade: ITrade = {\n id: tradeId,\n account_id: accountId,\n product_id: '',\n direction: '',\n traded_volume: '',\n traded_price: '',\n traded_value: '',\n post_volume: '',\n fee: '',\n fee_currency: '',\n created_at: '0',\n };\n\n v.forEach((bill) => {\n trade.created_at = Math.max(Number(trade.created_at), Number(bill.ts)).toString();\n trade.product_id = encodePath(bill.instType, bill.instId);\n trade.traded_price = bill.px;\n if (bill.instType === 'SWAP') {\n if (bill.subType === '1') trade.direction = 'OPEN_LONG';\n if (bill.subType === '2') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '3') trade.direction = 'OPEN_LONG';\n if (bill.subType === '4') trade.direction = 'OPEN_SHORT';\n if (bill.subType === '5') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '6') trade.direction = 'CLOSE_SHORT';\n trade.traded_volume = bill.sz;\n trade.traded_value = (Number(bill.sz) * Number(bill.px)).toString();\n }\n if (bill.instType === 'SPOT') {\n if (bill.subType === '1') {\n if (bill.ccy !== 'USDT') {\n trade.direction = 'OPEN_LONG';\n } else {\n trade.direction = 'CLOSE_LONG';\n }\n }\n\n if (bill.ccy !== 'USDT') {\n trade.traded_volume = bill.sz;\n }\n if (bill.ccy === 'USDT') {\n trade.traded_value = bill.sz;\n }\n }\n // fee\n if (bill.fee !== '0') {\n trade.fee = Math.abs(Number(bill.fee)).toString();\n trade.fee_currency = bill.ccy;\n }\n });\n trade.created_at = formatTime(Number(trade.created_at));\n if (productIdToProduct.has(trade.product_id)) {\n trade.traded_value = (\n +trade.traded_value * +(productIdToProduct.get(trade.product_id)?.value_scale ?? 1)\n ).toString();\n } else {\n throw new Error(`Not Found Product With Product Id: ${trade.product_id}`);\n }\n tradeList.push(trade);\n });\n }\n return tradeList;\n};\n\nconst getAccountTradeWithAccountId = async (accountId: string) => {\n const currentTrade = await requestSQL<ITrade[]>(\n Terminal.fromNodeEnv(),\n `\n select * from trade where account_id=${escapeSQL(accountId)} order by created_at desc limit 1;\n `,\n );\n const params: Record<string, string> = {\n type: '2',\n begin: (new Date().getTime() - 1000 * 60 * 60 * 24 * 30 * 3).toString(),\n };\n if (currentTrade.length === 1) {\n params['begin'] = new Date(currentTrade[0].created_at ?? 0).getTime().toString();\n }\n console.log(formatTime(Date.now()), 'getAccountTrade', `params: ${JSON.stringify(params)}`);\n const tradeList = await tradeParser(accountId, params);\n console.log(formatTime(Date.now()), 'getAccountTrade', `tradeList: ${JSON.stringify(tradeList)}`);\n await requestSQL(\n Terminal.fromNodeEnv(),\n buildInsertManyIntoTableSQL(tradeList, 'trade', {\n columns: [\n 'id',\n 'account_id',\n 'product_id',\n 'traded_volume',\n 'traded_value',\n 'traded_price',\n 'direction',\n 'fee',\n 'fee_currency',\n 'created_at',\n ],\n conflictKeys: ['id'],\n }),\n );\n};\n\ndefer(() => accountUid$)\n .pipe(first())\n .subscribe((uid) => {\n const account_id = `okx/${uid}/trading`;\n console.log(formatTime(Date.now()), 'getAccountTrade', `AccountID: ${account_id}`);\n defer(() => getAccountTradeWithAccountId(account_id))\n .pipe(\n //\n timeout(10_000), // 超时设定:10 秒\n tap({\n error: (err) => {\n console.error(formatTime(Date.now()), 'getAccountTradeError', err);\n },\n }),\n repeat({ delay: 30_000 }),\n retry({ delay: 5000 }),\n )\n .subscribe();\n });\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cache_1 = require("@yuants/cache");
4
+ const protocol_1 = require("@yuants/protocol");
5
+ const transfer_1 = require("@yuants/transfer");
6
+ const utils_1 = require("@yuants/utils");
7
+ const rxjs_1 = require("rxjs");
8
+ const account_1 = require("./account");
9
+ const api_1 = require("./api");
10
+ const terminal = protocol_1.Terminal.fromNodeEnv();
11
+ const credential = (0, api_1.getDefaultCredential)();
12
+ const cacheOfAssetCurrencies = (0, cache_1.createCache)(() => (0, api_1.getAssetCurrencies)(credential), { expire: 3600000 });
13
+ (0, rxjs_1.defer)(async () => {
14
+ const account_config = await (0, rxjs_1.firstValueFrom)(account_1.accountConfig$);
15
+ console.info((0, utils_1.formatTime)(Date.now()), 'AccountConfig', JSON.stringify(account_config));
16
+ const { mainUid, uid } = account_config.data[0];
17
+ const isMainAccount = mainUid === uid;
18
+ const TRADING_ACCOUNT_ID = `okx/${uid}/trading`;
19
+ const FUNDING_ACCOUNT_ID = `okx/${uid}/funding/USDT`;
20
+ const EARNING_ACCOUNT_ID = `okx/${uid}/earning/USDT`;
21
+ // BLOCK_CHAIN: only available for main account
22
+ if (isMainAccount) {
23
+ const depositAddressRes = await (0, api_1.getAssetDepositAddress)(credential, { ccy: 'USDT' });
24
+ console.info((0, utils_1.formatTime)(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes.data));
25
+ const addresses = depositAddressRes.data.filter((v) => v.chain === 'USDT-TRC20' && v.to === '6');
26
+ for (const address of addresses) {
27
+ (0, transfer_1.addAccountTransferAddress)({
28
+ terminal,
29
+ account_id: FUNDING_ACCOUNT_ID,
30
+ network_id: 'TRC20',
31
+ currency: 'USDT',
32
+ address: address.addr,
33
+ onApply: {
34
+ INIT: async (order) => {
35
+ var _a, _b;
36
+ if (!order.current_amount ||
37
+ order.current_amount < 3 // 最小提币额度
38
+ ) {
39
+ return { state: 'ERROR', message: 'Amount too small' };
40
+ }
41
+ const res = await cacheOfAssetCurrencies.query('');
42
+ const theRes = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.find((x) => x.ccy === 'USDT' && x.chain === 'USDT-TRC20');
43
+ const _fee = theRes === null || theRes === void 0 ? void 0 : theRes.minFee;
44
+ if (!_fee)
45
+ return { state: 'ERROR', message: 'Currency Info not found, cannot get fee' };
46
+ const fee = +_fee;
47
+ const amt = Math.floor(order.current_amount - fee);
48
+ const transferResult = await (0, api_1.postAssetWithdrawal)(credential, {
49
+ amt: `${amt}`,
50
+ ccy: 'USDT',
51
+ chain: 'USDT-TRC20',
52
+ fee: `${fee}`,
53
+ dest: '4',
54
+ toAddr: order.current_rx_address,
55
+ });
56
+ if (transferResult.code !== '0') {
57
+ return { state: 'INIT', message: transferResult.msg };
58
+ }
59
+ const wdId = (_b = transferResult.data[0]) === null || _b === void 0 ? void 0 : _b.wdId;
60
+ return { state: 'AWAIT_TX_ID', context: wdId };
61
+ },
62
+ AWAIT_TX_ID: async (transferOrder) => {
63
+ var _a, _b;
64
+ const wdId = transferOrder.current_tx_context;
65
+ const withdrawalHistory = await (0, api_1.getAssetWithdrawalHistory)(credential, { wdId });
66
+ const txId = (_b = (_a = withdrawalHistory.data) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.txId;
67
+ if (!txId) {
68
+ return { state: 'AWAIT_TX_ID', context: wdId };
69
+ }
70
+ return { state: 'COMPLETE', transaction_id: txId };
71
+ },
72
+ },
73
+ onEval: async (transferOrder) => {
74
+ const checkResult = await (0, api_1.getAssetDepositHistory)(credential, {
75
+ ccy: 'USDT',
76
+ txId: transferOrder.current_transaction_id,
77
+ type: '4',
78
+ });
79
+ if (checkResult.code !== '0') {
80
+ return {
81
+ state: 'INIT',
82
+ };
83
+ }
84
+ if (checkResult.data[0].state !== '2') {
85
+ return { state: 'PENDING' };
86
+ }
87
+ const received_amount = +checkResult.data[0].amt;
88
+ return { state: 'COMPLETE', received_amount };
89
+ },
90
+ });
91
+ }
92
+ }
93
+ // Funding-Trading
94
+ {
95
+ const FUNDING_TRADING_NETWORK_ID = `OKX/${uid}/Funding-Trading`;
96
+ (0, transfer_1.addAccountTransferAddress)({
97
+ terminal,
98
+ account_id: FUNDING_ACCOUNT_ID,
99
+ network_id: FUNDING_TRADING_NETWORK_ID,
100
+ currency: 'USDT',
101
+ address: 'funding',
102
+ onApply: {
103
+ INIT: async (order) => {
104
+ const transferResult = await (0, api_1.postAssetTransfer)(credential, {
105
+ type: '0',
106
+ ccy: 'USDT',
107
+ amt: `${order.current_amount}`,
108
+ from: '6',
109
+ to: '18',
110
+ });
111
+ if (transferResult.code !== '0') {
112
+ return { state: 'INIT', message: transferResult.msg };
113
+ }
114
+ const transaction_id = transferResult.data[0].transId;
115
+ return { state: 'COMPLETE', transaction_id };
116
+ },
117
+ },
118
+ onEval: async (transferOrder) => {
119
+ return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
120
+ },
121
+ });
122
+ (0, transfer_1.addAccountTransferAddress)({
123
+ terminal,
124
+ account_id: TRADING_ACCOUNT_ID,
125
+ network_id: FUNDING_TRADING_NETWORK_ID,
126
+ currency: 'USDT',
127
+ address: 'trading',
128
+ onApply: {
129
+ INIT: async (order) => {
130
+ const transferResult = await (0, api_1.postAssetTransfer)(credential, {
131
+ type: '0',
132
+ ccy: order.currency,
133
+ amt: `${order.current_amount}`,
134
+ from: '18',
135
+ to: '6',
136
+ });
137
+ if (transferResult.code !== '0') {
138
+ return { state: 'INIT', message: transferResult.msg };
139
+ }
140
+ const transaction_id = transferResult.data[0].transId;
141
+ return { state: 'COMPLETE', transaction_id };
142
+ },
143
+ },
144
+ onEval: async (transferOrder) => {
145
+ return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
146
+ },
147
+ });
148
+ }
149
+ // Funding-Earning
150
+ {
151
+ const FUNDING_EARNING_NETWORK_ID = `OKX/${uid}/Funding-Earning`;
152
+ (0, transfer_1.addAccountTransferAddress)({
153
+ terminal,
154
+ account_id: FUNDING_ACCOUNT_ID,
155
+ network_id: FUNDING_EARNING_NETWORK_ID,
156
+ currency: 'USDT',
157
+ address: 'funding',
158
+ onApply: {
159
+ INIT: async (order) => {
160
+ const transferResult = await (0, api_1.postFinanceSavingsPurchaseRedempt)(credential, {
161
+ ccy: 'USDT',
162
+ amt: `${order.current_amount}`,
163
+ side: 'purchase',
164
+ rate: '0.01',
165
+ });
166
+ if (transferResult.code !== '0') {
167
+ return { state: 'INIT', message: transferResult.msg };
168
+ }
169
+ return { state: 'COMPLETE', transaction_id: 'ok' };
170
+ },
171
+ },
172
+ onEval: async (transferOrder) => {
173
+ return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
174
+ },
175
+ });
176
+ (0, transfer_1.addAccountTransferAddress)({
177
+ terminal,
178
+ account_id: EARNING_ACCOUNT_ID,
179
+ network_id: FUNDING_EARNING_NETWORK_ID,
180
+ currency: 'USDT',
181
+ address: 'earning',
182
+ onApply: {
183
+ INIT: async (order) => {
184
+ const transferResult = await (0, api_1.postFinanceSavingsPurchaseRedempt)(credential, {
185
+ ccy: 'USDT',
186
+ amt: `${order.current_amount}`,
187
+ side: 'redempt',
188
+ rate: '0.01',
189
+ });
190
+ if (transferResult.code !== '0') {
191
+ return { state: 'INIT', message: transferResult.msg };
192
+ }
193
+ return { state: 'COMPLETE', transaction_id: 'ok' };
194
+ },
195
+ },
196
+ onEval: async (transferOrder) => {
197
+ return { state: 'COMPLETE', received_amount: transferOrder.current_amount };
198
+ },
199
+ });
200
+ }
201
+ // SubAccount
202
+ {
203
+ const getSubAccountNetworkId = (subUid) => `OKX/${mainUid}/SubAccount/${subUid}`;
204
+ if (isMainAccount) {
205
+ const subAcctsRes = await (0, api_1.getSubAccountList)(credential);
206
+ for (const item of subAcctsRes.data || []) {
207
+ (0, transfer_1.addAccountTransferAddress)({
208
+ terminal,
209
+ account_id: FUNDING_ACCOUNT_ID,
210
+ network_id: getSubAccountNetworkId(item.uid),
211
+ currency: 'USDT',
212
+ address: 'main',
213
+ onApply: {
214
+ INIT: async (order) => {
215
+ const transferResult = await (0, api_1.postAssetTransfer)(credential, {
216
+ type: '1',
217
+ ccy: 'USDT',
218
+ amt: `${order.current_amount}`,
219
+ from: '6',
220
+ to: '6',
221
+ subAcct: item.subAcct,
222
+ });
223
+ if (transferResult.code !== '0') {
224
+ return { state: 'INIT', message: transferResult.msg };
225
+ }
226
+ const transaction_id = transferResult.data[0].transId;
227
+ return { state: 'COMPLETE', transaction_id };
228
+ },
229
+ },
230
+ onEval: async (order) => {
231
+ // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’
232
+ // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });
233
+ // const received_amount = checkResult?.data?.[0]?.amt;
234
+ // if (!received_amount) {
235
+ // return { state: 'INIT', message: checkResult.msg };
236
+ // }
237
+ // return { state: 'COMPLETE', received_amount: +received_amount };
238
+ return { state: 'COMPLETE', received_amount: order.current_amount };
239
+ },
240
+ });
241
+ }
242
+ }
243
+ // SubAccount API
244
+ else {
245
+ (0, transfer_1.addAccountTransferAddress)({
246
+ terminal,
247
+ account_id: FUNDING_ACCOUNT_ID,
248
+ network_id: getSubAccountNetworkId(uid),
249
+ currency: 'USDT',
250
+ address: 'sub',
251
+ onApply: {
252
+ INIT: async (order) => {
253
+ const transferResult = await (0, api_1.postAssetTransfer)(credential, {
254
+ type: '3',
255
+ ccy: 'USDT',
256
+ amt: `${order.current_amount}`,
257
+ from: '6',
258
+ to: '6',
259
+ });
260
+ if (transferResult.code !== '0') {
261
+ return { state: 'INIT', message: transferResult.msg };
262
+ }
263
+ const transaction_id = transferResult.data[0].transId;
264
+ return { state: 'COMPLETE', transaction_id };
265
+ },
266
+ },
267
+ onEval: async (order) => {
268
+ // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’
269
+ // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });
270
+ // const received_amount = checkResult?.data?.[0]?.amt;
271
+ // if (!received_amount) {
272
+ // return { state: 'INIT', message: checkResult.msg };
273
+ // }
274
+ // return { state: 'COMPLETE', received_amount: +received_amount };
275
+ return { state: 'COMPLETE', received_amount: order.current_amount };
276
+ },
277
+ });
278
+ }
279
+ }
280
+ }).subscribe();
281
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime } from '@yuants/utils';\nimport { defer, firstValueFrom } from 'rxjs';\nimport { accountConfig$ } from './account';\nimport {\n getAssetCurrencies,\n getAssetDepositAddress,\n getAssetDepositHistory,\n getAssetWithdrawalHistory,\n getDefaultCredential,\n getSubAccountList,\n postAssetTransfer,\n postAssetWithdrawal,\n postFinanceSavingsPurchaseRedempt,\n} from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\nconst cacheOfAssetCurrencies = createCache(() => getAssetCurrencies(credential), { expire: 3600_000 });\n\ndefer(async () => {\n const account_config = await firstValueFrom(accountConfig$);\n console.info(formatTime(Date.now()), 'AccountConfig', JSON.stringify(account_config));\n const { mainUid, uid } = account_config.data[0];\n const isMainAccount = mainUid === uid;\n\n const TRADING_ACCOUNT_ID = `okx/${uid}/trading`;\n const FUNDING_ACCOUNT_ID = `okx/${uid}/funding/USDT`;\n const EARNING_ACCOUNT_ID = `okx/${uid}/earning/USDT`;\n\n // BLOCK_CHAIN: only available for main account\n if (isMainAccount) {\n const depositAddressRes = await getAssetDepositAddress(credential, { ccy: 'USDT' });\n console.info(formatTime(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes.data));\n const addresses = depositAddressRes.data.filter((v) => v.chain === 'USDT-TRC20' && v.to === '6');\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: 'TRC20',\n currency: 'USDT',\n address: address.addr,\n onApply: {\n INIT: async (order) => {\n if (\n !order.current_amount ||\n order.current_amount < 3 // 最小提币额度\n ) {\n return { state: 'ERROR', message: 'Amount too small' };\n }\n const res = await cacheOfAssetCurrencies.query('');\n const theRes = res?.data?.find((x) => x.ccy === 'USDT' && x.chain === 'USDT-TRC20');\n const _fee = theRes?.minFee;\n if (!_fee) return { state: 'ERROR', message: 'Currency Info not found, cannot get fee' };\n const fee = +_fee;\n const amt = Math.floor(order.current_amount - fee);\n const transferResult = await postAssetWithdrawal(credential, {\n amt: `${amt}`,\n ccy: 'USDT',\n chain: 'USDT-TRC20',\n fee: `${fee}`,\n dest: '4', // 链上提币\n toAddr: order.current_rx_address!,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const wdId = transferResult.data[0]?.wdId;\n return { state: 'AWAIT_TX_ID', context: wdId };\n },\n AWAIT_TX_ID: async (transferOrder) => {\n const wdId = transferOrder.current_tx_context;\n const withdrawalHistory = await getAssetWithdrawalHistory(credential, { wdId });\n const txId = withdrawalHistory.data?.[0]?.txId;\n if (!txId) {\n return { state: 'AWAIT_TX_ID', context: wdId };\n }\n return { state: 'COMPLETE', transaction_id: txId };\n },\n },\n onEval: async (transferOrder) => {\n const checkResult = await getAssetDepositHistory(credential, {\n ccy: 'USDT',\n txId: transferOrder.current_transaction_id,\n type: '4',\n });\n\n if (checkResult.code !== '0') {\n return {\n state: 'INIT',\n };\n }\n\n if (checkResult.data[0].state !== '2') {\n return { state: 'PENDING' };\n }\n const received_amount = +checkResult.data[0].amt;\n return { state: 'COMPLETE', received_amount };\n },\n });\n }\n }\n\n // Funding-Trading\n {\n const FUNDING_TRADING_NETWORK_ID = `OKX/${uid}/Funding-Trading`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '18',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: TRADING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'trading',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: order.currency,\n amt: `${order.current_amount}`,\n from: '18',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n // Funding-Earning\n {\n const FUNDING_EARNING_NETWORK_ID = `OKX/${uid}/Funding-Earning`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'purchase',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: EARNING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'earning',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'redempt',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n\n // SubAccount\n {\n const getSubAccountNetworkId = (subUid: string) => `OKX/${mainUid}/SubAccount/${subUid}`;\n if (isMainAccount) {\n const subAcctsRes = await getSubAccountList(credential);\n for (const item of subAcctsRes.data || []) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(item.uid),\n currency: 'USDT',\n address: 'main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '1',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n subAcct: item.subAcct,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n // SubAccount API\n else {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(uid),\n currency: 'USDT',\n address: 'sub',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '3',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n}).subscribe();\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import { PromRegistry, Terminal } from '@yuants/protocol';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { catchError, defer, EMPTY, interval, Observable, Subscription, tap, timeout } from 'rxjs';\n\nconst MetricsWebSocketConnectionsGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_connections',\n 'Number of active OKX WebSocket connections',\n);\n\nconst MetricsWebSocketChannelGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_channel',\n 'Number of OKX WebSocket channels subscribed',\n);\n\nconst terminal = Terminal.fromNodeEnv();\n\nclass OKXWsClient {\n ws: WebSocket;\n connected: boolean = false;\n subscriptions: Set<string>;\n handlers: Record<string, Function>;\n pendingSub: string[];\n keepAlive: Subscription;\n\n baseURL: string = `wss://ws.okx.com:8443`;\n constructor(path: string) {\n // this.instId = instId;\n this.ws = new WebSocket(`${this.baseURL}/${path}`);\n\n MetricsWebSocketConnectionsGauge.inc({ path, terminal_id: terminal.terminal_id });\n\n this.pendingSub = [];\n this.keepAlive = interval(25000)\n .pipe(\n tap(() => {\n if (this.connected) {\n this.ws.send('ping');\n }\n }),\n )\n .subscribe();\n // this.ws.\n this.ws.addEventListener('open', () => {\n this.connected = true;\n console.info(formatTime(Date.now()), '✅ WS connected');\n while (this.pendingSub.length > 0) {\n const msg = this.pendingSub.shift();\n if (msg) {\n this.ws.send(msg);\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${msg}`);\n }\n }\n });\n\n this.ws.addEventListener('message', (raw) => this.handleMessage(raw));\n this.ws.addEventListener('error', (raw) => {\n console.error(formatTime(Date.now()), '❌ WS error', raw);\n });\n this.ws.addEventListener('close', (event) => {\n console.error(formatTime(Date.now()), '❌ WS closed', event);\n\n MetricsWebSocketConnectionsGauge.dec({ path });\n });\n this.subscriptions = new Set();\n this.handlers = {}; // key: channel, value: callback\n }\n\n // 处理消息\n handleMessage(raw: any) {\n if (raw.data === 'pong') {\n return;\n }\n const msg = JSON.parse(raw.data);\n if (msg.arg?.channel) {\n const channelId = encodePath(msg.arg.channel, msg.arg.instId);\n const data = msg.data?.[0];\n if (data && this.handlers[channelId]) {\n this.handlers[channelId](data, msg.arg);\n }\n } else if (msg.event) {\n console.info(formatTime(Date.now()), 'Event:', msg);\n }\n }\n\n // 调用订阅\n subscribe(channel: string, instId?: string, handler?: Function) {\n const channelId = encodePath(channel, instId);\n if (this.subscriptions.has(channelId)) {\n console.info(formatTime(Date.now()), `⚠️ Already subscribed: ${channelId}`);\n return;\n }\n\n const subMsg = {\n op: 'subscribe',\n args: [{ channel, instId }],\n };\n\n if (this.connected) {\n this.ws.send(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${channelId}`);\n } else {\n this.pendingSub.push(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 add subscribe for ${channelId} to pending list`);\n }\n MetricsWebSocketChannelGauge.inc({ channel, terminal_id: terminal.terminal_id });\n this.subscriptions.add(channelId);\n if (handler) {\n this.handlers[channelId] = handler;\n }\n }\n\n // 取消订阅\n unsubscribe(channel: string, instId?: string) {\n const channelId = encodePath(channel, instId);\n if (!this.subscriptions.has(channelId)) return;\n\n const unSubMsg = {\n op: 'unsubscribe',\n args: [{ channel, instId }],\n };\n\n this.ws.send(JSON.stringify(unSubMsg));\n this.subscriptions.delete(channelId);\n if (this.subscriptions.size === 0) {\n this.keepAlive.unsubscribe();\n }\n MetricsWebSocketChannelGauge.dec({ channel });\n delete this.handlers[channelId];\n console.info(formatTime(Date.now()), `📩 Sent unsubscribe for ${channelId}`);\n }\n}\n\nconst wsPool: {\n path: string;\n client: OKXWsClient;\n requests: number;\n isFull: boolean;\n}[] = [];\n\n// ISSUE: 连接限制:3 次/秒 (基于IP)\n//\n// https://www.okx.com/docs-v5/zh/#overview-websocket-connect\n//\n// 当订阅公有频道时,使用公有服务的地址;当订阅私有频道时,使用私有服务的地址\n//\n// 请求限制:\n//\n// 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时\nconst getWsClient = (path: string) => {\n const existing = wsPool.find((item) => item.path === path && !item.isFull);\n if (existing) {\n existing.requests++;\n if (existing.requests >= 480) {\n existing.isFull = true;\n }\n return existing.client;\n }\n const newClient = new OKXWsClient(path);\n wsPool.push({ path, client: newClient, requests: 1, isFull: false });\n return newClient;\n};\n\nconst fromWsChannelAndInstId = <T>(path: string, channel: string, instId: string) =>\n defer(\n () =>\n new Observable<T>((subscriber) => {\n const client = getWsClient(path);\n client.subscribe(channel, instId, (data: T) => {\n subscriber.next(data);\n });\n client.ws.addEventListener('error', (err) => {\n subscriber.error(err);\n });\n client.ws.addEventListener('close', () => {\n subscriber.error('WS Connection Closed');\n });\n subscriber.add(() => {\n client.unsubscribe(channel, instId);\n });\n }),\n ).pipe(\n // 防止单个连接断开导致数据流关闭\n timeout(60_000),\n tap({\n error: (err) => {\n console.info(formatTime(Date.now()), 'WS_SUBSCRIBE_ERROR', channel, instId, err);\n },\n }),\n // 暂时不太确定是否能支持 retry\n // retry({ delay: 1000 }),\n catchError(() => EMPTY),\n );\n\nexport const useTicker = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n last: string;\n askPx: string;\n bidPx: string;\n askSz: string;\n bidSz: string;\n }>('ws/v5/public', 'tickers', instId);\n\nexport const useOpenInterest = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n oi: string; // open interest\n }>('ws/v5/public', 'open-interest', instId);\n\nexport const useOHLC = (candleType: string, instId: string) =>\n fromWsChannelAndInstId<string[]>('ws/v5/business', candleType, instId);\n"]}
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":";;;AAAA,+CAA0D;AAC1D,yCAAuD;AACvD,+BAAkG;AAElG,MAAM,gCAAgC,GAAG,uBAAY,CAAC,MAAM,CAC1D,OAAO,EACP,2BAA2B,EAC3B,4CAA4C,CAC7C,CAAC;AAEF,MAAM,4BAA4B,GAAG,uBAAY,CAAC,MAAM,CACtD,OAAO,EACP,uBAAuB,EACvB,6CAA6C,CAC9C,CAAC;AAEF,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,WAAW;IASf,YAAY,IAAY;QAPxB,cAAS,GAAY,KAAK,CAAC;QAM3B,YAAO,GAAW,uBAAuB,CAAC;QAExC,wBAAwB;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;QAEnD,gCAAgC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAElF,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAA,eAAQ,EAAC,KAAK,CAAC;aAC7B,IAAI,CACH,IAAA,UAAG,EAAC,GAAG,EAAE;YACP,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACtB;QACH,CAAC,CAAC,CACH;aACA,SAAS,EAAE,CAAC;QACf,WAAW;QACX,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACpC,IAAI,GAAG,EAAE;oBACP,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,yBAAyB,GAAG,EAAE,CAAC,CAAC;iBACtE;aACF;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,OAAO,CAAC,KAAK,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YAE5D,gCAAgC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,gCAAgC;IACtD,CAAC;IAED,OAAO;IACP,aAAa,CAAC,GAAqB;;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;YACvB,OAAO;SACR;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAA,GAAG,CAAC,GAAG,0CAAE,OAAO,EAAE;YACpB,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAA,GAAG,CAAC,IAAI,0CAAG,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;gBACpC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;aACzC;SACF;aAAM,IAAI,GAAG,CAAC,KAAK,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;SACrD;IACH,CAAC;IAED,OAAO;IACP,SAAS,CAAC,OAAe,EAAE,MAAe,EAAE,OAAkB;QAC5D,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACrC,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,0BAA0B,SAAS,EAAE,CAAC,CAAC;YAC5E,OAAO;SACR;QAED,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC5B,CAAC;QAEF,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,yBAAyB,SAAS,EAAE,CAAC,CAAC;SAC5E;aAAM;YACL,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,wBAAwB,SAAS,kBAAkB,CAAC,CAAC;SAC3F;QACD,4BAA4B,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;SACpC;IACH,CAAC;IAED,OAAO;IACP,WAAW,CAAC,OAAe,EAAE,MAAe;QAC1C,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QAE/C,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC5B,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;SAC9B;QACD,4BAA4B,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,2BAA2B,SAAS,EAAE,CAAC,CAAC;IAC/E,CAAC;CACF;AAED,MAAM,MAAM,GAKN,EAAE,CAAC;AAET,2BAA2B;AAC3B,EAAE;AACF,6DAA6D;AAC7D,EAAE;AACF,wCAAwC;AACxC,EAAE;AACF,QAAQ;AACR,EAAE;AACF,wCAAwC;AACxC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,QAAQ,EAAE;QACZ,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACpB,IAAI,QAAQ,CAAC,QAAQ,IAAI,GAAG,EAAE;YAC5B,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;SACxB;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC;KACxB;IACD,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAI,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,EAAE,CAClF,IAAA,YAAK,EACH,GAAG,EAAE,CACH,IAAI,iBAAU,CAAI,CAAC,UAAU,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,IAAO,EAAE,EAAE;QAC5C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QAC1C,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACvC,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;QAClB,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACL,CAAC,IAAI;AACJ,kBAAkB;AAClB,IAAA,cAAO,EAAC,KAAM,CAAC,EACf,IAAA,UAAG,EAAC;IACF,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;QACb,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC;CACF,CAAC;AACF,oBAAoB;AACpB,0BAA0B;AAC1B,IAAA,iBAAU,EAAC,GAAG,EAAE,CAAC,YAAK,CAAC,CACxB,CAAC;AAEG,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,EAAE,CAC1C,sBAAsB,CAOnB,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAR3B,QAAA,SAAS,aAQkB;AAEjC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE,CAChD,sBAAsB,CAGnB,cAAc,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAJjC,QAAA,eAAe,mBAIkB;AAEvC,MAAM,OAAO,GAAG,CAAC,UAAkB,EAAE,MAAc,EAAE,EAAE,CAC5D,sBAAsB,CAAW,gBAAgB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAD5D,QAAA,OAAO,WACqD","sourcesContent":["import { PromRegistry, Terminal } from '@yuants/protocol';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { catchError, defer, EMPTY, interval, Observable, Subscription, tap, timeout } from 'rxjs';\n\nconst MetricsWebSocketConnectionsGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_connections',\n 'Number of active OKX WebSocket connections',\n);\n\nconst MetricsWebSocketChannelGauge = PromRegistry.create(\n 'gauge',\n 'okx_websocket_channel',\n 'Number of OKX WebSocket channels subscribed',\n);\n\nconst terminal = Terminal.fromNodeEnv();\n\nclass OKXWsClient {\n ws: WebSocket;\n connected: boolean = false;\n subscriptions: Set<string>;\n handlers: Record<string, Function>;\n pendingSub: string[];\n keepAlive: Subscription;\n\n baseURL: string = `wss://ws.okx.com:8443`;\n constructor(path: string) {\n // this.instId = instId;\n this.ws = new WebSocket(`${this.baseURL}/${path}`);\n\n MetricsWebSocketConnectionsGauge.inc({ path, terminal_id: terminal.terminal_id });\n\n this.pendingSub = [];\n this.keepAlive = interval(25000)\n .pipe(\n tap(() => {\n if (this.connected) {\n this.ws.send('ping');\n }\n }),\n )\n .subscribe();\n // this.ws.\n this.ws.addEventListener('open', () => {\n this.connected = true;\n console.info(formatTime(Date.now()), '✅ WS connected');\n while (this.pendingSub.length > 0) {\n const msg = this.pendingSub.shift();\n if (msg) {\n this.ws.send(msg);\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${msg}`);\n }\n }\n });\n\n this.ws.addEventListener('message', (raw) => this.handleMessage(raw));\n this.ws.addEventListener('error', (raw) => {\n console.error(formatTime(Date.now()), '❌ WS error', raw);\n });\n this.ws.addEventListener('close', (event) => {\n console.error(formatTime(Date.now()), '❌ WS closed', event);\n\n MetricsWebSocketConnectionsGauge.dec({ path });\n });\n this.subscriptions = new Set();\n this.handlers = {}; // key: channel, value: callback\n }\n\n // 处理消息\n handleMessage(raw: { data: string }) {\n if (raw.data === 'pong') {\n return;\n }\n const msg = JSON.parse(raw.data);\n if (msg.arg?.channel) {\n const channelId = encodePath(msg.arg.channel, msg.arg.instId);\n const data = msg.data?.[0];\n if (data && this.handlers[channelId]) {\n this.handlers[channelId](data, msg.arg);\n }\n } else if (msg.event) {\n console.info(formatTime(Date.now()), 'Event:', msg);\n }\n }\n\n // 调用订阅\n subscribe(channel: string, instId?: string, handler?: Function) {\n const channelId = encodePath(channel, instId);\n if (this.subscriptions.has(channelId)) {\n console.info(formatTime(Date.now()), `⚠️ Already subscribed: ${channelId}`);\n return;\n }\n\n const subMsg = {\n op: 'subscribe',\n args: [{ channel, instId }],\n };\n\n if (this.connected) {\n this.ws.send(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${channelId}`);\n } else {\n this.pendingSub.push(JSON.stringify(subMsg));\n console.info(formatTime(Date.now()), `📩 add subscribe for ${channelId} to pending list`);\n }\n MetricsWebSocketChannelGauge.inc({ channel, terminal_id: terminal.terminal_id });\n this.subscriptions.add(channelId);\n if (handler) {\n this.handlers[channelId] = handler;\n }\n }\n\n // 取消订阅\n unsubscribe(channel: string, instId?: string) {\n const channelId = encodePath(channel, instId);\n if (!this.subscriptions.has(channelId)) return;\n\n const unSubMsg = {\n op: 'unsubscribe',\n args: [{ channel, instId }],\n };\n\n this.ws.send(JSON.stringify(unSubMsg));\n this.subscriptions.delete(channelId);\n if (this.subscriptions.size === 0) {\n this.keepAlive.unsubscribe();\n }\n MetricsWebSocketChannelGauge.dec({ channel });\n delete this.handlers[channelId];\n console.info(formatTime(Date.now()), `📩 Sent unsubscribe for ${channelId}`);\n }\n}\n\nconst wsPool: {\n path: string;\n client: OKXWsClient;\n requests: number;\n isFull: boolean;\n}[] = [];\n\n// ISSUE: 连接限制:3 次/秒 (基于IP)\n//\n// https://www.okx.com/docs-v5/zh/#overview-websocket-connect\n//\n// 当订阅公有频道时,使用公有服务的地址;当订阅私有频道时,使用私有服务的地址\n//\n// 请求限制:\n//\n// 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时\nconst getWsClient = (path: string) => {\n const existing = wsPool.find((item) => item.path === path && !item.isFull);\n if (existing) {\n existing.requests++;\n if (existing.requests >= 480) {\n existing.isFull = true;\n }\n return existing.client;\n }\n const newClient = new OKXWsClient(path);\n wsPool.push({ path, client: newClient, requests: 1, isFull: false });\n return newClient;\n};\n\nconst fromWsChannelAndInstId = <T>(path: string, channel: string, instId: string) =>\n defer(\n () =>\n new Observable<T>((subscriber) => {\n const client = getWsClient(path);\n client.subscribe(channel, instId, (data: T) => {\n subscriber.next(data);\n });\n client.ws.addEventListener('error', (err) => {\n subscriber.error(err);\n });\n client.ws.addEventListener('close', () => {\n subscriber.error('WS Connection Closed');\n });\n subscriber.add(() => {\n client.unsubscribe(channel, instId);\n });\n }),\n ).pipe(\n // 防止单个连接断开导致数据流关闭\n timeout(60_000),\n tap({\n error: (err) => {\n console.info(formatTime(Date.now()), 'WS_SUBSCRIBE_ERROR', channel, instId, err);\n },\n }),\n // 暂时不太确定是否能支持 retry\n // retry({ delay: 1000 }),\n catchError(() => EMPTY),\n );\n\nexport const useTicker = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n last: string;\n askPx: string;\n bidPx: string;\n askSz: string;\n bidSz: string;\n }>('ws/v5/public', 'tickers', instId);\n\nexport const useOpenInterest = (instId: string) =>\n fromWsChannelAndInstId<{\n instId: string;\n oi: string; // open interest\n }>('ws/v5/public', 'open-interest', instId);\n\nexport const useOHLC = (candleType: string, instId: string) =>\n fromWsChannelAndInstId<string[]>('ws/v5/business', candleType, instId);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuants/vendor-okx",
3
- "version": "0.23.24",
3
+ "version": "0.23.26",
4
4
  "bin": "lib/cli.js",
5
5
  "main": "lib/index.js",
6
6
  "files": [
@@ -9,18 +9,19 @@
9
9
  "temp"
10
10
  ],
11
11
  "dependencies": {
12
- "@yuants/protocol": "0.50.2",
13
- "@yuants/transfer": "0.2.31",
14
- "@yuants/data-account": "0.6.12",
15
- "@yuants/data-order": "0.3.10",
12
+ "@yuants/protocol": "0.50.4",
13
+ "@yuants/transfer": "0.2.33",
14
+ "@yuants/data-account": "0.6.14",
15
+ "@yuants/data-order": "0.3.12",
16
16
  "@yuants/utils": "0.11.0",
17
- "@yuants/sql": "0.9.22",
18
- "@yuants/data-series": "0.3.43",
19
- "@yuants/data-product": "0.4.13",
20
- "@yuants/data-ohlc": "0.4.14",
21
- "@yuants/data-interest-rate": "0.1.40",
22
- "@yuants/data-quote": "0.2.35",
23
- "@yuants/data-trade": "0.1.13",
17
+ "@yuants/cache": "0.3.0",
18
+ "@yuants/sql": "0.9.24",
19
+ "@yuants/data-series": "0.3.45",
20
+ "@yuants/data-product": "0.4.15",
21
+ "@yuants/data-ohlc": "0.4.16",
22
+ "@yuants/data-interest-rate": "0.1.42",
23
+ "@yuants/data-quote": "0.2.37",
24
+ "@yuants/data-trade": "0.1.15",
24
25
  "rxjs": "~7.5.6",
25
26
  "crypto-js": "^4.2.0",
26
27
  "ws": "~8.8.1"
@@ -1,49 +1,60 @@
1
1
  {
2
- "apps/vendor-okx/CHANGELOG.json": "349de38d564082f436e8daf9c3effcbf995a1458",
3
- "apps/vendor-okx/CHANGELOG.md": "c2e055d12fe50b671289c08f383b12cff3198007",
2
+ "apps/vendor-okx/CHANGELOG.json": "010ffdab5701ba146833116295b9f94b1ef01ae7",
3
+ "apps/vendor-okx/CHANGELOG.md": "aa14ccfb2cc6e9c9a056b10377c5ad0277831be1",
4
4
  "apps/vendor-okx/README.md": "ac3d1f6c4c8d73066664699b0bb1b01db02e67a2",
5
5
  "apps/vendor-okx/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
6
6
  "apps/vendor-okx/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
7
7
  "apps/vendor-okx/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
8
8
  "apps/vendor-okx/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
9
9
  "apps/vendor-okx/etc/vendor-okx.api.md": "92c54ccd547d2ad81ca6088158ca193e85c208df",
10
- "apps/vendor-okx/package.json": "091a155510f69494329f925c3c1923ce985c8727",
11
- "apps/vendor-okx/src/account.ts": "8bd61c3cc0b3183a81415dabd0c5d43e41cafe0f",
10
+ "apps/vendor-okx/package.json": "61e42c630aac1f5ae95a7966a0f6281771997b83",
11
+ "apps/vendor-okx/src/account.ts": "70d23dc3cf097b5bb43c07322e1a1429e89074c0",
12
+ "apps/vendor-okx/src/accountInfos/earning.ts": "d1afa6c128c628ebb787860c84f6cee037782fe1",
13
+ "apps/vendor-okx/src/accountInfos/funding.ts": "8ddb44633e8d76975b69695ad1ebcd80b0242fd2",
14
+ "apps/vendor-okx/src/accountInfos/index.ts": "272c4a49a94749b17d83bfb1f39a9bd932707288",
15
+ "apps/vendor-okx/src/accountInfos/loan.ts": "688b1f3cd8937f9b9da4a986e478c3e8efbfeebb",
16
+ "apps/vendor-okx/src/accountInfos/strategy.ts": "dd8a931aa9a85a416c491642a5e6663e8965244c",
17
+ "apps/vendor-okx/src/accountInfos/trading.ts": "9108ed4cf31b86d554db6ccff089c9176688dd06",
18
+ "apps/vendor-okx/src/accountInfos/types.ts": "c3c1096c3ad6849f6f679f1dfe0badb3ae876e41",
12
19
  "apps/vendor-okx/src/api-service.ts": "9f236b61d28781eb75ef3d572e75e3b95e4e305a",
13
- "apps/vendor-okx/src/api.ts": "463ee502845b02ae52e71107ddfa468cf5740bb4",
20
+ "apps/vendor-okx/src/api.ts": "ed9ad3c6052f0968cf612b474d9301d2316f4a04",
14
21
  "apps/vendor-okx/src/cli.ts": "9bf6b5559a6c6f33da20e74cc6c5d702c60ec891",
15
- "apps/vendor-okx/src/index.ts": "a57b6e81635c58e2c861f30221b794002941d333",
22
+ "apps/vendor-okx/src/index.ts": "cf3479fcc512941fa3e8550ff06cbe1467bfe705",
16
23
  "apps/vendor-okx/src/interest_rate.ts": "192ab4c5fb4cc1075bda57ba3ca6d21b4e5714a9",
17
- "apps/vendor-okx/src/legacy_index.ts": "dfda996f2b1869b14155f0e7dd76546623c21c71",
18
- "apps/vendor-okx/src/loan-account.ts": "fa37d6e51a992443ddba130e5136de7a58c34286",
19
- "apps/vendor-okx/src/logger.ts": "d25d427e74f46819a601e0cb17d5358b22c8db7b",
20
- "apps/vendor-okx/src/market-order.ts": "68b5d1bbf56348e06f3091bb5aeb4b9e322b25cb",
24
+ "apps/vendor-okx/src/loan-account.ts": "cba4bc9fa7c4f965f6a1196b4d03925abdf77aea",
25
+ "apps/vendor-okx/src/market-order.ts": "80c8881dc460ca03c655f513adb0653b675f28b3",
21
26
  "apps/vendor-okx/src/ohlc.ts": "535f802ef8f3df1468d0e45ba5b7f1b8fa78940c",
22
- "apps/vendor-okx/src/order.ts": "945865088271a194eb1c684af0f10e6b54d89f6b",
27
+ "apps/vendor-okx/src/order-actions.ts": "0d2348a6082cba9a125204a668cfc8bce64358e8",
28
+ "apps/vendor-okx/src/order.ts": "305edb35b895fa7afa187250cf08d50084c978f7",
29
+ "apps/vendor-okx/src/orders/cancelOrder.ts": "5c89d1860c93a0a6de113e5ae398300ec8da6cef",
30
+ "apps/vendor-okx/src/orders/modifyOrder.ts": "48d6df204967c831f4bee3d05429d56c02ab0f20",
31
+ "apps/vendor-okx/src/orders/submitOrder.ts": "dea1824cea155e41fc062c3cbe8a3f3ced7bab8f",
23
32
  "apps/vendor-okx/src/product.ts": "2dfbe23705894e3b2d3883aa69c7a989d32ca1d9",
24
33
  "apps/vendor-okx/src/provideOHLCFromTimeBackwardService.ts": "3a44206410b5b73683f2395d6c551549b553d7bd",
25
34
  "apps/vendor-okx/src/provideSeriesFromTimeBackwardService.ts": "daf3c793eb4fc20e59a740bb69e50fadab5f62f0",
26
- "apps/vendor-okx/src/public-api.ts": "ec41299f0bb0d07ecf74e6879e9483a671b027ce",
27
- "apps/vendor-okx/src/quote.ts": "43c1cd945ced4176321c3b852cb491b8ee948683",
28
- "apps/vendor-okx/src/services.ts": "7b7df830a6d78b6de5cee44bbcec66f282ab53ab",
29
- "apps/vendor-okx/src/strategy-account.ts": "48e1533b6fd42ff621a789eb991cf094a4a9ee64",
30
- "apps/vendor-okx/src/trade.ts": "5265a7215b803c5f357842e1ece7ddca53f7e7fc",
31
- "apps/vendor-okx/src/websocket.ts": "6c0199bbb9db714ec96b59d90b35b3c801975194",
35
+ "apps/vendor-okx/src/public-api.ts": "05b9cddafd09b5c9f65ce4eaeab42832e7d60449",
36
+ "apps/vendor-okx/src/quote.ts": "6ebc494a6d739edfa79cab2f88576df5b0798138",
37
+ "apps/vendor-okx/src/services.ts": "cda765de4da97a532eb7652ea66764e9ba9afe6c",
38
+ "apps/vendor-okx/src/strategy-account.ts": "6a224521d192a69c6d9051fde87d2a95a506afae",
39
+ "apps/vendor-okx/src/trade.ts": "06a443dc3cd8caf016211f85599d063a1a12c63b",
40
+ "apps/vendor-okx/src/transfer.ts": "e2284568d755b87904160d832e25affc90f4f35c",
41
+ "apps/vendor-okx/src/websocket.ts": "3614db6be5dc7dba842ae4dfdd0a7c8de201b21a",
32
42
  "apps/vendor-okx/src/ws.ts": "7aa1561c8c524dee838817eaeda5031d389ec877",
33
43
  "apps/vendor-okx/tsconfig.json": "81da8f78196974b5d15da0edb6b2d9f48641063c",
34
- "apps/vendor-okx/.rush/temp/shrinkwrap-deps.json": "eec75f84f913f6d956cbd3436df448790c76a85d",
35
- "libraries/protocol/temp/package-deps.json": "927e493d72c10154de2879f2d0c89fb1e8726487",
36
- "libraries/transfer/temp/package-deps.json": "dcc50695281bd25e170ea2d105332c8bc1ff5a87",
37
- "libraries/data-account/temp/package-deps.json": "c29b11fcb30dc5bf813894995bd958142783ee13",
38
- "libraries/data-order/temp/package-deps.json": "e97eced62e0ec43de4519dd383c4b8948282fbb3",
44
+ "apps/vendor-okx/.rush/temp/shrinkwrap-deps.json": "41772be396e5468b5ef42f47388dc75c7a566c7b",
45
+ "libraries/protocol/temp/package-deps.json": "35bc77333a1c85db1cd130579963e8cefa00f56c",
46
+ "libraries/transfer/temp/package-deps.json": "708a4caf79d042cad56a39f0b00d399bca04af40",
47
+ "libraries/data-account/temp/package-deps.json": "1063c689ee00118b3bf78dec1fe00efe0a258db3",
48
+ "libraries/data-order/temp/package-deps.json": "943238fe32aa351d20da29ba160399268b01bf29",
39
49
  "libraries/utils/temp/package-deps.json": "c58f1ca8f498315d9a0219ca8c498299a41d297b",
40
- "libraries/sql/temp/package-deps.json": "159a9bfbc1734553ee3295f3ddaafd85b2725c81",
41
- "libraries/data-series/temp/package-deps.json": "9525d8c8a2933830845fd34551d11897a8cf31fc",
42
- "libraries/data-product/temp/package-deps.json": "a056c3df6e19e1e51bc814ed1f09541d63b2afe7",
43
- "libraries/data-ohlc/temp/package-deps.json": "4cca5eb528cf247e88594a7dda67f6e75b43de24",
44
- "libraries/data-interest-rate/temp/package-deps.json": "53722b7498258ac7069e609c627047ae8b40f474",
45
- "libraries/data-quote/temp/package-deps.json": "ca82690303c9b5a55846387d1bfa0d8fe57e3947",
46
- "libraries/data-trade/temp/package-deps.json": "945632ba0f45327c28d8ab12fe052c3e38397327",
50
+ "libraries/cache/temp/package-deps.json": "49789a92426969daa31f0c956bb56bd783929765",
51
+ "libraries/sql/temp/package-deps.json": "e3b6f24485a429fb24cacbf0d6150f55ca394706",
52
+ "libraries/data-series/temp/package-deps.json": "d5269fad8f63460b1b5f29ba701ad3a9457e0061",
53
+ "libraries/data-product/temp/package-deps.json": "0a4e14971c7dc350b84712fb16c07fefad351619",
54
+ "libraries/data-ohlc/temp/package-deps.json": "6e10227e1c394ad0b5a71e0f810914760e9b7956",
55
+ "libraries/data-interest-rate/temp/package-deps.json": "11bb199efb64628f67b1165e11d6c85dd7114a9a",
56
+ "libraries/data-quote/temp/package-deps.json": "752ea44d75cbe7a652ace79629c02ca92a92cf1d",
57
+ "libraries/data-trade/temp/package-deps.json": "3383f312b7263d86dede5a11293727746a252e5b",
47
58
  "libraries/extension/temp/package-deps.json": "fd20507284f9fd74b4de6f9855c8cead9cc132e8",
48
59
  "tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
49
60
  }