opentool 0.8.1 → 0.8.3

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/README.md CHANGED
@@ -26,8 +26,8 @@ npm install opentool
26
26
  ```bash
27
27
  mkdir my-opentool-project
28
28
  cd my-opentool-project
29
- npm init -y
30
29
  npm install opentool
30
+ npx opentool init
31
31
  ```
32
32
 
33
33
  ### 2. Create your first tool
@@ -62,7 +62,7 @@ type ExchangeSignature = {
62
62
  v: 27 | 28;
63
63
  };
64
64
  type HyperliquidExchangeResponse<T = unknown> = {
65
- status: "ok";
65
+ status: string;
66
66
  response?: {
67
67
  type: string;
68
68
  data?: T;
@@ -168,7 +168,16 @@ declare class HyperliquidExchangeClient {
168
168
  token: string;
169
169
  amount: string | number | bigint;
170
170
  }): Promise<HyperliquidExchangeResponse<unknown>>;
171
+ setPortfolioMargin(params: {
172
+ enabled: boolean;
173
+ user?: `0x${string}`;
174
+ }): Promise<HyperliquidExchangeResponse<unknown>>;
171
175
  }
176
+ declare function setHyperliquidPortfolioMargin(options: {
177
+ wallet: WalletFullContext;
178
+ enabled: boolean;
179
+ user?: `0x${string}`;
180
+ } & CommonActionOptions): Promise<HyperliquidExchangeResponse<unknown>>;
172
181
  declare function cancelHyperliquidOrders(options: {
173
182
  wallet: WalletFullContext;
174
183
  cancels: CancelInput[];
@@ -411,4 +420,4 @@ declare const __hyperliquidInternals: {
411
420
  splitSignature: typeof splitSignature;
412
421
  };
413
422
 
414
- export { HyperliquidApiError, type HyperliquidApproveBuilderFeeOptions, type HyperliquidApproveBuilderFeeResponse, HyperliquidBuilderApprovalError, type HyperliquidBuilderApprovalRecordInput, type HyperliquidBuilderFee, type HyperliquidClearinghouseState, type HyperliquidDepositResult, type HyperliquidEnvironment, HyperliquidExchangeClient, type HyperliquidExchangeResponse, type HyperliquidGrouping, HyperliquidGuardError, HyperliquidInfoClient, type HyperliquidOrderIntent, type HyperliquidOrderOptions, type HyperliquidOrderResponse, type HyperliquidOrderStatus, HyperliquidTermsError, type HyperliquidTermsRecordInput, type HyperliquidTriggerOptions, type HyperliquidTriggerType, type HyperliquidWithdrawResult, type NonceSource, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, createHyperliquidSubAccount, createMonotonicNonceFactory, depositToHyperliquidBridge, fetchHyperliquidAssetCtxs, fetchHyperliquidClearinghouseState, fetchHyperliquidFrontendOpenOrders, fetchHyperliquidHistoricalOrders, fetchHyperliquidMeta, fetchHyperliquidMetaAndAssetCtxs, fetchHyperliquidOpenOrders, fetchHyperliquidOrderStatus, fetchHyperliquidPreTransferCheck, fetchHyperliquidSpotAssetCtxs, fetchHyperliquidSpotClearinghouseState, fetchHyperliquidSpotMeta, fetchHyperliquidSpotMetaAndAssetCtxs, fetchHyperliquidUserFills, fetchHyperliquidUserFillsByTime, fetchHyperliquidUserRateLimit, getHyperliquidMaxBuilderFee, modifyHyperliquidOrder, placeHyperliquidOrder, placeHyperliquidTwapOrder, recordHyperliquidBuilderApproval, recordHyperliquidTermsAcceptance, reserveHyperliquidRequestWeight, scheduleHyperliquidCancel, sendHyperliquidSpot, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
423
+ export { HyperliquidApiError, type HyperliquidApproveBuilderFeeOptions, type HyperliquidApproveBuilderFeeResponse, HyperliquidBuilderApprovalError, type HyperliquidBuilderApprovalRecordInput, type HyperliquidBuilderFee, type HyperliquidClearinghouseState, type HyperliquidDepositResult, type HyperliquidEnvironment, HyperliquidExchangeClient, type HyperliquidExchangeResponse, type HyperliquidGrouping, HyperliquidGuardError, HyperliquidInfoClient, type HyperliquidOrderIntent, type HyperliquidOrderOptions, type HyperliquidOrderResponse, type HyperliquidOrderStatus, HyperliquidTermsError, type HyperliquidTermsRecordInput, type HyperliquidTriggerOptions, type HyperliquidTriggerType, type HyperliquidWithdrawResult, type NonceSource, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, createHyperliquidSubAccount, createMonotonicNonceFactory, depositToHyperliquidBridge, fetchHyperliquidAssetCtxs, fetchHyperliquidClearinghouseState, fetchHyperliquidFrontendOpenOrders, fetchHyperliquidHistoricalOrders, fetchHyperliquidMeta, fetchHyperliquidMetaAndAssetCtxs, fetchHyperliquidOpenOrders, fetchHyperliquidOrderStatus, fetchHyperliquidPreTransferCheck, fetchHyperliquidSpotAssetCtxs, fetchHyperliquidSpotClearinghouseState, fetchHyperliquidSpotMeta, fetchHyperliquidSpotMetaAndAssetCtxs, fetchHyperliquidUserFills, fetchHyperliquidUserFillsByTime, fetchHyperliquidUserRateLimit, getHyperliquidMaxBuilderFee, modifyHyperliquidOrder, placeHyperliquidOrder, placeHyperliquidTwapOrder, recordHyperliquidBuilderApproval, recordHyperliquidTermsAcceptance, reserveHyperliquidRequestWeight, scheduleHyperliquidCancel, sendHyperliquidSpot, setHyperliquidPortfolioMargin, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
@@ -307,6 +307,37 @@ async function signApproveBuilderFee(args) {
307
307
  });
308
308
  return splitSignature(signatureHex);
309
309
  }
310
+ async function signUserPortfolioMargin(args) {
311
+ const { wallet, action } = args;
312
+ const domain = {
313
+ name: "HyperliquidSignTransaction",
314
+ version: "1",
315
+ chainId: Number.parseInt(action.signatureChainId, 16),
316
+ verifyingContract: ZERO_ADDRESS
317
+ };
318
+ const message = {
319
+ enabled: action.enabled,
320
+ hyperliquidChain: action.hyperliquidChain,
321
+ user: action.user,
322
+ nonce: BigInt(action.nonce)
323
+ };
324
+ const types = {
325
+ "HyperliquidTransaction:UserPortfolioMargin": [
326
+ { name: "enabled", type: "bool" },
327
+ { name: "hyperliquidChain", type: "string" },
328
+ { name: "user", type: "address" },
329
+ { name: "nonce", type: "uint64" }
330
+ ]
331
+ };
332
+ const signatureHex = await wallet.walletClient.signTypedData({
333
+ account: wallet.account,
334
+ domain,
335
+ types,
336
+ primaryType: "HyperliquidTransaction:UserPortfolioMargin",
337
+ message
338
+ });
339
+ return splitSignature(signatureHex);
340
+ }
310
341
  function splitSignature(signature) {
311
342
  const cleaned = signature.slice(2);
312
343
  const rHex = `0x${cleaned.slice(0, 64)}`;
@@ -507,7 +538,58 @@ var HyperliquidExchangeClient = class {
507
538
  ...params
508
539
  });
509
540
  }
541
+ setPortfolioMargin(params) {
542
+ const base = {
543
+ wallet: this.wallet,
544
+ enabled: params.enabled,
545
+ environment: this.environment,
546
+ vaultAddress: this.vaultAddress,
547
+ expiresAfter: this.expiresAfter,
548
+ nonceSource: this.nonceSource
549
+ };
550
+ return setHyperliquidPortfolioMargin(
551
+ params.user ? { ...base, user: params.user } : base
552
+ );
553
+ }
510
554
  };
