@yuants/vendor-huobi 0.13.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/account-actions-with-credentials.js +30 -0
  2. package/dist/account-actions-with-credentials.js.map +1 -0
  3. package/dist/account-info.js +13 -173
  4. package/dist/account-info.js.map +1 -1
  5. package/dist/accounts/list.js +8 -0
  6. package/dist/accounts/list.js.map +1 -0
  7. package/dist/accounts/spot.js +20 -0
  8. package/dist/accounts/spot.js.map +1 -0
  9. package/dist/accounts/super-margin.js +74 -0
  10. package/dist/accounts/super-margin.js.map +1 -0
  11. package/dist/accounts/swap.js +87 -0
  12. package/dist/accounts/swap.js.map +1 -0
  13. package/dist/api/private-api.js +0 -8
  14. package/dist/api/private-api.js.map +1 -1
  15. package/dist/index.js +5 -4
  16. package/dist/index.js.map +1 -1
  17. package/dist/orders/submitOrder.js +3 -2
  18. package/dist/orders/submitOrder.js.map +1 -1
  19. package/dist/uid.js +0 -1
  20. package/dist/uid.js.map +1 -1
  21. package/lib/account-actions-with-credentials.d.ts +2 -0
  22. package/lib/account-actions-with-credentials.d.ts.map +1 -0
  23. package/lib/account-actions-with-credentials.js +32 -0
  24. package/lib/account-actions-with-credentials.js.map +1 -0
  25. package/lib/account-info.d.ts +1 -1
  26. package/lib/account-info.d.ts.map +1 -1
  27. package/lib/account-info.js +11 -171
  28. package/lib/account-info.js.map +1 -1
  29. package/lib/accounts/list.d.ts +4 -0
  30. package/lib/accounts/list.d.ts.map +1 -0
  31. package/lib/accounts/list.js +12 -0
  32. package/lib/accounts/list.js.map +1 -0
  33. package/lib/accounts/spot.d.ts +4 -0
  34. package/lib/accounts/spot.d.ts.map +1 -0
  35. package/lib/accounts/spot.js +24 -0
  36. package/lib/accounts/spot.js.map +1 -0
  37. package/lib/accounts/super-margin.d.ts +7 -0
  38. package/lib/accounts/super-margin.d.ts.map +1 -0
  39. package/lib/accounts/super-margin.js +78 -0
  40. package/lib/accounts/super-margin.js.map +1 -0
  41. package/lib/accounts/swap.d.ts +4 -0
  42. package/lib/accounts/swap.d.ts.map +1 -0
  43. package/lib/accounts/swap.js +91 -0
  44. package/lib/accounts/swap.js.map +1 -0
  45. package/lib/api/private-api.d.ts +0 -13
  46. package/lib/api/private-api.d.ts.map +1 -1
  47. package/lib/api/private-api.js +1 -10
  48. package/lib/api/private-api.js.map +1 -1
  49. package/lib/index.d.ts +1 -0
  50. package/lib/index.d.ts.map +1 -1
  51. package/lib/index.js +4 -3
  52. package/lib/index.js.map +1 -1
  53. package/lib/orders/submitOrder.d.ts.map +1 -1
  54. package/lib/orders/submitOrder.js +2 -1
  55. package/lib/orders/submitOrder.js.map +1 -1
  56. package/lib/uid.d.ts +0 -1
  57. package/lib/uid.d.ts.map +1 -1
  58. package/lib/uid.js +0 -1
  59. package/lib/uid.js.map +1 -1
  60. package/package.json +2 -2
  61. package/temp/package-deps.json +14 -9
