@yuants/vendor-hyperliquid 0.3.15 → 0.3.16
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 +2 -1
- package/dist/index.js.map +1 -1
- package/dist/order.js +2 -1
- package/dist/order.js.map +1 -1
- package/dist/product.js +2 -1
- package/dist/product.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -3
- package/lib/index.js.map +1 -1
- package/lib/order.js +3 -2
- package/lib/order.js.map +1 -1
- package/lib/product.d.ts.map +1 -1
- package/lib/product.js +3 -2
- package/lib/product.js.map +1 -1
- package/package.json +10 -10
- package/temp/package-deps.json +17 -18
- package/dist/terminal.js +0 -3
- package/dist/terminal.js.map +0 -1
- package/lib/terminal.d.ts +0 -3
- package/lib/terminal.d.ts.map +0 -1
- package/lib/terminal.js +0 -6
- package/lib/terminal.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';
|
|
2
|
+
import { Terminal } from '@yuants/protocol';
|
|
2
3
|
import { encodePath } from '@yuants/utils';
|
|
3
4
|
import { client } from './api';
|
|
4
5
|
import './interest_rate';
|
|
5
6
|
import './order';
|
|
6
7
|
import './product';
|
|
7
|
-
|
|
8
|
+
const terminal = Terminal.fromNodeEnv();
|
|
8
9
|
(async () => {
|
|
9
10
|
// swap account info
|
|
10
11
|
{
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA4B,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/B,OAAO,iBAAiB,CAAC;AACzB,OAAO,SAAS,CAAC;AACjB,OAAO,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IAccountMoney, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { client } from './api';\nimport './interest_rate';\nimport './order';\nimport './product';\n\nconst terminal = Terminal.fromNodeEnv();\n\n(async () => {\n // swap account info\n {\n const account_id = `Hyperliquid/${client.public_key}`;\n\n provideAccountInfoService(\n terminal,\n account_id,\n async () => {\n const accountRes = await client.getUserPerpetualsAccountSummary({\n user: client.public_key!,\n });\n\n const profit = accountRes.assetPositions\n .map((pos) => +pos.position.unrealizedPnl)\n .reduce((a, b) => a + b, 0);\n\n const money: IAccountMoney = {\n currency: 'USDC',\n equity: +accountRes.crossMarginSummary.accountValue,\n profit: profit,\n free: +accountRes.withdrawable,\n used: +accountRes.crossMarginSummary.accountValue - +accountRes.withdrawable,\n balance: +accountRes.crossMarginSummary.accountValue - profit,\n };\n\n return {\n money: money,\n positions: accountRes.assetPositions.map(\n (position): IPosition => ({\n position_id: `${position.position.coin}-USD`,\n datasource_id: 'HYPERLIQUID',\n product_id: encodePath('PERPETUAL', `${position.position.coin}-USD`),\n direction: +position.position.szi > 0 ? 'LONG' : 'SHORT',\n volume: Math.abs(+position.position.szi),\n free_volume: Math.abs(+position.position.szi),\n position_price: +position.position.entryPx,\n closable_price: Math.abs(+position.position.positionValue / +position.position.szi),\n floating_profit: +position.position.unrealizedPnl,\n valuation: +position.position.positionValue,\n margin: +position.position.marginUsed,\n }),\n ),\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n addAccountMarket(terminal, { account_id: `Hyperliquid/${client.public_key}`, market_id: 'Hyperliquid' });\n }\n\n // TODO: spot account info\n\n // TODO: funding rate\n\n // TODO: transfer\n})();\n"]}
|
package/dist/order.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { Terminal } from '@yuants/protocol';
|
|
1
2
|
import { formatTime } from '@yuants/utils';
|
|
2
3
|
import { client } from './api';
|
|
3
|
-
|
|
4
|
+
const terminal = Terminal.fromNodeEnv();
|
|
4
5
|
/**
|
|
5
6
|
* Round price according to Hyperliquid rules:
|
|
6
7
|
* - Max 5 significant figures
|
package/dist/order.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.js","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"order.js","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\n/**\n * Round price according to Hyperliquid rules:\n * - Max 5 significant figures\n * - Max decimal places = MAX_DECIMALS - szDecimals (6 for perps, 8 for spot)\n * - Integer prices are always allowed regardless of significant figures\n */\nconst roundPrice = (price: number, instType: 'PERPETUAL' | 'SPOT', szDecimals: number): string => {\n const MAX_DECIMALS = instType === 'PERPETUAL' ? 6 : 8;\n const maxDecimalPlaces = MAX_DECIMALS - szDecimals;\n\n // Convert to string to work with precision\n const priceStr = price.toString();\n\n // Check if it's an integer\n if (Number.isInteger(price)) {\n return priceStr;\n }\n\n // Get significant figures count\n const significantFigures = priceStr.replace(/^0+\\.?0*/, '').replace(/\\./g, '').length;\n\n // If more than 5 significant figures, round to 5\n let roundedPrice = price;\n if (significantFigures > 5) {\n // Find the position of the first non-zero digit\n const firstNonZeroIndex = priceStr.match(/[1-9]/)?.index || 0;\n const decimalIndex = priceStr.indexOf('.');\n\n if (decimalIndex === -1) {\n // Integer case - round to 5 significant figures\n const magnitude = Math.floor(Math.log10(Math.abs(price)));\n const factor = Math.pow(10, magnitude - 4); // 5 significant figures\n roundedPrice = Math.round(price / factor) * factor;\n } else {\n // Decimal case\n const beforeDecimal = priceStr.substring(0, decimalIndex);\n const afterDecimal = priceStr.substring(decimalIndex + 1);\n\n if (beforeDecimal !== '0') {\n // Has integer part\n const integerDigits = beforeDecimal.length;\n const neededDecimalDigits = Math.max(0, 5 - integerDigits);\n roundedPrice = parseFloat(price.toFixed(neededDecimalDigits));\n } else {\n // Pure decimal (0.xxxx)\n const leadingZeros = afterDecimal.match(/^0*/)?.[0].length || 0;\n const precision = leadingZeros + 5;\n roundedPrice = parseFloat(price.toFixed(precision));\n }\n }\n }\n\n // Apply decimal places limit\n const finalPrice = parseFloat(roundedPrice.toFixed(maxDecimalPlaces));\n\n return finalPrice.toString();\n};\n\nterminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: `Hyperliquid/${client.public_key}` },\n },\n },\n async (msg) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(msg));\n const order = msg.req;\n\n const [instType, symbol] = order.product_id.split('/');\n const baseCurrency = symbol.split('-')[0];\n\n const mapBaseCurrencyToAssetId: Record<string, number> = {};\n const mapBaseCurrencyToSzDecimals: Record<string, number> = {};\n\n if (instType === 'PERPETUAL') {\n const meta = await client.getPerpetualsMetaData();\n for (let i = 0; i < meta.universe.length; i++) {\n const token = meta.universe[i];\n mapBaseCurrencyToAssetId[token.name] = i;\n mapBaseCurrencyToSzDecimals[token.name] = token.szDecimals;\n }\n } else if (instType === 'SPOT') {\n const meta = await client.getSpotMetaData();\n for (const token of meta.tokens) {\n mapBaseCurrencyToAssetId[token.name] = token.index;\n mapBaseCurrencyToSzDecimals[token.name] = token.szDecimals;\n }\n }\n\n const a = mapBaseCurrencyToAssetId[baseCurrency];\n const szDecimals = mapBaseCurrencyToSzDecimals[baseCurrency];\n const b = order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT';\n\n let price = `${order.price}`;\n if (order.order_type === 'MARKET') {\n const allMids = await client.getAllMids();\n const midPrice = +allMids[baseCurrency];\n price = `${b ? (1 + 0.05) * midPrice : (1 - 0.05) * midPrice}`;\n }\n price = roundPrice(+price, instType as 'PERPETUAL' | 'SPOT', szDecimals);\n\n const p = `${price}`;\n const s = `${order.volume}`;\n const r = order.order_direction === 'CLOSE_LONG' || order.order_direction === 'CLOSE_SHORT';\n // other method\n const t =\n order.order_type === 'MARKET'\n ? {\n limit: {\n tif: 'Ioc',\n },\n }\n : {\n limit: {\n tif: 'Gtc',\n },\n };\n const params = {\n orders: [\n {\n a,\n b,\n p,\n s,\n r,\n t,\n },\n ],\n };\n\n const res = await client.placeOrder(params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(res));\n return {\n res: {\n code: res.status === 'ok' && res.response.data.statuses[0]?.error === undefined ? 0 : 1,\n message: res.status !== 'ok' ? 'API ERROR' : res.response.data.statuses[0]?.error || 'OK',\n },\n };\n },\n);\n"]}
|
package/dist/product.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { Terminal } from '@yuants/protocol';
|
|
1
2
|
import { createSQLWriter } from '@yuants/sql';
|
|
2
3
|
import { encodePath, formatTime } from '@yuants/utils';
|
|
3
4
|
import { defer, repeat, retry, shareReplay, Subject, tap } from 'rxjs';
|
|
4
5
|
import { client } from './api';
|
|
5
|
-
|
|
6
|
+
const terminal = Terminal.fromNodeEnv();
|
|
6
7
|
const product$ = new Subject();
|
|
7
8
|
const tokenProduct$ = defer(async () => {
|
|
8
9
|
const res = await client.getSpotMetaData();
|
package/dist/product.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { createSQLWriter } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, repeat, retry, shareReplay, Subject, tap } from 'rxjs';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst product$ = new Subject<IProduct>();\n\nconst tokenProduct$ = defer(async () => {\n const res = await client.getSpotMetaData();\n return res.tokens.map(\n (token): IProduct => ({\n product_id: encodePath('SPOT', `${token.name}-USDC`),\n datasource_id: 'HYPERLIQUID',\n quote_currency: 'USDC',\n base_currency: token.name,\n price_step: 1e-2,\n volume_step: Number(`1e-${token.szDecimals}`),\n name: '',\n value_scale: 1,\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: 'Hyperliquid',\n no_interest_rate: true,\n }),\n );\n}).pipe(\n tap((list) => list.forEach((product) => product$.next(product))),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'SpotProducts', e);\n },\n }),\n retry({ delay: 5000 }),\n repeat({ delay: 86400_000 }),\n shareReplay(1),\n);\n\nexport const perpetualProduct$ = defer(async () => {\n const res = await client.getPerpetualsMetaData();\n return res.universe.map(\n (product): IProduct => ({\n product_id: encodePath('PERPETUAL', `${product.name}-USD`),\n datasource_id: 'HYPERLIQUID',\n quote_currency: 'USD',\n base_currency: product.name,\n price_step: 1e-2,\n volume_step: Number(`1e-${product.szDecimals}`),\n name: '',\n value_scale: 1,\n value_scale_unit: '',\n margin_rate: 1 / product.maxLeverage,\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: 'Hyperliquid',\n no_interest_rate: false,\n }),\n );\n}).pipe(\n tap((list) => list.forEach((product) => product$.next(product))),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'PerpetualProducts', e);\n },\n }),\n retry({ delay: 5000 }),\n repeat({ delay: 86400_000 }),\n shareReplay(1),\n);\n\nperpetualProduct$.subscribe();\ntokenProduct$.subscribe();\n\ncreateSQLWriter<IProduct>(terminal, {\n data$: product$,\n tableName: 'product',\n conflictKeys: ['datasource_id', 'product_id'],\n writeInterval: 1000,\n});\n"]}
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,iBAAiB,CAAC;AACzB,OAAO,SAAS,CAAC;AACjB,OAAO,WAAW,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const data_account_1 = require("@yuants/data-account");
|
|
4
|
+
const protocol_1 = require("@yuants/protocol");
|
|
4
5
|
const utils_1 = require("@yuants/utils");
|
|
5
6
|
const api_1 = require("./api");
|
|
6
7
|
require("./interest_rate");
|
|
7
8
|
require("./order");
|
|
8
9
|
require("./product");
|
|
9
|
-
const
|
|
10
|
+
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
10
11
|
(async () => {
|
|
11
12
|
// swap account info
|
|
12
13
|
{
|
|
13
14
|
const account_id = `Hyperliquid/${api_1.client.public_key}`;
|
|
14
|
-
(0, data_account_1.provideAccountInfoService)(
|
|
15
|
+
(0, data_account_1.provideAccountInfoService)(terminal, account_id, async () => {
|
|
15
16
|
const accountRes = await api_1.client.getUserPerpetualsAccountSummary({
|
|
16
17
|
user: api_1.client.public_key,
|
|
17
18
|
});
|
|
@@ -43,7 +44,7 @@ const terminal_1 = require("./terminal");
|
|
|
43
44
|
})),
|
|
44
45
|
};
|
|
45
46
|
}, { auto_refresh_interval: 1000 });
|
|
46
|
-
(0, data_account_1.addAccountMarket)(
|
|
47
|
+
(0, data_account_1.addAccountMarket)(terminal, { account_id: `Hyperliquid/${api_1.client.public_key}`, market_id: 'Hyperliquid' });
|
|
47
48
|
}
|
|
48
49
|
// TODO: spot account info
|
|
49
50
|
// TODO: funding rate
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,uDAA6G;AAC7G,yCAA2C;AAC3C,+BAA+B;AAC/B,2BAAyB;AACzB,mBAAiB;AACjB,qBAAmB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,uDAA6G;AAC7G,+CAA4C;AAC5C,yCAA2C;AAC3C,+BAA+B;AAC/B,2BAAyB;AACzB,mBAAiB;AACjB,qBAAmB;AAEnB,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,CAAC,KAAK,IAAI,EAAE;IACV,oBAAoB;IACpB;QACE,MAAM,UAAU,GAAG,eAAe,YAAM,CAAC,UAAU,EAAE,CAAC;QAEtD,IAAA,wCAAyB,EACvB,QAAQ,EACR,UAAU,EACV,KAAK,IAAI,EAAE;YACT,MAAM,UAAU,GAAG,MAAM,YAAM,CAAC,+BAA+B,CAAC;gBAC9D,IAAI,EAAE,YAAM,CAAC,UAAW;aACzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc;iBACrC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;iBACzC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAE9B,MAAM,KAAK,GAAkB;gBAC3B,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,YAAY;gBACnD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY;gBAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,YAAY,GAAG,CAAC,UAAU,CAAC,YAAY;gBAC5E,OAAO,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,YAAY,GAAG,MAAM;aAC9D,CAAC;YAEF,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,CACtC,CAAC,QAAQ,EAAa,EAAE,CAAC,CAAC;oBACxB,WAAW,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM;oBAC5C,aAAa,EAAE,aAAa;oBAC5B,UAAU,EAAE,IAAA,kBAAU,EAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;oBACpE,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;oBACxD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;oBACxC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAC7C,cAAc,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO;oBAC1C,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;oBACnF,eAAe,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa;oBACjD,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa;oBAC3C,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU;iBACtC,CAAC,CACH;aACF,CAAC;QACJ,CAAC,EACD,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAChC,CAAC;QAEF,IAAA,+BAAgB,EAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,eAAe,YAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;KAC1G;IAED,0BAA0B;IAE1B,qBAAqB;IAErB,iBAAiB;AACnB,CAAC,CAAC,EAAE,CAAC","sourcesContent":["import { addAccountMarket, IAccountMoney, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { client } from './api';\nimport './interest_rate';\nimport './order';\nimport './product';\n\nconst terminal = Terminal.fromNodeEnv();\n\n(async () => {\n // swap account info\n {\n const account_id = `Hyperliquid/${client.public_key}`;\n\n provideAccountInfoService(\n terminal,\n account_id,\n async () => {\n const accountRes = await client.getUserPerpetualsAccountSummary({\n user: client.public_key!,\n });\n\n const profit = accountRes.assetPositions\n .map((pos) => +pos.position.unrealizedPnl)\n .reduce((a, b) => a + b, 0);\n\n const money: IAccountMoney = {\n currency: 'USDC',\n equity: +accountRes.crossMarginSummary.accountValue,\n profit: profit,\n free: +accountRes.withdrawable,\n used: +accountRes.crossMarginSummary.accountValue - +accountRes.withdrawable,\n balance: +accountRes.crossMarginSummary.accountValue - profit,\n };\n\n return {\n money: money,\n positions: accountRes.assetPositions.map(\n (position): IPosition => ({\n position_id: `${position.position.coin}-USD`,\n datasource_id: 'HYPERLIQUID',\n product_id: encodePath('PERPETUAL', `${position.position.coin}-USD`),\n direction: +position.position.szi > 0 ? 'LONG' : 'SHORT',\n volume: Math.abs(+position.position.szi),\n free_volume: Math.abs(+position.position.szi),\n position_price: +position.position.entryPx,\n closable_price: Math.abs(+position.position.positionValue / +position.position.szi),\n floating_profit: +position.position.unrealizedPnl,\n valuation: +position.position.positionValue,\n margin: +position.position.marginUsed,\n }),\n ),\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n addAccountMarket(terminal, { account_id: `Hyperliquid/${client.public_key}`, market_id: 'Hyperliquid' });\n }\n\n // TODO: spot account info\n\n // TODO: funding rate\n\n // TODO: transfer\n})();\n"]}
|
package/lib/order.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const protocol_1 = require("@yuants/protocol");
|
|
3
4
|
const utils_1 = require("@yuants/utils");
|
|
4
5
|
const api_1 = require("./api");
|
|
5
|
-
const
|
|
6
|
+
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
6
7
|
/**
|
|
7
8
|
* Round price according to Hyperliquid rules:
|
|
8
9
|
* - Max 5 significant figures
|
|
@@ -55,7 +56,7 @@ const roundPrice = (price, instType, szDecimals) => {
|
|
|
55
56
|
const finalPrice = parseFloat(roundedPrice.toFixed(maxDecimalPlaces));
|
|
56
57
|
return finalPrice.toString();
|
|
57
58
|
};
|
|
58
|
-
|
|
59
|
+
terminal.server.provideService('SubmitOrder', {
|
|
59
60
|
required: ['account_id'],
|
|
60
61
|
properties: {
|
|
61
62
|
account_id: { const: `Hyperliquid/${api_1.client.public_key}` },
|
package/lib/order.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.js","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":";;AACA,yCAA2C;AAC3C,+BAA+B;
|
|
1
|
+
{"version":3,"file":"order.js","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\n/**\n * Round price according to Hyperliquid rules:\n * - Max 5 significant figures\n * - Max decimal places = MAX_DECIMALS - szDecimals (6 for perps, 8 for spot)\n * - Integer prices are always allowed regardless of significant figures\n */\nconst roundPrice = (price: number, instType: 'PERPETUAL' | 'SPOT', szDecimals: number): string => {\n const MAX_DECIMALS = instType === 'PERPETUAL' ? 6 : 8;\n const maxDecimalPlaces = MAX_DECIMALS - szDecimals;\n\n // Convert to string to work with precision\n const priceStr = price.toString();\n\n // Check if it's an integer\n if (Number.isInteger(price)) {\n return priceStr;\n }\n\n // Get significant figures count\n const significantFigures = priceStr.replace(/^0+\\.?0*/, '').replace(/\\./g, '').length;\n\n // If more than 5 significant figures, round to 5\n let roundedPrice = price;\n if (significantFigures > 5) {\n // Find the position of the first non-zero digit\n const firstNonZeroIndex = priceStr.match(/[1-9]/)?.index || 0;\n const decimalIndex = priceStr.indexOf('.');\n\n if (decimalIndex === -1) {\n // Integer case - round to 5 significant figures\n const magnitude = Math.floor(Math.log10(Math.abs(price)));\n const factor = Math.pow(10, magnitude - 4); // 5 significant figures\n roundedPrice = Math.round(price / factor) * factor;\n } else {\n // Decimal case\n const beforeDecimal = priceStr.substring(0, decimalIndex);\n const afterDecimal = priceStr.substring(decimalIndex + 1);\n\n if (beforeDecimal !== '0') {\n // Has integer part\n const integerDigits = beforeDecimal.length;\n const neededDecimalDigits = Math.max(0, 5 - integerDigits);\n roundedPrice = parseFloat(price.toFixed(neededDecimalDigits));\n } else {\n // Pure decimal (0.xxxx)\n const leadingZeros = afterDecimal.match(/^0*/)?.[0].length || 0;\n const precision = leadingZeros + 5;\n roundedPrice = parseFloat(price.toFixed(precision));\n }\n }\n }\n\n // Apply decimal places limit\n const finalPrice = parseFloat(roundedPrice.toFixed(maxDecimalPlaces));\n\n return finalPrice.toString();\n};\n\nterminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: `Hyperliquid/${client.public_key}` },\n },\n },\n async (msg) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(msg));\n const order = msg.req;\n\n const [instType, symbol] = order.product_id.split('/');\n const baseCurrency = symbol.split('-')[0];\n\n const mapBaseCurrencyToAssetId: Record<string, number> = {};\n const mapBaseCurrencyToSzDecimals: Record<string, number> = {};\n\n if (instType === 'PERPETUAL') {\n const meta = await client.getPerpetualsMetaData();\n for (let i = 0; i < meta.universe.length; i++) {\n const token = meta.universe[i];\n mapBaseCurrencyToAssetId[token.name] = i;\n mapBaseCurrencyToSzDecimals[token.name] = token.szDecimals;\n }\n } else if (instType === 'SPOT') {\n const meta = await client.getSpotMetaData();\n for (const token of meta.tokens) {\n mapBaseCurrencyToAssetId[token.name] = token.index;\n mapBaseCurrencyToSzDecimals[token.name] = token.szDecimals;\n }\n }\n\n const a = mapBaseCurrencyToAssetId[baseCurrency];\n const szDecimals = mapBaseCurrencyToSzDecimals[baseCurrency];\n const b = order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT';\n\n let price = `${order.price}`;\n if (order.order_type === 'MARKET') {\n const allMids = await client.getAllMids();\n const midPrice = +allMids[baseCurrency];\n price = `${b ? (1 + 0.05) * midPrice : (1 - 0.05) * midPrice}`;\n }\n price = roundPrice(+price, instType as 'PERPETUAL' | 'SPOT', szDecimals);\n\n const p = `${price}`;\n const s = `${order.volume}`;\n const r = order.order_direction === 'CLOSE_LONG' || order.order_direction === 'CLOSE_SHORT';\n // other method\n const t =\n order.order_type === 'MARKET'\n ? {\n limit: {\n tif: 'Ioc',\n },\n }\n : {\n limit: {\n tif: 'Gtc',\n },\n };\n const params = {\n orders: [\n {\n a,\n b,\n p,\n s,\n r,\n t,\n },\n ],\n };\n\n const res = await client.placeOrder(params);\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(res));\n return {\n res: {\n code: res.status === 'ok' && res.response.data.statuses[0]?.error === undefined ? 0 : 1,\n message: res.status !== 'ok' ? 'API ERROR' : res.response.data.statuses[0]?.error || 'OK',\n },\n };\n },\n);\n"]}
|
package/lib/product.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AA+ChD,eAAO,MAAM,iBAAiB,uCAkC7B,CAAC"}
|
package/lib/product.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.perpetualProduct$ = void 0;
|
|
4
|
+
const protocol_1 = require("@yuants/protocol");
|
|
4
5
|
const sql_1 = require("@yuants/sql");
|
|
5
6
|
const utils_1 = require("@yuants/utils");
|
|
6
7
|
const rxjs_1 = require("rxjs");
|
|
7
8
|
const api_1 = require("./api");
|
|
8
|
-
const
|
|
9
|
+
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
9
10
|
const product$ = new rxjs_1.Subject();
|
|
10
11
|
const tokenProduct$ = (0, rxjs_1.defer)(async () => {
|
|
11
12
|
const res = await api_1.client.getSpotMetaData();
|
|
@@ -63,7 +64,7 @@ exports.perpetualProduct$ = (0, rxjs_1.defer)(async () => {
|
|
|
63
64
|
}), (0, rxjs_1.retry)({ delay: 5000 }), (0, rxjs_1.repeat)({ delay: 86400000 }), (0, rxjs_1.shareReplay)(1));
|
|
64
65
|
exports.perpetualProduct$.subscribe();
|
|
65
66
|
tokenProduct$.subscribe();
|
|
66
|
-
(0, sql_1.createSQLWriter)(
|
|
67
|
+
(0, sql_1.createSQLWriter)(terminal, {
|
|
67
68
|
data$: product$,
|
|
68
69
|
tableName: 'product',
|
|
69
70
|
conflictKeys: ['datasource_id', 'product_id'],
|
package/lib/product.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":";;;AACA,qCAA8C;AAC9C,yCAAuD;AACvD,+BAAuE;AACvE,+BAA+B;
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { createSQLWriter } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, repeat, retry, shareReplay, Subject, tap } from 'rxjs';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst product$ = new Subject<IProduct>();\n\nconst tokenProduct$ = defer(async () => {\n const res = await client.getSpotMetaData();\n return res.tokens.map(\n (token): IProduct => ({\n product_id: encodePath('SPOT', `${token.name}-USDC`),\n datasource_id: 'HYPERLIQUID',\n quote_currency: 'USDC',\n base_currency: token.name,\n price_step: 1e-2,\n volume_step: Number(`1e-${token.szDecimals}`),\n name: '',\n value_scale: 1,\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: 'Hyperliquid',\n no_interest_rate: true,\n }),\n );\n}).pipe(\n tap((list) => list.forEach((product) => product$.next(product))),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'SpotProducts', e);\n },\n }),\n retry({ delay: 5000 }),\n repeat({ delay: 86400_000 }),\n shareReplay(1),\n);\n\nexport const perpetualProduct$ = defer(async () => {\n const res = await client.getPerpetualsMetaData();\n return res.universe.map(\n (product): IProduct => ({\n product_id: encodePath('PERPETUAL', `${product.name}-USD`),\n datasource_id: 'HYPERLIQUID',\n quote_currency: 'USD',\n base_currency: product.name,\n price_step: 1e-2,\n volume_step: Number(`1e-${product.szDecimals}`),\n name: '',\n value_scale: 1,\n value_scale_unit: '',\n margin_rate: 1 / product.maxLeverage,\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: 'Hyperliquid',\n no_interest_rate: false,\n }),\n );\n}).pipe(\n tap((list) => list.forEach((product) => product$.next(product))),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'PerpetualProducts', e);\n },\n }),\n retry({ delay: 5000 }),\n repeat({ delay: 86400_000 }),\n shareReplay(1),\n);\n\nperpetualProduct$.subscribe();\ntokenProduct$.subscribe();\n\ncreateSQLWriter<IProduct>(terminal, {\n data$: product$,\n tableName: 'product',\n conflictKeys: ['datasource_id', 'product_id'],\n writeInterval: 1000,\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuants/vendor-hyperliquid",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.16",
|
|
4
4
|
"bin": "lib/cli.js",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"files": [
|
|
@@ -9,21 +9,21 @@
|
|
|
9
9
|
"temp"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@yuants/protocol": "0.
|
|
13
|
-
"@yuants/transfer": "0.2.
|
|
14
|
-
"@yuants/data-account": "0.4.
|
|
12
|
+
"@yuants/protocol": "0.45.0",
|
|
13
|
+
"@yuants/transfer": "0.2.17",
|
|
14
|
+
"@yuants/data-account": "0.4.6",
|
|
15
15
|
"@yuants/utils": "0.8.0",
|
|
16
|
-
"@yuants/sql": "0.9.
|
|
17
|
-
"@yuants/data-product": "0.2.
|
|
18
|
-
"@yuants/data-interest-rate": "0.1.
|
|
19
|
-
"@yuants/data-order": "0.2.
|
|
20
|
-
"@yuants/data-series": "0.3.
|
|
16
|
+
"@yuants/sql": "0.9.8",
|
|
17
|
+
"@yuants/data-product": "0.2.18",
|
|
18
|
+
"@yuants/data-interest-rate": "0.1.26",
|
|
19
|
+
"@yuants/data-order": "0.2.14",
|
|
20
|
+
"@yuants/data-series": "0.3.29",
|
|
21
21
|
"rxjs": "~7.5.6",
|
|
22
22
|
"crypto-js": "^4.2.0",
|
|
23
23
|
"hyperliquid": "~1.6.2",
|
|
24
24
|
"ethers": "~6.13.5",
|
|
25
25
|
"@msgpack/msgpack": "~3.1.2",
|
|
26
|
-
"@yuants/data-ohlc": "0.3.
|
|
26
|
+
"@yuants/data-ohlc": "0.3.25"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@microsoft/api-extractor": "~7.30.0",
|
package/temp/package-deps.json
CHANGED
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
{
|
|
2
|
-
"apps/vendor-hyperliquid/CHANGELOG.json": "
|
|
3
|
-
"apps/vendor-hyperliquid/CHANGELOG.md": "
|
|
2
|
+
"apps/vendor-hyperliquid/CHANGELOG.json": "110ad6e8cbce0b2f642c1edb79ad7739b1596b91",
|
|
3
|
+
"apps/vendor-hyperliquid/CHANGELOG.md": "4aaa49f1cce94784bc985c7d9c387185521c6f70",
|
|
4
4
|
"apps/vendor-hyperliquid/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
|
|
5
5
|
"apps/vendor-hyperliquid/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
|
|
6
6
|
"apps/vendor-hyperliquid/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
|
|
7
7
|
"apps/vendor-hyperliquid/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
|
|
8
8
|
"apps/vendor-hyperliquid/etc/vendor-hyperliquid.api.md": "66675bd88afa1fe945f0d4023984c1c9c3e60a34",
|
|
9
|
-
"apps/vendor-hyperliquid/package.json": "
|
|
9
|
+
"apps/vendor-hyperliquid/package.json": "0638d77c6403bd49be79704672f568d941d6ce18",
|
|
10
10
|
"apps/vendor-hyperliquid/src/api.ts": "041aa6e0e322b7c6ea5c822119c695b05d32295a",
|
|
11
11
|
"apps/vendor-hyperliquid/src/cli.ts": "9bf6b5559a6c6f33da20e74cc6c5d702c60ec891",
|
|
12
|
-
"apps/vendor-hyperliquid/src/index.ts": "
|
|
12
|
+
"apps/vendor-hyperliquid/src/index.ts": "7657d0e32c93b8c81496119ec7a05e2882207e5a",
|
|
13
13
|
"apps/vendor-hyperliquid/src/interest_rate.ts": "5b46f8a4904734d9801e3ddd1146813918e36835",
|
|
14
14
|
"apps/vendor-hyperliquid/src/ohlc.ts": "b1272944f0ffe8dd77ef9e7e39429efb7d2e5006",
|
|
15
|
-
"apps/vendor-hyperliquid/src/order.ts": "
|
|
16
|
-
"apps/vendor-hyperliquid/src/product.ts": "
|
|
15
|
+
"apps/vendor-hyperliquid/src/order.ts": "de633327cb9ca8c02295f14d2d8a8b8384fdc1b4",
|
|
16
|
+
"apps/vendor-hyperliquid/src/product.ts": "36081fdbea85de89a2745cb4815abcb05d1af294",
|
|
17
17
|
"apps/vendor-hyperliquid/src/sign.ts": "94f4e5604a01d197d164b42415b17789ab2b6889",
|
|
18
|
-
"apps/vendor-hyperliquid/src/terminal.ts": "04776a178d253a2e53f9c84c802e80f67aa9179b",
|
|
19
18
|
"apps/vendor-hyperliquid/tsconfig.json": "81da8f78196974b5d15da0edb6b2d9f48641063c",
|
|
20
19
|
"apps/vendor-hyperliquid/.rush/temp/shrinkwrap-deps.json": "d8a15e8163d8abdb142a2024a5b5b13ab444f87b",
|
|
21
|
-
"libraries/protocol/temp/package-deps.json": "
|
|
22
|
-
"libraries/transfer/temp/package-deps.json": "
|
|
23
|
-
"libraries/data-account/temp/package-deps.json": "
|
|
24
|
-
"libraries/utils/temp/package-deps.json": "
|
|
25
|
-
"libraries/sql/temp/package-deps.json": "
|
|
26
|
-
"libraries/data-product/temp/package-deps.json": "
|
|
27
|
-
"libraries/data-interest-rate/temp/package-deps.json": "
|
|
28
|
-
"libraries/data-order/temp/package-deps.json": "
|
|
29
|
-
"libraries/data-series/temp/package-deps.json": "
|
|
30
|
-
"libraries/data-ohlc/temp/package-deps.json": "
|
|
31
|
-
"libraries/extension/temp/package-deps.json": "
|
|
20
|
+
"libraries/protocol/temp/package-deps.json": "ff231b7689ff7d151498b496f70944d4598fcf33",
|
|
21
|
+
"libraries/transfer/temp/package-deps.json": "2a26e3db2d5ef3318172d1d29ca257bfa94d1b21",
|
|
22
|
+
"libraries/data-account/temp/package-deps.json": "7baeec049b7f31fb4bafb63018c0c9736f1aa456",
|
|
23
|
+
"libraries/utils/temp/package-deps.json": "56def945d0e67a9d0ca13447d2333155be0138f2",
|
|
24
|
+
"libraries/sql/temp/package-deps.json": "2da55e5e704b1c1558acab11b6df163744d1b24a",
|
|
25
|
+
"libraries/data-product/temp/package-deps.json": "fceed1ec7ecb23e7e3f9c36bc0abd3f053a27c75",
|
|
26
|
+
"libraries/data-interest-rate/temp/package-deps.json": "246f09881d5bce801a352861086d7e2b90eb5b6b",
|
|
27
|
+
"libraries/data-order/temp/package-deps.json": "add9a90c23442334f0575f403ef48dc33ceb5fd4",
|
|
28
|
+
"libraries/data-series/temp/package-deps.json": "dd0d2f8322b484f074ae09c050ceb53fbc1368f4",
|
|
29
|
+
"libraries/data-ohlc/temp/package-deps.json": "6ae0a1249855ee2e1aefd88a66f6d0c4a1f61dd5",
|
|
30
|
+
"libraries/extension/temp/package-deps.json": "1e2fec9acb35353b204eff0d4cc0af65c3b2582a",
|
|
32
31
|
"tools/toolkit/temp/package-deps.json": "3bef053db16659f0cdaceea64c8a8580c0131633"
|
|
33
32
|
}
|
package/dist/terminal.js
DELETED
package/dist/terminal.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC","sourcesContent":["import { Terminal } from '@yuants/protocol';\n\nexport const terminal = Terminal.fromNodeEnv();\n"]}
|
package/lib/terminal.d.ts
DELETED
package/lib/terminal.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,eAAO,MAAM,QAAQ,UAAyB,CAAC"}
|
package/lib/terminal.js
DELETED
package/lib/terminal.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE/B,QAAA,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC","sourcesContent":["import { Terminal } from '@yuants/protocol';\n\nexport const terminal = Terminal.fromNodeEnv();\n"]}
|