@yuants/vendor-huobi 0.11.18 → 0.11.19
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.
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/product.js +46 -53
- package/dist/product.js.map +1 -1
- package/lib/index.js +3 -4
- package/lib/index.js.map +1 -1
- package/lib/product.d.ts +2 -3
- package/lib/product.d.ts.map +1 -1
- package/lib/product.js +47 -54
- package/lib/product.js.map +1 -1
- package/package.json +2 -2
- package/temp/package-deps.json +6 -6
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { formatTime, roundToStep } from '@yuants/utils';
|
|
|
5
5
|
import { catchError, combineLatestWith, defer, distinct, filter, first, firstValueFrom, from, map, mergeMap, of, reduce, repeat, retry, shareReplay, tap, timeout, toArray, } from 'rxjs';
|
|
6
6
|
import { client } from './api';
|
|
7
7
|
import './interest_rate';
|
|
8
|
-
import {
|
|
8
|
+
import { spotProductService, swapProductService } from './product';
|
|
9
9
|
import './quote';
|
|
10
10
|
const terminal = Terminal.fromNodeEnv();
|
|
11
11
|
(async () => {
|
|
@@ -30,7 +30,6 @@ const terminal = Terminal.fromNodeEnv();
|
|
|
30
30
|
const subAccounts = subUsersRes.data;
|
|
31
31
|
const isMainAccount = subUsersRes.ok;
|
|
32
32
|
console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));
|
|
33
|
-
const mapProductIdToPerpetualProduct$ = perpetualContractProducts$.pipe(map((x) => new Map(x.map((v) => [v.product_id, v]))), shareReplay(1));
|
|
34
33
|
provideAccountInfoService(terminal, SWAP_ACCOUNT_ID, async () => {
|
|
35
34
|
// balance
|
|
36
35
|
const balance = await client.getUnifiedAccountInfo();
|
|
@@ -45,7 +44,7 @@ const terminal = Terminal.fromNodeEnv();
|
|
|
45
44
|
const free = balanceData.withdraw_available;
|
|
46
45
|
// positions
|
|
47
46
|
const positionsRes = await client.getSwapCrossPositionInfo();
|
|
48
|
-
const mapProductIdToPerpetualProduct = await firstValueFrom(
|
|
47
|
+
const mapProductIdToPerpetualProduct = await firstValueFrom(swapProductService.mapProductIdToProduct$);
|
|
49
48
|
const positions = (positionsRes.data || []).map((v) => {
|
|
50
49
|
const product_id = v.contract_code;
|
|
51
50
|
const theProduct = mapProductIdToPerpetualProduct === null || mapProductIdToPerpetualProduct === void 0 ? void 0 : mapProductIdToPerpetualProduct.get(product_id);
|
|
@@ -288,9 +287,9 @@ const terminal = Terminal.fromNodeEnv();
|
|
|
288
287
|
//
|
|
289
288
|
mergeMap((res) => res.data), first((v) => v.currency === 'usdt'), map((v) => +v['loanable-amt']), combineLatestWith(superMarginUnifiedRawAccountBalance$.pipe(first(), mergeMap((res) => from(res.list).pipe(
|
|
290
289
|
// we only need the amount of usdt that can be used to trade
|
|
291
|
-
filter((v) => v.currency === 'usdt' && v.type === 'trade'), reduce((acc, cur) => acc + +cur.balance, 0))))), combineLatestWith(
|
|
290
|
+
filter((v) => v.currency === 'usdt' && v.type === 'trade'), reduce((acc, cur) => acc + +cur.balance, 0))))), combineLatestWith(spotProductService.mapProductIdToProduct$.pipe(first())), mergeMap(async ([[loanable, balance], mapProductIdToProduct]) => {
|
|
292
291
|
const priceRes = await client.getSpotTick({ symbol: msg.req.product_id });
|
|
293
|
-
const theProduct =
|
|
292
|
+
const theProduct = mapProductIdToProduct.get(msg.req.product_id);
|
|
294
293
|
const price = priceRes.tick.close;
|
|
295
294
|
const borrow_amount = msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'
|
|
296
295
|
? Math.max(Math.min(loanable, msg.req.volume * price - balance), 0)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime, roundToStep } from '@yuants/utils';\nimport {\n catchError,\n combineLatestWith,\n defer,\n distinct,\n filter,\n first,\n firstValueFrom,\n from,\n map,\n mergeMap,\n of,\n reduce,\n repeat,\n retry,\n shareReplay,\n tap,\n timeout,\n toArray,\n} from 'rxjs';\nimport { client } from './api';\nimport './interest_rate';\nimport { perpetualContractProducts$, spotProducts$ } from './product';\nimport './quote';\n\nconst terminal = Terminal.fromNodeEnv();\n\n(async () => {\n const swapAccountTypeRes = await client.getSwapUnifiedAccountType();\n if (swapAccountTypeRes.data?.account_type === 1) {\n console.info(\n formatTime(Date.now()),\n 'SwitchingAccountType',\n `previous: ${swapAccountTypeRes.data.account_type}, switching to 2 (unified account)`,\n );\n const switchRes = await client.postSwapSwitchAccountType({ account_type: 2 });\n console.info(formatTime(Date.now()), 'SwitchingAccountType', `current: ${switchRes.data.account_type}`);\n }\n\n const huobiUid: number = (await client.getUid()).data;\n console.info(formatTime(Date.now()), 'UID', huobiUid);\n\n const huobiAccounts = await client.getAccount();\n const superMarginAccountUid = huobiAccounts.data.find((v) => v.type === 'super-margin')?.id!;\n const spotAccountUid = huobiAccounts.data.find((v) => v.type === 'spot')?.id!;\n console.info(formatTime(Date.now()), 'huobiAccount', JSON.stringify(huobiAccounts));\n\n const account_id = `huobi/${huobiUid}`;\n const SPOT_ACCOUNT_ID = `${account_id}/spot/usdt`;\n const SUPER_MARGIN_ACCOUNT_ID = `${account_id}/super-margin`;\n const SWAP_ACCOUNT_ID = `${account_id}/swap`;\n\n const subUsersRes = await client.getSubUserList();\n const subAccounts = subUsersRes.data;\n const isMainAccount = subUsersRes.ok;\n console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));\n\n const mapProductIdToPerpetualProduct$ = perpetualContractProducts$.pipe(\n map((x) => new Map(x.map((v) => [v.product_id, v]))),\n shareReplay(1),\n );\n\n provideAccountInfoService(\n terminal,\n SWAP_ACCOUNT_ID,\n async () => {\n // balance\n const balance = await client.getUnifiedAccountInfo();\n if (!balance.data) {\n throw new Error('Failed to get unified account info');\n }\n const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');\n if (!balanceData) {\n throw new Error('No USDT balance found in unified account');\n }\n const equity = balanceData.margin_balance;\n const free = balanceData.withdraw_available;\n\n // positions\n const positionsRes = await client.getSwapCrossPositionInfo();\n const mapProductIdToPerpetualProduct = await firstValueFrom(mapProductIdToPerpetualProduct$);\n const positions: IPosition[] = (positionsRes.data || []).map((v): IPosition => {\n const product_id = v.contract_code;\n const theProduct = mapProductIdToPerpetualProduct?.get(product_id);\n const valuation = v.volume * v.last_price * (theProduct?.value_scale || 1);\n return {\n position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,\n datasource_id: 'HUOBI-SWAP',\n product_id,\n direction: v.direction === 'buy' ? 'LONG' : 'SHORT',\n volume: v.volume,\n free_volume: v.available,\n position_price: v.cost_hold,\n closable_price: v.last_price,\n floating_profit: v.profit_unreal,\n valuation,\n };\n });\n\n // orders\n // const orders: IOrder[] = [];\n // let page_index = 1;\n // const page_size = 50;\n\n // while (true) {\n // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });\n // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {\n // break;\n // }\n\n // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {\n // return {\n // order_id: v.order_id_str,\n // account_id: SWAP_ACCOUNT_ID,\n // product_id: v.contract_code,\n // order_type: ['lightning'].includes(v.order_price_type)\n // ? 'MARKET'\n // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(\n // v.order_price_type,\n // )\n // ? 'LIMIT'\n // : ['fok'].includes(v.order_price_type)\n // ? 'FOK'\n // : v.order_price_type.includes('ioc')\n // ? 'IOC'\n // : 'STOP', // unreachable code\n // order_direction:\n // v.direction === 'open'\n // ? v.offset === 'buy'\n // ? 'OPEN_LONG'\n // : 'OPEN_SHORT'\n // : v.offset === 'buy'\n // ? 'CLOSE_SHORT'\n // : 'CLOSE_LONG',\n // volume: v.volume,\n // submit_at: v.created_at,\n // price: v.price,\n // traded_volume: v.trade_volume,\n // };\n // });\n\n // orders.push(...pageOrders);\n // page_index++;\n // }\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n const superMarginUnifiedRawAccountBalance$ = defer(() =>\n client.getSpotAccountBalance(superMarginAccountUid),\n ).pipe(\n //\n map((res) => res.data),\n repeat({ delay: 1000 }),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'unifiedRaw', e);\n },\n }),\n retry({ delay: 5000 }),\n shareReplay(1),\n );\n\n const subscriptions: Set<string> = new Set();\n from(client.spot_ws.connection$).subscribe(() => {\n subscriptions.clear();\n });\n // subscribe the symbols of positions we held\n superMarginUnifiedRawAccountBalance$\n .pipe(\n //\n mergeMap((res) =>\n from(res?.list || []).pipe(\n filter((v) => v.currency !== 'usdt'),\n map((v) => v.currency),\n distinct(),\n toArray(),\n map((v) => new Set(v)),\n ),\n ),\n )\n .subscribe((v: Set<string>) => {\n const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));\n const toSubscribe = [...v].filter((x) => !subscriptions.has(x));\n\n for (const symbol of toUnsubscribe) {\n client.spot_ws.output$.next({\n unsub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.delete(symbol);\n }\n for (const symbol of toSubscribe) {\n client.spot_ws.output$.next({\n sub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.add(symbol);\n }\n });\n\n provideAccountInfoService(\n terminal,\n SUPER_MARGIN_ACCOUNT_ID,\n async () => {\n // get account balance\n const accountBalance = await client.getSpotAccountBalance(superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // calculate usdt balance\n const usdtBalance = balanceList\n .filter((v) => v.currency === 'usdt')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n // get positions (non-usdt currencies)\n const positions: IPosition[] = [];\n const nonUsdtCurrencies = balanceList\n .filter((v) => v.currency !== 'usdt')\n .reduce((acc, cur) => {\n const existing = acc.find((item) => item.currency === cur.currency);\n if (existing) {\n existing.balance += +cur.balance;\n } else {\n acc.push({ currency: cur.currency, balance: +cur.balance });\n }\n return acc;\n }, [] as { currency: string; balance: number }[]);\n\n // get prices and create positions\n for (const currencyData of nonUsdtCurrencies) {\n if (currencyData.balance > 0) {\n try {\n // get current price from websocket or fallback to REST API\n let price: number;\n try {\n const tickPrice = await firstValueFrom(\n client.spot_ws.input$.pipe(\n //\n first((v) => v.ch?.includes('ticker') && v.ch?.includes(currencyData.currency) && v.tick),\n map((v): number => v.tick.bid),\n timeout(5000),\n tap({\n error: (e) => {\n subscriptions.clear();\n },\n }),\n ),\n );\n price = tickPrice;\n } catch {\n // fallback to REST API\n const tickerRes = await client.getSpotTick({ symbol: `${currencyData.currency}usdt` });\n price = tickerRes.tick.close;\n }\n\n positions.push({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: `${currencyData.currency}usdt`,\n direction: 'LONG',\n volume: currencyData.balance,\n free_volume: currencyData.balance,\n position_price: price,\n closable_price: price,\n floating_profit: 0,\n valuation: currencyData.balance * price,\n });\n } catch (error) {\n console.warn(formatTime(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);\n }\n }\n }\n\n // calculate equity\n const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free: equity,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n provideAccountInfoService(\n terminal,\n SPOT_ACCOUNT_ID,\n async () => {\n const spotBalance = await client.getSpotAccountBalance(spotAccountUid);\n\n const equity = +(spotBalance.data.list.find((v) => v.currency === 'usdt')?.balance ?? 0);\n const free = equity;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n },\n { auto_refresh_interval: 1000 },\n );\n addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'HUOBI/SPOT' });\n addAccountMarket(terminal, { account_id: SUPER_MARGIN_ACCOUNT_ID, market_id: 'HUOBI/SUPER-MARGIN' });\n addAccountMarket(terminal, { account_id: SWAP_ACCOUNT_ID, market_id: 'HUOBI/SWAP' });\n\n // Submit order\n terminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: {\n enum: [SUPER_MARGIN_ACCOUNT_ID, SWAP_ACCOUNT_ID],\n },\n },\n },\n (msg) => {\n const { account_id: req_account_id } = msg.req;\n console.info(formatTime(Date.now()), `SubmitOrder for ${account_id}`, JSON.stringify(msg));\n\n if (req_account_id === SWAP_ACCOUNT_ID) {\n return defer(() => client.getSwapCrossPositionInfo()).pipe(\n mergeMap((res) => res.data),\n map((v) => [v.contract_code, v.lever_rate]),\n toArray(),\n map((v) => Object.fromEntries(v)),\n mergeMap((mapContractCodeToRate) => {\n const lever_rate = mapContractCodeToRate[msg.req.product_id] ?? 20;\n const params = {\n contract_code: msg.req.product_id,\n contract_type: 'swap',\n price: msg.req.price,\n volume: msg.req.volume,\n offset:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'OPEN_SHORT'\n ? 'open'\n : 'close',\n direction:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell',\n // dynamically adjust the leverage\n lever_rate,\n order_price_type: msg.req.order_type === 'MARKET' ? 'market' : 'limit',\n };\n return client.postSwapOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.status !== 'ok') {\n return { res: { code: 500, message: v.status } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n }\n // for super-margin orders, we need to denote the amount of usdt to borrow, therefore we need to:\n // 1. get the loanable amount\n // 2. get the current balance\n // 3. get the current price\n // 4. combine the information to submit the order\n return defer(() => client.getCrossMarginLoanInfo()).pipe(\n //\n mergeMap((res) => res.data),\n first((v) => v.currency === 'usdt'),\n map((v) => +v['loanable-amt']),\n combineLatestWith(\n superMarginUnifiedRawAccountBalance$.pipe(\n first(),\n mergeMap((res) =>\n from(res.list).pipe(\n // we only need the amount of usdt that can be used to trade\n filter((v) => v.currency === 'usdt' && v.type === 'trade'),\n reduce((acc, cur) => acc + +cur.balance, 0),\n ),\n ),\n ),\n ),\n combineLatestWith(spotProducts$.pipe(first())),\n mergeMap(async ([[loanable, balance], products]) => {\n const priceRes = await client.getSpotTick({ symbol: msg.req.product_id });\n const theProduct = products.find((v) => v.product_id === msg.req.product_id);\n const price: number = priceRes.tick.close;\n const borrow_amount =\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? Math.max(Math.min(loanable, msg.req.volume * price - balance), 0)\n : undefined;\n const params = {\n symbol: msg.req.product_id,\n 'account-id': '' + superMarginAccountUid,\n // amount: msg.req.type === OrderType.MARKET ? 0 : '' + msg.req.volume,\n // 'market-amount': msg.req.type === OrderType.MARKET ? '' + msg.req.volume : undefined,\n amount:\n '' +\n (msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? roundToStep(msg.req.volume * price, theProduct?.volume_step!)\n : msg.req.volume),\n 'borrow-amount': '' + borrow_amount,\n type: `${\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell'\n }-${'LIMIT' === msg.req.order_type ? 'limit' : 'market'}`,\n 'trade-purpose':\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? '1' // auto borrow\n : '2', // auto repay\n price: msg.req.order_type === 'MARKET' ? undefined : '' + msg.req.price,\n source: 'super-margin-api',\n };\n return client.postSpotOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.success === false) {\n return { res: { code: v.code, message: v.message } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n },\n );\n\n // Update Spot TRC20 Addresses (Only Main Account)\n if (isMainAccount) {\n const res = await client.getSpotAccountDepositAddresses({ currency: 'usdt' });\n const addresses = res.data.filter((v) => v.chain === 'trc20usdt').map((v) => v.address);\n\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n address: address,\n network_id: 'TRC20',\n onApply: {\n INIT: async (order) => {\n const res0 = await client.getV2ReferenceCurrencies({ currency: 'usdt' });\n const fee = res0.data\n .find((v) => v.currency === 'usdt')\n ?.chains.find((v) => v.chain === 'trc20usdt')?.transactFeeWithdraw;\n if (!fee) {\n return { state: 'ERROR', message: 'MISSING FEE' };\n }\n const res = await client.postWithdraw({\n address: order.current_rx_address!,\n amount: '' + (order.expected_amount - +fee),\n currency: 'usdt',\n fee: fee,\n chain: 'trc20usdt',\n });\n if (res.status != 'ok') {\n return { state: 'INIT', message: `${res.status}` };\n }\n return { state: 'PENDING', context: `${res.data}` };\n },\n PENDING: async (order) => {\n if (!order.current_tx_context) {\n return { state: 'ERROR', message: 'MISSING CONTEXT' };\n }\n const wdId = +order.current_tx_context;\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'withdraw',\n from: `${wdId}`,\n });\n const txId = res.data.find((v) => v.id === wdId)?.['tx-hash'];\n if (!txId) {\n return { state: 'PENDING', context: `${wdId}` };\n }\n return {\n state: 'COMPLETE',\n transaction_id: txId,\n };\n },\n },\n onEval: async (order) => {\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'deposit',\n direct: 'next',\n });\n\n const theItem = res.data.find(\n (v) => v['tx-hash'] === order.current_transaction_id && v.state === 'safe',\n );\n if (!theItem) {\n return { state: 'PENDING' };\n }\n return { received_amount: +theItem.amount, state: 'COMPLETE' };\n },\n });\n }\n }\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferInResult = await client.postSuperMarginAccountTransferIn({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferInResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SUPER_MARGIN_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SUPER_MARGIN',\n onApply: {\n INIT: async (order) => {\n const transferOutResult = await client.postSuperMarginAccountTransferOut({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferOutResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'spot',\n to: 'linear-swap',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SWAP_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SWAP',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'linear-swap',\n to: 'spot',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n if (isMainAccount) {\n for (const subAccount of subAccounts) {\n const SPOT_SUB_ACCOUNT_ID = `huobi/${subAccount.uid}/spot/usdt`;\n\n const SUB_ACCOUNT_NETWORK_ID = `Huobi/${huobiUid}/SubAccount/${subAccount.uid}`;\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: '#main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_rx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-out',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_SUB_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: `${subAccount.uid}`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_tx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-in',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n }\n }\n})();\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAa,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,cAAc,EACd,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,EAAE,EACF,MAAM,EACN,MAAM,EACN,KAAK,EACL,WAAW,EACX,GAAG,EACH,OAAO,EACP,OAAO,GACR,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,SAAS,CAAC;AAEjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,CAAC,KAAK,IAAI,EAAE;;IACV,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,yBAAyB,EAAE,CAAC;IACpE,IAAI,CAAA,MAAA,kBAAkB,CAAC,IAAI,0CAAE,YAAY,MAAK,CAAC,EAAE;QAC/C,OAAO,CAAC,IAAI,CACV,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,sBAAsB,EACtB,aAAa,kBAAkB,CAAC,IAAI,CAAC,YAAY,oCAAoC,CACtF,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,sBAAsB,EAAE,YAAY,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACzG;IAED,MAAM,QAAQ,GAAW,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEtD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAChD,MAAM,qBAAqB,GAAG,MAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,0CAAE,EAAG,CAAC;IAC7F,MAAM,cAAc,GAAG,MAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,0CAAE,EAAG,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpF,MAAM,UAAU,GAAG,SAAS,QAAQ,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,GAAG,UAAU,YAAY,CAAC;IAClD,MAAM,uBAAuB,GAAG,GAAG,UAAU,eAAe,CAAC;IAC7D,MAAM,eAAe,GAAG,GAAG,UAAU,OAAO,CAAC;IAE7C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;IAClD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC;IACrC,MAAM,aAAa,GAAG,WAAW,CAAC,EAAE,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAEjF,yBAAyB,CACvB,QAAQ,EACR,eAAe,EACf,KAAK,IAAI,EAAE;QACT,UAAU;QACV,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;SACvD;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;SAC7D;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,kBAAkB,CAAC;QAE5C,YAAY;QACZ,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,wBAAwB,EAAE,CAAC;QAC7D,MAAM,8BAA8B,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;QACvG,MAAM,SAAS,GAAgB,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAa,EAAE;YAC5E,MAAM,UAAU,GAAG,CAAC,CAAC,aAAa,CAAC;YACnC,MAAM,UAAU,GAAG,8BAA8B,aAA9B,8BAA8B,uBAA9B,8BAA8B,CAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,KAAI,CAAC,CAAC,CAAC;YAC3E,OAAO;gBACL,WAAW,EAAE,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,WAAW,EAAE;gBACpF,aAAa,EAAE,YAAY;gBAC3B,UAAU;gBACV,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;gBACnD,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,CAAC,CAAC,SAAS;gBACxB,cAAc,EAAE,CAAC,CAAC,SAAS;gBAC3B,cAAc,EAAE,CAAC,CAAC,UAAU;gBAC5B,eAAe,EAAE,CAAC,CAAC,aAAa;gBAChC,SAAS;aACV,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAS;QACT,+BAA+B;QAC/B,sBAAsB;QACtB,wBAAwB;QAExB,iBAAiB;QACjB,iFAAiF;QACjF,yEAAyE;QACzE,aAAa;QACb,MAAM;QAEN,4EAA4E;QAC5E,eAAe;QACf,kCAAkC;QAClC,qCAAqC;QACrC,qCAAqC;QACrC,+DAA+D;QAC/D,qBAAqB;QACrB,kGAAkG;QAClG,kCAAkC;QAClC,cAAc;QACd,oBAAoB;QACpB,iDAAiD;QACjD,kBAAkB;QAClB,+CAA+C;QAC/C,kBAAkB;QAClB,wCAAwC;QACxC,yBAAyB;QACzB,iCAAiC;QACjC,iCAAiC;QACjC,4BAA4B;QAC5B,6BAA6B;QAC7B,iCAAiC;QACjC,4BAA4B;QAC5B,4BAA4B;QAC5B,0BAA0B;QAC1B,iCAAiC;QACjC,wBAAwB;QACxB,uCAAuC;QACvC,SAAS;QACT,QAAQ;QAER,gCAAgC;QAChC,kBAAkB;QAClB,IAAI;QAEJ,OAAO;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM;gBAChB,MAAM;gBACN,IAAI;aACL;YACD,SAAS;SACV,CAAC;IACJ,CAAC,EACD,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAChC,CAAC;IAEF,MAAM,oCAAoC,GAAG,KAAK,CAAC,GAAG,EAAE,CACtD,MAAM,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CACpD,CAAC,IAAI;IACJ,EAAE;IACF,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EACtB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,GAAG,CAAC;QACF,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,EACF,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;IAEF,MAAM,aAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QAC9C,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,6CAA6C;IAC7C,oCAAoC;SACjC,IAAI;IACH,EAAE;IACF,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,KAAI,EAAE,CAAC,CAAC,IAAI,CACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,EACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EACtB,QAAQ,EAAE,EACV,OAAO,EAAE,EACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CACvB,CACF,CACF;SACA,SAAS,CAAC,CAAC,CAAc,EAAE,EAAE;QAC5B,MAAM,aAAa,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhE,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE;YAClC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,UAAU,MAAM,aAAa;aACrC,CAAC,CAAC;YACH,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC9B;QACD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE;YAChC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC1B,GAAG,EAAE,UAAU,MAAM,aAAa;aACnC,CAAC,CAAC;YACH,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC3B;IACH,CAAC,CAAC,CAAC;IAEL,yBAAyB,CACvB,QAAQ,EACR,uBAAuB,EACvB,KAAK,IAAI,EAAE;;QACT,sBAAsB;QACtB,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAE,IAAI,KAAI,EAAE,CAAC;QAEpD,yBAAyB;QACzB,MAAM,WAAW,GAAG,WAAW;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;aACpC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE/C,sCAAsC;QACtC,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,MAAM,iBAAiB,GAAG,WAAW;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;aACpC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpE,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;aAClC;iBAAM;gBACL,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;aAC7D;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAA6C,CAAC,CAAC;QAEpD,kCAAkC;QAClC,KAAK,MAAM,YAAY,IAAI,iBAAiB,EAAE;YAC5C,IAAI,YAAY,CAAC,OAAO,GAAG,CAAC,EAAE;gBAC5B,IAAI;oBACF,2DAA2D;oBAC3D,IAAI,KAAa,CAAC;oBAClB,IAAI;wBACF,MAAM,SAAS,GAAG,MAAM,cAAc,CACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;wBACxB,EAAE;wBACF,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,eAAC,OAAA,CAAA,MAAA,CAAC,CAAC,EAAE,0CAAE,QAAQ,CAAC,QAAQ,CAAC,MAAI,MAAA,CAAC,CAAC,EAAE,0CAAE,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA,IAAI,CAAC,CAAC,IAAI,CAAA,EAAA,CAAC,EACzF,GAAG,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAC9B,OAAO,CAAC,IAAI,CAAC,EACb,GAAG,CAAC;4BACF,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;gCACX,aAAa,CAAC,KAAK,EAAE,CAAC;4BACxB,CAAC;yBACF,CAAC,CACH,CACF,CAAC;wBACF,KAAK,GAAG,SAAS,CAAC;qBACnB;oBAAC,WAAM;wBACN,uBAAuB;wBACvB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC;wBACvF,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;qBAC9B;oBAED,SAAS,CAAC,IAAI,CAAC;wBACb,WAAW,EAAE,GAAG,YAAY,CAAC,QAAQ,YAAY;wBACjD,UAAU,EAAE,GAAG,YAAY,CAAC,QAAQ,MAAM;wBAC1C,SAAS,EAAE,MAAM;wBACjB,MAAM,EAAE,YAAY,CAAC,OAAO;wBAC5B,WAAW,EAAE,YAAY,CAAC,OAAO;wBACjC,cAAc,EAAE,KAAK;wBACrB,cAAc,EAAE,KAAK;wBACrB,eAAe,EAAE,CAAC;wBAClB,SAAS,EAAE,YAAY,CAAC,OAAO,GAAG,KAAK;qBACxC,CAAC,CAAC;iBACJ;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,2BAA2B,YAAY,CAAC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;iBAClG;aACF;SACF;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC;QAEtG,OAAO;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM;gBAChB,MAAM;gBACN,IAAI,EAAE,MAAM;aACb;YACD,SAAS;SACV,CAAC;IACJ,CAAC,EACD,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAChC,CAAC;IAEF,yBAAyB,CACvB,QAAQ,EACR,eAAe,EACf,KAAK,IAAI,EAAE;;QACT,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAA,MAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,0CAAE,OAAO,mCAAI,CAAC,CAAC,CAAC;QACzF,MAAM,IAAI,GAAG,MAAM,CAAC;QACpB,OAAO;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM;gBAChB,MAAM;gBACN,IAAI;aACL;YACD,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC,EACD,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAChC,CAAC;IACF,gBAAgB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IACrF,gBAAgB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,uBAAuB,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACrG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IAErF,eAAe;IACf,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,aAAa,EACb;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,CAAC,uBAAuB,EAAE,eAAe,CAAC;aACjD;SACF;KACF,EACD,CAAC,GAAG,EAAE,EAAE;QACN,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,mBAAmB,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3F,IAAI,cAAc,KAAK,eAAe,EAAE;YACtC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CACxD,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,EAC3C,OAAO,EAAE,EACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACjC,QAAQ,CAAC,CAAC,qBAAqB,EAAE,EAAE;;gBACjC,MAAM,UAAU,GAAG,MAAA,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,mCAAI,EAAE,CAAC;gBACnE,MAAM,MAAM,GAAG;oBACb,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU;oBACjC,aAAa,EAAE,MAAM;oBACrB,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK;oBACpB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM;oBACtB,MAAM,EACJ,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,YAAY;wBACjF,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,OAAO;oBACb,SAAS,EACP,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,aAAa;wBAClF,CAAC,CAAC,KAAK;wBACP,CAAC,CAAC,MAAM;oBACZ,kCAAkC;oBAClC,UAAU;oBACV,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;iBACvE,CAAC;gBACF,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC7C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC/F,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACR,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE;oBACrB,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;iBAClD;gBACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YAC7C,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACrD,CAAC,CAAC,CACH,CAAC;SACH;QACD,iGAAiG;QACjG,6BAA6B;QAC7B,6BAA6B;QAC7B,2BAA2B;QAC3B,iDAAiD;QACjD,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,IAAI;QACtD,EAAE;QACF,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3B,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,EACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAC9B,iBAAiB,CACf,oCAAoC,CAAC,IAAI,CACvC,KAAK,EAAE,EACP,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI;QACjB,4DAA4D;QAC5D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAC1D,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAC5C,CACF,CACF,CACF,EACD,iBAAiB,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAC1E,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,qBAAqB,CAAC,EAAE,EAAE;YAC9D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACjE,MAAM,KAAK,GAAW,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1C,MAAM,aAAa,GACjB,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,aAAa;gBAClF,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnE,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,MAAM,GAAG;gBACb,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU;gBAC1B,YAAY,EAAE,EAAE,GAAG,qBAAqB;gBACxC,uEAAuE;gBACvE,wFAAwF;gBACxF,MAAM,EACJ,EAAE;oBACF,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,aAAa;wBACnF,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAY,CAAC;wBAC/D,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;gBACrB,eAAe,EAAE,EAAE,GAAG,aAAa;gBACnC,IAAI,EAAE,GACJ,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,aAAa;oBAClF,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,MACN,IAAI,OAAO,KAAK,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACzD,eAAe,EACb,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,aAAa;oBAClF,CAAC,CAAC,GAAG,CAAC,cAAc;oBACpB,CAAC,CAAC,GAAG;gBACT,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK;gBACvE,MAAM,EAAE,kBAAkB;aAC3B,CAAC;YACF,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC7C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/F,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACR,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE;gBACvB,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;aACtD;YACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7C,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,kDAAkD;IAClD,IAAI,aAAa,EAAE;QACjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAExF,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE;YAC/B,yBAAyB,CAAC;gBACxB,QAAQ;gBACR,UAAU,EAAE,eAAe;gBAC3B,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,OAAO;gBAChB,UAAU,EAAE,OAAO;gBACnB,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;;wBACpB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;wBACzE,MAAM,GAAG,GAAG,MAAA,MAAA,IAAI,CAAC,IAAI;6BAClB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,0CACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,0CAAE,mBAAmB,CAAC;wBACrE,IAAI,CAAC,GAAG,EAAE;4BACR,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;yBACnD;wBACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;4BACpC,OAAO,EAAE,KAAK,CAAC,kBAAmB;4BAClC,MAAM,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC;4BAC3C,QAAQ,EAAE,MAAM;4BAChB,GAAG,EAAE,GAAG;4BACR,KAAK,EAAE,WAAW;yBACnB,CAAC,CAAC;wBACH,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE;4BACtB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;yBACpD;wBACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;oBACtD,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;;wBACvB,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;4BAC7B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;yBACvD;wBACD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC;wBACvC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC;4BACjD,QAAQ,EAAE,MAAM;4BAChB,IAAI,EAAE,UAAU;4BAChB,IAAI,EAAE,GAAG,IAAI,EAAE;yBAChB,CAAC,CAAC;wBACH,MAAM,IAAI,GAAG,MAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,0CAAG,SAAS,CAAC,CAAC;wBAC9D,IAAI,CAAC,IAAI,EAAE;4BACT,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;yBACjD;wBACD,OAAO;4BACL,KAAK,EAAE,UAAU;4BACjB,cAAc,EAAE,IAAI;yBACrB,CAAC;oBACJ,CAAC;iBACF;gBACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC;wBACjD,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,MAAM;qBACf,CAAC,CAAC;oBAEH,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,sBAAsB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAC3E,CAAC;oBACF,IAAI,CAAC,OAAO,EAAE;wBACZ,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;qBAC7B;oBACD,OAAO,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;gBACjE,CAAC;aACF,CAAC,CAAC;SACJ;KACF;IAED,yBAAyB,CAAC;QACxB,QAAQ;QACR,UAAU,EAAE,eAAe;QAC3B,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,SAAS,QAAQ,oBAAoB;QACjD,OAAO,EAAE,MAAM;QACf,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpB,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC;oBACrE,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,CAAC;iBAC7D,CAAC,CAAC;gBACH,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI,EAAE;oBACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;iBAC1B;gBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAC/B,CAAC;SACF;QACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACtB,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC/F,CAAC;KACF,CAAC,CAAC;IAEH,yBAAyB,CAAC;QACxB,QAAQ;QACR,UAAU,EAAE,uBAAuB;QACnC,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,SAAS,QAAQ,oBAAoB;QACjD,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpB,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC;oBACvE,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,CAAC;iBAC7D,CAAC,CAAC;gBACH,IAAI,iBAAiB,CAAC,MAAM,KAAK,IAAI,EAAE;oBACrC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;iBAC1B;gBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAC/B,CAAC;SACF;QACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACtB,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC/F,CAAC;KACF,CAAC,CAAC;IAEH,yBAAyB,CAAC;QACxB,QAAQ;QACR,UAAU,EAAE,eAAe;QAC3B,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,SAAS,QAAQ,YAAY;QACzC,OAAO,EAAE,MAAM;QACf,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpB,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC;oBAC1D,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,aAAa;oBACjB,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe;oBACrD,gBAAgB,EAAE,MAAM;iBACzB,CAAC,CAAC;gBACH,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;oBAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;iBAC1B;gBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAC/B,CAAC;SACF;QACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACtB,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC/F,CAAC;KACF,CAAC,CAAC;IAEH,yBAAyB,CAAC;QACxB,QAAQ;QACR,UAAU,EAAE,eAAe;QAC3B,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,SAAS,QAAQ,YAAY;QACzC,OAAO,EAAE,MAAM;QACf,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACpB,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC;oBAC1D,IAAI,EAAE,aAAa;oBACnB,EAAE,EAAE,MAAM;oBACV,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe;oBACrD,gBAAgB,EAAE,MAAM;iBACzB,CAAC,CAAC;gBACH,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;oBAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;iBAC1B;gBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAC/B,CAAC;SACF;QACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACtB,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC/F,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,aAAa,EAAE;QACjB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YACpC,MAAM,mBAAmB,GAAG,SAAS,UAAU,CAAC,GAAG,YAAY,CAAC;YAEhE,MAAM,sBAAsB,GAAG,SAAS,QAAQ,eAAe,UAAU,CAAC,GAAG,EAAE,CAAC;YAChF,yBAAyB,CAAC;gBACxB,QAAQ;gBACR,UAAU,EAAE,eAAe;gBAC3B,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,sBAAsB;gBAClC,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;wBACpB,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC;4BACtD,SAAS,EAAE,CAAC,KAAK,CAAC,kBAAmB;4BACrC,QAAQ,EAAE,MAAM;4BAChB,MAAM,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe;4BACrD,IAAI,EAAE,qBAAqB;yBAC5B,CAAC,CAAC;wBACH,IAAI,cAAc,CAAC,MAAM,KAAK,IAAI,EAAE;4BAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;yBAC1B;wBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;oBAC/B,CAAC;iBACF;gBACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtB,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;gBAC/F,CAAC;aACF,CAAC,CAAC;YACH,yBAAyB,CAAC;gBACxB,QAAQ;gBACR,UAAU,EAAE,mBAAmB;gBAC/B,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,sBAAsB;gBAClC,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;wBACpB,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC;4BACtD,SAAS,EAAE,CAAC,KAAK,CAAC,kBAAmB;4BACrC,QAAQ,EAAE,MAAM;4BAChB,MAAM,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe;4BACrD,IAAI,EAAE,oBAAoB;yBAC3B,CAAC,CAAC;wBACH,IAAI,cAAc,CAAC,MAAM,KAAK,IAAI,EAAE;4BAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;yBAC1B;wBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;oBAC/B,CAAC;iBACF;gBACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtB,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;gBAC/F,CAAC;aACF,CAAC,CAAC;SACJ;KACF;AACH,CAAC,CAAC,EAAE,CAAC","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime, roundToStep } from '@yuants/utils';\nimport {\n catchError,\n combineLatestWith,\n defer,\n distinct,\n filter,\n first,\n firstValueFrom,\n from,\n map,\n mergeMap,\n of,\n reduce,\n repeat,\n retry,\n shareReplay,\n tap,\n timeout,\n toArray,\n} from 'rxjs';\nimport { client } from './api';\nimport './interest_rate';\nimport { spotProductService, swapProductService } from './product';\nimport './quote';\n\nconst terminal = Terminal.fromNodeEnv();\n\n(async () => {\n const swapAccountTypeRes = await client.getSwapUnifiedAccountType();\n if (swapAccountTypeRes.data?.account_type === 1) {\n console.info(\n formatTime(Date.now()),\n 'SwitchingAccountType',\n `previous: ${swapAccountTypeRes.data.account_type}, switching to 2 (unified account)`,\n );\n const switchRes = await client.postSwapSwitchAccountType({ account_type: 2 });\n console.info(formatTime(Date.now()), 'SwitchingAccountType', `current: ${switchRes.data.account_type}`);\n }\n\n const huobiUid: number = (await client.getUid()).data;\n console.info(formatTime(Date.now()), 'UID', huobiUid);\n\n const huobiAccounts = await client.getAccount();\n const superMarginAccountUid = huobiAccounts.data.find((v) => v.type === 'super-margin')?.id!;\n const spotAccountUid = huobiAccounts.data.find((v) => v.type === 'spot')?.id!;\n console.info(formatTime(Date.now()), 'huobiAccount', JSON.stringify(huobiAccounts));\n\n const account_id = `huobi/${huobiUid}`;\n const SPOT_ACCOUNT_ID = `${account_id}/spot/usdt`;\n const SUPER_MARGIN_ACCOUNT_ID = `${account_id}/super-margin`;\n const SWAP_ACCOUNT_ID = `${account_id}/swap`;\n\n const subUsersRes = await client.getSubUserList();\n const subAccounts = subUsersRes.data;\n const isMainAccount = subUsersRes.ok;\n console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));\n\n provideAccountInfoService(\n terminal,\n SWAP_ACCOUNT_ID,\n async () => {\n // balance\n const balance = await client.getUnifiedAccountInfo();\n if (!balance.data) {\n throw new Error('Failed to get unified account info');\n }\n const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');\n if (!balanceData) {\n throw new Error('No USDT balance found in unified account');\n }\n const equity = balanceData.margin_balance;\n const free = balanceData.withdraw_available;\n\n // positions\n const positionsRes = await client.getSwapCrossPositionInfo();\n const mapProductIdToPerpetualProduct = await firstValueFrom(swapProductService.mapProductIdToProduct$);\n const positions: IPosition[] = (positionsRes.data || []).map((v): IPosition => {\n const product_id = v.contract_code;\n const theProduct = mapProductIdToPerpetualProduct?.get(product_id);\n const valuation = v.volume * v.last_price * (theProduct?.value_scale || 1);\n return {\n position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,\n datasource_id: 'HUOBI-SWAP',\n product_id,\n direction: v.direction === 'buy' ? 'LONG' : 'SHORT',\n volume: v.volume,\n free_volume: v.available,\n position_price: v.cost_hold,\n closable_price: v.last_price,\n floating_profit: v.profit_unreal,\n valuation,\n };\n });\n\n // orders\n // const orders: IOrder[] = [];\n // let page_index = 1;\n // const page_size = 50;\n\n // while (true) {\n // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });\n // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {\n // break;\n // }\n\n // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {\n // return {\n // order_id: v.order_id_str,\n // account_id: SWAP_ACCOUNT_ID,\n // product_id: v.contract_code,\n // order_type: ['lightning'].includes(v.order_price_type)\n // ? 'MARKET'\n // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(\n // v.order_price_type,\n // )\n // ? 'LIMIT'\n // : ['fok'].includes(v.order_price_type)\n // ? 'FOK'\n // : v.order_price_type.includes('ioc')\n // ? 'IOC'\n // : 'STOP', // unreachable code\n // order_direction:\n // v.direction === 'open'\n // ? v.offset === 'buy'\n // ? 'OPEN_LONG'\n // : 'OPEN_SHORT'\n // : v.offset === 'buy'\n // ? 'CLOSE_SHORT'\n // : 'CLOSE_LONG',\n // volume: v.volume,\n // submit_at: v.created_at,\n // price: v.price,\n // traded_volume: v.trade_volume,\n // };\n // });\n\n // orders.push(...pageOrders);\n // page_index++;\n // }\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n const superMarginUnifiedRawAccountBalance$ = defer(() =>\n client.getSpotAccountBalance(superMarginAccountUid),\n ).pipe(\n //\n map((res) => res.data),\n repeat({ delay: 1000 }),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'unifiedRaw', e);\n },\n }),\n retry({ delay: 5000 }),\n shareReplay(1),\n );\n\n const subscriptions: Set<string> = new Set();\n from(client.spot_ws.connection$).subscribe(() => {\n subscriptions.clear();\n });\n // subscribe the symbols of positions we held\n superMarginUnifiedRawAccountBalance$\n .pipe(\n //\n mergeMap((res) =>\n from(res?.list || []).pipe(\n filter((v) => v.currency !== 'usdt'),\n map((v) => v.currency),\n distinct(),\n toArray(),\n map((v) => new Set(v)),\n ),\n ),\n )\n .subscribe((v: Set<string>) => {\n const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));\n const toSubscribe = [...v].filter((x) => !subscriptions.has(x));\n\n for (const symbol of toUnsubscribe) {\n client.spot_ws.output$.next({\n unsub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.delete(symbol);\n }\n for (const symbol of toSubscribe) {\n client.spot_ws.output$.next({\n sub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.add(symbol);\n }\n });\n\n provideAccountInfoService(\n terminal,\n SUPER_MARGIN_ACCOUNT_ID,\n async () => {\n // get account balance\n const accountBalance = await client.getSpotAccountBalance(superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // calculate usdt balance\n const usdtBalance = balanceList\n .filter((v) => v.currency === 'usdt')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n // get positions (non-usdt currencies)\n const positions: IPosition[] = [];\n const nonUsdtCurrencies = balanceList\n .filter((v) => v.currency !== 'usdt')\n .reduce((acc, cur) => {\n const existing = acc.find((item) => item.currency === cur.currency);\n if (existing) {\n existing.balance += +cur.balance;\n } else {\n acc.push({ currency: cur.currency, balance: +cur.balance });\n }\n return acc;\n }, [] as { currency: string; balance: number }[]);\n\n // get prices and create positions\n for (const currencyData of nonUsdtCurrencies) {\n if (currencyData.balance > 0) {\n try {\n // get current price from websocket or fallback to REST API\n let price: number;\n try {\n const tickPrice = await firstValueFrom(\n client.spot_ws.input$.pipe(\n //\n first((v) => v.ch?.includes('ticker') && v.ch?.includes(currencyData.currency) && v.tick),\n map((v): number => v.tick.bid),\n timeout(5000),\n tap({\n error: (e) => {\n subscriptions.clear();\n },\n }),\n ),\n );\n price = tickPrice;\n } catch {\n // fallback to REST API\n const tickerRes = await client.getSpotTick({ symbol: `${currencyData.currency}usdt` });\n price = tickerRes.tick.close;\n }\n\n positions.push({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: `${currencyData.currency}usdt`,\n direction: 'LONG',\n volume: currencyData.balance,\n free_volume: currencyData.balance,\n position_price: price,\n closable_price: price,\n floating_profit: 0,\n valuation: currencyData.balance * price,\n });\n } catch (error) {\n console.warn(formatTime(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);\n }\n }\n }\n\n // calculate equity\n const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free: equity,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n provideAccountInfoService(\n terminal,\n SPOT_ACCOUNT_ID,\n async () => {\n const spotBalance = await client.getSpotAccountBalance(spotAccountUid);\n\n const equity = +(spotBalance.data.list.find((v) => v.currency === 'usdt')?.balance ?? 0);\n const free = equity;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n },\n { auto_refresh_interval: 1000 },\n );\n addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'HUOBI/SPOT' });\n addAccountMarket(terminal, { account_id: SUPER_MARGIN_ACCOUNT_ID, market_id: 'HUOBI/SUPER-MARGIN' });\n addAccountMarket(terminal, { account_id: SWAP_ACCOUNT_ID, market_id: 'HUOBI/SWAP' });\n\n // Submit order\n terminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: {\n enum: [SUPER_MARGIN_ACCOUNT_ID, SWAP_ACCOUNT_ID],\n },\n },\n },\n (msg) => {\n const { account_id: req_account_id } = msg.req;\n console.info(formatTime(Date.now()), `SubmitOrder for ${account_id}`, JSON.stringify(msg));\n\n if (req_account_id === SWAP_ACCOUNT_ID) {\n return defer(() => client.getSwapCrossPositionInfo()).pipe(\n mergeMap((res) => res.data),\n map((v) => [v.contract_code, v.lever_rate]),\n toArray(),\n map((v) => Object.fromEntries(v)),\n mergeMap((mapContractCodeToRate) => {\n const lever_rate = mapContractCodeToRate[msg.req.product_id] ?? 20;\n const params = {\n contract_code: msg.req.product_id,\n contract_type: 'swap',\n price: msg.req.price,\n volume: msg.req.volume,\n offset:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'OPEN_SHORT'\n ? 'open'\n : 'close',\n direction:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell',\n // dynamically adjust the leverage\n lever_rate,\n order_price_type: msg.req.order_type === 'MARKET' ? 'market' : 'limit',\n };\n return client.postSwapOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.status !== 'ok') {\n return { res: { code: 500, message: v.status } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n }\n // for super-margin orders, we need to denote the amount of usdt to borrow, therefore we need to:\n // 1. get the loanable amount\n // 2. get the current balance\n // 3. get the current price\n // 4. combine the information to submit the order\n return defer(() => client.getCrossMarginLoanInfo()).pipe(\n //\n mergeMap((res) => res.data),\n first((v) => v.currency === 'usdt'),\n map((v) => +v['loanable-amt']),\n combineLatestWith(\n superMarginUnifiedRawAccountBalance$.pipe(\n first(),\n mergeMap((res) =>\n from(res.list).pipe(\n // we only need the amount of usdt that can be used to trade\n filter((v) => v.currency === 'usdt' && v.type === 'trade'),\n reduce((acc, cur) => acc + +cur.balance, 0),\n ),\n ),\n ),\n ),\n combineLatestWith(spotProductService.mapProductIdToProduct$.pipe(first())),\n mergeMap(async ([[loanable, balance], mapProductIdToProduct]) => {\n const priceRes = await client.getSpotTick({ symbol: msg.req.product_id });\n const theProduct = mapProductIdToProduct.get(msg.req.product_id);\n const price: number = priceRes.tick.close;\n const borrow_amount =\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? Math.max(Math.min(loanable, msg.req.volume * price - balance), 0)\n : undefined;\n const params = {\n symbol: msg.req.product_id,\n 'account-id': '' + superMarginAccountUid,\n // amount: msg.req.type === OrderType.MARKET ? 0 : '' + msg.req.volume,\n // 'market-amount': msg.req.type === OrderType.MARKET ? '' + msg.req.volume : undefined,\n amount:\n '' +\n (msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? roundToStep(msg.req.volume * price, theProduct?.volume_step!)\n : msg.req.volume),\n 'borrow-amount': '' + borrow_amount,\n type: `${\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell'\n }-${'LIMIT' === msg.req.order_type ? 'limit' : 'market'}`,\n 'trade-purpose':\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? '1' // auto borrow\n : '2', // auto repay\n price: msg.req.order_type === 'MARKET' ? undefined : '' + msg.req.price,\n source: 'super-margin-api',\n };\n return client.postSpotOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.success === false) {\n return { res: { code: v.code, message: v.message } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n },\n );\n\n // Update Spot TRC20 Addresses (Only Main Account)\n if (isMainAccount) {\n const res = await client.getSpotAccountDepositAddresses({ currency: 'usdt' });\n const addresses = res.data.filter((v) => v.chain === 'trc20usdt').map((v) => v.address);\n\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n address: address,\n network_id: 'TRC20',\n onApply: {\n INIT: async (order) => {\n const res0 = await client.getV2ReferenceCurrencies({ currency: 'usdt' });\n const fee = res0.data\n .find((v) => v.currency === 'usdt')\n ?.chains.find((v) => v.chain === 'trc20usdt')?.transactFeeWithdraw;\n if (!fee) {\n return { state: 'ERROR', message: 'MISSING FEE' };\n }\n const res = await client.postWithdraw({\n address: order.current_rx_address!,\n amount: '' + (order.expected_amount - +fee),\n currency: 'usdt',\n fee: fee,\n chain: 'trc20usdt',\n });\n if (res.status != 'ok') {\n return { state: 'INIT', message: `${res.status}` };\n }\n return { state: 'PENDING', context: `${res.data}` };\n },\n PENDING: async (order) => {\n if (!order.current_tx_context) {\n return { state: 'ERROR', message: 'MISSING CONTEXT' };\n }\n const wdId = +order.current_tx_context;\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'withdraw',\n from: `${wdId}`,\n });\n const txId = res.data.find((v) => v.id === wdId)?.['tx-hash'];\n if (!txId) {\n return { state: 'PENDING', context: `${wdId}` };\n }\n return {\n state: 'COMPLETE',\n transaction_id: txId,\n };\n },\n },\n onEval: async (order) => {\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'deposit',\n direct: 'next',\n });\n\n const theItem = res.data.find(\n (v) => v['tx-hash'] === order.current_transaction_id && v.state === 'safe',\n );\n if (!theItem) {\n return { state: 'PENDING' };\n }\n return { received_amount: +theItem.amount, state: 'COMPLETE' };\n },\n });\n }\n }\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferInResult = await client.postSuperMarginAccountTransferIn({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferInResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SUPER_MARGIN_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SUPER_MARGIN',\n onApply: {\n INIT: async (order) => {\n const transferOutResult = await client.postSuperMarginAccountTransferOut({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferOutResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'spot',\n to: 'linear-swap',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SWAP_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SWAP',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'linear-swap',\n to: 'spot',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n if (isMainAccount) {\n for (const subAccount of subAccounts) {\n const SPOT_SUB_ACCOUNT_ID = `huobi/${subAccount.uid}/spot/usdt`;\n\n const SUB_ACCOUNT_NETWORK_ID = `Huobi/${huobiUid}/SubAccount/${subAccount.uid}`;\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: '#main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_rx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-out',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_SUB_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: `${subAccount.uid}`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_tx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-in',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n }\n }\n})();\n"]}
|
package/dist/product.js
CHANGED
|
@@ -1,30 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { provideQueryProductsService } from '@yuants/data-product';
|
|
2
2
|
import { Terminal } from '@yuants/protocol';
|
|
3
|
-
import { createSQLWriter } from '@yuants/sql';
|
|
4
|
-
import { defer, filter, map, mergeMap, repeat, retry, shareReplay, Subject, toArray } from 'rxjs';
|
|
5
3
|
import { client } from './api';
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
const productIdToMaxLeverage = createCache(async (product_id, force_update) => {
|
|
4
|
+
const terminal = Terminal.fromNodeEnv();
|
|
5
|
+
// Provide QueryProducts service for swap products
|
|
6
|
+
export const swapProductService = provideQueryProductsService(terminal, 'HUOBI-SWAP', async (req) => {
|
|
11
7
|
var _a;
|
|
12
|
-
const res = await cacheOfCrossLeverage.query('', force_update);
|
|
13
|
-
return (_a = res === null || res === void 0 ? void 0 : res.data.find((x) => x.contract_code === product_id)) === null || _a === void 0 ? void 0 : _a.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);
|
|
14
|
-
}, {
|
|
15
|
-
expire: 3600000, // 1 hour
|
|
16
|
-
});
|
|
17
|
-
const swapSymbols = createCache(() => client.getPerpetualContractSymbols(), {
|
|
18
|
-
expire: 3600000,
|
|
19
|
-
});
|
|
20
|
-
const swapProducts = createCache(async (_, force_update) => {
|
|
21
8
|
const products = [];
|
|
22
|
-
|
|
23
|
-
|
|
9
|
+
// Get perpetual contract products and cross leverage data in parallel
|
|
10
|
+
const [swapSymbols, crossLeverage] = await Promise.all([
|
|
11
|
+
client.getPerpetualContractSymbols(),
|
|
12
|
+
client.getSwapCrossLadderMargin(),
|
|
13
|
+
]);
|
|
14
|
+
for (const symbol of (swapSymbols === null || swapSymbols === void 0 ? void 0 : swapSymbols.data) || []) {
|
|
24
15
|
if (symbol.contract_status !== 1)
|
|
25
16
|
continue; // Only include active contracts
|
|
26
|
-
const maxLeverage =
|
|
27
|
-
|
|
17
|
+
const maxLeverage = (_a = crossLeverage === null || crossLeverage === void 0 ? void 0 : crossLeverage.data.find((x) => x.contract_code === symbol.contract_code)) === null || _a === void 0 ? void 0 : _a.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);
|
|
18
|
+
products.push({
|
|
28
19
|
datasource_id: 'HUOBI-SWAP',
|
|
29
20
|
product_id: symbol.contract_code,
|
|
30
21
|
base_currency: symbol.symbol,
|
|
@@ -43,41 +34,43 @@ const swapProducts = createCache(async (_, force_update) => {
|
|
|
43
34
|
allow_short: true,
|
|
44
35
|
market_id: 'HUOBI/SWAP',
|
|
45
36
|
no_interest_rate: false,
|
|
46
|
-
};
|
|
47
|
-
products.push(product);
|
|
48
|
-
product$.next(product);
|
|
37
|
+
});
|
|
49
38
|
}
|
|
50
39
|
return products;
|
|
51
40
|
}, {
|
|
52
|
-
|
|
41
|
+
auto_refresh_interval: 3600000,
|
|
53
42
|
});
|
|
54
|
-
|
|
55
|
-
export const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
43
|
+
// Provide QueryProducts service for spot products
|
|
44
|
+
export const spotProductService = provideQueryProductsService(terminal, 'HUOBI-SPOT', async (req) => {
|
|
45
|
+
const products = [];
|
|
46
|
+
// Get spot products
|
|
47
|
+
const spotSymbols = await client.getSpotSymbols();
|
|
48
|
+
for (const symbol of (spotSymbols === null || spotSymbols === void 0 ? void 0 : spotSymbols.data) || []) {
|
|
49
|
+
if (symbol.state !== 'online')
|
|
50
|
+
continue; // Only include online symbols
|
|
51
|
+
products.push({
|
|
52
|
+
datasource_id: 'HUOBI-SPOT',
|
|
53
|
+
product_id: symbol.sc,
|
|
54
|
+
base_currency: symbol.bc,
|
|
55
|
+
quote_currency: symbol.qc,
|
|
56
|
+
value_scale: 1,
|
|
57
|
+
price_step: 1 / 10 ** symbol.tpp,
|
|
58
|
+
volume_step: 1 / 10 ** symbol.tap,
|
|
59
|
+
name: '',
|
|
60
|
+
value_scale_unit: '',
|
|
61
|
+
margin_rate: 1,
|
|
62
|
+
value_based_cost: 0,
|
|
63
|
+
volume_based_cost: 0,
|
|
64
|
+
max_position: 0,
|
|
65
|
+
max_volume: 0,
|
|
66
|
+
allow_long: true,
|
|
67
|
+
allow_short: false,
|
|
68
|
+
market_id: 'HUOBI/SPOT',
|
|
69
|
+
no_interest_rate: true,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return products;
|
|
73
|
+
}, {
|
|
74
|
+
auto_refresh_interval: 3600000,
|
|
82
75
|
});
|
|
83
76
|
//# sourceMappingURL=product.js.map
|
package/dist/product.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct, IQueryProductsRequest, provideQueryProductsService } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\n// Provide QueryProducts service for swap products\nexport const swapProductService = provideQueryProductsService(\n terminal,\n 'HUOBI-SWAP',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n const products: IProduct[] = [];\n\n // Get perpetual contract products and cross leverage data in parallel\n const [swapSymbols, crossLeverage] = await Promise.all([\n client.getPerpetualContractSymbols(),\n client.getSwapCrossLadderMargin(),\n ]);\n\n for (const symbol of swapSymbols?.data || []) {\n if (symbol.contract_status !== 1) continue; // Only include active contracts\n\n const maxLeverage = crossLeverage?.data\n .find((x) => x.contract_code === symbol.contract_code)\n ?.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);\n\n products.push({\n datasource_id: 'HUOBI-SWAP',\n product_id: symbol.contract_code,\n base_currency: symbol.symbol,\n quote_currency: 'USDT',\n value_scale: symbol.contract_size,\n price_step: symbol.price_tick,\n volume_step: 1,\n name: '',\n value_scale_unit: '',\n margin_rate: 1 / (maxLeverage || 1),\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: true,\n market_id: 'HUOBI/SWAP',\n no_interest_rate: false,\n });\n }\n\n return products;\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n\n// Provide QueryProducts service for spot products\nexport const spotProductService = provideQueryProductsService(\n terminal,\n 'HUOBI-SPOT',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n const products: IProduct[] = [];\n\n // Get spot products\n const spotSymbols = await client.getSpotSymbols();\n\n for (const symbol of spotSymbols?.data || []) {\n if (symbol.state !== 'online') continue; // Only include online symbols\n\n products.push({\n datasource_id: 'HUOBI-SPOT',\n product_id: symbol.sc,\n base_currency: symbol.bc,\n quote_currency: symbol.qc,\n value_scale: 1,\n price_step: 1 / 10 ** symbol.tpp,\n volume_step: 1 / 10 ** symbol.tap,\n name: '',\n value_scale_unit: '',\n margin_rate: 1,\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: false,\n market_id: 'HUOBI/SPOT',\n no_interest_rate: true,\n });\n }\n\n return products;\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n"]}
|
package/lib/index.js
CHANGED
|
@@ -32,7 +32,6 @@ const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
|
32
32
|
const subAccounts = subUsersRes.data;
|
|
33
33
|
const isMainAccount = subUsersRes.ok;
|
|
34
34
|
console.info((0, utils_1.formatTime)(Date.now()), 'subAccounts', JSON.stringify(subAccounts));
|
|
35
|
-
const mapProductIdToPerpetualProduct$ = product_1.perpetualContractProducts$.pipe((0, rxjs_1.map)((x) => new Map(x.map((v) => [v.product_id, v]))), (0, rxjs_1.shareReplay)(1));
|
|
36
35
|
(0, data_account_1.provideAccountInfoService)(terminal, SWAP_ACCOUNT_ID, async () => {
|
|
37
36
|
// balance
|
|
38
37
|
const balance = await api_1.client.getUnifiedAccountInfo();
|
|
@@ -47,7 +46,7 @@ const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
|
47
46
|
const free = balanceData.withdraw_available;
|
|
48
47
|
// positions
|
|
49
48
|
const positionsRes = await api_1.client.getSwapCrossPositionInfo();
|
|
50
|
-
const mapProductIdToPerpetualProduct = await (0, rxjs_1.firstValueFrom)(
|
|
49
|
+
const mapProductIdToPerpetualProduct = await (0, rxjs_1.firstValueFrom)(product_1.swapProductService.mapProductIdToProduct$);
|
|
51
50
|
const positions = (positionsRes.data || []).map((v) => {
|
|
52
51
|
const product_id = v.contract_code;
|
|
53
52
|
const theProduct = mapProductIdToPerpetualProduct === null || mapProductIdToPerpetualProduct === void 0 ? void 0 : mapProductIdToPerpetualProduct.get(product_id);
|
|
@@ -290,9 +289,9 @@ const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
|
290
289
|
//
|
|
291
290
|
(0, rxjs_1.mergeMap)((res) => res.data), (0, rxjs_1.first)((v) => v.currency === 'usdt'), (0, rxjs_1.map)((v) => +v['loanable-amt']), (0, rxjs_1.combineLatestWith)(superMarginUnifiedRawAccountBalance$.pipe((0, rxjs_1.first)(), (0, rxjs_1.mergeMap)((res) => (0, rxjs_1.from)(res.list).pipe(
|
|
292
291
|
// we only need the amount of usdt that can be used to trade
|
|
293
|
-
(0, rxjs_1.filter)((v) => v.currency === 'usdt' && v.type === 'trade'), (0, rxjs_1.reduce)((acc, cur) => acc + +cur.balance, 0))))), (0, rxjs_1.combineLatestWith)(product_1.
|
|
292
|
+
(0, rxjs_1.filter)((v) => v.currency === 'usdt' && v.type === 'trade'), (0, rxjs_1.reduce)((acc, cur) => acc + +cur.balance, 0))))), (0, rxjs_1.combineLatestWith)(product_1.spotProductService.mapProductIdToProduct$.pipe((0, rxjs_1.first)())), (0, rxjs_1.mergeMap)(async ([[loanable, balance], mapProductIdToProduct]) => {
|
|
294
293
|
const priceRes = await api_1.client.getSpotTick({ symbol: msg.req.product_id });
|
|
295
|
-
const theProduct =
|
|
294
|
+
const theProduct = mapProductIdToProduct.get(msg.req.product_id);
|
|
296
295
|
const price = priceRes.tick.close;
|
|
297
296
|
const borrow_amount = msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'
|
|
298
297
|
? Math.max(Math.min(loanable, msg.req.volume * price - balance), 0)
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime, roundToStep } from '@yuants/utils';\nimport {\n catchError,\n combineLatestWith,\n defer,\n distinct,\n filter,\n first,\n firstValueFrom,\n from,\n map,\n mergeMap,\n of,\n reduce,\n repeat,\n retry,\n shareReplay,\n tap,\n timeout,\n toArray,\n} from 'rxjs';\nimport { client } from './api';\nimport './interest_rate';\nimport { perpetualContractProducts$, spotProducts$ } from './product';\nimport './quote';\n\nconst terminal = Terminal.fromNodeEnv();\n\n(async () => {\n const swapAccountTypeRes = await client.getSwapUnifiedAccountType();\n if (swapAccountTypeRes.data?.account_type === 1) {\n console.info(\n formatTime(Date.now()),\n 'SwitchingAccountType',\n `previous: ${swapAccountTypeRes.data.account_type}, switching to 2 (unified account)`,\n );\n const switchRes = await client.postSwapSwitchAccountType({ account_type: 2 });\n console.info(formatTime(Date.now()), 'SwitchingAccountType', `current: ${switchRes.data.account_type}`);\n }\n\n const huobiUid: number = (await client.getUid()).data;\n console.info(formatTime(Date.now()), 'UID', huobiUid);\n\n const huobiAccounts = await client.getAccount();\n const superMarginAccountUid = huobiAccounts.data.find((v) => v.type === 'super-margin')?.id!;\n const spotAccountUid = huobiAccounts.data.find((v) => v.type === 'spot')?.id!;\n console.info(formatTime(Date.now()), 'huobiAccount', JSON.stringify(huobiAccounts));\n\n const account_id = `huobi/${huobiUid}`;\n const SPOT_ACCOUNT_ID = `${account_id}/spot/usdt`;\n const SUPER_MARGIN_ACCOUNT_ID = `${account_id}/super-margin`;\n const SWAP_ACCOUNT_ID = `${account_id}/swap`;\n\n const subUsersRes = await client.getSubUserList();\n const subAccounts = subUsersRes.data;\n const isMainAccount = subUsersRes.ok;\n console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));\n\n const mapProductIdToPerpetualProduct$ = perpetualContractProducts$.pipe(\n map((x) => new Map(x.map((v) => [v.product_id, v]))),\n shareReplay(1),\n );\n\n provideAccountInfoService(\n terminal,\n SWAP_ACCOUNT_ID,\n async () => {\n // balance\n const balance = await client.getUnifiedAccountInfo();\n if (!balance.data) {\n throw new Error('Failed to get unified account info');\n }\n const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');\n if (!balanceData) {\n throw new Error('No USDT balance found in unified account');\n }\n const equity = balanceData.margin_balance;\n const free = balanceData.withdraw_available;\n\n // positions\n const positionsRes = await client.getSwapCrossPositionInfo();\n const mapProductIdToPerpetualProduct = await firstValueFrom(mapProductIdToPerpetualProduct$);\n const positions: IPosition[] = (positionsRes.data || []).map((v): IPosition => {\n const product_id = v.contract_code;\n const theProduct = mapProductIdToPerpetualProduct?.get(product_id);\n const valuation = v.volume * v.last_price * (theProduct?.value_scale || 1);\n return {\n position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,\n datasource_id: 'HUOBI-SWAP',\n product_id,\n direction: v.direction === 'buy' ? 'LONG' : 'SHORT',\n volume: v.volume,\n free_volume: v.available,\n position_price: v.cost_hold,\n closable_price: v.last_price,\n floating_profit: v.profit_unreal,\n valuation,\n };\n });\n\n // orders\n // const orders: IOrder[] = [];\n // let page_index = 1;\n // const page_size = 50;\n\n // while (true) {\n // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });\n // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {\n // break;\n // }\n\n // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {\n // return {\n // order_id: v.order_id_str,\n // account_id: SWAP_ACCOUNT_ID,\n // product_id: v.contract_code,\n // order_type: ['lightning'].includes(v.order_price_type)\n // ? 'MARKET'\n // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(\n // v.order_price_type,\n // )\n // ? 'LIMIT'\n // : ['fok'].includes(v.order_price_type)\n // ? 'FOK'\n // : v.order_price_type.includes('ioc')\n // ? 'IOC'\n // : 'STOP', // unreachable code\n // order_direction:\n // v.direction === 'open'\n // ? v.offset === 'buy'\n // ? 'OPEN_LONG'\n // : 'OPEN_SHORT'\n // : v.offset === 'buy'\n // ? 'CLOSE_SHORT'\n // : 'CLOSE_LONG',\n // volume: v.volume,\n // submit_at: v.created_at,\n // price: v.price,\n // traded_volume: v.trade_volume,\n // };\n // });\n\n // orders.push(...pageOrders);\n // page_index++;\n // }\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n const superMarginUnifiedRawAccountBalance$ = defer(() =>\n client.getSpotAccountBalance(superMarginAccountUid),\n ).pipe(\n //\n map((res) => res.data),\n repeat({ delay: 1000 }),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'unifiedRaw', e);\n },\n }),\n retry({ delay: 5000 }),\n shareReplay(1),\n );\n\n const subscriptions: Set<string> = new Set();\n from(client.spot_ws.connection$).subscribe(() => {\n subscriptions.clear();\n });\n // subscribe the symbols of positions we held\n superMarginUnifiedRawAccountBalance$\n .pipe(\n //\n mergeMap((res) =>\n from(res?.list || []).pipe(\n filter((v) => v.currency !== 'usdt'),\n map((v) => v.currency),\n distinct(),\n toArray(),\n map((v) => new Set(v)),\n ),\n ),\n )\n .subscribe((v: Set<string>) => {\n const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));\n const toSubscribe = [...v].filter((x) => !subscriptions.has(x));\n\n for (const symbol of toUnsubscribe) {\n client.spot_ws.output$.next({\n unsub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.delete(symbol);\n }\n for (const symbol of toSubscribe) {\n client.spot_ws.output$.next({\n sub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.add(symbol);\n }\n });\n\n provideAccountInfoService(\n terminal,\n SUPER_MARGIN_ACCOUNT_ID,\n async () => {\n // get account balance\n const accountBalance = await client.getSpotAccountBalance(superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // calculate usdt balance\n const usdtBalance = balanceList\n .filter((v) => v.currency === 'usdt')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n // get positions (non-usdt currencies)\n const positions: IPosition[] = [];\n const nonUsdtCurrencies = balanceList\n .filter((v) => v.currency !== 'usdt')\n .reduce((acc, cur) => {\n const existing = acc.find((item) => item.currency === cur.currency);\n if (existing) {\n existing.balance += +cur.balance;\n } else {\n acc.push({ currency: cur.currency, balance: +cur.balance });\n }\n return acc;\n }, [] as { currency: string; balance: number }[]);\n\n // get prices and create positions\n for (const currencyData of nonUsdtCurrencies) {\n if (currencyData.balance > 0) {\n try {\n // get current price from websocket or fallback to REST API\n let price: number;\n try {\n const tickPrice = await firstValueFrom(\n client.spot_ws.input$.pipe(\n //\n first((v) => v.ch?.includes('ticker') && v.ch?.includes(currencyData.currency) && v.tick),\n map((v): number => v.tick.bid),\n timeout(5000),\n tap({\n error: (e) => {\n subscriptions.clear();\n },\n }),\n ),\n );\n price = tickPrice;\n } catch {\n // fallback to REST API\n const tickerRes = await client.getSpotTick({ symbol: `${currencyData.currency}usdt` });\n price = tickerRes.tick.close;\n }\n\n positions.push({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: `${currencyData.currency}usdt`,\n direction: 'LONG',\n volume: currencyData.balance,\n free_volume: currencyData.balance,\n position_price: price,\n closable_price: price,\n floating_profit: 0,\n valuation: currencyData.balance * price,\n });\n } catch (error) {\n console.warn(formatTime(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);\n }\n }\n }\n\n // calculate equity\n const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free: equity,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n provideAccountInfoService(\n terminal,\n SPOT_ACCOUNT_ID,\n async () => {\n const spotBalance = await client.getSpotAccountBalance(spotAccountUid);\n\n const equity = +(spotBalance.data.list.find((v) => v.currency === 'usdt')?.balance ?? 0);\n const free = equity;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n },\n { auto_refresh_interval: 1000 },\n );\n addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'HUOBI/SPOT' });\n addAccountMarket(terminal, { account_id: SUPER_MARGIN_ACCOUNT_ID, market_id: 'HUOBI/SUPER-MARGIN' });\n addAccountMarket(terminal, { account_id: SWAP_ACCOUNT_ID, market_id: 'HUOBI/SWAP' });\n\n // Submit order\n terminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: {\n enum: [SUPER_MARGIN_ACCOUNT_ID, SWAP_ACCOUNT_ID],\n },\n },\n },\n (msg) => {\n const { account_id: req_account_id } = msg.req;\n console.info(formatTime(Date.now()), `SubmitOrder for ${account_id}`, JSON.stringify(msg));\n\n if (req_account_id === SWAP_ACCOUNT_ID) {\n return defer(() => client.getSwapCrossPositionInfo()).pipe(\n mergeMap((res) => res.data),\n map((v) => [v.contract_code, v.lever_rate]),\n toArray(),\n map((v) => Object.fromEntries(v)),\n mergeMap((mapContractCodeToRate) => {\n const lever_rate = mapContractCodeToRate[msg.req.product_id] ?? 20;\n const params = {\n contract_code: msg.req.product_id,\n contract_type: 'swap',\n price: msg.req.price,\n volume: msg.req.volume,\n offset:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'OPEN_SHORT'\n ? 'open'\n : 'close',\n direction:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell',\n // dynamically adjust the leverage\n lever_rate,\n order_price_type: msg.req.order_type === 'MARKET' ? 'market' : 'limit',\n };\n return client.postSwapOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.status !== 'ok') {\n return { res: { code: 500, message: v.status } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n }\n // for super-margin orders, we need to denote the amount of usdt to borrow, therefore we need to:\n // 1. get the loanable amount\n // 2. get the current balance\n // 3. get the current price\n // 4. combine the information to submit the order\n return defer(() => client.getCrossMarginLoanInfo()).pipe(\n //\n mergeMap((res) => res.data),\n first((v) => v.currency === 'usdt'),\n map((v) => +v['loanable-amt']),\n combineLatestWith(\n superMarginUnifiedRawAccountBalance$.pipe(\n first(),\n mergeMap((res) =>\n from(res.list).pipe(\n // we only need the amount of usdt that can be used to trade\n filter((v) => v.currency === 'usdt' && v.type === 'trade'),\n reduce((acc, cur) => acc + +cur.balance, 0),\n ),\n ),\n ),\n ),\n combineLatestWith(spotProducts$.pipe(first())),\n mergeMap(async ([[loanable, balance], products]) => {\n const priceRes = await client.getSpotTick({ symbol: msg.req.product_id });\n const theProduct = products.find((v) => v.product_id === msg.req.product_id);\n const price: number = priceRes.tick.close;\n const borrow_amount =\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? Math.max(Math.min(loanable, msg.req.volume * price - balance), 0)\n : undefined;\n const params = {\n symbol: msg.req.product_id,\n 'account-id': '' + superMarginAccountUid,\n // amount: msg.req.type === OrderType.MARKET ? 0 : '' + msg.req.volume,\n // 'market-amount': msg.req.type === OrderType.MARKET ? '' + msg.req.volume : undefined,\n amount:\n '' +\n (msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? roundToStep(msg.req.volume * price, theProduct?.volume_step!)\n : msg.req.volume),\n 'borrow-amount': '' + borrow_amount,\n type: `${\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell'\n }-${'LIMIT' === msg.req.order_type ? 'limit' : 'market'}`,\n 'trade-purpose':\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? '1' // auto borrow\n : '2', // auto repay\n price: msg.req.order_type === 'MARKET' ? undefined : '' + msg.req.price,\n source: 'super-margin-api',\n };\n return client.postSpotOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.success === false) {\n return { res: { code: v.code, message: v.message } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n },\n );\n\n // Update Spot TRC20 Addresses (Only Main Account)\n if (isMainAccount) {\n const res = await client.getSpotAccountDepositAddresses({ currency: 'usdt' });\n const addresses = res.data.filter((v) => v.chain === 'trc20usdt').map((v) => v.address);\n\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n address: address,\n network_id: 'TRC20',\n onApply: {\n INIT: async (order) => {\n const res0 = await client.getV2ReferenceCurrencies({ currency: 'usdt' });\n const fee = res0.data\n .find((v) => v.currency === 'usdt')\n ?.chains.find((v) => v.chain === 'trc20usdt')?.transactFeeWithdraw;\n if (!fee) {\n return { state: 'ERROR', message: 'MISSING FEE' };\n }\n const res = await client.postWithdraw({\n address: order.current_rx_address!,\n amount: '' + (order.expected_amount - +fee),\n currency: 'usdt',\n fee: fee,\n chain: 'trc20usdt',\n });\n if (res.status != 'ok') {\n return { state: 'INIT', message: `${res.status}` };\n }\n return { state: 'PENDING', context: `${res.data}` };\n },\n PENDING: async (order) => {\n if (!order.current_tx_context) {\n return { state: 'ERROR', message: 'MISSING CONTEXT' };\n }\n const wdId = +order.current_tx_context;\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'withdraw',\n from: `${wdId}`,\n });\n const txId = res.data.find((v) => v.id === wdId)?.['tx-hash'];\n if (!txId) {\n return { state: 'PENDING', context: `${wdId}` };\n }\n return {\n state: 'COMPLETE',\n transaction_id: txId,\n };\n },\n },\n onEval: async (order) => {\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'deposit',\n direct: 'next',\n });\n\n const theItem = res.data.find(\n (v) => v['tx-hash'] === order.current_transaction_id && v.state === 'safe',\n );\n if (!theItem) {\n return { state: 'PENDING' };\n }\n return { received_amount: +theItem.amount, state: 'COMPLETE' };\n },\n });\n }\n }\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferInResult = await client.postSuperMarginAccountTransferIn({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferInResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SUPER_MARGIN_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SUPER_MARGIN',\n onApply: {\n INIT: async (order) => {\n const transferOutResult = await client.postSuperMarginAccountTransferOut({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferOutResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'spot',\n to: 'linear-swap',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SWAP_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SWAP',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'linear-swap',\n to: 'spot',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n if (isMainAccount) {\n for (const subAccount of subAccounts) {\n const SPOT_SUB_ACCOUNT_ID = `huobi/${subAccount.uid}/spot/usdt`;\n\n const SUB_ACCOUNT_NETWORK_ID = `Huobi/${huobiUid}/SubAccount/${subAccount.uid}`;\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: '#main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_rx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-out',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_SUB_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: `${subAccount.uid}`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_tx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-in',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n }\n }\n})();\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime, roundToStep } from '@yuants/utils';\nimport {\n catchError,\n combineLatestWith,\n defer,\n distinct,\n filter,\n first,\n firstValueFrom,\n from,\n map,\n mergeMap,\n of,\n reduce,\n repeat,\n retry,\n shareReplay,\n tap,\n timeout,\n toArray,\n} from 'rxjs';\nimport { client } from './api';\nimport './interest_rate';\nimport { spotProductService, swapProductService } from './product';\nimport './quote';\n\nconst terminal = Terminal.fromNodeEnv();\n\n(async () => {\n const swapAccountTypeRes = await client.getSwapUnifiedAccountType();\n if (swapAccountTypeRes.data?.account_type === 1) {\n console.info(\n formatTime(Date.now()),\n 'SwitchingAccountType',\n `previous: ${swapAccountTypeRes.data.account_type}, switching to 2 (unified account)`,\n );\n const switchRes = await client.postSwapSwitchAccountType({ account_type: 2 });\n console.info(formatTime(Date.now()), 'SwitchingAccountType', `current: ${switchRes.data.account_type}`);\n }\n\n const huobiUid: number = (await client.getUid()).data;\n console.info(formatTime(Date.now()), 'UID', huobiUid);\n\n const huobiAccounts = await client.getAccount();\n const superMarginAccountUid = huobiAccounts.data.find((v) => v.type === 'super-margin')?.id!;\n const spotAccountUid = huobiAccounts.data.find((v) => v.type === 'spot')?.id!;\n console.info(formatTime(Date.now()), 'huobiAccount', JSON.stringify(huobiAccounts));\n\n const account_id = `huobi/${huobiUid}`;\n const SPOT_ACCOUNT_ID = `${account_id}/spot/usdt`;\n const SUPER_MARGIN_ACCOUNT_ID = `${account_id}/super-margin`;\n const SWAP_ACCOUNT_ID = `${account_id}/swap`;\n\n const subUsersRes = await client.getSubUserList();\n const subAccounts = subUsersRes.data;\n const isMainAccount = subUsersRes.ok;\n console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));\n\n provideAccountInfoService(\n terminal,\n SWAP_ACCOUNT_ID,\n async () => {\n // balance\n const balance = await client.getUnifiedAccountInfo();\n if (!balance.data) {\n throw new Error('Failed to get unified account info');\n }\n const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');\n if (!balanceData) {\n throw new Error('No USDT balance found in unified account');\n }\n const equity = balanceData.margin_balance;\n const free = balanceData.withdraw_available;\n\n // positions\n const positionsRes = await client.getSwapCrossPositionInfo();\n const mapProductIdToPerpetualProduct = await firstValueFrom(swapProductService.mapProductIdToProduct$);\n const positions: IPosition[] = (positionsRes.data || []).map((v): IPosition => {\n const product_id = v.contract_code;\n const theProduct = mapProductIdToPerpetualProduct?.get(product_id);\n const valuation = v.volume * v.last_price * (theProduct?.value_scale || 1);\n return {\n position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,\n datasource_id: 'HUOBI-SWAP',\n product_id,\n direction: v.direction === 'buy' ? 'LONG' : 'SHORT',\n volume: v.volume,\n free_volume: v.available,\n position_price: v.cost_hold,\n closable_price: v.last_price,\n floating_profit: v.profit_unreal,\n valuation,\n };\n });\n\n // orders\n // const orders: IOrder[] = [];\n // let page_index = 1;\n // const page_size = 50;\n\n // while (true) {\n // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });\n // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {\n // break;\n // }\n\n // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {\n // return {\n // order_id: v.order_id_str,\n // account_id: SWAP_ACCOUNT_ID,\n // product_id: v.contract_code,\n // order_type: ['lightning'].includes(v.order_price_type)\n // ? 'MARKET'\n // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(\n // v.order_price_type,\n // )\n // ? 'LIMIT'\n // : ['fok'].includes(v.order_price_type)\n // ? 'FOK'\n // : v.order_price_type.includes('ioc')\n // ? 'IOC'\n // : 'STOP', // unreachable code\n // order_direction:\n // v.direction === 'open'\n // ? v.offset === 'buy'\n // ? 'OPEN_LONG'\n // : 'OPEN_SHORT'\n // : v.offset === 'buy'\n // ? 'CLOSE_SHORT'\n // : 'CLOSE_LONG',\n // volume: v.volume,\n // submit_at: v.created_at,\n // price: v.price,\n // traded_volume: v.trade_volume,\n // };\n // });\n\n // orders.push(...pageOrders);\n // page_index++;\n // }\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n const superMarginUnifiedRawAccountBalance$ = defer(() =>\n client.getSpotAccountBalance(superMarginAccountUid),\n ).pipe(\n //\n map((res) => res.data),\n repeat({ delay: 1000 }),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'unifiedRaw', e);\n },\n }),\n retry({ delay: 5000 }),\n shareReplay(1),\n );\n\n const subscriptions: Set<string> = new Set();\n from(client.spot_ws.connection$).subscribe(() => {\n subscriptions.clear();\n });\n // subscribe the symbols of positions we held\n superMarginUnifiedRawAccountBalance$\n .pipe(\n //\n mergeMap((res) =>\n from(res?.list || []).pipe(\n filter((v) => v.currency !== 'usdt'),\n map((v) => v.currency),\n distinct(),\n toArray(),\n map((v) => new Set(v)),\n ),\n ),\n )\n .subscribe((v: Set<string>) => {\n const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));\n const toSubscribe = [...v].filter((x) => !subscriptions.has(x));\n\n for (const symbol of toUnsubscribe) {\n client.spot_ws.output$.next({\n unsub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.delete(symbol);\n }\n for (const symbol of toSubscribe) {\n client.spot_ws.output$.next({\n sub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.add(symbol);\n }\n });\n\n provideAccountInfoService(\n terminal,\n SUPER_MARGIN_ACCOUNT_ID,\n async () => {\n // get account balance\n const accountBalance = await client.getSpotAccountBalance(superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // calculate usdt balance\n const usdtBalance = balanceList\n .filter((v) => v.currency === 'usdt')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n // get positions (non-usdt currencies)\n const positions: IPosition[] = [];\n const nonUsdtCurrencies = balanceList\n .filter((v) => v.currency !== 'usdt')\n .reduce((acc, cur) => {\n const existing = acc.find((item) => item.currency === cur.currency);\n if (existing) {\n existing.balance += +cur.balance;\n } else {\n acc.push({ currency: cur.currency, balance: +cur.balance });\n }\n return acc;\n }, [] as { currency: string; balance: number }[]);\n\n // get prices and create positions\n for (const currencyData of nonUsdtCurrencies) {\n if (currencyData.balance > 0) {\n try {\n // get current price from websocket or fallback to REST API\n let price: number;\n try {\n const tickPrice = await firstValueFrom(\n client.spot_ws.input$.pipe(\n //\n first((v) => v.ch?.includes('ticker') && v.ch?.includes(currencyData.currency) && v.tick),\n map((v): number => v.tick.bid),\n timeout(5000),\n tap({\n error: (e) => {\n subscriptions.clear();\n },\n }),\n ),\n );\n price = tickPrice;\n } catch {\n // fallback to REST API\n const tickerRes = await client.getSpotTick({ symbol: `${currencyData.currency}usdt` });\n price = tickerRes.tick.close;\n }\n\n positions.push({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: `${currencyData.currency}usdt`,\n direction: 'LONG',\n volume: currencyData.balance,\n free_volume: currencyData.balance,\n position_price: price,\n closable_price: price,\n floating_profit: 0,\n valuation: currencyData.balance * price,\n });\n } catch (error) {\n console.warn(formatTime(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);\n }\n }\n }\n\n // calculate equity\n const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free: equity,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n provideAccountInfoService(\n terminal,\n SPOT_ACCOUNT_ID,\n async () => {\n const spotBalance = await client.getSpotAccountBalance(spotAccountUid);\n\n const equity = +(spotBalance.data.list.find((v) => v.currency === 'usdt')?.balance ?? 0);\n const free = equity;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n },\n { auto_refresh_interval: 1000 },\n );\n addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'HUOBI/SPOT' });\n addAccountMarket(terminal, { account_id: SUPER_MARGIN_ACCOUNT_ID, market_id: 'HUOBI/SUPER-MARGIN' });\n addAccountMarket(terminal, { account_id: SWAP_ACCOUNT_ID, market_id: 'HUOBI/SWAP' });\n\n // Submit order\n terminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: {\n enum: [SUPER_MARGIN_ACCOUNT_ID, SWAP_ACCOUNT_ID],\n },\n },\n },\n (msg) => {\n const { account_id: req_account_id } = msg.req;\n console.info(formatTime(Date.now()), `SubmitOrder for ${account_id}`, JSON.stringify(msg));\n\n if (req_account_id === SWAP_ACCOUNT_ID) {\n return defer(() => client.getSwapCrossPositionInfo()).pipe(\n mergeMap((res) => res.data),\n map((v) => [v.contract_code, v.lever_rate]),\n toArray(),\n map((v) => Object.fromEntries(v)),\n mergeMap((mapContractCodeToRate) => {\n const lever_rate = mapContractCodeToRate[msg.req.product_id] ?? 20;\n const params = {\n contract_code: msg.req.product_id,\n contract_type: 'swap',\n price: msg.req.price,\n volume: msg.req.volume,\n offset:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'OPEN_SHORT'\n ? 'open'\n : 'close',\n direction:\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell',\n // dynamically adjust the leverage\n lever_rate,\n order_price_type: msg.req.order_type === 'MARKET' ? 'market' : 'limit',\n };\n return client.postSwapOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.status !== 'ok') {\n return { res: { code: 500, message: v.status } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n }\n // for super-margin orders, we need to denote the amount of usdt to borrow, therefore we need to:\n // 1. get the loanable amount\n // 2. get the current balance\n // 3. get the current price\n // 4. combine the information to submit the order\n return defer(() => client.getCrossMarginLoanInfo()).pipe(\n //\n mergeMap((res) => res.data),\n first((v) => v.currency === 'usdt'),\n map((v) => +v['loanable-amt']),\n combineLatestWith(\n superMarginUnifiedRawAccountBalance$.pipe(\n first(),\n mergeMap((res) =>\n from(res.list).pipe(\n // we only need the amount of usdt that can be used to trade\n filter((v) => v.currency === 'usdt' && v.type === 'trade'),\n reduce((acc, cur) => acc + +cur.balance, 0),\n ),\n ),\n ),\n ),\n combineLatestWith(spotProductService.mapProductIdToProduct$.pipe(first())),\n mergeMap(async ([[loanable, balance], mapProductIdToProduct]) => {\n const priceRes = await client.getSpotTick({ symbol: msg.req.product_id });\n const theProduct = mapProductIdToProduct.get(msg.req.product_id);\n const price: number = priceRes.tick.close;\n const borrow_amount =\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? Math.max(Math.min(loanable, msg.req.volume * price - balance), 0)\n : undefined;\n const params = {\n symbol: msg.req.product_id,\n 'account-id': '' + superMarginAccountUid,\n // amount: msg.req.type === OrderType.MARKET ? 0 : '' + msg.req.volume,\n // 'market-amount': msg.req.type === OrderType.MARKET ? '' + msg.req.volume : undefined,\n amount:\n '' +\n (msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? roundToStep(msg.req.volume * price, theProduct?.volume_step!)\n : msg.req.volume),\n 'borrow-amount': '' + borrow_amount,\n type: `${\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? 'buy'\n : 'sell'\n }-${'LIMIT' === msg.req.order_type ? 'limit' : 'market'}`,\n 'trade-purpose':\n msg.req.order_direction === 'OPEN_LONG' || msg.req.order_direction === 'CLOSE_SHORT'\n ? '1' // auto borrow\n : '2', // auto repay\n price: msg.req.order_type === 'MARKET' ? undefined : '' + msg.req.price,\n source: 'super-margin-api',\n };\n return client.postSpotOrder(params).then((v) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(v), JSON.stringify(params));\n return v;\n });\n }),\n map((v) => {\n if (v.success === false) {\n return { res: { code: v.code, message: v.message } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n catchError((e) => {\n console.error(formatTime(Date.now()), 'SubmitOrder', e);\n return of({ res: { code: 500, message: `${e}` } });\n }),\n );\n },\n );\n\n // Update Spot TRC20 Addresses (Only Main Account)\n if (isMainAccount) {\n const res = await client.getSpotAccountDepositAddresses({ currency: 'usdt' });\n const addresses = res.data.filter((v) => v.chain === 'trc20usdt').map((v) => v.address);\n\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n address: address,\n network_id: 'TRC20',\n onApply: {\n INIT: async (order) => {\n const res0 = await client.getV2ReferenceCurrencies({ currency: 'usdt' });\n const fee = res0.data\n .find((v) => v.currency === 'usdt')\n ?.chains.find((v) => v.chain === 'trc20usdt')?.transactFeeWithdraw;\n if (!fee) {\n return { state: 'ERROR', message: 'MISSING FEE' };\n }\n const res = await client.postWithdraw({\n address: order.current_rx_address!,\n amount: '' + (order.expected_amount - +fee),\n currency: 'usdt',\n fee: fee,\n chain: 'trc20usdt',\n });\n if (res.status != 'ok') {\n return { state: 'INIT', message: `${res.status}` };\n }\n return { state: 'PENDING', context: `${res.data}` };\n },\n PENDING: async (order) => {\n if (!order.current_tx_context) {\n return { state: 'ERROR', message: 'MISSING CONTEXT' };\n }\n const wdId = +order.current_tx_context;\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'withdraw',\n from: `${wdId}`,\n });\n const txId = res.data.find((v) => v.id === wdId)?.['tx-hash'];\n if (!txId) {\n return { state: 'PENDING', context: `${wdId}` };\n }\n return {\n state: 'COMPLETE',\n transaction_id: txId,\n };\n },\n },\n onEval: async (order) => {\n const res = await client.getDepositWithdrawHistory({\n currency: 'usdt',\n type: 'deposit',\n direct: 'next',\n });\n\n const theItem = res.data.find(\n (v) => v['tx-hash'] === order.current_transaction_id && v.state === 'safe',\n );\n if (!theItem) {\n return { state: 'PENDING' };\n }\n return { received_amount: +theItem.amount, state: 'COMPLETE' };\n },\n });\n }\n }\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferInResult = await client.postSuperMarginAccountTransferIn({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferInResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SUPER_MARGIN_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`,\n address: 'SUPER_MARGIN',\n onApply: {\n INIT: async (order) => {\n const transferOutResult = await client.postSuperMarginAccountTransferOut({\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferOutResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'spot',\n to: 'linear-swap',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n addAccountTransferAddress({\n terminal,\n account_id: SWAP_ACCOUNT_ID,\n currency: 'USDT',\n network_id: `Huobi/${huobiUid}/SPOT-SWAP`,\n address: 'SWAP',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSpotAccountTransfer({\n from: 'linear-swap',\n to: 'spot',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n if (isMainAccount) {\n for (const subAccount of subAccounts) {\n const SPOT_SUB_ACCOUNT_ID = `huobi/${subAccount.uid}/spot/usdt`;\n\n const SUB_ACCOUNT_NETWORK_ID = `Huobi/${huobiUid}/SubAccount/${subAccount.uid}`;\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: '#main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_rx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-out',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_SUB_ACCOUNT_ID,\n currency: 'USDT',\n network_id: SUB_ACCOUNT_NETWORK_ID,\n address: `${subAccount.uid}`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await client.postSubUserTransfer({\n 'sub-uid': +order.current_tx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-in',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n }\n }\n})();\n"]}
|
package/lib/product.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const spotProducts$: import("rxjs").Observable<IProduct[]>;
|
|
1
|
+
export declare const swapProductService: import("@yuants/data-product").IQueryProductsService;
|
|
2
|
+
export declare const spotProductService: import("@yuants/data-product").IQueryProductsService;
|
|
4
3
|
//# sourceMappingURL=product.d.ts.map
|
package/lib/product.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,sDA8C9B,CAAC;AAGF,eAAO,MAAM,kBAAkB,sDAuC9B,CAAC"}
|
package/lib/product.js
CHANGED
|
@@ -1,33 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
3
|
+
exports.spotProductService = exports.swapProductService = void 0;
|
|
4
|
+
const data_product_1 = require("@yuants/data-product");
|
|
5
5
|
const protocol_1 = require("@yuants/protocol");
|
|
6
|
-
const sql_1 = require("@yuants/sql");
|
|
7
|
-
const rxjs_1 = require("rxjs");
|
|
8
6
|
const api_1 = require("./api");
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
13
|
-
const productIdToMaxLeverage = (0, cache_1.createCache)(async (product_id, force_update) => {
|
|
7
|
+
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
8
|
+
// Provide QueryProducts service for swap products
|
|
9
|
+
exports.swapProductService = (0, data_product_1.provideQueryProductsService)(terminal, 'HUOBI-SWAP', async (req) => {
|
|
14
10
|
var _a;
|
|
15
|
-
const res = await cacheOfCrossLeverage.query('', force_update);
|
|
16
|
-
return (_a = res === null || res === void 0 ? void 0 : res.data.find((x) => x.contract_code === product_id)) === null || _a === void 0 ? void 0 : _a.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);
|
|
17
|
-
}, {
|
|
18
|
-
expire: 3600000, // 1 hour
|
|
19
|
-
});
|
|
20
|
-
const swapSymbols = (0, cache_1.createCache)(() => api_1.client.getPerpetualContractSymbols(), {
|
|
21
|
-
expire: 3600000,
|
|
22
|
-
});
|
|
23
|
-
const swapProducts = (0, cache_1.createCache)(async (_, force_update) => {
|
|
24
11
|
const products = [];
|
|
25
|
-
|
|
26
|
-
|
|
12
|
+
// Get perpetual contract products and cross leverage data in parallel
|
|
13
|
+
const [swapSymbols, crossLeverage] = await Promise.all([
|
|
14
|
+
api_1.client.getPerpetualContractSymbols(),
|
|
15
|
+
api_1.client.getSwapCrossLadderMargin(),
|
|
16
|
+
]);
|
|
17
|
+
for (const symbol of (swapSymbols === null || swapSymbols === void 0 ? void 0 : swapSymbols.data) || []) {
|
|
27
18
|
if (symbol.contract_status !== 1)
|
|
28
19
|
continue; // Only include active contracts
|
|
29
|
-
const maxLeverage =
|
|
30
|
-
|
|
20
|
+
const maxLeverage = (_a = crossLeverage === null || crossLeverage === void 0 ? void 0 : crossLeverage.data.find((x) => x.contract_code === symbol.contract_code)) === null || _a === void 0 ? void 0 : _a.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);
|
|
21
|
+
products.push({
|
|
31
22
|
datasource_id: 'HUOBI-SWAP',
|
|
32
23
|
product_id: symbol.contract_code,
|
|
33
24
|
base_currency: symbol.symbol,
|
|
@@ -46,41 +37,43 @@ const swapProducts = (0, cache_1.createCache)(async (_, force_update) => {
|
|
|
46
37
|
allow_short: true,
|
|
47
38
|
market_id: 'HUOBI/SWAP',
|
|
48
39
|
no_interest_rate: false,
|
|
49
|
-
};
|
|
50
|
-
products.push(product);
|
|
51
|
-
product$.next(product);
|
|
40
|
+
});
|
|
52
41
|
}
|
|
53
42
|
return products;
|
|
54
43
|
}, {
|
|
55
|
-
|
|
44
|
+
auto_refresh_interval: 3600000,
|
|
56
45
|
});
|
|
57
|
-
|
|
58
|
-
exports.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
46
|
+
// Provide QueryProducts service for spot products
|
|
47
|
+
exports.spotProductService = (0, data_product_1.provideQueryProductsService)(terminal, 'HUOBI-SPOT', async (req) => {
|
|
48
|
+
const products = [];
|
|
49
|
+
// Get spot products
|
|
50
|
+
const spotSymbols = await api_1.client.getSpotSymbols();
|
|
51
|
+
for (const symbol of (spotSymbols === null || spotSymbols === void 0 ? void 0 : spotSymbols.data) || []) {
|
|
52
|
+
if (symbol.state !== 'online')
|
|
53
|
+
continue; // Only include online symbols
|
|
54
|
+
products.push({
|
|
55
|
+
datasource_id: 'HUOBI-SPOT',
|
|
56
|
+
product_id: symbol.sc,
|
|
57
|
+
base_currency: symbol.bc,
|
|
58
|
+
quote_currency: symbol.qc,
|
|
59
|
+
value_scale: 1,
|
|
60
|
+
price_step: 1 / 10 ** symbol.tpp,
|
|
61
|
+
volume_step: 1 / 10 ** symbol.tap,
|
|
62
|
+
name: '',
|
|
63
|
+
value_scale_unit: '',
|
|
64
|
+
margin_rate: 1,
|
|
65
|
+
value_based_cost: 0,
|
|
66
|
+
volume_based_cost: 0,
|
|
67
|
+
max_position: 0,
|
|
68
|
+
max_volume: 0,
|
|
69
|
+
allow_long: true,
|
|
70
|
+
allow_short: false,
|
|
71
|
+
market_id: 'HUOBI/SPOT',
|
|
72
|
+
no_interest_rate: true,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return products;
|
|
76
|
+
}, {
|
|
77
|
+
auto_refresh_interval: 3600000,
|
|
85
78
|
});
|
|
86
79
|
//# sourceMappingURL=product.js.map
|
package/lib/product.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct, IQueryProductsRequest, provideQueryProductsService } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\n// Provide QueryProducts service for swap products\nexport const swapProductService = provideQueryProductsService(\n terminal,\n 'HUOBI-SWAP',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n const products: IProduct[] = [];\n\n // Get perpetual contract products and cross leverage data in parallel\n const [swapSymbols, crossLeverage] = await Promise.all([\n client.getPerpetualContractSymbols(),\n client.getSwapCrossLadderMargin(),\n ]);\n\n for (const symbol of swapSymbols?.data || []) {\n if (symbol.contract_status !== 1) continue; // Only include active contracts\n\n const maxLeverage = crossLeverage?.data\n .find((x) => x.contract_code === symbol.contract_code)\n ?.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);\n\n products.push({\n datasource_id: 'HUOBI-SWAP',\n product_id: symbol.contract_code,\n base_currency: symbol.symbol,\n quote_currency: 'USDT',\n value_scale: symbol.contract_size,\n price_step: symbol.price_tick,\n volume_step: 1,\n name: '',\n value_scale_unit: '',\n margin_rate: 1 / (maxLeverage || 1),\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: true,\n market_id: 'HUOBI/SWAP',\n no_interest_rate: false,\n });\n }\n\n return products;\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n\n// Provide QueryProducts service for spot products\nexport const spotProductService = provideQueryProductsService(\n terminal,\n 'HUOBI-SPOT',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n const products: IProduct[] = [];\n\n // Get spot products\n const spotSymbols = await client.getSpotSymbols();\n\n for (const symbol of spotSymbols?.data || []) {\n if (symbol.state !== 'online') continue; // Only include online symbols\n\n products.push({\n datasource_id: 'HUOBI-SPOT',\n product_id: symbol.sc,\n base_currency: symbol.bc,\n quote_currency: symbol.qc,\n value_scale: 1,\n price_step: 1 / 10 ** symbol.tpp,\n volume_step: 1 / 10 ** symbol.tap,\n name: '',\n value_scale_unit: '',\n margin_rate: 1,\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: false,\n market_id: 'HUOBI/SPOT',\n no_interest_rate: true,\n });\n }\n\n return products;\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuants/vendor-huobi",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.19",
|
|
4
4
|
"bin": "lib/cli.js",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"files": [
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@yuants/utils": "0.8.0",
|
|
17
17
|
"@yuants/cache": "0.1.7",
|
|
18
18
|
"@yuants/sql": "0.9.8",
|
|
19
|
-
"@yuants/data-product": "0.
|
|
19
|
+
"@yuants/data-product": "0.3.0",
|
|
20
20
|
"@yuants/data-series": "0.3.29",
|
|
21
21
|
"@yuants/data-interest-rate": "0.1.26",
|
|
22
22
|
"@yuants/data-quote": "0.2.21",
|
package/temp/package-deps.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
|
-
"apps/vendor-huobi/CHANGELOG.json": "
|
|
3
|
-
"apps/vendor-huobi/CHANGELOG.md": "
|
|
2
|
+
"apps/vendor-huobi/CHANGELOG.json": "b356d637969bd5e39cf2f762f4fcfbdf06457147",
|
|
3
|
+
"apps/vendor-huobi/CHANGELOG.md": "b770d2b083f7e4f5b16b7ec14f003e1c6b742ea6",
|
|
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": "
|
|
10
|
+
"apps/vendor-huobi/package.json": "253616d4a101c1a44cb22948c546109b0d012e7a",
|
|
11
11
|
"apps/vendor-huobi/src/api.ts": "7f13d45da5c3600276cdf4e734e086358d96b348",
|
|
12
12
|
"apps/vendor-huobi/src/cli.ts": "9bf6b5559a6c6f33da20e74cc6c5d702c60ec891",
|
|
13
13
|
"apps/vendor-huobi/src/cluster.ts": "f58a96d9c89e29e4fcf7cedd8ea9cb1dc920540b",
|
|
14
|
-
"apps/vendor-huobi/src/index.ts": "
|
|
14
|
+
"apps/vendor-huobi/src/index.ts": "a0695d883a439740b990c883b002f27f237ee5a5",
|
|
15
15
|
"apps/vendor-huobi/src/interest_rate.ts": "1ada272b47f382533368928758b35176442d957f",
|
|
16
16
|
"apps/vendor-huobi/src/logger.ts": "d25d427e74f46819a601e0cb17d5358b22c8db7b",
|
|
17
|
-
"apps/vendor-huobi/src/product.ts": "
|
|
17
|
+
"apps/vendor-huobi/src/product.ts": "2e15fedf89c1dc5ab2fc9c557ee94c3fbb0bd57d",
|
|
18
18
|
"apps/vendor-huobi/src/quote.ts": "d772d64897c765a8157dac1a9abc0f3f488eaa1d",
|
|
19
19
|
"apps/vendor-huobi/tsconfig.json": "81da8f78196974b5d15da0edb6b2d9f48641063c",
|
|
20
20
|
"apps/vendor-huobi/.rush/temp/shrinkwrap-deps.json": "d9fc97de6643d551cb315ce28c6deca42698705c",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"libraries/utils/temp/package-deps.json": "56def945d0e67a9d0ca13447d2333155be0138f2",
|
|
26
26
|
"libraries/cache/temp/package-deps.json": "e73377f1b5ffb139459079e09bfeffec119abc6a",
|
|
27
27
|
"libraries/sql/temp/package-deps.json": "2da55e5e704b1c1558acab11b6df163744d1b24a",
|
|
28
|
-
"libraries/data-product/temp/package-deps.json": "
|
|
28
|
+
"libraries/data-product/temp/package-deps.json": "7c61716062e33869b203755b1b7db894e713b46f",
|
|
29
29
|
"libraries/data-series/temp/package-deps.json": "dd0d2f8322b484f074ae09c050ceb53fbc1368f4",
|
|
30
30
|
"libraries/data-interest-rate/temp/package-deps.json": "246f09881d5bce801a352861086d7e2b90eb5b6b",
|
|
31
31
|
"libraries/data-quote/temp/package-deps.json": "d90e1d62e8a480c7af07ecc09197c7d348c69804",
|