opentool 0.8.21 → 0.8.23

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.
@@ -4,6 +4,30 @@ import 'viem';
4
4
  import 'viem/accounts';
5
5
 
6
6
  type HyperliquidEnvironment = "mainnet" | "testnet";
7
+ type MarketIdentity = {
8
+ market_type: "perp" | "spot" | "dex";
9
+ venue: "hyperliquid";
10
+ environment: HyperliquidEnvironment;
11
+ base: string;
12
+ quote?: string | null;
13
+ dex?: string | null;
14
+ chain_id?: number | null;
15
+ pool_address?: string | null;
16
+ token0_address?: string | null;
17
+ token1_address?: string | null;
18
+ fee_tier?: number | null;
19
+ raw_symbol?: string | null;
20
+ canonical_symbol: string;
21
+ };
22
+ type HyperliquidMarketIdentityInput = {
23
+ environment: HyperliquidEnvironment;
24
+ symbol: string;
25
+ rawSymbol?: string | null;
26
+ isSpot?: boolean;
27
+ base?: string | null;
28
+ quote?: string | null;
29
+ };
30
+ declare function buildHyperliquidMarketIdentity(input: HyperliquidMarketIdentityInput): MarketIdentity | null;
7
31
  type HyperliquidTimeInForce = "Gtc" | "Ioc" | "Alo" | "FrontendMarket" | "LiquidationMarket";
8
32
  type HyperliquidGrouping = "na" | "normalTpsl" | "positionTpsl";
9
33
  type HyperliquidTriggerType = "tp" | "sl";
@@ -448,4 +472,4 @@ declare const __hyperliquidInternals: {
448
472
  splitSignature: typeof splitSignature;
449
473
  };
450
474
 
