@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 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 { perpetualContractProducts$, spotProducts$ } from './product';
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(mapProductIdToPerpetualProduct$);
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(spotProducts$.pipe(first())), mergeMap(async ([[loanable, balance], products]) => {
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 = products.find((v) => v.product_id === msg.req.product_id);
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":"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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/dist/product.js CHANGED
@@ -1,30 +1,21 @@
1
- import { createCache } from '@yuants/cache';
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 product$ = new Subject();
7
- const cacheOfCrossLeverage = createCache(() => client.getSwapCrossLadderMargin(), {
8
- expire: 3600000, // 1 hour
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
- const symbols = await swapSymbols.query('', force_update);
23
- for (const symbol of (symbols === null || symbols === void 0 ? void 0 : symbols.data) || []) {
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 = await productIdToMaxLeverage.query(symbol.contract_code);
27
- const product = {
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
- expire: 3600000, // 1 hour
41
+ auto_refresh_interval: 3600000,
53
42
  });
54
- export const perpetualContractProducts$ = defer(() => swapProducts.query('')).pipe(map((res) => res || []), repeat({ delay: 86400000 }), retry({ delay: 10000 }), shareReplay(1));
55
- export const spotProducts$ = defer(() => client.getSpotSymbols()).pipe(mergeMap((res) => res.data), filter((symbol) => symbol.state === 'online'), map((symbol) => ({
56
- datasource_id: 'HUOBI-SPOT',
57
- product_id: symbol.sc,
58
- base_currency: symbol.bc,
59
- quote_currency: symbol.qc,
60
- value_scale: 1,
61
- price_step: 1 / 10 ** symbol.tpp,
62
- volume_step: 1 / 10 ** symbol.tap,
63
- name: '',
64
- value_scale_unit: '',
65
- margin_rate: 1,
66
- value_based_cost: 0,
67
- volume_based_cost: 0,
68
- max_position: 0,
69
- max_volume: 0,
70
- allow_long: true,
71
- allow_short: false,
72
- market_id: 'HUOBI/SPOT',
73
- no_interest_rate: true,
74
- })), toArray(), repeat({ delay: 86400000 }), retry({ delay: 10000 }), shareReplay(1));
75
- spotProducts$.subscribe();
76
- perpetualContractProducts$.subscribe();
77
- createSQLWriter(Terminal.fromNodeEnv(), {
78
- tableName: 'product',
79
- writeInterval: 1000,
80
- conflictKeys: ['datasource_id', 'product_id'],
81
- data$: product$,
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
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IProduct } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { createSQLWriter } from '@yuants/sql';\nimport { encodePath } from '@yuants/utils';\nimport { defer, filter, map, mergeMap, repeat, retry, shareReplay, Subject, toArray } from 'rxjs';\nimport { client } from './api';\n\nconst product$ = new Subject<IProduct>();\n\nconst cacheOfCrossLeverage = createCache(() => client.getSwapCrossLadderMargin(), {\n expire: 3600_000, // 1 hour\n});\n\nconst productIdToMaxLeverage = createCache(\n async (product_id, force_update) => {\n const res = await cacheOfCrossLeverage.query('', force_update);\n return res?.data\n .find((x) => x.contract_code === product_id)\n ?.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);\n },\n {\n expire: 3600_000, // 1 hour\n },\n);\n\nconst swapSymbols = createCache(() => client.getPerpetualContractSymbols(), {\n expire: 3600_000,\n});\n\nconst swapProducts = createCache(\n async (_, force_update) => {\n const products: IProduct[] = [];\n const symbols = await swapSymbols.query('', force_update);\n for (const symbol of symbols?.data || []) {\n if (symbol.contract_status !== 1) continue; // Only include active contracts\n const maxLeverage = await productIdToMaxLeverage.query(symbol.contract_code);\n const product: IProduct = {\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 products.push(product);\n product$.next(product);\n }\n return products;\n },\n {\n expire: 3600_000, // 1 hour\n },\n);\n\nexport const perpetualContractProducts$ = defer(() => swapProducts.query('')).pipe(\n map((res) => res || []),\n repeat({ delay: 86400_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nexport const spotProducts$ = defer(() => client.getSpotSymbols()).pipe(\n mergeMap((res) => res.data),\n filter((symbol) => symbol.state === 'online'),\n map(\n (symbol): IProduct => ({\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 toArray(),\n repeat({ delay: 86400_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nspotProducts$.subscribe();\nperpetualContractProducts$.subscribe();\n\ncreateSQLWriter<IProduct>(Terminal.fromNodeEnv(), {\n tableName: 'product',\n writeInterval: 1000,\n conflictKeys: ['datasource_id', 'product_id'],\n data$: product$,\n});\n"]}
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)(mapProductIdToPerpetualProduct$);
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.spotProducts$.pipe((0, rxjs_1.first)())), (0, rxjs_1.mergeMap)(async ([[loanable, balance], products]) => {
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 = products.find((v) => v.product_id === msg.req.product_id);
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":";;AAAA,uDAA8F;AAE9F,+CAA4C;AAC5C,+CAA6D;AAC7D,yCAAwD;AACxD,+BAmBc;AACd,+BAA+B;AAC/B,2BAAyB;AACzB,uCAAsE;AACtE,mBAAiB;AAEjB,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,CAAC,KAAK,IAAI,EAAE;;IACV,MAAM,kBAAkB,GAAG,MAAM,YAAM,CAAC,yBAAyB,EAAE,CAAC;IACpE,IAAI,CAAA,MAAA,kBAAkB,CAAC,IAAI,0CAAE,YAAY,MAAK,CAAC,EAAE;QAC/C,OAAO,CAAC,IAAI,CACV,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,sBAAsB,EACtB,aAAa,kBAAkB,CAAC,IAAI,CAAC,YAAY,oCAAoC,CACtF,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,YAAM,CAAC,yBAAyB,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,sBAAsB,EAAE,YAAY,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACzG;IAED,MAAM,QAAQ,GAAW,CAAC,MAAM,YAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEtD,MAAM,aAAa,GAAG,MAAM,YAAM,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,IAAA,kBAAU,EAAC,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,YAAM,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,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAEjF,MAAM,+BAA+B,GAAG,oCAA0B,CAAC,IAAI,CACrE,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EACpD,IAAA,kBAAW,EAAC,CAAC,CAAC,CACf,CAAC;IAEF,IAAA,wCAAyB,EACvB,QAAQ,EACR,eAAe,EACf,KAAK,IAAI,EAAE;QACT,UAAU;QACV,MAAM,OAAO,GAAG,MAAM,YAAM,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,YAAM,CAAC,wBAAwB,EAAE,CAAC;QAC7D,MAAM,8BAA8B,GAAG,MAAM,IAAA,qBAAc,EAAC,+BAA+B,CAAC,CAAC;QAC7F,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,IAAA,YAAK,EAAC,GAAG,EAAE,CACtD,YAAM,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CACpD,CAAC,IAAI;IACJ,EAAE;IACF,IAAA,UAAG,EAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EACtB,IAAA,aAAM,EAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,IAAA,UAAG,EAAC;QACF,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,EACF,IAAA,YAAK,EAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtB,IAAA,kBAAW,EAAC,CAAC,CAAC,CACf,CAAC;IAEF,MAAM,aAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC7C,IAAA,WAAI,EAAC,YAAM,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,IAAA,eAAQ,EAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAA,WAAI,EAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,KAAI,EAAE,CAAC,CAAC,IAAI,CACxB,IAAA,aAAM,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,EACpC,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EACtB,IAAA,eAAQ,GAAE,EACV,IAAA,cAAO,GAAE,EACT,IAAA,UAAG,EAAC,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,YAAM,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,YAAM,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,IAAA,wCAAyB,EACvB,QAAQ,EACR,uBAAuB,EACvB,KAAK,IAAI,EAAE;;QACT,sBAAsB;QACtB,MAAM,cAAc,GAAG,MAAM,YAAM,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,IAAA,qBAAc,EACpC,YAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;wBACxB,EAAE;wBACF,IAAA,YAAK,EAAC,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,IAAA,UAAG,EAAC,CAAC,CAAC,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAC9B,IAAA,cAAO,EAAC,IAAI,CAAC,EACb,IAAA,UAAG,EAAC;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,YAAM,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,IAAA,kBAAU,EAAC,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,IAAA,wCAAyB,EACvB,QAAQ,EACR,eAAe,EACf,KAAK,IAAI,EAAE;;QACT,MAAM,WAAW,GAAG,MAAM,YAAM,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,IAAA,+BAAgB,EAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IACrF,IAAA,+BAAgB,EAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,uBAAuB,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACrG,IAAA,+BAAgB,EAAC,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,IAAA,kBAAU,EAAC,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,IAAA,YAAK,EAAC,GAAG,EAAE,CAAC,YAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CACxD,IAAA,eAAQ,EAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3B,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,EAC3C,IAAA,cAAO,GAAE,EACT,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACjC,IAAA,eAAQ,EAAC,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,YAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC7C,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,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,IAAA,UAAG,EAAC,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,IAAA,iBAAU,EAAC,CAAC,CAAC,EAAE,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO,IAAA,SAAE,EAAC,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,IAAA,YAAK,EAAC,GAAG,EAAE,CAAC,YAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,IAAI;QACtD,EAAE;QACF,IAAA,eAAQ,EAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3B,IAAA,YAAK,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,EACnC,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAC9B,IAAA,wBAAiB,EACf,oCAAoC,CAAC,IAAI,CACvC,IAAA,YAAK,GAAE,EACP,IAAA,eAAQ,EAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAA,WAAI,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI;QACjB,4DAA4D;QAC5D,IAAA,aAAM,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAC1D,IAAA,aAAM,EAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAC5C,CACF,CACF,CACF,EACD,IAAA,wBAAiB,EAAC,uBAAa,CAAC,IAAI,CAAC,IAAA,YAAK,GAAE,CAAC,CAAC,EAC9C,IAAA,eAAQ,EAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE;YACjD,MAAM,QAAQ,GAAG,MAAM,YAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC7E,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,IAAA,mBAAW,EAAC,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,YAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC7C,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,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,IAAA,UAAG,EAAC,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,IAAA,iBAAU,EAAC,CAAC,CAAC,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,IAAA,SAAE,EAAC,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,YAAM,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,IAAA,oCAAyB,EAAC;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,YAAM,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,YAAM,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,YAAM,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,YAAM,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,IAAA,oCAAyB,EAAC;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,YAAM,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,IAAA,oCAAyB,EAAC;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,YAAM,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,IAAA,oCAAyB,EAAC;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,YAAM,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,IAAA,oCAAyB,EAAC;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,YAAM,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,IAAA,oCAAyB,EAAC;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,YAAM,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,IAAA,oCAAyB,EAAC;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,YAAM,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 { 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
- import { IProduct } from '@yuants/data-product';
2
- export declare const perpetualContractProducts$: import("rxjs").Observable<IProduct[]>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAkEhD,eAAO,MAAM,0BAA0B,uCAKtC,CAAC;AAEF,eAAO,MAAM,aAAa,uCA6BzB,CAAC"}
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.spotProducts$ = exports.perpetualContractProducts$ = void 0;
4
- const cache_1 = require("@yuants/cache");
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 product$ = new rxjs_1.Subject();
10
- const cacheOfCrossLeverage = (0, cache_1.createCache)(() => api_1.client.getSwapCrossLadderMargin(), {
11
- expire: 3600000, // 1 hour
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
- const symbols = await swapSymbols.query('', force_update);
26
- for (const symbol of (symbols === null || symbols === void 0 ? void 0 : symbols.data) || []) {
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 = await productIdToMaxLeverage.query(symbol.contract_code);
30
- const product = {
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
- expire: 3600000, // 1 hour
44
+ auto_refresh_interval: 3600000,
56
45
  });
57
- exports.perpetualContractProducts$ = (0, rxjs_1.defer)(() => swapProducts.query('')).pipe((0, rxjs_1.map)((res) => res || []), (0, rxjs_1.repeat)({ delay: 86400000 }), (0, rxjs_1.retry)({ delay: 10000 }), (0, rxjs_1.shareReplay)(1));
58
- exports.spotProducts$ = (0, rxjs_1.defer)(() => api_1.client.getSpotSymbols()).pipe((0, rxjs_1.mergeMap)((res) => res.data), (0, rxjs_1.filter)((symbol) => symbol.state === 'online'), (0, rxjs_1.map)((symbol) => ({
59
- datasource_id: 'HUOBI-SPOT',
60
- product_id: symbol.sc,
61
- base_currency: symbol.bc,
62
- quote_currency: symbol.qc,
63
- value_scale: 1,
64
- price_step: 1 / 10 ** symbol.tpp,
65
- volume_step: 1 / 10 ** symbol.tap,
66
- name: '',
67
- value_scale_unit: '',
68
- margin_rate: 1,
69
- value_based_cost: 0,
70
- volume_based_cost: 0,
71
- max_position: 0,
72
- max_volume: 0,
73
- allow_long: true,
74
- allow_short: false,
75
- market_id: 'HUOBI/SPOT',
76
- no_interest_rate: true,
77
- })), (0, rxjs_1.toArray)(), (0, rxjs_1.repeat)({ delay: 86400000 }), (0, rxjs_1.retry)({ delay: 10000 }), (0, rxjs_1.shareReplay)(1));
78
- exports.spotProducts$.subscribe();
79
- exports.perpetualContractProducts$.subscribe();
80
- (0, sql_1.createSQLWriter)(protocol_1.Terminal.fromNodeEnv(), {
81
- tableName: 'product',
82
- writeInterval: 1000,
83
- conflictKeys: ['datasource_id', 'product_id'],
84
- data$: product$,
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
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IProduct } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { createSQLWriter } from '@yuants/sql';\nimport { encodePath } from '@yuants/utils';\nimport { defer, filter, map, mergeMap, repeat, retry, shareReplay, Subject, toArray } from 'rxjs';\nimport { client } from './api';\n\nconst product$ = new Subject<IProduct>();\n\nconst cacheOfCrossLeverage = createCache(() => client.getSwapCrossLadderMargin(), {\n expire: 3600_000, // 1 hour\n});\n\nconst productIdToMaxLeverage = createCache(\n async (product_id, force_update) => {\n const res = await cacheOfCrossLeverage.query('', force_update);\n return res?.data\n .find((x) => x.contract_code === product_id)\n ?.list.reduce((acc, cur) => Math.max(acc, cur.lever_rate), 1);\n },\n {\n expire: 3600_000, // 1 hour\n },\n);\n\nconst swapSymbols = createCache(() => client.getPerpetualContractSymbols(), {\n expire: 3600_000,\n});\n\nconst swapProducts = createCache(\n async (_, force_update) => {\n const products: IProduct[] = [];\n const symbols = await swapSymbols.query('', force_update);\n for (const symbol of symbols?.data || []) {\n if (symbol.contract_status !== 1) continue; // Only include active contracts\n const maxLeverage = await productIdToMaxLeverage.query(symbol.contract_code);\n const product: IProduct = {\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 products.push(product);\n product$.next(product);\n }\n return products;\n },\n {\n expire: 3600_000, // 1 hour\n },\n);\n\nexport const perpetualContractProducts$ = defer(() => swapProducts.query('')).pipe(\n map((res) => res || []),\n repeat({ delay: 86400_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nexport const spotProducts$ = defer(() => client.getSpotSymbols()).pipe(\n mergeMap((res) => res.data),\n filter((symbol) => symbol.state === 'online'),\n map(\n (symbol): IProduct => ({\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 toArray(),\n repeat({ delay: 86400_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nspotProducts$.subscribe();\nperpetualContractProducts$.subscribe();\n\ncreateSQLWriter<IProduct>(Terminal.fromNodeEnv(), {\n tableName: 'product',\n writeInterval: 1000,\n conflictKeys: ['datasource_id', 'product_id'],\n data$: product$,\n});\n"]}
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.18",
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.2.18",
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",
@@ -1,20 +1,20 @@
1
1
  {
2
- "apps/vendor-huobi/CHANGELOG.json": "66d01948e107dab1d8debc2b53e5afa28a571d06",
3
- "apps/vendor-huobi/CHANGELOG.md": "d88ec3627528b56e807949a6aea07768824a2e2d",
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": "dfc6e8f1db406a645acd622a035e4d7b2120c2d8",
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": "0e6d5f00e25d8bad8080034c5c18b0d7be44fa57",
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": "5085b9262651dc574627e82723f862724124e6ea",
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": "fceed1ec7ecb23e7e3f9c36bc0abd3f053a27c75",
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",