jcc_hyper_tool 0.1.1
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/LICENSE +21 -0
- package/README.md +394 -0
- package/dist/cli/confirm.d.ts +2 -0
- package/dist/cli/confirm.d.ts.map +1 -0
- package/dist/cli/confirm.js +22 -0
- package/dist/cli/confirm.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +189 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/perpKline.d.ts +19 -0
- package/dist/cli/perpKline.d.ts.map +1 -0
- package/dist/cli/perpKline.js +39 -0
- package/dist/cli/perpKline.js.map +1 -0
- package/dist/cli/stateCli.d.ts +3 -0
- package/dist/cli/stateCli.d.ts.map +1 -0
- package/dist/cli/stateCli.js +158 -0
- package/dist/cli/stateCli.js.map +1 -0
- package/dist/cli/strategyCli.d.ts +3 -0
- package/dist/cli/strategyCli.d.ts.map +1 -0
- package/dist/cli/strategyCli.js +198 -0
- package/dist/cli/strategyCli.js.map +1 -0
- package/dist/cli/tradingCli.d.ts +3 -0
- package/dist/cli/tradingCli.d.ts.map +1 -0
- package/dist/cli/tradingCli.js +587 -0
- package/dist/cli/tradingCli.js.map +1 -0
- package/dist/cli/util.d.ts +28 -0
- package/dist/cli/util.d.ts.map +1 -0
- package/dist/cli/util.js +62 -0
- package/dist/cli/util.js.map +1 -0
- package/dist/core/config.d.ts +32 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +101 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +9 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +17 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hyperliquid/asset.d.ts +24 -0
- package/dist/core/hyperliquid/asset.d.ts.map +1 -0
- package/dist/core/hyperliquid/asset.js +88 -0
- package/dist/core/hyperliquid/asset.js.map +1 -0
- package/dist/core/hyperliquid/candles.d.ts +24 -0
- package/dist/core/hyperliquid/candles.d.ts.map +1 -0
- package/dist/core/hyperliquid/candles.js +113 -0
- package/dist/core/hyperliquid/candles.js.map +1 -0
- package/dist/core/hyperliquid/client.d.ts +36 -0
- package/dist/core/hyperliquid/client.d.ts.map +1 -0
- package/dist/core/hyperliquid/client.js +92 -0
- package/dist/core/hyperliquid/client.js.map +1 -0
- package/dist/core/hyperliquid/exchange.d.ts +14 -0
- package/dist/core/hyperliquid/exchange.d.ts.map +1 -0
- package/dist/core/hyperliquid/exchange.js +42 -0
- package/dist/core/hyperliquid/exchange.js.map +1 -0
- package/dist/core/hyperliquid/exchangeParse.d.ts +7 -0
- package/dist/core/hyperliquid/exchangeParse.d.ts.map +1 -0
- package/dist/core/hyperliquid/exchangeParse.js +44 -0
- package/dist/core/hyperliquid/exchangeParse.js.map +1 -0
- package/dist/core/hyperliquid/float.d.ts +6 -0
- package/dist/core/hyperliquid/float.d.ts.map +1 -0
- package/dist/core/hyperliquid/float.js +24 -0
- package/dist/core/hyperliquid/float.js.map +1 -0
- package/dist/core/hyperliquid/klineCoin.d.ts +10 -0
- package/dist/core/hyperliquid/klineCoin.d.ts.map +1 -0
- package/dist/core/hyperliquid/klineCoin.js +90 -0
- package/dist/core/hyperliquid/klineCoin.js.map +1 -0
- package/dist/core/hyperliquid/orders.d.ts +91 -0
- package/dist/core/hyperliquid/orders.d.ts.map +1 -0
- package/dist/core/hyperliquid/orders.js +116 -0
- package/dist/core/hyperliquid/orders.js.map +1 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.d.ts +3 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.d.ts.map +1 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.js +10 -0
- package/dist/core/hyperliquid/prefixedPerpCoin.js.map +1 -0
- package/dist/core/hyperliquid/signed-exchange.d.ts +10 -0
- package/dist/core/hyperliquid/signed-exchange.d.ts.map +1 -0
- package/dist/core/hyperliquid/signed-exchange.js +23 -0
- package/dist/core/hyperliquid/signed-exchange.js.map +1 -0
- package/dist/core/hyperliquid/signing.d.ts +23 -0
- package/dist/core/hyperliquid/signing.d.ts.map +1 -0
- package/dist/core/hyperliquid/signing.js +65 -0
- package/dist/core/hyperliquid/signing.js.map +1 -0
- package/dist/core/hyperliquid/types.d.ts +11 -0
- package/dist/core/hyperliquid/types.d.ts.map +1 -0
- package/dist/core/hyperliquid/types.js +2 -0
- package/dist/core/hyperliquid/types.js.map +1 -0
- package/dist/core/hyperliquid/watchOrders.d.ts +10 -0
- package/dist/core/hyperliquid/watchOrders.d.ts.map +1 -0
- package/dist/core/hyperliquid/watchOrders.js +38 -0
- package/dist/core/hyperliquid/watchOrders.js.map +1 -0
- package/dist/core/state/bracketReconcile.d.ts +23 -0
- package/dist/core/state/bracketReconcile.d.ts.map +1 -0
- package/dist/core/state/bracketReconcile.js +297 -0
- package/dist/core/state/bracketReconcile.js.map +1 -0
- package/dist/core/state/cancelOpenPlan.d.ts +23 -0
- package/dist/core/state/cancelOpenPlan.d.ts.map +1 -0
- package/dist/core/state/cancelOpenPlan.js +126 -0
- package/dist/core/state/cancelOpenPlan.js.map +1 -0
- package/dist/core/state/gcTradeState.d.ts +13 -0
- package/dist/core/state/gcTradeState.d.ts.map +1 -0
- package/dist/core/state/gcTradeState.js +48 -0
- package/dist/core/state/gcTradeState.js.map +1 -0
- package/dist/core/state/gridReconcile.d.ts +46 -0
- package/dist/core/state/gridReconcile.d.ts.map +1 -0
- package/dist/core/state/gridReconcile.js +307 -0
- package/dist/core/state/gridReconcile.js.map +1 -0
- package/dist/core/state/intentFactory.d.ts +58 -0
- package/dist/core/state/intentFactory.d.ts.map +1 -0
- package/dist/core/state/intentFactory.js +95 -0
- package/dist/core/state/intentFactory.js.map +1 -0
- package/dist/core/state/present.d.ts +17 -0
- package/dist/core/state/present.d.ts.map +1 -0
- package/dist/core/state/present.js +100 -0
- package/dist/core/state/present.js.map +1 -0
- package/dist/core/state/runCancelOpen.d.ts +32 -0
- package/dist/core/state/runCancelOpen.d.ts.map +1 -0
- package/dist/core/state/runCancelOpen.js +101 -0
- package/dist/core/state/runCancelOpen.js.map +1 -0
- package/dist/core/state/runReconcile.d.ts +20 -0
- package/dist/core/state/runReconcile.d.ts.map +1 -0
- package/dist/core/state/runReconcile.js +248 -0
- package/dist/core/state/runReconcile.js.map +1 -0
- package/dist/core/state/schema.d.ts +1161 -0
- package/dist/core/state/schema.d.ts.map +1 -0
- package/dist/core/state/schema.js +151 -0
- package/dist/core/state/schema.js.map +1 -0
- package/dist/core/state/snapshot.d.ts +22 -0
- package/dist/core/state/snapshot.d.ts.map +1 -0
- package/dist/core/state/snapshot.js +115 -0
- package/dist/core/state/snapshot.js.map +1 -0
- package/dist/core/state/statePaths.d.ts +2 -0
- package/dist/core/state/statePaths.d.ts.map +1 -0
- package/dist/core/state/statePaths.js +7 -0
- package/dist/core/state/statePaths.js.map +1 -0
- package/dist/core/state/store.d.ts +12 -0
- package/dist/core/state/store.d.ts.map +1 -0
- package/dist/core/state/store.js +95 -0
- package/dist/core/state/store.js.map +1 -0
- package/dist/core/state/types.d.ts +40 -0
- package/dist/core/state/types.d.ts.map +1 -0
- package/dist/core/state/types.js +2 -0
- package/dist/core/state/types.js.map +1 -0
- package/dist/core/trading.d.ts +8 -0
- package/dist/core/trading.d.ts.map +1 -0
- package/dist/core/trading.js +22 -0
- package/dist/core/trading.js.map +1 -0
- package/dist/core/wallet.d.ts +3 -0
- package/dist/core/wallet.d.ts.map +1 -0
- package/dist/core/wallet.js +14 -0
- package/dist/core/wallet.js.map +1 -0
- package/dist/daemon/index.d.ts +3 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +104 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/meta/version.d.ts +2 -0
- package/dist/meta/version.d.ts.map +1 -0
- package/dist/meta/version.js +12 -0
- package/dist/meta/version.js.map +1 -0
- package/dist/strategies/grid.d.ts +46 -0
- package/dist/strategies/grid.d.ts.map +1 -0
- package/dist/strategies/grid.js +101 -0
- package/dist/strategies/grid.js.map +1 -0
- package/package.json +46 -0
package/dist/cli/util.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ConfigError } from "../core/errors.js";
|
|
2
|
+
import { defaultTradeStateFilePath } from "../core/state/statePaths.js";
|
|
3
|
+
export function getRootProgram(cmd) {
|
|
4
|
+
let c = cmd;
|
|
5
|
+
while (c.parent) {
|
|
6
|
+
c = c.parent;
|
|
7
|
+
}
|
|
8
|
+
return c;
|
|
9
|
+
}
|
|
10
|
+
export function readGlobalOptions(cmd) {
|
|
11
|
+
const root = getRootProgram(cmd);
|
|
12
|
+
const opts = root.opts();
|
|
13
|
+
return opts;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pure resolver for tests and CLI helpers.
|
|
17
|
+
* Precedence: subcommand `--state-file` → root `--state-file` → env `JCC_HYPER_STATE_FILE` → default `~/.jcc_hyper_tool/trade-state.json`
|
|
18
|
+
*/
|
|
19
|
+
export function resolveTradeStatePathFromGlobals(globals, localStateFile, homeDir, envStateFile) {
|
|
20
|
+
if (globals.noState) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const local = localStateFile?.trim();
|
|
24
|
+
if (local) {
|
|
25
|
+
return local;
|
|
26
|
+
}
|
|
27
|
+
const rootPath = globals.stateFile?.trim();
|
|
28
|
+
if (rootPath) {
|
|
29
|
+
return rootPath;
|
|
30
|
+
}
|
|
31
|
+
const fromEnv = envStateFile?.trim();
|
|
32
|
+
if (fromEnv) {
|
|
33
|
+
return fromEnv;
|
|
34
|
+
}
|
|
35
|
+
return defaultTradeStateFilePath(homeDir);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolved path for persisting trade state. Returns `undefined` when `--no-state` is set on the root command.
|
|
39
|
+
* Precedence: `localStateFile` (subcommand `--state-file`) → root `--state-file` → env `JCC_HYPER_STATE_FILE` → default ~/.jcc_hyper_tool/trade-state.json
|
|
40
|
+
*/
|
|
41
|
+
export function resolveTradeStatePath(cmd, localStateFile) {
|
|
42
|
+
const globals = readGlobalOptions(cmd);
|
|
43
|
+
return resolveTradeStatePathFromGlobals(globals, localStateFile, undefined, process.env.JCC_HYPER_STATE_FILE);
|
|
44
|
+
}
|
|
45
|
+
export function requireStateCliEnabled(cmd, hint) {
|
|
46
|
+
const globals = readGlobalOptions(cmd);
|
|
47
|
+
if (globals.noState) {
|
|
48
|
+
throw new ConfigError(`--no-state cannot be used with ${hint}.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function printJson(value) {
|
|
52
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
53
|
+
}
|
|
54
|
+
export function logVerbose(cmd, message) {
|
|
55
|
+
const o = readGlobalOptions(cmd);
|
|
56
|
+
if (o.verbose) {
|
|
57
|
+
process.stderr.write(`${message}\n`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** HIP-3 `deployer:ASSET` → infer `/info` meta `dex` (substring before `:`). */
|
|
61
|
+
export { inferHlDexFromPrefixedPerpCoin as inferHlDexFromPrefixedCoin } from "../core/hyperliquid/prefixedPerpCoin.js";
|
|
62
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/cli/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,CAAC,GAAY,GAAG,CAAC;IACrB,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAYD,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAoB,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAC9C,OAAwD,EACxD,cAAmC,EACnC,OAAgB,EAChB,YAAiC;IAEjC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,EAAE,IAAI,EAAE,CAAC;IACrC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAY,EACZ,cAAmC;IAEnC,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,gCAAgC,CACrC,OAAO,EACP,cAAc,EACd,SAAS,EACT,OAAO,CAAC,GAAG,CAAC,oBAAoB,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,IAAY;IAC/D,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,WAAW,CAAC,kCAAkC,IAAI,GAAG,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,OAAe;IACtD,MAAM,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,OAAO,EAAE,8BAA8B,IAAI,0BAA0B,EAAE,MAAM,yCAAyC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const NetworkSchema: z.ZodEnum<["mainnet", "testnet"]>;
|
|
3
|
+
export type EffectiveConfig = {
|
|
4
|
+
network: z.infer<typeof NetworkSchema>;
|
|
5
|
+
infoOrigin: string;
|
|
6
|
+
/** Resolved user wallet for HL account queries — never the agent mismatch per docs unless explicitly set via address env. */
|
|
7
|
+
userAddress?: `0x${string}`;
|
|
8
|
+
/** True when HYPERLIQUID_PRIVATE_KEY / alias was present and parsed. */
|
|
9
|
+
hasPrivateKey: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type ResolvedUserContext = Pick<EffectiveConfig, "network" | "infoOrigin"> & {
|
|
12
|
+
userAddress: `0x${string}`;
|
|
13
|
+
};
|
|
14
|
+
export declare function parseNetwork(raw: unknown): z.infer<typeof NetworkSchema>;
|
|
15
|
+
export declare function normalizeInfoOrigin(network: z.infer<typeof NetworkSchema>, apiUrl?: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Loads effective configuration from env + CLI overrides.
|
|
18
|
+
* Env knobs: JCC_HYPER_NETWORK, JCC_HYPER_API_URL / HYPERLIQUID_API_URL, HYPERLIQUID_PRIVATE_KEY /
|
|
19
|
+
* JCC_HYPER_WALLET_PRIVATE_KEY, HYPERLIQUID_ADDRESS / JCC_HYPER_WALLET_ADDRESS.
|
|
20
|
+
* Trade-state default path (when CLI omits --state-file): JCC_HYPER_STATE_FILE, resolved in resolveTradeStatePath.
|
|
21
|
+
* Does not read ".env" files — use your shell / direnv / dotenv in dev if needed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadEffectiveConfig(opts: {
|
|
24
|
+
env?: NodeJS.ProcessEnv;
|
|
25
|
+
network?: string;
|
|
26
|
+
apiUrl?: string;
|
|
27
|
+
}): EffectiveConfig;
|
|
28
|
+
/** Requires a user address (from private key or explicit env) for account-scoped calls. */
|
|
29
|
+
export declare function requireUserContext(cfg: EffectiveConfig): ResolvedUserContext;
|
|
30
|
+
export declare function printEffectiveConfig(cfg: EffectiveConfig): string;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,aAAa,mCAAiC,CAAC;AAWrD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,6HAA6H;IAC7H,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,wEAAwE;IACxE,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,YAAY,CAAC,GAAG;IAClF,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAMxE;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,EACtC,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAoBR;AAuBD;;;;;;GAMG;AAEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,eAAe,CA4BlB;AAED,2FAA2F;AAE3F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,mBAAmB,CAW5E;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAQjE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ConfigError } from "./errors.js";
|
|
3
|
+
import { addressFromPrivateKey } from "./wallet.js";
|
|
4
|
+
const NetworkSchema = z.enum(["mainnet", "testnet"]);
|
|
5
|
+
const DEFAULT_BASE = {
|
|
6
|
+
mainnet: "https://api.hyperliquid.xyz",
|
|
7
|
+
testnet: "https://api.hyperliquid-testnet.xyz",
|
|
8
|
+
};
|
|
9
|
+
function isEthereumAddress(raw) {
|
|
10
|
+
return /^0x[a-fA-F0-9]{40}$/.test(raw);
|
|
11
|
+
}
|
|
12
|
+
export function parseNetwork(raw) {
|
|
13
|
+
const v = NetworkSchema.safeParse(raw);
|
|
14
|
+
if (!v.success) {
|
|
15
|
+
throw new ConfigError(`Invalid network. Expected mainnet | testnet, got: ${String(raw)}`);
|
|
16
|
+
}
|
|
17
|
+
return v.data;
|
|
18
|
+
}
|
|
19
|
+
export function normalizeInfoOrigin(network, apiUrl) {
|
|
20
|
+
const base = DEFAULT_BASE[network];
|
|
21
|
+
if (!apiUrl) {
|
|
22
|
+
return base;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const parsed = new URL(apiUrl);
|
|
26
|
+
/**
|
|
27
|
+
* If user passes ".../info" by mistake, trim to origin.
|
|
28
|
+
* If they pass ".../anything", we'll still normalize to `${origin}`.
|
|
29
|
+
*/
|
|
30
|
+
const origin = parsed.protocol === "https:" || parsed.protocol === "http:" ? parsed.origin : base;
|
|
31
|
+
return origin;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new ConfigError(`Invalid --api-url / api URL: "${apiUrl}"`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function readOptionalPrivateKey(env) {
|
|
38
|
+
const raw = env.JCC_HYPER_WALLET_PRIVATE_KEY ?? env.HYPERLIQUID_PRIVATE_KEY;
|
|
39
|
+
if (!raw) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return raw;
|
|
43
|
+
}
|
|
44
|
+
function readOptionalAddress(env) {
|
|
45
|
+
const raw = env.JCC_HYPER_WALLET_ADDRESS ?? env.HYPERLIQUID_ADDRESS;
|
|
46
|
+
if (!raw) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
if (!isEthereumAddress(raw.trim())) {
|
|
50
|
+
throw new ConfigError(`Invalid JCC_HYPER_WALLET_ADDRESS / HYPERLIQUID_ADDRESS: expected 0x + 40 hex chars`);
|
|
51
|
+
}
|
|
52
|
+
return raw.trim();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Loads effective configuration from env + CLI overrides.
|
|
56
|
+
* Env knobs: JCC_HYPER_NETWORK, JCC_HYPER_API_URL / HYPERLIQUID_API_URL, HYPERLIQUID_PRIVATE_KEY /
|
|
57
|
+
* JCC_HYPER_WALLET_PRIVATE_KEY, HYPERLIQUID_ADDRESS / JCC_HYPER_WALLET_ADDRESS.
|
|
58
|
+
* Trade-state default path (when CLI omits --state-file): JCC_HYPER_STATE_FILE, resolved in resolveTradeStatePath.
|
|
59
|
+
* Does not read ".env" files — use your shell / direnv / dotenv in dev if needed.
|
|
60
|
+
*/
|
|
61
|
+
export function loadEffectiveConfig(opts) {
|
|
62
|
+
const env = opts.env ?? process.env;
|
|
63
|
+
const network = parseNetwork(opts.network ?? env.JCC_HYPER_NETWORK ?? "mainnet");
|
|
64
|
+
const infoOrigin = normalizeInfoOrigin(network, opts.apiUrl ?? env.JCC_HYPER_API_URL ?? env.HYPERLIQUID_API_URL);
|
|
65
|
+
const pk = readOptionalPrivateKey(env);
|
|
66
|
+
const explicitAddress = readOptionalAddress(env);
|
|
67
|
+
if (explicitAddress && pk) {
|
|
68
|
+
const derived = addressFromPrivateKey(pk);
|
|
69
|
+
if (derived.toLowerCase() !== explicitAddress.toLowerCase()) {
|
|
70
|
+
throw new ConfigError(`Private key address ${derived} does not match JCC_HYPER_WALLET_ADDRESS / HYPERLIQUID_ADDRESS ${explicitAddress}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const userAddress = explicitAddress ?? (pk ? addressFromPrivateKey(pk) : undefined);
|
|
74
|
+
return {
|
|
75
|
+
network,
|
|
76
|
+
infoOrigin,
|
|
77
|
+
userAddress,
|
|
78
|
+
hasPrivateKey: Boolean(pk),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** Requires a user address (from private key or explicit env) for account-scoped calls. */
|
|
82
|
+
export function requireUserContext(cfg) {
|
|
83
|
+
if (!cfg.userAddress) {
|
|
84
|
+
throw new ConfigError("Missing wallet context. Set HYPERLIQUID_PRIVATE_KEY or JCC_HYPER_WALLET_PRIVATE_KEY (or HYPERLIQUID_ADDRESS / JCC_HYPER_WALLET_ADDRESS for read-only account queries).");
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
network: cfg.network,
|
|
88
|
+
infoOrigin: cfg.infoOrigin,
|
|
89
|
+
userAddress: cfg.userAddress,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function printEffectiveConfig(cfg) {
|
|
93
|
+
const lines = [
|
|
94
|
+
`network: ${cfg.network}`,
|
|
95
|
+
`infoOrigin: ${cfg.infoOrigin}`,
|
|
96
|
+
`hasPrivateKey: ${cfg.hasPrivateKey ? "yes" : "no"}`,
|
|
97
|
+
`userAddress: ${cfg.userAddress ?? "(not set)"}`,
|
|
98
|
+
];
|
|
99
|
+
return lines.join("\n");
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class HyperliquidApiError extends Error {
|
|
2
|
+
readonly status: number;
|
|
3
|
+
readonly bodyText: string;
|
|
4
|
+
constructor(message: string, status: number, bodyText: string);
|
|
5
|
+
}
|
|
6
|
+
export declare class ConfigError extends Error {
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAM9D;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class HyperliquidApiError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
bodyText;
|
|
4
|
+
constructor(message, status, bodyText) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "HyperliquidApiError";
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.bodyText = bodyText;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class ConfigError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "ConfigError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,MAAM,CAAS;IACf,QAAQ,CAAS;IAE1B,YAAY,OAAe,EAAE,MAAc,EAAE,QAAgB;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare function encodeBuilderDeployedPerpAssetId(perpDexIndex: number, indexInMeta: number): number;
|
|
2
|
+
/** Resolve perp `"coin"` symbols (BTC, ETH, HIP-3 `xyz:...`) to HL `universe` indices from `meta` info payload. */
|
|
3
|
+
export declare function perpCoinToAssetIndex(meta: unknown, coin: string): number;
|
|
4
|
+
/** Sorted unique `universe[].name` strings from a `meta` info payload (HIP-3 rows look like `xyz:CL`). */
|
|
5
|
+
export declare function extractPerpUniverseCoinNames(meta: unknown): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Map `/info` `perpDexs` list (index 0 is `null` = native HL perp dex) to the `perp_dex_index`
|
|
8
|
+
* used in builder asset encoding.
|
|
9
|
+
*/
|
|
10
|
+
export declare function perpDexIndexFromList(perpDexs: unknown, dexName: string): number;
|
|
11
|
+
/**
|
|
12
|
+
* Integer `asset` for `/exchange` perp order actions.
|
|
13
|
+
* - Default / native perp dex (no `dex`): same as index in `meta.universe` (e.g. BTC often 0).
|
|
14
|
+
* - Builder-deployed dex: `100000 + perp_dex_index * 10000 + index_in_meta`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function perpCoinToExchangeAssetId(opts: {
|
|
17
|
+
coin: string;
|
|
18
|
+
meta: unknown;
|
|
19
|
+
/** When set, selects a builder dex; native dex is `meta()` without `dex` and no encoding offset. */
|
|
20
|
+
dex: string | undefined;
|
|
21
|
+
/** From `POST { type: "perpDexs" }` — required when `dex` is set. */
|
|
22
|
+
perpDexs?: unknown;
|
|
23
|
+
}): number;
|
|
24
|
+
//# sourceMappingURL=asset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/asset.ts"],"names":[],"mappings":"AAMA,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED,mHAAmH;AAEnH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBxE;AAED,0GAA0G;AAE1G,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAmBpE;AAED;;;GAGG;AAEH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgB/E;AAED;;;;GAIG;AAEH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,oGAAoG;IACpG,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAaT"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ConfigError } from "../errors.js";
|
|
2
|
+
/** HL builder-deployed perp asset IDs: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/asset-ids */
|
|
3
|
+
const BUILDER_PERP_BASE = 100_000;
|
|
4
|
+
const BUILDER_PERP_STRIDE = 10_000;
|
|
5
|
+
export function encodeBuilderDeployedPerpAssetId(perpDexIndex, indexInMeta) {
|
|
6
|
+
return BUILDER_PERP_BASE + perpDexIndex * BUILDER_PERP_STRIDE + indexInMeta;
|
|
7
|
+
}
|
|
8
|
+
/** Resolve perp `"coin"` symbols (BTC, ETH, HIP-3 `xyz:...`) to HL `universe` indices from `meta` info payload. */
|
|
9
|
+
export function perpCoinToAssetIndex(meta, coin) {
|
|
10
|
+
if (typeof meta !== "object" || meta === null) {
|
|
11
|
+
throw new ConfigError(`Unexpected meta response while resolving coin '${coin}'.`);
|
|
12
|
+
}
|
|
13
|
+
const u = meta.universe;
|
|
14
|
+
if (!Array.isArray(u)) {
|
|
15
|
+
throw new ConfigError(`Unexpected meta.universe shape while resolving '${coin}'.`);
|
|
16
|
+
}
|
|
17
|
+
for (let i = 0; i < u.length; i++) {
|
|
18
|
+
const row = u[i];
|
|
19
|
+
if (typeof row !== "object" || row === null) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const name = row.name;
|
|
23
|
+
if (name === coin) {
|
|
24
|
+
return i;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw new ConfigError(`Unknown perp universe coin '${coin}'. Try 'perp meta' to inspect names.`);
|
|
28
|
+
}
|
|
29
|
+
/** Sorted unique `universe[].name` strings from a `meta` info payload (HIP-3 rows look like `xyz:CL`). */
|
|
30
|
+
export function extractPerpUniverseCoinNames(meta) {
|
|
31
|
+
if (typeof meta !== "object" || meta === null) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const u = meta.universe;
|
|
35
|
+
if (!Array.isArray(u)) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
const names = [];
|
|
39
|
+
for (const row of u) {
|
|
40
|
+
if (typeof row !== "object" || row === null) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const name = row.name;
|
|
44
|
+
if (typeof name === "string" && name.length > 0) {
|
|
45
|
+
names.push(name);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return [...new Set(names)].sort();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Map `/info` `perpDexs` list (index 0 is `null` = native HL perp dex) to the `perp_dex_index`
|
|
52
|
+
* used in builder asset encoding.
|
|
53
|
+
*/
|
|
54
|
+
export function perpDexIndexFromList(perpDexs, dexName) {
|
|
55
|
+
if (!Array.isArray(perpDexs)) {
|
|
56
|
+
throw new ConfigError("Unexpected perpDexs response shape.");
|
|
57
|
+
}
|
|
58
|
+
const want = dexName.trim();
|
|
59
|
+
for (let i = 0; i < perpDexs.length; i++) {
|
|
60
|
+
const row = perpDexs[i];
|
|
61
|
+
if (row === null || typeof row !== "object") {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const name = row.name;
|
|
65
|
+
if (name === want) {
|
|
66
|
+
return i;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
throw new ConfigError(`Unknown perp dex '${want}'. Try perpDexs / perp meta.`);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Integer `asset` for `/exchange` perp order actions.
|
|
73
|
+
* - Default / native perp dex (no `dex`): same as index in `meta.universe` (e.g. BTC often 0).
|
|
74
|
+
* - Builder-deployed dex: `100000 + perp_dex_index * 10000 + index_in_meta`.
|
|
75
|
+
*/
|
|
76
|
+
export function perpCoinToExchangeAssetId(opts) {
|
|
77
|
+
const indexInMeta = perpCoinToAssetIndex(opts.meta, opts.coin);
|
|
78
|
+
const d = opts.dex?.trim();
|
|
79
|
+
if (!d) {
|
|
80
|
+
return indexInMeta;
|
|
81
|
+
}
|
|
82
|
+
if (opts.perpDexs === undefined || opts.perpDexs === null) {
|
|
83
|
+
throw new ConfigError("perpDexs is required when resolving a builder-deployed perp asset id (dex is set).");
|
|
84
|
+
}
|
|
85
|
+
const perpDexIdx = perpDexIndexFromList(opts.perpDexs, d);
|
|
86
|
+
return encodeBuilderDeployedPerpAssetId(perpDexIdx, indexInMeta);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=asset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/asset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Official `candleSnapshot` `req.interval` values (matches HL WS candle subscription set). */
|
|
2
|
+
export declare const HL_CANDLE_INTERVALS: readonly ["1m", "3m", "5m", "15m", "30m", "1h", "2h", "4h", "8h", "12h", "1d", "3d", "1w", "1M"];
|
|
3
|
+
export type HlCandleInterval = (typeof HL_CANDLE_INTERVALS)[number];
|
|
4
|
+
export declare function parseCandleInterval(raw: string): HlCandleInterval;
|
|
5
|
+
export declare function parsePositiveIntMs(raw: string, label: string): number;
|
|
6
|
+
export declare function assertKlineTimeOrder(startMs: number, endMs: number): void;
|
|
7
|
+
export type ValidatedKlineReq = {
|
|
8
|
+
interval: HlCandleInterval;
|
|
9
|
+
startTime: number;
|
|
10
|
+
endTime: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Default history length when `--start-time` / `--end-time` are omitted.
|
|
14
|
+
* Tuned so bar counts stay reasonable for HL API (emphasis: 5m ≈ 1 交易日日内、1h ≈ 一月、1d ≈ 一年).
|
|
15
|
+
*/
|
|
16
|
+
export declare function defaultLookbackMs(interval: HlCandleInterval): number;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve interval + time range: either explicit `--start-time` & `--end-time`, or defaults (end = now).
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveKlineRequest(intervalRaw: string, timeOpts: {
|
|
21
|
+
startTime?: string;
|
|
22
|
+
endTime?: string;
|
|
23
|
+
}, nowMs: number): ValidatedKlineReq;
|
|
24
|
+
//# sourceMappingURL=candles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candles.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/candles.ts"],"names":[],"mappings":"AAEA,+FAA+F;AAC/F,eAAO,MAAM,mBAAmB,kGAetB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIpE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAQjE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAmCpE;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAClD,KAAK,EAAE,MAAM,GACZ,iBAAiB,CA2BnB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { ConfigError } from "../errors.js";
|
|
2
|
+
/** Official `candleSnapshot` `req.interval` values (matches HL WS candle subscription set). */
|
|
3
|
+
export const HL_CANDLE_INTERVALS = [
|
|
4
|
+
"1m",
|
|
5
|
+
"3m",
|
|
6
|
+
"5m",
|
|
7
|
+
"15m",
|
|
8
|
+
"30m",
|
|
9
|
+
"1h",
|
|
10
|
+
"2h",
|
|
11
|
+
"4h",
|
|
12
|
+
"8h",
|
|
13
|
+
"12h",
|
|
14
|
+
"1d",
|
|
15
|
+
"3d",
|
|
16
|
+
"1w",
|
|
17
|
+
"1M",
|
|
18
|
+
];
|
|
19
|
+
const INTERVAL_SET = new Set(HL_CANDLE_INTERVALS);
|
|
20
|
+
export function parseCandleInterval(raw) {
|
|
21
|
+
const s = raw.trim();
|
|
22
|
+
if (!INTERVAL_SET.has(s)) {
|
|
23
|
+
throw new ConfigError(`Invalid --interval '${raw}'. Allowed: ${HL_CANDLE_INTERVALS.join(", ")}`);
|
|
24
|
+
}
|
|
25
|
+
return s;
|
|
26
|
+
}
|
|
27
|
+
export function parsePositiveIntMs(raw, label) {
|
|
28
|
+
const trimmed = raw.trim();
|
|
29
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
30
|
+
throw new ConfigError(`${label} must be a positive integer (milliseconds as digits only).`);
|
|
31
|
+
}
|
|
32
|
+
const n = Number(trimmed);
|
|
33
|
+
if (!Number.isSafeInteger(n) || n <= 0) {
|
|
34
|
+
throw new ConfigError(`${label} must be a positive integer milliseconds.`);
|
|
35
|
+
}
|
|
36
|
+
return n;
|
|
37
|
+
}
|
|
38
|
+
export function assertKlineTimeOrder(startMs, endMs) {
|
|
39
|
+
if (startMs > endMs) {
|
|
40
|
+
throw new ConfigError(`--start-time must be <= --end-time (got ${startMs} > ${endMs}).`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const MINUTE_MS = 60_000;
|
|
44
|
+
const HOUR_MS = 60 * MINUTE_MS;
|
|
45
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
46
|
+
/**
|
|
47
|
+
* Default history length when `--start-time` / `--end-time` are omitted.
|
|
48
|
+
* Tuned so bar counts stay reasonable for HL API (emphasis: 5m ≈ 1 交易日日内、1h ≈ 一月、1d ≈ 一年).
|
|
49
|
+
*/
|
|
50
|
+
export function defaultLookbackMs(interval) {
|
|
51
|
+
switch (interval) {
|
|
52
|
+
case "1m":
|
|
53
|
+
return 1 * DAY_MS;
|
|
54
|
+
case "3m":
|
|
55
|
+
return 2 * DAY_MS;
|
|
56
|
+
case "5m":
|
|
57
|
+
return 1 * DAY_MS;
|
|
58
|
+
case "15m":
|
|
59
|
+
return 7 * DAY_MS;
|
|
60
|
+
case "30m":
|
|
61
|
+
return 14 * DAY_MS;
|
|
62
|
+
case "1h":
|
|
63
|
+
return 30 * DAY_MS;
|
|
64
|
+
case "2h":
|
|
65
|
+
return 45 * DAY_MS;
|
|
66
|
+
case "4h":
|
|
67
|
+
return 90 * DAY_MS;
|
|
68
|
+
case "8h":
|
|
69
|
+
return 180 * DAY_MS;
|
|
70
|
+
case "12h":
|
|
71
|
+
return 270 * DAY_MS;
|
|
72
|
+
case "1d":
|
|
73
|
+
return 365 * DAY_MS;
|
|
74
|
+
case "3d":
|
|
75
|
+
return 3 * 365 * DAY_MS;
|
|
76
|
+
case "1w":
|
|
77
|
+
return 2 * 365 * DAY_MS;
|
|
78
|
+
case "1M":
|
|
79
|
+
return 5 * 365 * DAY_MS;
|
|
80
|
+
default: {
|
|
81
|
+
const _exhaustive = interval;
|
|
82
|
+
return _exhaustive;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function isProvided(raw) {
|
|
87
|
+
return raw !== undefined && raw.trim() !== "";
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Resolve interval + time range: either explicit `--start-time` & `--end-time`, or defaults (end = now).
|
|
91
|
+
*/
|
|
92
|
+
export function resolveKlineRequest(intervalRaw, timeOpts, nowMs) {
|
|
93
|
+
const interval = parseCandleInterval(intervalRaw);
|
|
94
|
+
const hasStart = isProvided(timeOpts.startTime);
|
|
95
|
+
const hasEnd = isProvided(timeOpts.endTime);
|
|
96
|
+
if (hasStart !== hasEnd) {
|
|
97
|
+
throw new ConfigError("请同时传入 --start-time 与 --end-time,或两者都不传以使用按周期自动计算的默认时间范围。");
|
|
98
|
+
}
|
|
99
|
+
if (hasStart && hasEnd) {
|
|
100
|
+
const startTime = parsePositiveIntMs(timeOpts.startTime, "--start-time");
|
|
101
|
+
const endTime = parsePositiveIntMs(timeOpts.endTime, "--end-time");
|
|
102
|
+
assertKlineTimeOrder(startTime, endTime);
|
|
103
|
+
return { interval, startTime, endTime };
|
|
104
|
+
}
|
|
105
|
+
const endTime = nowMs;
|
|
106
|
+
const startTime = endTime - defaultLookbackMs(interval);
|
|
107
|
+
if (!Number.isSafeInteger(startTime) || startTime <= 0) {
|
|
108
|
+
throw new ConfigError("默认起始时间无效(当前时间过小);请显式传入 --start-time / --end-time。");
|
|
109
|
+
}
|
|
110
|
+
assertKlineTimeOrder(startTime, endTime);
|
|
111
|
+
return { interval, startTime, endTime };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=candles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candles.js","sourceRoot":"","sources":["../../../src/core/hyperliquid/candles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { JsonValue } from "./types.js";
|
|
2
|
+
export type FetchLike = (input: string | URL | globalThis.Request, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export type InfoRequestBody = Record<string, unknown>;
|
|
4
|
+
export declare class HyperliquidInfoClient {
|
|
5
|
+
private readonly fetchImpl;
|
|
6
|
+
readonly infoUrl: string;
|
|
7
|
+
constructor(opts: {
|
|
8
|
+
infoOrigin: string;
|
|
9
|
+
fetchImpl?: FetchLike;
|
|
10
|
+
});
|
|
11
|
+
info(body: InfoRequestBody): Promise<JsonValue>;
|
|
12
|
+
meta(dex?: string): Promise<JsonValue>;
|
|
13
|
+
perpDexs(): Promise<JsonValue>;
|
|
14
|
+
allMids(dex?: string): Promise<JsonValue>;
|
|
15
|
+
clearinghouseState(user: `0x${string}`, dex?: string): Promise<JsonValue>;
|
|
16
|
+
openOrders(user: `0x${string}`, dex?: string): Promise<JsonValue>;
|
|
17
|
+
/** Recent user fills (per HL API caps). Optional `aggregateByTime` merges partials. */
|
|
18
|
+
userFills(user: `0x${string}`, opts?: {
|
|
19
|
+
aggregateByTime?: boolean;
|
|
20
|
+
}): Promise<JsonValue>;
|
|
21
|
+
l2Book(coin: string, opts?: {
|
|
22
|
+
nSigFigs?: number;
|
|
23
|
+
mantissa?: number;
|
|
24
|
+
}): Promise<JsonValue>;
|
|
25
|
+
/**
|
|
26
|
+
* OHLCV candle snapshot. Response shape is API-defined (typically array of objects with
|
|
27
|
+
* `t,T,s,i,o,h,l,c,v,n`); numeric precision is preserved when those fields are strings.
|
|
28
|
+
*/
|
|
29
|
+
candleSnapshot(params: {
|
|
30
|
+
coin: string;
|
|
31
|
+
interval: string;
|
|
32
|
+
startTime: number;
|
|
33
|
+
endTime: number;
|
|
34
|
+
}): Promise<JsonValue>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/hyperliquid/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,EACxC,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IAMzD,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAkCrD,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAItC,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IAI9B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzC,kBAAkB,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQzE,UAAU,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAMjE,uFAAuF;IACvF,SAAS,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAQxF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAWzF;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,SAAS,CAAC;CAWvB"}
|