451
- export { DEFAULT_HYPERLIQUID_MARKET_SLIPPAGE_BPS, type HyperliquidAbstraction, type HyperliquidAccountMode, 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 HyperliquidTimeInForce, type HyperliquidTriggerOptions, type HyperliquidTriggerType, type HyperliquidWithdrawResult, type NonceSource, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, computeHyperliquidMarketIocLimitPrice, 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, resolveHyperliquidAbstractionFromMode, scheduleHyperliquidCancel, sendHyperliquidSpot, setHyperliquidAccountAbstractionMode, setHyperliquidDexAbstraction, setHyperliquidPortfolioMargin, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
475
+ export { DEFAULT_HYPERLIQUID_MARKET_SLIPPAGE_BPS, type HyperliquidAbstraction, type HyperliquidAccountMode, HyperliquidApiError, type HyperliquidApproveBuilderFeeOptions, type HyperliquidApproveBuilderFeeResponse, HyperliquidBuilderApprovalError, type HyperliquidBuilderApprovalRecordInput, type HyperliquidBuilderFee, type HyperliquidClearinghouseState, type HyperliquidDepositResult, type HyperliquidEnvironment, HyperliquidExchangeClient, type HyperliquidExchangeResponse, type HyperliquidGrouping, HyperliquidGuardError, HyperliquidInfoClient, type HyperliquidMarketIdentityInput, type HyperliquidOrderIntent, type HyperliquidOrderOptions, type HyperliquidOrderResponse, type HyperliquidOrderStatus, HyperliquidTermsError, type HyperliquidTermsRecordInput, type HyperliquidTimeInForce, type HyperliquidTriggerOptions, type HyperliquidTriggerType, type HyperliquidWithdrawResult, type MarketIdentity, type NonceSource, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, buildHyperliquidMarketIdentity, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, computeHyperliquidMarketIocLimitPrice, 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, resolveHyperliquidAbstractionFromMode, scheduleHyperliquidCancel, sendHyperliquidSpot, setHyperliquidAccountAbstractionMode, setHyperliquidDexAbstraction, setHyperliquidPortfolioMargin, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
@@ -14,6 +14,14 @@ var StoreError = class extends Error {
14
14
  this.name = "StoreError";
15
15
  }
16
16
  };
17
+ var requiresMarketIdentity = (input) => {
18
+ const action = (input.action ?? "").toLowerCase();
19
+ if (action === "order" || action === "swap" || action === "trade") return true;
20
+ return false;
21
+ };
22
+ var hasMarketIdentity = (value) => {
23
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
24
+ };
17
25
  function resolveConfig(options) {
18
26
  const baseUrl = options?.baseUrl ?? process.env.BASE_URL ?? "https://api.openpond.ai";
19
27
  const apiKey = options?.apiKey ?? process.env.OPENPOND_API_KEY;
@@ -33,6 +41,9 @@ function resolveConfig(options) {
33
41
  return { baseUrl: normalizedBaseUrl, apiKey, fetchFn };
34
42
  }
35
43
  async function store(input, options) {
44
+ if (requiresMarketIdentity(input) && !hasMarketIdentity(input.market)) {
45
+ throw new StoreError("market is required for trade events");
46
+ }
36
47
  const { baseUrl, apiKey, fetchFn } = resolveConfig(options);
37
48
  const url = `${baseUrl}/apps/positions/tx`;
38
49
  let response;
@@ -109,7 +120,83 @@ var BUILDER_CODE = {
109
120
  fee: 100
110
121
  };
111
122
  var metaCache = /* @__PURE__ */ new Map();
123
+ var spotMetaCache = /* @__PURE__ */ new Map();
112
124
  var perpDexsCache = /* @__PURE__ */ new Map();
125
+ var UNKNOWN_SYMBOL = "UNKNOWN";
126
+ var extractDexPrefix = (value) => {
127
+ if (!value) return null;
128
+ const trimmed = value.trim();
129
+ if (!trimmed) return null;
130
+ if (!trimmed.includes(":")) return null;
131
+ if (trimmed.startsWith("@")) return null;
132
+ const [prefix] = trimmed.split(":");
133
+ const dex = prefix?.trim().toLowerCase() ?? "";
134
+ return dex || null;
135
+ };
136
+ var normalizeHyperliquidBase = (value) => {
137
+ if (!value) return null;
138
+ const trimmed = value.trim();
139
+ if (!trimmed) return null;
140
+ const withoutDex = trimmed.includes(":") ? trimmed.split(":").slice(1).join(":") : trimmed;
141
+ const base = withoutDex.split("-")[0] ?? withoutDex;
142
+ const normalized = (base.split("/")[0] ?? base).trim().toUpperCase();
143
+ if (!normalized || normalized === UNKNOWN_SYMBOL) return null;
144
+ return normalized;
145
+ };
146
+ var normalizeSpotTokenName = (value) => {
147
+ const raw = (value ?? "").trim().toUpperCase();
148
+ if (!raw) return "";
149
+ if (raw.endsWith("0") && raw.length > 1) {
150
+ return raw.slice(0, -1);
151
+ }
152
+ return raw;
153
+ };
154
+ var parseHyperliquidPair = (value) => {
155
+ if (!value) return null;
156
+ const trimmed = value.trim();
157
+ if (!trimmed) return null;
158
+ const withoutDex = trimmed.includes(":") ? trimmed.split(":").slice(1).join(":") : trimmed;
159
+ const separator = withoutDex.includes("/") ? "/" : withoutDex.includes("-") ? "-" : null;
160
+ if (!separator) return null;
161
+ const [baseRaw, ...rest] = withoutDex.split(separator);
162
+ const quoteRaw = rest.join(separator);
163
+ if (!baseRaw || !quoteRaw) return null;
164
+ const base = baseRaw.trim().toUpperCase();
165
+ const quote = quoteRaw.trim().toUpperCase();
166
+ if (!base || !quote) return null;
167
+ return { base, quote };
168
+ };
169
+ function buildHyperliquidMarketIdentity(input) {
170
+ const rawSymbol = input.rawSymbol ?? input.symbol;
171
+ const dex = extractDexPrefix(rawSymbol);
172
+ const pair = parseHyperliquidPair(rawSymbol) ?? parseHyperliquidPair(input.symbol);
173
+ const isSpot = input.isSpot ?? (Boolean(pair) || rawSymbol.startsWith("@") || input.symbol.includes("/"));
174
+ const base = (input.base ? input.base.trim().toUpperCase() : null) ?? pair?.base ?? normalizeHyperliquidBase(input.symbol) ?? normalizeHyperliquidBase(rawSymbol);
175
+ if (!base) return null;
176
+ if (isSpot) {
177
+ const quote = (input.quote ? input.quote.trim().toUpperCase() : null) ?? pair?.quote ?? null;
178
+ if (!quote) return null;
179
+ return {
180
+ market_type: "spot",
181
+ venue: "hyperliquid",
182
+ environment: input.environment,
183
+ base,
184
+ quote,
185
+ dex,
186
+ raw_symbol: rawSymbol ?? null,
187
+ canonical_symbol: `spot:hyperliquid:${base}-${quote}`
188
+ };
189
+ }
190
+ return {
191
+ market_type: "perp",
192
+ venue: "hyperliquid",
193
+ environment: input.environment,
194
+ base,
195
+ dex,
196
+ raw_symbol: rawSymbol ?? null,
197
+ canonical_symbol: `perp:hyperliquid:${base}`
198
+ };
199
+ }
113
200
  function resolveHyperliquidAbstractionFromMode(mode) {
114
201
  switch (mode) {
115
202
  case "standard":
@@ -210,6 +297,29 @@ async function getUniverse(args) {
210
297
  metaCache.set(cacheKey, { fetchedAt: Date.now(), universe: json.universe });
211
298
  return json.universe;
212
299
  }
300
+ async function getSpotMeta(args) {
301
+ const cacheKey = `${args.environment}:${args.baseUrl}`;
302
+ const cached = spotMetaCache.get(cacheKey);
303
+ if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
304
+ return { universe: cached.universe, tokens: cached.tokens };
305
+ }
306
+ const response = await args.fetcher(`${args.baseUrl}/info`, {
307
+ method: "POST",
308
+ headers: { "content-type": "application/json" },
309
+ body: JSON.stringify({ type: "spotMeta" })
310
+ });
311
+ const json = await response.json().catch(() => null);
312
+ if (!response.ok || !json?.universe) {
313
+ throw new HyperliquidApiError(
314
+ "Unable to load Hyperliquid spot metadata.",
315
+ json ?? { status: response.status }
316
+ );
317
+ }
318
+ const universe = json.universe ?? [];
319
+ const tokens = json.tokens ?? [];
320
+ spotMetaCache.set(cacheKey, { fetchedAt: Date.now(), universe, tokens });
321
+ return { universe, tokens };
322
+ }
213
323
  function resolveAssetIndex(symbol, universe) {
214
324
  const [raw] = symbol.split("-");
215
325
  const target = raw.trim();
@@ -253,11 +363,57 @@ async function resolveDexIndex(args) {
253
363
  }
254
364
  return index;
255
365
  }
366
+ function buildSpotTokenIndexMap(tokens) {
367
+ const map = /* @__PURE__ */ new Map();
368
+ for (const token of tokens) {
369
+ const name = normalizeSpotTokenName(token?.name);
370
+ const index = typeof token?.index === "number" && Number.isFinite(token.index) ? token.index : null;
371
+ if (!name || index == null) continue;
372
+ if (!map.has(name) || token?.isCanonical) {
373
+ map.set(name, index);
374
+ }
375
+ }
376
+ return map;
377
+ }
378
+ function resolveSpotTokenIndex(tokenMap, value) {
379
+ const normalized = normalizeSpotTokenName(value);
380
+ if (!normalized) return null;
381
+ const direct = tokenMap.get(normalized);
382
+ if (direct != null) return direct;
383
+ if (!normalized.startsWith("U")) {
384
+ const prefixed = tokenMap.get(`U${normalized}`);
385
+ if (prefixed != null) return prefixed;
386
+ }
387
+ return null;
388
+ }
389
+ function resolveSpotMarketIndex(args) {
390
+ for (let i = 0; i < args.universe.length; i += 1) {
391
+ const entry = args.universe[i];
392
+ const tokens = Array.isArray(entry?.tokens) ? entry.tokens : null;
393
+ const baseToken = tokens?.[0] ?? entry?.baseToken ?? null;
394
+ const quoteToken = tokens?.[1] ?? entry?.quoteToken ?? null;
395
+ if (baseToken === args.baseToken && quoteToken === args.quoteToken) {
396
+ if (typeof entry?.index === "number" && Number.isFinite(entry.index)) {
397
+ return entry.index;
398
+ }
399
+ return i;
400
+ }
401
+ }
402
+ return null;
403
+ }
256
404
  async function resolveHyperliquidAssetIndex(args) {
257
405
  const trimmed = args.symbol.trim();
258
406
  if (!trimmed) {
259
407
  throw new Error("Hyperliquid symbol must be a non-empty string.");
260
408
  }
409
+ if (trimmed.startsWith("@")) {
410
+ const rawIndex = trimmed.slice(1).trim();
411
+ const index = Number(rawIndex);
412
+ if (!Number.isFinite(index)) {
413
+ throw new Error(`Hyperliquid spot market index is invalid: ${trimmed}`);
414
+ }
415
+ return 1e4 + index;
416
+ }
261
417
  const separator = trimmed.indexOf(":");
262
418
  if (separator > 0) {
263
419
  const dex = trimmed.slice(0, separator).trim();
@@ -284,6 +440,29 @@ async function resolveHyperliquidAssetIndex(args) {
284
440
  }
285
441
  return 1e5 + dexIndex * 1e4 + assetIndex;
286
442
  }
443
+ const pair = parseHyperliquidPair(trimmed);
444
+ if (pair) {
445
+ const { universe: universe2, tokens } = await getSpotMeta({
446
+ baseUrl: args.baseUrl,
447
+ environment: args.environment,
448
+ fetcher: args.fetcher
449
+ });
450
+ const tokenMap = buildSpotTokenIndexMap(tokens);
451
+ const baseToken = resolveSpotTokenIndex(tokenMap, pair.base);
452
+ const quoteToken = resolveSpotTokenIndex(tokenMap, pair.quote);
453
+ if (baseToken == null || quoteToken == null) {
454
+ throw new Error(`Unknown Hyperliquid spot symbol: ${trimmed}`);
455
+ }
456
+ const marketIndex = resolveSpotMarketIndex({
457
+ universe: universe2,
458
+ baseToken,
459
+ quoteToken
460
+ });
461
+ if (marketIndex == null) {
462
+ throw new Error(`Unknown Hyperliquid spot symbol: ${trimmed}`);
463
+ }
464
+ return 1e4 + marketIndex;
465
+ }
287
466
  const universe = await getUniverse({
288
467
  baseUrl: args.baseUrl,
289
468
  environment: args.environment,
@@ -1788,6 +1967,6 @@ var __hyperliquidInternals = {
1788
1967
  splitSignature
1789
1968
  };
1790
1969
 
1791
- export { DEFAULT_HYPERLIQUID_MARKET_SLIPPAGE_BPS, HyperliquidApiError, HyperliquidBuilderApprovalError, HyperliquidExchangeClient, HyperliquidGuardError, HyperliquidInfoClient, HyperliquidTermsError, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, computeHyperliquidMarketIocLimitPrice, 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, resolveHyperliquidAbstractionFromMode, scheduleHyperliquidCancel, sendHyperliquidSpot, setHyperliquidAccountAbstractionMode, setHyperliquidDexAbstraction, setHyperliquidPortfolioMargin, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
1970
+ export { DEFAULT_HYPERLIQUID_MARKET_SLIPPAGE_BPS, HyperliquidApiError, HyperliquidBuilderApprovalError, HyperliquidExchangeClient, HyperliquidGuardError, HyperliquidInfoClient, HyperliquidTermsError, __hyperliquidInternals, approveHyperliquidBuilderFee, batchModifyHyperliquidOrders, buildHyperliquidMarketIdentity, cancelAllHyperliquidOrders, cancelHyperliquidOrders, cancelHyperliquidOrdersByCloid, cancelHyperliquidTwapOrder, computeHyperliquidMarketIocLimitPrice, 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, resolveHyperliquidAbstractionFromMode, scheduleHyperliquidCancel, sendHyperliquidSpot, setHyperliquidAccountAbstractionMode, setHyperliquidDexAbstraction, setHyperliquidPortfolioMargin, transferHyperliquidSubAccount, updateHyperliquidIsolatedMargin, updateHyperliquidLeverage, withdrawFromHyperliquid };
1792
1971
  //# sourceMappingURL=index.js.map
1793
1972
  //# sourceMappingURL=index.js.map