@@ -1 +1 @@
1
- {"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n}\n\nexport const getDefaultCredential = (): ICredential => {\n return {\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n };\n};\n\nexport const privateRequest = async (\n credential: ICredential,\n method: string,\n path: string,\n api_root: string,\n params?: any,\n) => {\n const requestParams = `AccessKeyId=${\n credential.access_key\n }&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(\n new Date().toISOString().split('.')[0],\n )}${\n method === 'GET' && params !== undefined\n ? `&${Object.entries(params)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&')}`\n : ''\n }`;\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n const requestString = `${method}\\n${api_root}\\n${path}\\n${requestParams}`;\n\n const str = encodeBase64(\n await HmacSHA256(\n new TextEncoder().encode(requestString),\n new TextEncoder().encode(credential.secret_key),\n ),\n );\n\n const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);\n // url.searchParams.sort();\n console.info(formatTime(Date.now()), method, url.href, body);\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n const retStr = await res.text();\n console.info(formatTime(Date.now()), 'PrivateResponse', url.toString(), res.status);\n try {\n return JSON.parse(retStr);\n } catch (e) {\n console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);\n throw e;\n }\n};\n\n/**\n * 获取账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003\n */\nexport const getAccount = (\n credential: ICredential,\n): Promise<{\n status: string;\n data: {\n id: number;\n type: string;\n state: string;\n subtype: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/accounts', 'api.huobi.pro');\n};\n\n/**\n * 获取用户ID\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003\n */\nexport const getUid = (credential: ICredential): Promise<{ data: number; code: number }> => {\n return privateRequest(credential, 'GET', '/v2/user/uid', 'api.huobi.pro');\n};\n\n/**\n * 获取统一账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003\n */\nexport const getUnifiedAccountInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n msg: string;\n data: {\n margin_asset: string;\n margin_balance: number;\n cross_margin_static: number;\n cross_profit_unreal: number;\n withdraw_available: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info', 'api.hbdm.com');\n};\n\n/**\n * 获取合约持仓信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapCrossPositionInfo = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n contract_type: string;\n },\n): Promise<{\n status: string;\n ts: number;\n data: {\n contract_code: string;\n contract_type: string;\n direction: string;\n margin_mode: string;\n volume: number;\n available: number;\n cost_hold: number;\n last_price: number;\n profit_unreal: number;\n lever_rate: number;\n }[];\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_position_info',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取合约挂单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapOpenOrders = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n page_index?: number;\n page_size?: number;\n sort_by?: string;\n trade_type?: string;\n },\n): Promise<{\n status: string;\n data: {\n orders: {\n order_id_str: string;\n contract_code: string;\n order_price_type: string;\n direction: string;\n offset: string;\n volume: number;\n created_at: number;\n price: number;\n trade_volume: number;\n }[];\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_openorders',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取现货账户余额\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountBalance = (\n credential: ICredential,\n account_uid: number,\n): Promise<{\n status: string;\n data: {\n list: {\n currency: string;\n balance: string;\n type: string;\n }[];\n };\n}> => {\n return privateRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`, 'api.huobi.pro');\n};\n\n/**\n * 获取杠杆借贷信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003\n */\nexport const getCrossMarginLoanInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n data: {\n currency: string;\n 'loanable-amt': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/cross-margin/loan-info', 'api.huobi.pro');\n};\n\n/**\n * 获取现货行情\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003\n */\nexport const getSpotTick = (\n credential: ICredential,\n params: { symbol: string },\n): Promise<{\n status: string;\n tick: {\n close: number;\n };\n}> => {\n return privateRequest(credential, 'GET', `/market/detail/merged`, 'api.huobi.pro', params);\n};\n\n/**\n * 现货下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotOrder = (\n credential: ICredential,\n params: {\n symbol: string;\n 'account-id': string;\n amount: string;\n market_amount?: string;\n 'borrow-amount'?: string;\n type: string;\n 'trade-purpose': string;\n price?: string;\n source: string;\n },\n): Promise<{ success: boolean; code: number; message: string; data: { orderId: number } }> => {\n return privateRequest(credential, 'POST', `/v1/order/auto/place`, 'api.huobi.pro', params);\n};\n\n/**\n * 合约下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapOrder = (\n credential: ICredential,\n params: {\n contract_code: string;\n contract_type: string;\n price?: number;\n volume: number;\n offset: string;\n direction: string;\n lever_rate: number;\n order_price_type: string;\n },\n): Promise<{ status: string; ts: number; data: { order_id: number; order_id_str: string } }> => {\n return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', 'api.hbdm.com', params);\n};\n\n/**\n * 获取现货存款地址\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountDepositAddresses = (\n credential: ICredential,\n params: { currency: string },\n): Promise<{\n code: number;\n message: string;\n data: {\n currency: string;\n chain: string;\n address: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/deposit/address`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户流水\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003\n */\nexport const getAccountLedger = (\n credential: ICredential,\n params: { accountId: string; currency: string },\n): Promise<{\n status: string;\n data: {\n transactTime: number;\n transactAmt: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/ledger`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转出\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferOut = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转入\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferIn = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, 'api.huobi.pro', params);\n};\n\n/**\n * 现货账户转账\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotAccountTransfer = (\n credential: ICredential,\n params: {\n from: string;\n to: string;\n currency: string;\n amount: number;\n 'margin-account': string;\n },\n): Promise<{ success: boolean; data: number; code: number; message: string }> => {\n return privateRequest(credential, 'POST', `/v2/account/transfer`, 'api.huobi.pro', params);\n};\n\n/**\n * 借贷\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003\n */\nexport const postBorrow = (\n credential: ICredential,\n params: { currency: string; amount: string },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/orders`, 'api.huobi.pro', params);\n};\n\n/**\n * 提现\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003\n */\nexport const postWithdraw = (\n credential: ICredential,\n params: {\n address: string;\n amount: string;\n currency: string;\n fee: string;\n chain: string;\n },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取充提历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003\n */\nexport const getDepositWithdrawHistory = (\n credential: ICredential,\n params: {\n currency: string;\n type: string;\n from?: string;\n size?: string;\n direct?: string;\n },\n): Promise<{\n status: string;\n 'error-code': string;\n 'error-msg': string;\n data: {\n id: number;\n type: string;\n currency: string;\n 'tx-hash': string;\n chain: string;\n amount: string;\n address: string;\n 'address-tag': string;\n fee: string;\n state: string;\n 'create-at': number;\n 'update-at': number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v1/query/deposit-withdraw`, 'api.huobi.pro', params);\n};\n\n/**\n * 资产划转(母子用户之间)\n *\n * 接口权限: 交易\n *\n * 限频: 2次/2s\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003\n */\nexport const postSubUserTransfer = (\n credential: ICredential,\n params: {\n 'sub-uid': number;\n currency: string;\n amount: number;\n 'client-order-id'?: string;\n type: string;\n },\n): Promise<{\n data: number;\n status: string;\n}> => {\n return privateRequest(credential, 'POST', '/v1/subuser/transfer', 'api.huobi.pro', params);\n};\n\n/**\n * 获取子用户列表\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003\n */\nexport const getSubUserList = (\n credential: ICredential,\n params?: { fromId?: number },\n): Promise<{\n code: number;\n message?: string;\n data: {\n uid: number;\n userState: string;\n subUserName: string;\n note: string;\n }[];\n nextId?: number;\n ok: boolean;\n}> => {\n return privateRequest(credential, 'GET', `/v2/sub-user/user-list`, 'api.huobi.pro', params);\n};\n\n/**\n * 账户类型查询\n *\n * 是否验签: 是\n *\n * 接口权限: 读取\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。\n * 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapUnifiedAccountType = (\n credential: ICredential,\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type', 'api.hbdm.com');\n};\n\n/**\n * 账户类型更改接口\n *\n * 是否验签: 是\n *\n * 接口权限: 交易\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapSwitchAccountType = (\n credential: ICredential,\n params: { account_type: number },\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v3/swap_switch_account_type',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\nexport const getV2ReferenceCurrencies = (\n credential: ICredential,\n params: {\n currency?: string;\n authorizedUser?: string;\n },\n): Promise<{\n code: number;\n data: {\n currency: string;\n assetType: number;\n chains: {\n chain: string;\n displayName: string;\n fullName: string;\n baseChain?: string;\n baseChainProtocol?: string;\n isDynamic?: boolean;\n numOfConfirmations: number;\n numOfFastConfirmations: number;\n depositStatus: string;\n minDepositAmt: string;\n withdrawStatus: string;\n minWithdrawAmt: string;\n withdrawPrecision: number;\n maxWithdrawAmt: string;\n withdrawQuotaPerDay: string;\n withdrawQuotaPerYear: null;\n withdrawQuotaTotal: null;\n withdrawFeeType: string;\n transactFeeWithdraw?: string;\n addrWithTag: boolean;\n addrDepositTag: boolean;\n minTransactFeeWithdraw?: string;\n transactFeeRateWithdraw?: string;\n maxTransactFeeWithdraw?: string;\n }[];\n instStatus: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v2/reference/currencies', 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003\n */\nexport const getAccountHistory = (\n credential: ICredential,\n params: {\n 'account-id': string;\n currency?: string;\n 'transact-types'?: number;\n 'start-time'?: number;\n 'end-time'?: number;\n sort?: 'asc' | 'desc';\n size?: number;\n 'from-id'?: number;\n },\n): Promise<{\n // code: number;\n 'transact-amt': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n 'record-id': string;\n status: string;\n data: {\n 'account-id': string;\n currency: string;\n 'record-id': string;\n 'transact-amt': string;\n 'transact-type': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/history', 'api.huobi.pro', params);\n};\n"]}
1
+ {"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAOrE,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAgB,EAAE;IACpD,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAW;QACnC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAW;KACpC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,UAAuB,EACvB,MAAc,EACd,IAAY,EACZ,QAAgB,EAChB,MAAY,EACZ,EAAE;IACF,MAAM,aAAa,GAAG,eACpB,UAAU,CAAC,UACb,4DAA4D,kBAAkB,CAC5E,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACvC,GACC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS;QACtC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aACvB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;aAC5B,IAAI,CAAC,GAAG,CAAC,EAAE;QAChB,CAAC,CAAC,EACN,EAAE,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,aAAa,GAAG,GAAG,MAAM,KAAK,QAAQ,KAAK,IAAI,KAAK,aAAa,EAAE,CAAC;IAE1E,MAAM,GAAG,GAAG,YAAY,CACtB,MAAM,UAAU,CACd,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EACvC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAChD,CACF,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,QAAQ,GAAG,IAAI,IAAI,aAAa,cAAc,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxG,2BAA2B;IAC3B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;QAChC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,IAAI,SAAS;KACxB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,iBAAiB,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpF,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC3B;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAClG,MAAM,CAAC,CAAC;KACT;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,UAAuB,EAStB,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAAuB,EAA2C,EAAE;IACzF,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,UAAuB,EAYtB,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,0CAA0C,EAAE,cAAc,CAAC,CAAC;AACvG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,UAAuB,EACvB,MAIC,EAgBA,EAAE;IACH,OAAO,cAAc,CACnB,UAAU,EACV,MAAM,EACN,8CAA8C,EAC9C,cAAc,EACd,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,UAAuB,EACvB,MAOC,EAgBA,EAAE;IACH,OAAO,cAAc,CACnB,UAAU,EACV,MAAM,EACN,2CAA2C,EAC3C,cAAc,EACd,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,UAAuB,EACvB,WAAmB,EAUlB,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,wBAAwB,WAAW,UAAU,EAAE,eAAe,CAAC,CAAC;AAC3G,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,UAAuB,EAQtB,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,4BAA4B,EAAE,eAAe,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,UAAuB,EACvB,MAUC,EACwF,EAAE;IAC3F,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,UAAuB,EACvB,MASC,EAC0F,EAAE;IAC7F,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,sCAAsC,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AAC5G,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,UAAuB,EACvB,MAA4B,EAS3B,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,UAAuB,EACvB,MAA+C,EAO9C,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,UAAuB,EACvB,MAGC,EAC0C,EAAE;IAC7C,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,+BAA+B,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AACtG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,UAAuB,EACvB,MAGC,EAC0C,EAAE;IAC7C,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,8BAA8B,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,UAAuB,EACvB,MAMC,EAC2E,EAAE;IAC9E,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,UAAuB,EACvB,MAA4C,EAI3C,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,UAAuB,EACvB,MAMC,EAIA,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,UAAuB,EACvB,MAMC,EAmBA,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAClG,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAAuB,EACvB,MAMC,EAIA,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,UAAuB,EACvB,MAA4B,EAY3B,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAC9F,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,UAAuB,EAQtB,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,+CAA+C,EAAE,cAAc,CAAC,CAAC;AAC5G,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,UAAuB,EACvB,MAAgC,EAQ/B,EAAE;IACH,OAAO,cAAc,CACnB,UAAU,EACV,MAAM,EACN,8CAA8C,EAC9C,cAAc,EACd,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,UAAuB,EACvB,MAGC,EAkCA,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,UAAuB,EACvB,MASC,EAmBA,EAAE;IACH,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;AAC3F,CAAC,CAAC","sourcesContent":["import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n}\n\nexport const getDefaultCredential = (): ICredential => {\n return {\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n };\n};\n\nexport const privateRequest = async (\n credential: ICredential,\n method: string,\n path: string,\n api_root: string,\n params?: any,\n) => {\n const requestParams = `AccessKeyId=${\n credential.access_key\n }&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(\n new Date().toISOString().split('.')[0],\n )}${\n method === 'GET' && params !== undefined\n ? `&${Object.entries(params)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&')}`\n : ''\n }`;\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n const requestString = `${method}\\n${api_root}\\n${path}\\n${requestParams}`;\n\n const str = encodeBase64(\n await HmacSHA256(\n new TextEncoder().encode(requestString),\n new TextEncoder().encode(credential.secret_key),\n ),\n );\n\n const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);\n // url.searchParams.sort();\n console.info(formatTime(Date.now()), method, url.href, body);\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n const retStr = await res.text();\n console.info(formatTime(Date.now()), 'PrivateResponse', url.toString(), res.status);\n try {\n return JSON.parse(retStr);\n } catch (e) {\n console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);\n throw e;\n }\n};\n\n/**\n * 获取账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003\n */\nexport const getAccount = (\n credential: ICredential,\n): Promise<{\n status: string;\n data: {\n id: number;\n type: string;\n state: string;\n subtype: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/accounts', 'api.huobi.pro');\n};\n\n/**\n * 获取用户ID\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003\n */\nexport const getUid = (credential: ICredential): Promise<{ data: number; code: number }> => {\n return privateRequest(credential, 'GET', '/v2/user/uid', 'api.huobi.pro');\n};\n\n/**\n * 获取统一账户信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003\n */\nexport const getUnifiedAccountInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n msg: string;\n data: {\n margin_asset: string;\n margin_balance: number;\n cross_margin_static: number;\n cross_profit_unreal: number;\n withdraw_available: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/unified_account_info', 'api.hbdm.com');\n};\n\n/**\n * 获取合约持仓信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapCrossPositionInfo = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n contract_type: string;\n },\n): Promise<{\n status: string;\n ts: number;\n data: {\n contract_code: string;\n contract_type: string;\n direction: string;\n margin_mode: string;\n volume: number;\n available: number;\n cost_hold: number;\n last_price: number;\n profit_unreal: number;\n lever_rate: number;\n }[];\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_position_info',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取合约挂单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapOpenOrders = (\n credential: ICredential,\n params?: {\n contract_code?: string;\n pair?: string;\n page_index?: number;\n page_size?: number;\n sort_by?: string;\n trade_type?: string;\n },\n): Promise<{\n status: string;\n data: {\n orders: {\n order_id_str: string;\n contract_code: string;\n order_price_type: string;\n direction: string;\n offset: string;\n volume: number;\n created_at: number;\n price: number;\n trade_volume: number;\n }[];\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v1/swap_cross_openorders',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * 获取现货账户余额\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountBalance = (\n credential: ICredential,\n account_uid: number,\n): Promise<{\n status: string;\n data: {\n list: {\n currency: string;\n balance: string;\n type: string;\n }[];\n };\n}> => {\n return privateRequest(credential, 'GET', `/v1/account/accounts/${account_uid}/balance`, 'api.huobi.pro');\n};\n\n/**\n * 获取杠杆借贷信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003\n */\nexport const getCrossMarginLoanInfo = (\n credential: ICredential,\n): Promise<{\n status: string;\n code: number;\n data: {\n currency: string;\n 'loanable-amt': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/cross-margin/loan-info', 'api.huobi.pro');\n};\n\n/**\n * 现货下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotOrder = (\n credential: ICredential,\n params: {\n symbol: string;\n 'account-id': string;\n amount: string;\n market_amount?: string;\n 'borrow-amount'?: string;\n type: string;\n 'trade-purpose': string;\n price?: string;\n source: string;\n },\n): Promise<{ success: boolean; code: number; message: string; data: { orderId: number } }> => {\n return privateRequest(credential, 'POST', `/v1/order/auto/place`, 'api.huobi.pro', params);\n};\n\n/**\n * 合约下单\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapOrder = (\n credential: ICredential,\n params: {\n contract_code: string;\n contract_type: string;\n price?: number;\n volume: number;\n offset: string;\n direction: string;\n lever_rate: number;\n order_price_type: string;\n },\n): Promise<{ status: string; ts: number; data: { order_id: number; order_id_str: string } }> => {\n return privateRequest(credential, 'POST', '/linear-swap-api/v1/swap_cross_order', 'api.hbdm.com', params);\n};\n\n/**\n * 获取现货存款地址\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003\n */\nexport const getSpotAccountDepositAddresses = (\n credential: ICredential,\n params: { currency: string },\n): Promise<{\n code: number;\n message: string;\n data: {\n currency: string;\n chain: string;\n address: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/deposit/address`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户流水\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003\n */\nexport const getAccountLedger = (\n credential: ICredential,\n params: { accountId: string; currency: string },\n): Promise<{\n status: string;\n data: {\n transactTime: number;\n transactAmt: number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v2/account/ledger`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转出\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferOut = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-out`, 'api.huobi.pro', params);\n};\n\n/**\n * 超级杠杆转入\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003\n */\nexport const postSuperMarginAccountTransferIn = (\n credential: ICredential,\n params: {\n currency: string;\n amount: string;\n },\n): Promise<{ status: string; data: number }> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/transfer-in`, 'api.huobi.pro', params);\n};\n\n/**\n * 现货账户转账\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003\n */\nexport const postSpotAccountTransfer = (\n credential: ICredential,\n params: {\n from: string;\n to: string;\n currency: string;\n amount: number;\n 'margin-account': string;\n },\n): Promise<{ success: boolean; data: number; code: number; message: string }> => {\n return privateRequest(credential, 'POST', `/v2/account/transfer`, 'api.huobi.pro', params);\n};\n\n/**\n * 借贷\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003\n */\nexport const postBorrow = (\n credential: ICredential,\n params: { currency: string; amount: string },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/cross-margin/orders`, 'api.huobi.pro', params);\n};\n\n/**\n * 提现\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003\n */\nexport const postWithdraw = (\n credential: ICredential,\n params: {\n address: string;\n amount: string;\n currency: string;\n fee: string;\n chain: string;\n },\n): Promise<{\n status: string;\n data: number;\n}> => {\n return privateRequest(credential, 'POST', `/v1/dw/withdraw/api/create`, 'api.huobi.pro', params);\n};\n\n/**\n * 获取充提历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003\n */\nexport const getDepositWithdrawHistory = (\n credential: ICredential,\n params: {\n currency: string;\n type: string;\n from?: string;\n size?: string;\n direct?: string;\n },\n): Promise<{\n status: string;\n 'error-code': string;\n 'error-msg': string;\n data: {\n id: number;\n type: string;\n currency: string;\n 'tx-hash': string;\n chain: string;\n amount: string;\n address: string;\n 'address-tag': string;\n fee: string;\n state: string;\n 'create-at': number;\n 'update-at': number;\n }[];\n}> => {\n return privateRequest(credential, 'GET', `/v1/query/deposit-withdraw`, 'api.huobi.pro', params);\n};\n\n/**\n * 资产划转(母子用户之间)\n *\n * 接口权限: 交易\n *\n * 限频: 2次/2s\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003\n */\nexport const postSubUserTransfer = (\n credential: ICredential,\n params: {\n 'sub-uid': number;\n currency: string;\n amount: number;\n 'client-order-id'?: string;\n type: string;\n },\n): Promise<{\n data: number;\n status: string;\n}> => {\n return privateRequest(credential, 'POST', '/v1/subuser/transfer', 'api.huobi.pro', params);\n};\n\n/**\n * 获取子用户列表\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003\n */\nexport const getSubUserList = (\n credential: ICredential,\n params?: { fromId?: number },\n): Promise<{\n code: number;\n message?: string;\n data: {\n uid: number;\n userState: string;\n subUserName: string;\n note: string;\n }[];\n nextId?: number;\n ok: boolean;\n}> => {\n return privateRequest(credential, 'GET', `/v2/sub-user/user-list`, 'api.huobi.pro', params);\n};\n\n/**\n * 账户类型查询\n *\n * 是否验签: 是\n *\n * 接口权限: 读取\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。\n * 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003\n */\nexport const getSwapUnifiedAccountType = (\n credential: ICredential,\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(credential, 'GET', '/linear-swap-api/v3/swap_unified_account_type', 'api.hbdm.com');\n};\n\n/**\n * 账户类型更改接口\n *\n * 是否验签: 是\n *\n * 接口权限: 交易\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003\n */\nexport const postSwapSwitchAccountType = (\n credential: ICredential,\n params: { account_type: number },\n): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n}> => {\n return privateRequest(\n credential,\n 'POST',\n '/linear-swap-api/v3/swap_switch_account_type',\n 'api.hbdm.com',\n params,\n );\n};\n\n/**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\nexport const getV2ReferenceCurrencies = (\n credential: ICredential,\n params: {\n currency?: string;\n authorizedUser?: string;\n },\n): Promise<{\n code: number;\n data: {\n currency: string;\n assetType: number;\n chains: {\n chain: string;\n displayName: string;\n fullName: string;\n baseChain?: string;\n baseChainProtocol?: string;\n isDynamic?: boolean;\n numOfConfirmations: number;\n numOfFastConfirmations: number;\n depositStatus: string;\n minDepositAmt: string;\n withdrawStatus: string;\n minWithdrawAmt: string;\n withdrawPrecision: number;\n maxWithdrawAmt: string;\n withdrawQuotaPerDay: string;\n withdrawQuotaPerYear: null;\n withdrawQuotaTotal: null;\n withdrawFeeType: string;\n transactFeeWithdraw?: string;\n addrWithTag: boolean;\n addrDepositTag: boolean;\n minTransactFeeWithdraw?: string;\n transactFeeRateWithdraw?: string;\n maxTransactFeeWithdraw?: string;\n }[];\n instStatus: string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v2/reference/currencies', 'api.huobi.pro', params);\n};\n\n/**\n * 获取账户历史\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003\n */\nexport const getAccountHistory = (\n credential: ICredential,\n params: {\n 'account-id': string;\n currency?: string;\n 'transact-types'?: number;\n 'start-time'?: number;\n 'end-time'?: number;\n sort?: 'asc' | 'desc';\n size?: number;\n 'from-id'?: number;\n },\n): Promise<{\n // code: number;\n 'transact-amt': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n 'record-id': string;\n status: string;\n data: {\n 'account-id': string;\n currency: string;\n 'record-id': string;\n 'transact-amt': string;\n 'transact-type': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n }[];\n}> => {\n return privateRequest(credential, 'GET', '/v1/account/history', 'api.huobi.pro', params);\n};\n"]}
package/dist/index.js CHANGED
@@ -1,14 +1,15 @@
1
- import { addAccountMarket } from '@yuants/data-account';
1
+ import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';
2
2
  import { Terminal } from '@yuants/protocol';
