UNPKG

@nktkas/hyperliquid

Version:

Unofficial Hyperliquid API SDK for all major JS runtimes, written in TypeScript and provided with tests

1,219 lines 84.4 kB
(function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "@noble/hashes/sha3", "@noble/secp256k1", "../../deps/jsr.io/@std/encoding/1.0.10/hex.js", "../signing/mod.js", "./exchange.js"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MultiSignClient = void 0; const sha3_1 = require("@noble/hashes/sha3"); const secp256k1_1 = require("@noble/secp256k1"); const hex_js_1 = require("../../deps/jsr.io/@std/encoding/1.0.10/hex.js"); const mod_js_1 = require("../signing/mod.js"); const exchange_js_1 = require("./exchange.js"); /** * Multi-signature exchange client for interacting with the Hyperliquid API. * @typeParam T The transport used to connect to the Hyperliquid API. * @typeParam S Array of wallets where the first wallet acts as the leader. */ class MultiSignClient extends exchange_js_1.ExchangeClient { multiSignAddress; signers; /** * Initialises a new multi-signature client instance. * @param args - The parameters for the multi-signature client. * * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * ``` */ constructor(args) { super({ ...args, wallet: args.signers[0] }); this.multiSignAddress = args.multiSignAddress; this.signers = args.signers; Object.defineProperty(this, "wallet", { get() { return this.signers[0]; }, set(value) { this.signers[0] = value; }, enumerable: true, configurable: true, }); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#approve-an-api-wallet * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.approveAgent({ agentAddress: "0x...", agentName: "agentName" }); * ``` */ async approveAgent(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { ...actionArgs, agentName: args.agentName ?? "", type: "approveAgent", hyperliquidChain: this._getHyperliquidChain(), signatureChainId: await this._getSignatureChainId(), nonce, }; // Sign the action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignUserSignedAction(sortedAction, outerSigner); if (sortedAction.agentName === "") sortedAction.agentName = null; // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#approve-a-builder-fee * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.approveBuilderFee({ maxFeeRate: "0.01%", builder: "0x..." }); * ``` */ async approveBuilderFee(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { ...actionArgs, type: "approveBuilderFee", hyperliquidChain: this._getHyperliquidChain(), signatureChainId: await this._getSignatureChainId(), nonce, }; // Sign the action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignUserSignedAction(sortedAction, outerSigner); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful variant of {@link OrderResponse} without error statuses. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-multiple-orders * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.batchModify({ * modifies: [{ * oid: 123, * order: { * a: 0, // Asset index * b: true, // Buy order * p: "31000", // New price * s: "0.2", // New size * r: false, // Not reduce-only * t: { * limit: { * tif: "Gtc", // Good-til-cancelled * }, * }, * c: "0x...", // Client Order ID (optional) * }, * }], * }); * ``` */ async batchModify(...[args, signal]) { // Destructure the parameters const { vaultAddress = this.defaultVaultAddress, expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "batchModify", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, vaultAddress, expiresAfter, }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, vaultAddress, expiresAfter, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful variant of {@link CancelResponse} without error statuses. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.cancel({ * cancels: [{ * a: 0, // Asset index * o: 123, // Order ID * }], * }); * ``` */ async cancel(...[args, signal]) { // Destructure the parameters const { vaultAddress = this.defaultVaultAddress, expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "cancel", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, vaultAddress, expiresAfter, }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, vaultAddress, expiresAfter, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful variant of {@link CancelResponse} without error statuses. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.cancelByCloid({ * cancels: [ * { asset: 0, cloid: "0x..." }, * ], * }); * ``` */ async cancelByCloid(...[args, signal]) { // Destructure the parameters const { vaultAddress = this.defaultVaultAddress, expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "cancelByCloid", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, vaultAddress, expiresAfter, }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, vaultAddress, expiresAfter, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#deposit-into-staking * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.cDeposit({ wei: 1 * 1e8 }); * ``` */ async cDeposit(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { ...actionArgs, type: "cDeposit", hyperliquidChain: this._getHyperliquidChain(), signatureChainId: await this._getSignatureChainId(), nonce, }; // Sign the action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignUserSignedAction(sortedAction, outerSigner); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see null - no documentation * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.claimRewards(); * ``` */ async claimRewards(...[signal]) { // Construct an action const nonce = await this.nonceManager(); const action = { type: "claimRewards", }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/hypercore/multi-sig * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.convertToMultiSigUser({ // convert to normal user * authorizedUsers: [], * threshold: 0, * }); * ``` */ async convertToMultiSigUser(...[args, signal]) { // Destructure the parameters const actionArgs = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "convertToMultiSigUser", hyperliquidChain: this._getHyperliquidChain(), signatureChainId: await this._getSignatureChainId(), signers: JSON.stringify(actionArgs), nonce, }; // Sign the action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignUserSignedAction(sortedAction, outerSigner); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Response for creating a sub-account. * @throws {ApiRequestError} When the API returns an error response. * * @see null - no documentation * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.createSubAccount({ name: "subAccountName" }); * ``` */ async createSubAccount(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "createSubAccount", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Response for creating a vault. * @throws {ApiRequestError} When the API returns an error response. * * @see null - no documentation * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.createVault({ * name: "VaultName", * description: "Vault description", * initialUsd: 100 * 1e6, * }); * ``` */ async createVault(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "createVault", nonce, ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } async cSignerAction(args, signal) { // Destructure the parameters const { expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "CSignerAction", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, expiresAfter }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, expiresAfter, }, signal); } async cValidatorAction(args, signal) { // Destructure the parameters const { expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "CValidatorAction", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, expiresAfter }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, expiresAfter, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#withdraw-from-staking * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.cWithdraw({ wei: 1 * 1e8 }); * ``` */ async cWithdraw(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { ...actionArgs, type: "cWithdraw", hyperliquidChain: this._getHyperliquidChain(), signatureChainId: await this._getSignatureChainId(), nonce, }; // Sign the action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignUserSignedAction(sortedAction, outerSigner); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Response for creating a sub-account. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/evm/dual-block-architecture * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.evmUserModify({ usingBigBlocks: true }); * ``` */ async evmUserModify(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "evmUserModify", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-an-order * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.modify({ * oid: 123, * order: { * a: 0, // Asset index * b: true, // Buy order * p: "31000", // New price * s: "0.2", // New size * r: false, // Not reduce-only * t: { * limit: { * tif: "Gtc", // Good-til-cancelled * }, * }, * c: "0x...", // Client Order ID (optional) * }, * }); * ``` */ async modify(...[args, signal]) { // Destructure the parameters const { vaultAddress = this.defaultVaultAddress, expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "modify", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, vaultAddress, expiresAfter, }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, vaultAddress, expiresAfter, }, signal); } /** * @multisign Not implemented */ multiSig(...[_args, _signal]) { throw new Error("Not implemented"); // FIXME } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful variant of {@link OrderResponse} without error statuses. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.order({ * orders: [{ * a: 0, // Asset index * b: true, // Buy order * p: "30000", // Price * s: "0.1", // Size * r: false, // Not reduce-only * t: { * limit: { * tif: "Gtc", // Good-til-cancelled * }, * }, * c: "0x...", // Client Order ID (optional) * }], * grouping: "na", // No grouping * }); * ``` */ async order(...[args, signal]) { // Destructure the parameters const { vaultAddress = this.defaultVaultAddress, expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "order", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, vaultAddress, expiresAfter, }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, vaultAddress, expiresAfter, }, signal); } async perpDeploy(args, signal) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "perpDeploy", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#transfer-from-spot-account-to-perp-account-and-vice-versa * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.perpDexClassTransfer({ * dex: "test", * token: "USDC", * amount: "1", * toPerp: true, * }); * ``` */ async perpDexClassTransfer(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { ...actionArgs, type: "PerpDexClassTransfer", hyperliquidChain: this._getHyperliquidChain(), signatureChainId: await this._getSignatureChainId(), nonce, }; // Sign the action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignUserSignedAction(sortedAction, outerSigner); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see null - no documentation * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.registerReferrer({ code: "TEST" }); * ``` */ async registerReferrer(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "registerReferrer", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#reserve-additional-actions * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.reserveRequestWeight({ weight: 10 }); * ``` */ async reserveRequestWeight(...[args, signal]) { // Destructure the parameters const { expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "reserveRequestWeight", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, expiresAfter }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, expiresAfter, }, signal); } async scheduleCancel(args_or_signal, maybeSignal) { const args = args_or_signal instanceof AbortSignal ? {} : args_or_signal ?? {}; const signal = args_or_signal instanceof AbortSignal ? args_or_signal : maybeSignal; // Destructure the parameters const { vaultAddress = this.defaultVaultAddress, expiresAfter = await this._getDefaultExpiresAfter(), ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "scheduleCancel", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner, vaultAddress, expiresAfter, }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, vaultAddress, expiresAfter, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see null - no documentation * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.setDisplayName({ displayName: "My Name" }); * ``` */ async setDisplayName(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "setDisplayName", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see null - no documentation * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.setReferrer({ code: "TEST" }); * ``` */ async setReferrer(...[args, signal]) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "setReferrer", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } async spotDeploy(args, signal) { // Destructure the parameters const { ...actionArgs } = args; // Construct an action const nonce = await this.nonceManager(); const action = { type: "spotDeploy", ...actionArgs, }; // Send a multi-sig action const sortedAction = mod_js_1.actionSorter[action.type](action); const outerSigner = await this._getWalletAddress(this.signers[0]); const signatures = await this._multiSignL1Action({ action: sortedAction, nonce, outerSigner }); // Send a multi-sig action return super.multiSig({ signatures, payload: { multiSigUser: this.multiSignAddress, outerSigner, action: sortedAction, }, nonce, }, signal); } /** * @param args - The parameters for the request. * @param signal - An optional abort signal. * @returns Successful response without specific data. * @throws {ApiRequestError} When the API returns an error response. * * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#core-spot-transfer * @example * ```ts * import * as hl from "@nktkas/hyperliquid"; * * const multiSignAddress = "0x..."; * const signers = [ * "0x...", // Private key; or any other wallet libraries * ] as const; * * const transport = new hl.HttpTransport(); // or `WebSocketTransport` * const multiSignClient = new hl.MultiSignClient({ transport, multiSignAddress, signers }); * * const data = await multiSignClient.spotSend({ * destination: "0x...", * token: "USDC:0xeb62eee3685fc4c43992febcd9e7