UNPKG

@nktkas/hyperliquid

Version:

Hyperliquid API SDK for all major JS runtimes, written in TypeScript.

317 lines (280 loc) 13.1 kB
#!/usr/bin/env node "use strict"; /** * Command-line interface for interacting with Hyperliquid API. * * @example * ```sh * npx @nktkas/hyperliquid <endpoint> <method> [options] * ``` */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); // @ts-ignore: Ignore missing TS types when building npm const node_process_1 = __importDefault(require("node:process")); const _utils_js_1 = require("./_utils.js"); const mod_js_1 = require("../src/mod.js"); const mod_js_2 = require("../src/signing/mod.js"); // ============================================================ // Execute // ============================================================ function transformParams(method, params) { switch (method) { case "spotUser": { return { toggleSpotDusting: { ...params } }; } case "twapOrder": { return { twap: { ...params } }; } default: { return params; } } } class EchoTransport extends mod_js_1.HttpTransport { constructor(isTestnet) { super({ isTestnet }); } request(_, payload) { return new Promise((resolve) => resolve({ status: "ok", response: payload })); } } /** Execute CLI command on info/exchange endpoint */ async function executeEndpointMethod(endpoint, method, args) { // Parse CLI flags const isTestnet = "testnet" in args; const timeout = Number(args.timeout) || undefined; const isOffline = "offline" in args; // Create transport (echo for offline, http for online) const transport = isOffline ? new EchoTransport(isTestnet) : new mod_js_1.HttpTransport({ isTestnet, timeout }); let client; // Create client based on endpoint switch (endpoint) { case "info": client = new mod_js_1.InfoClient({ transport }); break; case "exchange": { const wallet = new mod_js_2.PrivateKeySigner(args["private-key"]); delete args["private-key"]; // remove before uncontrolled transfer of arguments (just in case) const defaultVaultAddress = args.vault; client = new mod_js_1.ExchangeClient({ transport, wallet, defaultVaultAddress }); break; } default: throw new Error(`Invalid endpoint "${endpoint}". Use "info" or "exchange"`); } // Check if method exists on client if (!(method in client)) throw new Error(`Unknown "${method}" method for "${endpoint}" endpoint`); // Execute method and return result const params = transformParams(method, args); // @ts-expect-error: dynamic method access const response = await client[method](params); return isOffline ? response.response : response; // for offline mode, we want to see the request payload, not the wrapper } // ============================================================ // CLI // ============================================================ function printHelp() { console.log(`Hyperliquid CLI Usage: npx @nktkas/hyperliquid <endpoint> <method> [options] Endpoints: info - Query blockchain and market information exchange - Execute trading operations (requires --private-key) Common Options: --testnet Use testnet instead of mainnet --timeout <number> Request timeout in milliseconds (default: 10000) --help, -h Show this help message --offline Generate transactions offline without broadcasting Exchange Options: --private-key <key> Private key for exchange operations (required) --vault <address> Vault address for operations ============================================================================= INFO ENDPOINT METHODS ============================================================================= Market Data: alignedQuoteTokenInfo --token <number> allMids [--dex <string>] allPerpMetas (no params) candleSnapshot --coin <string> --interval <1m|3m|5m|15m|30m|1h|2h|4h|8h|12h|1d|3d|1w|1M> --startTime <number> [--endTime <number>] fundingHistory --coin <string> --startTime <number> [--endTime <number>] l2Book --coin <string> [--nSigFigs <2|3|4|5>] [--mantissa <2|5>] liquidatable (no params) marginTable --id <number> maxMarketOrderNtls (no params) meta [--dex <string>] metaAndAssetCtxs [--dex <string>] perpsAtOpenInterestCap [--dex <string>] predictedFundings (no params) recentTrades --coin <string> spotMeta (no params) spotMetaAndAssetCtxs (no params) User Account: activeAssetData --user <address> --coin <string> clearinghouseState --user <address> [--dex <string>] extraAgents --user <address> isVip --user <address> legalCheck --user <address> maxBuilderFee --user <address> --builder <address> portfolio --user <address> preTransferCheck --user <address> --source <address> referral --user <address> spotClearinghouseState --user <address> [--dex <string>] subAccounts --user <address> subAccounts2 --user <address> userDexAbstraction --user <address> userFees --user <address> userFunding --user <address> --startTime <number> [--endTime <number>] userNonFundingLedgerUpdates --user <address> --startTime <number> [--endTime <number>] userRateLimit --user <address> userRole --user <address> userToMultiSigSigners --user <address> webData2 --user <address> Orders & TWAP & Position: frontendOpenOrders --user <address> [--dex <string>] historicalOrders --user <address> openOrders --user <address> [--dex <string>] orderStatus --user <address> --oid <number|hex> twapHistory --user <address> userFills --user <address> [--aggregateByTime <bool>] userFillsByTime --user <address> --startTime <number> [--endTime <number>] [--aggregateByTime <bool>] userTwapSliceFills --user <address> userTwapSliceFillsByTime --user <address> --startTime <number> [--endTime <number>] [--aggregateByTime <bool>] Delegation & Validators: delegations --user <address> delegatorHistory --user <address> delegatorRewards --user <address> delegatorSummary --user <address> gossipRootIps (no params) validatorL1Votes (no params) validatorSummaries (no params) Vault: leadingVaults --user <address> userVaultEquities --user <address> vaultDetails --vaultAddress <address> [--user <address>] vaultSummaries (no params) DEX: perpDexLimits --dex <string> perpDexs (no params) perpDexStatus --dex <string> Deploy Market: perpDeployAuctionStatus (no params) spotDeployState --user <address> spotPairDeployAuctionStatus (no params) Other: exchangeStatus (no params) Transaction & Block Details: blockDetails --height <number> tokenDetails --tokenId <hex> txDetails --hash <hex> userDetails --user <address> ============================================================================= EXCHANGE ENDPOINT METHODS ============================================================================= Order & TWAP & Position: batchModify --modifies <json> cancel --cancels <json> cancelByCloid --cancels <json> modify --oid <number|hex> --order <json> order --orders <json> [--grouping <na|normalTpsl|positionTpsl>] [--builder <json>] scheduleCancel [--time <number>] twapCancel --a <number> --t <number> twapOrder --a <number> --b <bool> --s <number> --r <bool> --m <number> --t <bool> updateIsolatedMargin --asset <number> --isBuy <bool> --ntli <number> updateLeverage --asset <number> --isCross <bool> --leverage <number> Account: agentEnableDexAbstraction (no params) approveAgent --agentAddress <address> [--agentName <string>] approveBuilderFee --maxFeeRate <number> --builder <address> evmUserModify --usingBigBlocks <bool> noop (no params) reserveRequestWeight --weight <number> setDisplayName --displayName <string> spotUser --optOut <bool> userDexAbstraction --user <address> --enabled <bool> Fund Transfers: sendAsset --destination <address> --token <name:address> --amount <number> --sourceDex <string> --destinationDex <string> [--fromSubAccount <address>] spotSend --destination <address> --token <name:address> --amount <number> usdClassTransfer --amount <number> --toPerp <bool> usdSend --destination <address> --amount <number> withdraw3 --destination <address> --amount <number> Sub-Account: createSubAccount --name <string> subAccountModify --subAccountUser <address> --name <string> subAccountSpotTransfer --subAccountUser <address> --isDeposit <bool> --token <name:address> --amount <number> subAccountTransfer --subAccountUser <address> --isDeposit <bool> --usd <number> Referrer: claimRewards (no params) registerReferrer --code <string> setReferrer --code <string> Staking & Delegation: cDeposit --wei <number> cWithdraw --wei <number> linkStakingUser --user <address> --isFinalize <bool> tokenDelegate --validator <address> --wei <number> --isUndelegate <bool> Vault: createVault --name <string> --description <string> --initialUsd <number> vaultDistribute --vaultAddress <address> --usd <number> vaultModify --vaultAddress <address> [--allowDeposits <bool>] [--alwaysCloseOnWithdraw <bool>] vaultTransfer --vaultAddress <address> --isDeposit <bool> --usd <number> Deploy Market: perpDeploy --<action> <json> spotDeploy --<action> <json> Validator Actions: cSignerAction --jailSelf null | --unjailSelf null cValidatorAction --<action> <json> validatorL1Stream --riskFreeRate <number> Other: convertToMultiSigUser --authorizedUsers <json> --threshold <number> ============================================================================= Examples: # Get all mid prices npx @nktkas/hyperliquid info allMids # Get ETH order book with 3 significant figures npx @nktkas/hyperliquid info l2Book --coin ETH --nSigFigs 3 # Get user's portfolio npx @nktkas/hyperliquid info portfolio --user 0x... # Get candle data for BTC npx @nktkas/hyperliquid info candleSnapshot --coin BTC --interval 1h --startTime 1700000000000 # Place a limit order npx @nktkas/hyperliquid exchange order --private-key 0x... --orders '[{\"a\":0,\"b\":true,\"p\":30000,\"s\":0.1,\"r\":false,\"t\":{\"limit\":{\"tif\":\"Gtc\"}}}]' # Modify an existing order npx @nktkas/hyperliquid exchange modify --private-key 0x... --oid 12345 --order '{\"a\":0,\"b\":true,\"p\":31000,\"s\":0.1,\"r\":false,\"t\":{\"limit\":{\"tif\":\"Gtc\"}}}' # Cancel orders npx @nktkas/hyperliquid exchange cancel --private-key 0x... --cancels '[{\"a\":0,\"o\":12345}]' # Update leverage npx @nktkas/hyperliquid exchange updateLeverage --private-key 0x... --asset 0 --isCross true --leverage 5 # Withdraw funds npx @nktkas/hyperliquid exchange withdraw3 --private-key 0x... --destination 0x... --amount 100.5 # Send USD to another user npx @nktkas/hyperliquid exchange usdSend --private-key 0x... --destination 0x... --amount 50 # Create a vault npx @nktkas/hyperliquid exchange createVault --private-key 0x... --name "My Vault" --description "Test vault" --initialUsd 1000`); } // ============================================================ // Entry // ============================================================ const rawArgs = (0, _utils_js_1.extractArgs)(node_process_1.default.argv.slice(2), { flags: ["testnet", "help", "h", "offline"], collect: false, }); const args = (0, _utils_js_1.transformArgs)(rawArgs, { number: "string" }); const [endpoint, method] = args._; if (args.help || args.h || !endpoint || !method) { printHelp(); } else { executeEndpointMethod(endpoint, method, args) .then((result) => console.log(JSON.stringify(result))) .catch((error) => console.error(error)); } //# sourceMappingURL=cli.js.map