3
3
  import { formatTime } from '@yuants/utils';
4
+ import './account-actions-with-credentials';
4
5
  import { provideSpotAccountInfoService, provideSwapAccountInfoService } from './account-info';
6
+ import { getSuperMarginAccountInfo } from './accounts/super-margin';
5
7
  import { getAccount, getDefaultCredential, getSubUserList, getSwapUnifiedAccountType, getUid, postSwapSwitchAccountType, } from './api/private-api';
6
8
  import './interest_rate';
7
9
  import { provideOrderSubmitService } from './order-actions';
8
10
  import './order-actions-with-credentials';
9
11
  import './quote';
10
12
  import { setupSpotSuperMarginTransfer, setupSpotSwapTransfer, setupSubAccountTransfers, setupTrc20WithdrawalAddresses, } from './transfer';
11
- import { spotAccountUidCache } from './uid';
12
13
  const terminal = Terminal.fromNodeEnv();
13
14
  const credential = getDefaultCredential();
14
15
  (async () => {
@@ -23,7 +24,6 @@ const credential = getDefaultCredential();
23
24
  const huobiUid = (await getUid(credential)).data;
24
25
  console.info(formatTime(Date.now()), 'UID', huobiUid);
25
26
  const huobiAccounts = await getAccount(credential);
26
- const spotAccountUid = (await spotAccountUidCache.query(JSON.stringify(credential)));
27
27
  console.info(formatTime(Date.now()), 'huobiAccount', JSON.stringify(huobiAccounts));
28
28
  const account_id = `huobi/${huobiUid}`;
29
29
  const SPOT_ACCOUNT_ID = `${account_id}/spot/usdt`;
@@ -35,7 +35,8 @@ const credential = getDefaultCredential();
35
35
  console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));