555
+ async function setHyperliquidPortfolioMargin(options) {
556
+ const env = options.environment ?? "mainnet";
557
+ if (!options.wallet?.account || !options.wallet.walletClient) {
558
+ throw new Error(
559
+ "Wallet with signing capability is required for portfolio margin."
560
+ );
561
+ }
562
+ const nonce = options.nonce ?? options.walletNonceProvider?.() ?? options.wallet.nonceSource?.() ?? options.nonceSource?.() ?? Date.now();
563
+ const signatureChainId = getSignatureChainId(env);
564
+ const hyperliquidChain = HL_CHAIN_LABEL[env];
565
+ const user = normalizeAddress(
566
+ options.user ?? options.wallet.address
567
+ );
568
+ const action = {
569
+ type: "userPortfolioMargin",
570
+ enabled: Boolean(options.enabled),
571
+ hyperliquidChain,
572
+ signatureChainId,
573
+ user,
574
+ nonce
575
+ };
576
+ const signature = await signUserPortfolioMargin({
577
+ wallet: options.wallet,
578
+ action
579
+ });
580
+ const body = {
581
+ action,
582
+ nonce,
583
+ signature
584
+ };
585
+ if (options.vaultAddress) {
586
+ body.vaultAddress = normalizeAddress(options.vaultAddress);
587
+ }
588
+ if (typeof options.expiresAfter === "number") {
589
+ body.expiresAfter = options.expiresAfter;
590
+ }
591
+ return postExchange(env, body);
592
+ }
511
593
  async function cancelHyperliquidOrders(options) {
512
594
  options.cancels.forEach((c) => assertSymbol(c.symbol));
513
595
  const action = {
@@ -830,15 +912,35 @@ async function postExchange(env, body) {
830
912
  headers: { "content-type": "application/json" },
831
913
  body: JSON.stringify(body)
832
914
  });
833
- const json = await response.json().catch(() => null);
834
- if (!response.ok || !json) {
835
- throw new HyperliquidApiError(
836
- "Hyperliquid exchange action failed.",
837
- json ?? { status: response.status }
838
- );
915
+ const text = await response.text().catch(() => "");
916
+ const json = (() => {
917
+ if (!text) return null;
918
+ try {
919
+ return JSON.parse(text);
920
+ } catch {
921
+ return null;
922
+ }
923
+ })();
924
+ if (!response.ok) {
925
+ throw new HyperliquidApiError("Hyperliquid exchange action failed.", {
926
+ status: response.status,
927
+ statusText: response.statusText,
928
+ body: json ?? (text ? text : null)
929
+ });
930
+ }
931
+ if (!json) {
932
+ throw new HyperliquidApiError("Hyperliquid exchange action failed.", {
933
+ status: response.status,
934
+ statusText: response.statusText,
935
+ body: text ? text : null
936
+ });
839
937
  }
840
938
  if (json.status !== "ok") {
841
- throw new HyperliquidApiError("Hyperliquid exchange returned error.", json);
939
+ throw new HyperliquidApiError("Hyperliquid exchange returned error.", {
940
+ status: response.status,
941
+ statusText: response.statusText,
942
+ body: json
943
+ });
842
944
  }
843
945
  return json;
844
946
  }
@@ -1406,6 +1508,6 @@ var __hyperliquidInternals = {
1406
1508
  splitSignature
1407
1509
  };
1408
1510
 
1409
- export { HyperliquidApiError, HyperliquidBuilderApprovalError, HyperliquidExchangeClient, HyperliquidGuardError, HyperliquidInfoClient, HyperliquidTermsError, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, createHyperliquidSubAccount, createMonotonicNonceFactory, depositToHyperliquidBridge, fetchHyperliquidAssetCtxs, fetchHyperliquidClearinghouseState, fetchHyperliquidFrontendOpenOrders, fetchHyperliquidHistoricalOrders, fetchHyperliquidMeta, fetchHyperliquidMetaAndAssetCtxs, fetchHyperliquidOpenOrders, fetchHyperliquidOrderStatus, fetchHyperliquidPreTransferCheck, fetchHyperliquidSpotAssetCtxs, fetchHyperliquidSpotClearinghouseState, fetchHyperliquidSpotMeta, fetchHyperliquidSpotMetaAndAssetCtxs, fetchHyperliquidUserFills, fetchHyperliquidUserFillsByTime, fetchHyperliquidUserRateLimit, getHyperliquidMaxBuilderFee, modifyHyperliquidOrder, placeHyperliquidOrder, placeHyperliquidTwapOrder, recordHyperliquidBuilderApproval, recordHyperliquidTermsAcceptance, reserveHyperliquidRequestWeight, scheduleHyperliquidCancel, sendHyperliquidSpot, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
1511
+ export { HyperliquidApiError, HyperliquidBuilderApprovalError, HyperliquidExchangeClient, HyperliquidGuardError, HyperliquidInfoClient, HyperliquidTermsError, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, createHyperliquidSubAccount, createMonotonicNonceFactory, depositToHyperliquidBridge, fetchHyperliquidAssetCtxs, fetchHyperliquidClearinghouseState, fetchHyperliquidFrontendOpenOrders, fetchHyperliquidHistoricalOrders, fetchHyperliquidMeta, fetchHyperliquidMetaAndAssetCtxs, fetchHyperliquidOpenOrders, fetchHyperliquidOrderStatus, fetchHyperliquidPreTransferCheck, fetchHyperliquidSpotAssetCtxs, fetchHyperliquidSpotClearinghouseState, fetchHyperliquidSpotMeta, fetchHyperliquidSpotMetaAndAssetCtxs, fetchHyperliquidUserFills, fetchHyperliquidUserFillsByTime, fetchHyperliquidUserRateLimit, getHyperliquidMaxBuilderFee, modifyHyperliquidOrder, placeHyperliquidOrder, placeHyperliquidTwapOrder, recordHyperliquidBuilderApproval, recordHyperliquidTermsAcceptance, reserveHyperliquidRequestWeight, scheduleHyperliquidCancel, sendHyperliquidSpot, setHyperliquidPortfolioMargin, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
1410
1512
  //# sourceMappingURL=index.js.map
1411
1513
  //# sourceMappingURL=index.js.map