36
36
  // 设置账户信息服务
37
37
  provideSwapAccountInfoService(terminal, SWAP_ACCOUNT_ID, credential);
38
- provideSpotAccountInfoService(terminal, SPOT_ACCOUNT_ID, credential, spotAccountUid);
38
+ provideAccountInfoService(terminal, SUPER_MARGIN_ACCOUNT_ID, async () => getSuperMarginAccountInfo(credential, SUPER_MARGIN_ACCOUNT_ID), { auto_refresh_interval: 1000 });
39
+ provideSpotAccountInfoService(terminal, SPOT_ACCOUNT_ID, credential);
39
40
  // 设置账户市场关联
40
41
  addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'HUOBI/SPOT' });
41
42
  addAccountMarket(terminal, { account_id: SUPER_MARGIN_ACCOUNT_ID, market_id: 'HUOBI/SUPER-MARGIN' });
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 } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport { provideSpotAccountInfoService, provideSwapAccountInfoService } from './account-info';\nimport {\n getAccount,\n getDefaultCredential,\n getSubUserList,\n getSwapUnifiedAccountType,\n getUid,\n postSwapSwitchAccountType,\n} from './api/private-api';\nimport './interest_rate';\nimport { provideOrderSubmitService } from './order-actions';\nimport './order-actions-with-credentials';\nimport './quote';\nimport {\n setupSpotSuperMarginTransfer,\n setupSpotSwapTransfer,\n setupSubAccountTransfers,\n setupTrc20WithdrawalAddresses,\n} from './transfer';\nimport { spotAccountUidCache } from './uid';\n\nconst terminal = Terminal.fromNodeEnv();\nconst credential = getDefaultCredential();\n\n(async () => {\n // 账户类型切换\n const swapAccountTypeRes = await getSwapUnifiedAccountType(credential);\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 postSwapSwitchAccountType(credential, { account_type: 2 });\n console.info(formatTime(Date.now()), 'SwitchingAccountType', `current: ${switchRes.data.account_type}`);\n }\n\n const huobiUid: number = (await getUid(credential)).data;\n console.info(formatTime(Date.now()), 'UID', huobiUid);\n\n const huobiAccounts = await getAccount(credential);\n const spotAccountUid = (await spotAccountUidCache.query(JSON.stringify(credential)))!;\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 getSubUserList(credential);\n const subAccounts = subUsersRes.data;\n const isMainAccount = subUsersRes.ok;\n console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));\n\n // 设置账户信息服务\n\n provideSwapAccountInfoService(terminal, SWAP_ACCOUNT_ID, credential);\n\n provideSpotAccountInfoService(terminal, SPOT_ACCOUNT_ID, credential, spotAccountUid);\n\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 // 设置订单提交服务\n provideOrderSubmitService(terminal, SWAP_ACCOUNT_ID, SUPER_MARGIN_ACCOUNT_ID, credential);\n\n // 设置转账功能\n await setupTrc20WithdrawalAddresses(terminal, SPOT_ACCOUNT_ID, credential, isMainAccount);\n setupSpotSuperMarginTransfer(terminal, SPOT_ACCOUNT_ID, SUPER_MARGIN_ACCOUNT_ID, credential, huobiUid);\n setupSpotSwapTransfer(terminal, SPOT_ACCOUNT_ID, SWAP_ACCOUNT_ID, credential, huobiUid);\n setupSubAccountTransfers(terminal, SPOT_ACCOUNT_ID, credential, huobiUid, subAccounts, isMainAccount);\n})();\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport './account-actions-with-credentials';\nimport { provideSpotAccountInfoService, provideSwapAccountInfoService } from './account-info';\nimport { getSuperMarginAccountInfo } from './accounts/super-margin';\nimport {\n getAccount,\n getDefaultCredential,\n getSubUserList,\n getSwapUnifiedAccountType,\n getUid,\n postSwapSwitchAccountType,\n} from './api/private-api';\nimport './interest_rate';\nimport { provideOrderSubmitService } from './order-actions';\nimport './order-actions-with-credentials';\nimport './quote';\nimport {\n setupSpotSuperMarginTransfer,\n setupSpotSwapTransfer,\n setupSubAccountTransfers,\n setupTrc20WithdrawalAddresses,\n} from './transfer';\n\nconst terminal = Terminal.fromNodeEnv();\nconst credential = getDefaultCredential();\n\n(async () => {\n // 账户类型切换\n const swapAccountTypeRes = await getSwapUnifiedAccountType(credential);\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 postSwapSwitchAccountType(credential, { account_type: 2 });\n console.info(formatTime(Date.now()), 'SwitchingAccountType', `current: ${switchRes.data.account_type}`);\n }\n\n const huobiUid: number = (await getUid(credential)).data;\n console.info(formatTime(Date.now()), 'UID', huobiUid);\n\n const huobiAccounts = await getAccount(credential);\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 getSubUserList(credential);\n const subAccounts = subUsersRes.data;\n const isMainAccount = subUsersRes.ok;\n console.info(formatTime(Date.now()), 'subAccounts', JSON.stringify(subAccounts));\n\n // 设置账户信息服务\n\n provideSwapAccountInfoService(terminal, SWAP_ACCOUNT_ID, credential);\n\n provideAccountInfoService(\n terminal,\n SUPER_MARGIN_ACCOUNT_ID,\n async () => getSuperMarginAccountInfo(credential, SUPER_MARGIN_ACCOUNT_ID),\n { auto_refresh_interval: 1000 },\n );\n\n provideSpotAccountInfoService(terminal, SPOT_ACCOUNT_ID, credential);\n\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 // 设置订单提交服务\n provideOrderSubmitService(terminal, SWAP_ACCOUNT_ID, SUPER_MARGIN_ACCOUNT_ID, credential);\n\n // 设置转账功能\n await setupTrc20WithdrawalAddresses(terminal, SPOT_ACCOUNT_ID, credential, isMainAccount);\n setupSpotSuperMarginTransfer(terminal, SPOT_ACCOUNT_ID, SUPER_MARGIN_ACCOUNT_ID, credential, huobiUid);\n setupSpotSwapTransfer(terminal, SPOT_ACCOUNT_ID, SWAP_ACCOUNT_ID, credential, huobiUid);\n setupSubAccountTransfers(terminal, SPOT_ACCOUNT_ID, credential, huobiUid, subAccounts, isMainAccount);\n})();\n"]}
@@ -1,6 +1,7 @@
1
1
  import { formatTime, roundToStep } from '@yuants/utils';
2
2
  import { firstValueFrom } from 'rxjs';
3
- import { getCrossMarginLoanInfo, getSpotAccountBalance, getSpotTick, getSwapCrossPositionInfo, postSpotOrder, postSwapOrder, } from '../api/private-api';
3
+ import { getCrossMarginLoanInfo, getSpotAccountBalance, getSwapCrossPositionInfo, postSpotOrder, postSwapOrder, } from '../api/private-api';
4
+ import { getSpotTick } from '../api/public-api';
4
5
  import { spotProductService } from '../product';
5
6
  import { superMarginAccountUidCache } from '../uid';
6
7
  /**
@@ -47,7 +48,7 @@ async function handleSuperMarginOrder(order, credential) {
47
48
  const [balanceRes, mapProductIdToProduct, priceRes] = await Promise.all([
48
49
  getSpotAccountBalance(credential, superMarginAccountUid),
49
50
  firstValueFrom(spotProductService.mapProductIdToProduct$),
50
- getSpotTick(credential, { symbol: order.product_id }),
51
+ getSpotTick({ symbol: order.product_id }),
51
52
  ]);
52
53
  const balance = balanceRes.data.list
53
54
  .filter((v) => v.currency === 'usdt' && v.type === 'trade')
@@ -1 +1 @@
1
- {"version":3,"file":"submitOrder.js","sourceRoot":"","sources":["../../src/orders/submitOrder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAEL,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,EACX,wBAAwB,EACxB,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,QAAQ,CAAC;AAEpD;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,UAAuB;;IACnE,SAAS;IACT,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,qBAAqB,GAAG,MAAM,CAAC,WAAW,CAC9C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAC9D,CAAC;IAEF,MAAM,UAAU,GAAG,MAAA,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,mCAAI,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG;QACb,aAAa,EAAE,KAAK,CAAC,UAAU;QAC/B,aAAa,EAAE,MAAM;QACrB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EACJ,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QACpG,SAAS,EACP,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QACnG,kCAAkC;QAClC,UAAU;QACV,gBAAgB,EAAE,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;KACrE,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpG,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;KACzE;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CAAC,KAAa,EAAE,UAAuB;IAC1E,UAAU;IACV,MAAM,qBAAqB,GAAG,MAAM,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,qBAAqB;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IACtE,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAE/C,kBAAkB;IAClB,MAAM,CAAC,UAAU,EAAE,qBAAqB,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtE,qBAAqB,CAAC,UAAU,EAAE,qBAAqB,CAAC;QACxD,cAAc,CAAC,kBAAkB,CAAC,sBAAsB,CAAC;QACzD,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;KACtD,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;SAC1D,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC,qBAAqB;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAErE,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAClC,MAAM,aAAa,GACjB,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,aAAa;QAC9E,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,UAAU;QACxB,YAAY,EAAE,EAAE,GAAG,qBAAqB;QACxC,MAAM,EACJ,EAAE;YACF,CAAC,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,aAAa;gBAC/E,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAY,CAAC;gBAC7D,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACnB,eAAe,EAAE,EAAE,GAAG,aAAa;QACnC,IAAI,EAAE,GACJ,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAC7F,IAAI,OAAO,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QACvD,eAAe,EACb,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,aAAa;YAC9E,CAAC,CAAC,GAAG,CAAC,cAAc;YACpB,CAAC,CAAC,GAAG;QACT,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK;QACnE,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpG,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;KACvG;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAuB,EAAE,KAAa,EAAiC,EAAE;IACnG,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;QACrC,OAAO,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;KAC3C;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;QAC7C,OAAO,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;KAClD;IACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;AACtF,CAAC,CAAC","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { formatTime, roundToStep } from '@yuants/utils';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ICredential,\n getCrossMarginLoanInfo,\n getSpotAccountBalance,\n getSpotTick,\n getSwapCrossPositionInfo,\n postSpotOrder,\n postSwapOrder,\n} from '../api/private-api';\nimport { spotProductService } from '../product';\nimport { superMarginAccountUidCache } from '../uid';\n\n/**\n * 处理 swap 账户订单提交\n */\nasync function handleSwapOrder(order: IOrder, credential: ICredential): Promise<{ order_id: string }> {\n // 获取仓位信息\n const positionInfo = await getSwapCrossPositionInfo(credential);\n const mapContractCodeToRate = Object.fromEntries(\n positionInfo.data.map((v) => [v.contract_code, v.lever_rate]),\n );\n\n const lever_rate = mapContractCodeToRate[order.product_id] ?? 20;\n const params = {\n contract_code: order.product_id,\n contract_type: 'swap',\n price: order.price,\n volume: order.volume,\n offset:\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'OPEN_SHORT' ? 'open' : 'close',\n direction:\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT' ? 'buy' : 'sell',\n // dynamically adjust the leverage\n lever_rate,\n order_price_type: order.order_type === 'MARKET' ? 'market' : 'limit',\n };\n\n const result = await postSwapOrder(credential, params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(result), JSON.stringify(params));\n\n if (result.status !== 'ok') {\n throw new Error(`Failed to submit swap order: status=${result.status}`);\n }\n return { order_id: result.data.order_id_str };\n}\n\n/**\n * 处理 super-margin 账户订单提交\n */\nasync function handleSuperMarginOrder(order: IOrder, credential: ICredential): Promise<{ order_id: string }> {\n // 获取可贷款金额\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Super margin account UID not found');\n const loanInfo = await getCrossMarginLoanInfo(credential);\n const usdtLoanable = loanInfo.data.find((v) => v.currency === 'usdt');\n if (!usdtLoanable) throw new Error('USDT loanable amount not found');\n const loanable = +usdtLoanable['loanable-amt'];\n\n // 获取账户余额, 产品信息和价格\n const [balanceRes, mapProductIdToProduct, priceRes] = await Promise.all([\n getSpotAccountBalance(credential, superMarginAccountUid),\n firstValueFrom(spotProductService.mapProductIdToProduct$),\n getSpotTick(credential, { symbol: order.product_id }),\n ]);\n\n const balance = balanceRes.data.list\n .filter((v) => v.currency === 'usdt' && v.type === 'trade')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n if (!mapProductIdToProduct) throw new Error('Product map not found');\n\n const theProduct = mapProductIdToProduct.get(order.product_id);\n const price = priceRes.tick.close;\n const borrow_amount =\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? Math.max(Math.min(loanable, order.volume * price - balance), 0)\n : undefined;\n\n const params = {\n symbol: order.product_id,\n 'account-id': '' + superMarginAccountUid,\n amount:\n '' +\n (order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? roundToStep(order.volume * price, theProduct?.volume_step!)\n : order.volume),\n 'borrow-amount': '' + borrow_amount,\n type: `${\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT' ? 'buy' : 'sell'\n }-${'LIMIT' === order.order_type ? 'limit' : 'market'}`,\n 'trade-purpose':\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? '1' // auto borrow\n : '2', // auto repay\n price: order.order_type === 'MARKET' ? undefined : '' + order.price,\n source: 'super-margin-api',\n };\n\n const result = await postSpotOrder(credential, params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(result), JSON.stringify(params));\n\n if (result.success === false) {\n throw new Error(`Failed to submit super margin order: code=${result.code} message=${result.message}`);\n }\n\n return { order_id: result.data.orderId.toString() };\n}\n\nexport const submitOrder = (credential: ICredential, order: IOrder): Promise<{ order_id: string }> => {\n if (order.account_id.includes('swap')) {\n return handleSwapOrder(order, credential);\n }\n if (order.account_id.includes('super-margin')) {\n return handleSuperMarginOrder(order, credential);\n }\n throw new Error(`Unsupported account_id for order submission: ${order.account_id}`);\n};\n"]}
1
+ {"version":3,"file":"submitOrder.js","sourceRoot":"","sources":["../../src/orders/submitOrder.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { formatTime, roundToStep } from '@yuants/utils';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ICredential,\n getCrossMarginLoanInfo,\n getSpotAccountBalance,\n getSwapCrossPositionInfo,\n postSpotOrder,\n postSwapOrder,\n} from '../api/private-api';\nimport { getSpotTick } from '../api/public-api';\nimport { spotProductService } from '../product';\nimport { superMarginAccountUidCache } from '../uid';\n\n/**\n * 处理 swap 账户订单提交\n */\nasync function handleSwapOrder(order: IOrder, credential: ICredential): Promise<{ order_id: string }> {\n // 获取仓位信息\n const positionInfo = await getSwapCrossPositionInfo(credential);\n const mapContractCodeToRate = Object.fromEntries(\n positionInfo.data.map((v) => [v.contract_code, v.lever_rate]),\n );\n\n const lever_rate = mapContractCodeToRate[order.product_id] ?? 20;\n const params = {\n contract_code: order.product_id,\n contract_type: 'swap',\n price: order.price,\n volume: order.volume,\n offset:\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'OPEN_SHORT' ? 'open' : 'close',\n direction:\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT' ? 'buy' : 'sell',\n // dynamically adjust the leverage\n lever_rate,\n order_price_type: order.order_type === 'MARKET' ? 'market' : 'limit',\n };\n\n const result = await postSwapOrder(credential, params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(result), JSON.stringify(params));\n\n if (result.status !== 'ok') {\n throw new Error(`Failed to submit swap order: status=${result.status}`);\n }\n return { order_id: result.data.order_id_str };\n}\n\n/**\n * 处理 super-margin 账户订单提交\n */\nasync function handleSuperMarginOrder(order: IOrder, credential: ICredential): Promise<{ order_id: string }> {\n // 获取可贷款金额\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Super margin account UID not found');\n const loanInfo = await getCrossMarginLoanInfo(credential);\n const usdtLoanable = loanInfo.data.find((v) => v.currency === 'usdt');\n if (!usdtLoanable) throw new Error('USDT loanable amount not found');\n const loanable = +usdtLoanable['loanable-amt'];\n\n // 获取账户余额, 产品信息和价格\n const [balanceRes, mapProductIdToProduct, priceRes] = await Promise.all([\n getSpotAccountBalance(credential, superMarginAccountUid),\n firstValueFrom(spotProductService.mapProductIdToProduct$),\n getSpotTick({ symbol: order.product_id }),\n ]);\n\n const balance = balanceRes.data.list\n .filter((v) => v.currency === 'usdt' && v.type === 'trade')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n if (!mapProductIdToProduct) throw new Error('Product map not found');\n\n const theProduct = mapProductIdToProduct.get(order.product_id);\n const price = priceRes.tick.close;\n const borrow_amount =\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? Math.max(Math.min(loanable, order.volume * price - balance), 0)\n : undefined;\n\n const params = {\n symbol: order.product_id,\n 'account-id': '' + superMarginAccountUid,\n amount:\n '' +\n (order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? roundToStep(order.volume * price, theProduct?.volume_step!)\n : order.volume),\n 'borrow-amount': '' + borrow_amount,\n type: `${\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT' ? 'buy' : 'sell'\n }-${'LIMIT' === order.order_type ? 'limit' : 'market'}`,\n 'trade-purpose':\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? '1' // auto borrow\n : '2', // auto repay\n price: order.order_type === 'MARKET' ? undefined : '' + order.price,\n source: 'super-margin-api',\n };\n\n const result = await postSpotOrder(credential, params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(result), JSON.stringify(params));\n\n if (result.success === false) {\n throw new Error(`Failed to submit super margin order: code=${result.code} message=${result.message}`);\n }\n\n return { order_id: result.data.orderId.toString() };\n}\n\nexport const submitOrder = (credential: ICredential, order: IOrder): Promise<{ order_id: string }> => {\n if (order.account_id.includes('swap')) {\n return handleSwapOrder(order, credential);\n }\n if (order.account_id.includes('super-margin')) {\n return handleSuperMarginOrder(order, credential);\n }\n throw new Error(`Unsupported account_id for order submission: ${order.account_id}`);\n};\n"]}
package/dist/uid.js CHANGED
@@ -13,7 +13,6 @@ export const getAccountIds = async (key) => {
13
13
  const SUPER_MARGIN_ACCOUNT_ID = `${account_id}/super-margin`;
14
14
  const SWAP_ACCOUNT_ID = `${account_id}/swap`;
15
15
  return {
16
- main: account_id,
17
16
  spot: SPOT_ACCOUNT_ID,
18
17
  superMargin: SUPER_MARGIN_ACCOUNT_ID,
19
18
  swap: SWAP_ACCOUNT_ID,
package/dist/uid.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"uid.js","sourceRoot":"","sources":["../src/uid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEtE,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,0BAA0B,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5D,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,0CAAE,EAAE,CAAA,EAAA,CAAC,CACzF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CACrD,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,0CAAE,EAAE,CAAA,EAAA,CAAC,CACjF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,SAAS,GAAG,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,GAAG,UAAU,YAAY,CAAC;IAClD,MAAM,uBAAuB,GAAG,GAAG,UAAU,eAAe,CAAC;IAC7D,MAAM,eAAe,GAAG,GAAG,UAAU,OAAO,CAAC;IAE7C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,uBAAuB;QACpC,IAAI,EAAE,eAAe;KACtB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { getAccount, getUid } from './api/private-api';\n\nexport const uidCache = createCache((key) => getUid(JSON.parse(key)));\n\nconst huobiAccounts = createCache((key) => getAccount(JSON.parse(key)));\n\nexport const superMarginAccountUidCache = createCache((key) =>\n huobiAccounts.query(key).then((x) => x?.data.find((v) => v.type === 'super-margin')?.id),\n);\n\nexport const spotAccountUidCache = createCache((key) =>\n huobiAccounts.query(key).then((x) => x?.data.find((v) => v.type === 'spot')?.id),\n);\n\nexport const getAccountIds = async (key: string) => {\n const uid = await uidCache.query(key);\n if (!uid) throw new Error('Failed to get UID');\n\n const account_id = `huobi/${uid}`;\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 return {\n main: account_id,\n spot: SPOT_ACCOUNT_ID,\n superMargin: SUPER_MARGIN_ACCOUNT_ID,\n swap: SWAP_ACCOUNT_ID,\n };\n};\n"]}
1
+ {"version":3,"file":"uid.js","sourceRoot":"","sources":["../src/uid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEtE,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,0BAA0B,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5D,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,0CAAE,EAAE,CAAA,EAAA,CAAC,CACzF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CACrD,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,0CAAE,EAAE,CAAA,EAAA,CAAC,CACjF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,SAAS,GAAG,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,GAAG,UAAU,YAAY,CAAC;IAClD,MAAM,uBAAuB,GAAG,GAAG,UAAU,eAAe,CAAC;IAC7D,MAAM,eAAe,GAAG,GAAG,UAAU,OAAO,CAAC;IAE7C,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,uBAAuB;QACpC,IAAI,EAAE,eAAe;KACtB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { getAccount, getUid } from './api/private-api';\n\nexport const uidCache = createCache((key) => getUid(JSON.parse(key)));\n\nconst huobiAccounts = createCache((key) => getAccount(JSON.parse(key)));\n\nexport const superMarginAccountUidCache = createCache((key) =>\n huobiAccounts.query(key).then((x) => x?.data.find((v) => v.type === 'super-margin')?.id),\n);\n\nexport const spotAccountUidCache = createCache((key) =>\n huobiAccounts.query(key).then((x) => x?.data.find((v) => v.type === 'spot')?.id),\n);\n\nexport const getAccountIds = async (key: string) => {\n const uid = await uidCache.query(key);\n if (!uid) throw new Error('Failed to get UID');\n\n const account_id = `huobi/${uid}`;\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 return {\n spot: SPOT_ACCOUNT_ID,\n superMargin: SUPER_MARGIN_ACCOUNT_ID,\n swap: SWAP_ACCOUNT_ID,\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=account-actions-with-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-actions-with-credentials.d.ts","sourceRoot":"","sources":["../src/account-actions-with-credentials.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const data_account_1 = require("@yuants/data-account");
4
+ const protocol_1 = require("@yuants/protocol");
5
+ const list_1 = require("./accounts/list");
6
+ const spot_1 = require("./accounts/spot");
7
+ const super_margin_1 = require("./accounts/super-margin");
8
+ const swap_1 = require("./accounts/swap");
9
+ const uid_1 = require("./uid");
10
+ (0, data_account_1.provideAccountActionsWithCredential)(protocol_1.Terminal.fromNodeEnv(), 'HTX', {
11
+ type: 'object',
12
+ required: ['access_key', 'secret_key'],
13
+ properties: {
14
+ access_key: { type: 'string' },
15
+ secret_key: { type: 'string' },
16
+ },
17
+ }, {
18
+ listAccounts: list_1.listAccounts,
19
+ getAccountInfo: async (credential, account_id) => {
20
+ const accounts = await (0, uid_1.getAccountIds)(JSON.stringify(credential));
21
+ switch (account_id) {
22
+ case accounts.spot:
23
+ return (0, spot_1.getSpotAccountInfo)(credential, account_id);
24
+ case accounts.superMargin:
25
+ return (0, super_margin_1.getSuperMarginAccountInfo)(credential, account_id);
26
+ case accounts.swap:
27
+ return (0, swap_1.getSwapAccountInfo)(credential, account_id);
28
+ }
29
+ throw new Error(`Unsupported account_id: ${account_id}`);
30
+ },
31
+ });
32
+ //# sourceMappingURL=account-actions-with-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-actions-with-credentials.js","sourceRoot":"","sources":["../src/account-actions-with-credentials.ts"],"names":[],"mappings":";;AAAA,uDAA2E;AAC3E,+CAA4C;AAC5C,0CAA+C;AAC/C,0CAAqD;AACrD,0DAAoE;AACpE,0CAAqD;AACrD,+BAAsC;AAEtC,IAAA,kDAAmC,EACjC,mBAAQ,CAAC,WAAW,EAAE,EACtB,KAAK,EACL;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IACtC,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD;IACE,YAAY,EAAE,mBAAY;IAC1B,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACjE,QAAQ,UAAU,EAAE;YAClB,KAAK,QAAQ,CAAC,IAAI;gBAChB,OAAO,IAAA,yBAAkB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACpD,KAAK,QAAQ,CAAC,WAAW;gBACvB,OAAO,IAAA,wCAAyB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC3D,KAAK,QAAQ,CAAC,IAAI;gBAChB,OAAO,IAAA,yBAAkB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SACrD;QACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC;CACF,CACF,CAAC","sourcesContent":["import { provideAccountActionsWithCredential } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { listAccounts } from './accounts/list';\nimport { getSpotAccountInfo } from './accounts/spot';\nimport { getSuperMarginAccountInfo } from './accounts/super-margin';\nimport { getSwapAccountInfo } from './accounts/swap';\nimport { getAccountIds } from './uid';\n\nprovideAccountActionsWithCredential(\n Terminal.fromNodeEnv(),\n 'HTX',\n {\n type: 'object',\n required: ['access_key', 'secret_key'],\n properties: {\n access_key: { type: 'string' },\n secret_key: { type: 'string' },\n },\n },\n {\n listAccounts: listAccounts,\n getAccountInfo: async (credential, account_id) => {\n const accounts = await getAccountIds(JSON.stringify(credential));\n switch (account_id) {\n case accounts.spot:\n return getSpotAccountInfo(credential, account_id);\n case accounts.superMargin:\n return getSuperMarginAccountInfo(credential, account_id);\n case accounts.swap:\n return getSwapAccountInfo(credential, account_id);\n }\n throw new Error(`Unsupported account_id: ${account_id}`);\n },\n },\n);\n"]}
@@ -31,5 +31,5 @@ export declare const provideSuperMarginAccountInfoService: (terminal: Terminal,
31
31
  /**
32
32
  * 提供 SPOT 账户信息服务
33
33
  */
34
- export declare const provideSpotAccountInfoService: (terminal: Terminal, accountId: string, credential: ICredential, spotAccountUid: number) => void;
34
+ export declare const provideSpotAccountInfoService: (terminal: Terminal, accountId: string, credential: ICredential) => void;
35
35
  //# sourceMappingURL=account-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-info.d.ts","sourceRoot":"","sources":["../src/account-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmB5C,OAAO,EAKL,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,eAAO,MAAM,6BAA6B,aAC9B,QAAQ,aACP,MAAM,cACL,WAAW,SAgGxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,eAAgB,WAAW,yBAAyB,MAAM;;;;;;EAanG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sCAAsC,+BACrB,WAAW,oCAAoC,CAAC,iBAC7D,IAAI,MAAM,CAAC,SAoC3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,aACrC,QAAQ,aACP,MAAM,cACL,WAAW,yBACA,MAAM,iBACd,IAAI,MAAM,CAAC;;;;;;EA4F3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,aAC9B,QAAQ,aACP,MAAM,cACL,WAAW,kBACP,MAAM,SAqBvB,CAAC"}
1
+ {"version":3,"file":"account-info.d.ts","sourceRoot":"","sources":["../src/account-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAO5C,OAAO,EAAyB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,6BAA6B,aAC9B,QAAQ,aACP,MAAM,cACL,WAAW,SAKxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,eAAgB,WAAW,yBAAyB,MAAM;;;;;;EAanG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sCAAsC,+BACrB,WAAW,oCAAoC,CAAC,iBAC7D,IAAI,MAAM,CAAC,SAoC3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,aACrC,QAAQ,aACP,MAAM,cACL,WAAW,yBACA,MAAM,iBACd,IAAI,MAAM,CAAC;;;;;;EAa3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,aAC9B,QAAQ,aACP,MAAM,cACL,WAAW,SAKxB,CAAC"}
@@ -4,96 +4,18 @@ exports.provideSpotAccountInfoService = exports.provideSuperMarginAccountInfoSer
4
4
  const data_account_1 = require("@yuants/data-account");
5
5
  const utils_1 = require("@yuants/utils");
6
6
  const rxjs_1 = require("rxjs");
7
+ const spot_1 = require("./accounts/spot");
8
+ const super_margin_1 = require("./accounts/super-margin");
9
+ const swap_1 = require("./accounts/swap");
7
10
  const api_1 = require("./api");
8
11
  const private_api_1 = require("./api/private-api");
9
- const product_1 = require("./product");
10
12
  /**
11
13
  * 提供 SWAP 账户信息服务
12
14
  */
13
15
  const provideSwapAccountInfoService = (terminal, accountId, credential) => {
14
- (0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => {
15
- // balance
16
- const balance = await (0, private_api_1.getUnifiedAccountInfo)(credential);
17
- if (!balance.data) {
18
- throw new Error('Failed to get unified account info');
19
- }
20
- const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');
21
- if (!balanceData) {
22
- throw new Error('No USDT balance found in unified account');
23
- }
24
- const equity = balanceData.margin_balance;
25
- const free = balanceData.withdraw_available;
26
- // positions
27
- const positionsRes = await (0, private_api_1.getSwapCrossPositionInfo)(credential);
28
- const mapProductIdToPerpetualProduct = await (0, rxjs_1.firstValueFrom)(product_1.swapProductService.mapProductIdToProduct$);
29
- const positions = (positionsRes.data || []).map((v) => {
30
- const product_id = v.contract_code;
31
- const theProduct = mapProductIdToPerpetualProduct === null || mapProductIdToPerpetualProduct === void 0 ? void 0 : mapProductIdToPerpetualProduct.get(product_id);
32
- const valuation = v.volume * v.last_price * ((theProduct === null || theProduct === void 0 ? void 0 : theProduct.value_scale) || 1);
33
- return {
34
- position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,
35
- datasource_id: 'HUOBI-SWAP',
36
- product_id,
37
- direction: v.direction === 'buy' ? 'LONG' : 'SHORT',
38
- volume: v.volume,
39
- free_volume: v.available,
40
- position_price: v.cost_hold,
41
- closable_price: v.last_price,
42
- floating_profit: v.profit_unreal,
43
- valuation,
44
- };
45
- });
46
- // orders
47
- // const orders: IOrder[] = [];
48
- // let page_index = 1;
49
- // const page_size = 50;
50
- // while (true) {
51
- // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });
52
- // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {
53
- // break;
54
- // }
55
- // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {
56
- // return {
57
- // order_id: v.order_id_str,
58
- // account_id: SWAP_ACCOUNT_ID,
59
- // product_id: v.contract_code,
60
- // order_type: ['lightning'].includes(v.order_price_type)
61
- // ? 'MARKET'
62
- // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(
63
- // v.order_price_type,
64
- // )
65
- // ? 'LIMIT'
66
- // : ['fok'].includes(v.order_price_type)
67
- // ? 'FOK'
68
- // : v.order_price_type.includes('ioc')
69
- // ? 'IOC'
70
- // : 'STOP', // unreachable code
71
- // order_direction:
72
- // v.direction === 'open'
73
- // ? v.offset === 'buy'
74
- // ? 'OPEN_LONG'
75
- // : 'OPEN_SHORT'
76
- // : v.offset === 'buy'
77
- // ? 'CLOSE_SHORT'
78
- // : 'CLOSE_LONG',
79
- // volume: v.volume,
80
- // submit_at: v.created_at,
81
- // price: v.price,
82
- // traded_volume: v.trade_volume,
83
- // };
84
- // });
85
- // orders.push(...pageOrders);
86
- // page_index++;
87
- // }
88
- return {
89
- money: {
90
- currency: 'USDT',
91
- equity,
92
- free,
93
- },
94
- positions,
95
- };
96
- }, { auto_refresh_interval: 1000 });
16
+ (0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => (0, swap_1.getSwapAccountInfo)(credential, accountId), {
17
+ auto_refresh_interval: 1000,
18
+ });
97
19
  };
98
20
  exports.provideSwapAccountInfoService = provideSwapAccountInfoService;
99
21
  /**
@@ -145,99 +67,17 @@ exports.setupSuperMarginWebSocketSubscriptions = setupSuperMarginWebSocketSubscr
145
67
  const provideSuperMarginAccountInfoService = (terminal, accountId, credential, superMarginAccountUid, subscriptions) => {
146
68
  const superMarginAccountBalance$ = (0, exports.getSuperMarginAccountBalance$)(credential, superMarginAccountUid);
147
69
  (0, exports.setupSuperMarginWebSocketSubscriptions)(superMarginAccountBalance$, subscriptions);
148
- (0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => {
149
- var _a;
150
- // get account balance
151
- const accountBalance = await (0, private_api_1.getSpotAccountBalance)(credential, superMarginAccountUid);
152
- const balanceList = ((_a = accountBalance.data) === null || _a === void 0 ? void 0 : _a.list) || [];
153
- // calculate usdt balance
154
- const usdtBalance = balanceList
155
- .filter((v) => v.currency === 'usdt')
156
- .reduce((acc, cur) => acc + +cur.balance, 0);
157
- // get positions (non-usdt currencies)
158
- const positions = [];
159
- const nonUsdtCurrencies = balanceList
160
- .filter((v) => v.currency !== 'usdt')
161
- .reduce((acc, cur) => {
162
- const existing = acc.find((item) => item.currency === cur.currency);
163
- if (existing) {
164
- existing.balance += +cur.balance;
165
- }
166
- else {
167
- acc.push({ currency: cur.currency, balance: +cur.balance });
168
- }
169
- return acc;
170
- }, []);
171
- // get prices and create positions
172
- for (const currencyData of nonUsdtCurrencies) {
173
- if (currencyData.balance > 0) {
174
- try {
175
- // get current price from websocket or fallback to REST API
176
- let price;
177
- try {
178
- const tickPrice = await (0, rxjs_1.firstValueFrom)(api_1.client.spot_ws.input$.pipe(
179
- //
180
- (0, rxjs_1.first)((v) => { var _a, _b; return ((_a = v.ch) === null || _a === void 0 ? void 0 : _a.includes('ticker')) && ((_b = v.ch) === null || _b === void 0 ? void 0 : _b.includes(currencyData.currency)) && v.tick; }), (0, rxjs_1.map)((v) => v.tick.bid), (0, rxjs_1.timeout)(5000), (0, rxjs_1.tap)({
181
- error: (e) => {
182
- subscriptions.clear();
183
- },
184
- })));
185
- price = tickPrice;
186
- }
187
- catch (_b) {
188
- // fallback to REST API
189
- const tickerRes = await (0, private_api_1.getSpotTick)(credential, { symbol: `${currencyData.currency}usdt` });
190
- price = tickerRes.tick.close;
191
- }
192
- positions.push({
193
- position_id: `${currencyData.currency}/usdt/spot`,
194
- product_id: `${currencyData.currency}usdt`,
195
- direction: 'LONG',
196
- volume: currencyData.balance,
197
- free_volume: currencyData.balance,
198
- position_price: price,
199
- closable_price: price,
200
- floating_profit: 0,
201
- valuation: currencyData.balance * price,
202
- });
203
- }
204
- catch (error) {
205
- console.warn((0, utils_1.formatTime)(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);
206
- }
207
- }
208
- }
209
- // calculate equity
210
- const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;
211
- return {
212
- money: {
213
- currency: 'USDT',
214
- equity,
215
- free: equity,
216
- },
217
- positions,
218
- };
219
- }, { auto_refresh_interval: 1000 });
70
+ (0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => (0, super_margin_1.getSuperMarginAccountInfo)(credential, accountId), { auto_refresh_interval: 1000 });
220
71
  return superMarginAccountBalance$;
221
72
  };
222
73
  exports.provideSuperMarginAccountInfoService = provideSuperMarginAccountInfoService;
223
74
  /**
224
75
  * 提供 SPOT 账户信息服务
225
76
  */
226
- const provideSpotAccountInfoService = (terminal, accountId, credential, spotAccountUid) => {
227
- (0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => {
228
- var _a, _b;
229
- const spotBalance = await (0, private_api_1.getSpotAccountBalance)(credential, spotAccountUid);
230
- const equity = +((_b = (_a = spotBalance.data.list.find((v) => v.currency === 'usdt')) === null || _a === void 0 ? void 0 : _a.balance) !== null && _b !== void 0 ? _b : 0);
231
- const free = equity;
232
- return {
233
- money: {
234
- currency: 'USDT',
235
- equity,
236
- free,
237
- },
238
- positions: [],
239
- };
240
- }, { auto_refresh_interval: 1000 });
77
+ const provideSpotAccountInfoService = (terminal, accountId, credential) => {
78
+ (0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => (0, spot_1.getSpotAccountInfo)(credential, accountId), {
79
+ auto_refresh_interval: 1000,
80
+ });
241
81
  };
242
82
  exports.provideSpotAccountInfoService = provideSpotAccountInfoService;
243
83
  //# sourceMappingURL=account-info.js.map