@liqpro/liq-core

中文文档
0.83.0发布于 2026/11/02TypeScriptES Module零依赖

SDK foundation — types, enums, EIP-712 helpers, chain config, and contract addresses for the Liq perpetuals exchange.

原始使用文档
文档目录12 节
  1. Overview
  2. Key Exports
  3. Chain config
  4. Контур production передеплоен (с 0.67.0)
  5. EIP-712
  6. Types ( src/types/ )
  7. Branded primitives ( src/primitives.ts )
  8. Prices ( src/prices/ )
  9. Скобки позиции — positionBrackets(position, conditional) ( …
  10. Маржа ордера и аккаунта (с 0.67.0)
  11. Install
  12. Build

@liq/core

SDK foundation — types, enums, EIP-712 helpers, chain config, and contract addresses for the Liq perpetuals exchange.

Overview

@liq/core is the zero-framework base layer shared by all Liq SDK packages. It provides the canonical EIP-712 domain and order type definitions, chain configuration with contract addresses for each supported network, shared TypeScript types and enums for orders/positions/accounts, and the branded numeric primitives (Price, Qty, Usd, Margin) used throughout the system. The only runtime dependency is zod.

Key Exports

Chain config

  • getChainConfig(chainId) — returns ChainConfig (contracts, rpcUrl, subgraphUrl) for a given chain ID
  • getContractAddress(chainId, contract) — shortcut to a single contract address
  • ChainConfig — interface with PerpsMarketProxy, SynthetixCoreProxy, PerpsAccountProxy, SpotMarketProxy, OracleManagerProxy, TrustedMulticallForwarder, USDC, sUSDC

Supported chains: MegaETH Testnet (chainId 6343)

Контур production передеплоен (с 0.67.0)

Prod-контур пересобран с нуля 2026-10-09 (snx-omnibus-megaeth-production:3-dev): все адреса в liqChains[6343].production новые, включая PerpsMarketProxy — это verifyingContract EIP-712. Подписи ордеров под старым PerpsMarketProxy (0x330E5A38…) на новом контуре невалидны, окна совместимости нет: клиент обязан обновиться до 0.67.0 вместе с шлюзом. Id тоже другие: susdcMarketId = 1 (было 3), perpsCoreMarketId = 3 (было 2); в collaterals у production появился USDm (getCollateral(chain, 'USDm')), как у staging. Старый контур продолжает отвечать на цепи теми же рынками, поэтому устаревший адрес выглядит живым и ломается только на «account not owned» или несовпадении домена EIP-712.

EIP-712

  • EIP712_ORDER_TYPES — typed data schema for order signing
  • EIP712_DOMAIN_NAME / EIP712_DOMAIN_VERSION — "PerpExchange" / "1"
  • buildEip712Domain(chainId, verifyingContract) — constructs the EIP-712 domain object
  • buildLimitOrderMessage(params) — builds a signed limit order payload
  • buildMarketOrderMessage(params) — builds a signed market order payload
  • buildConditionalOrderMessage(params) — builds a signed TP/SL/stop order payload
  • ORDER_TYPE_INDEX — numeric index mapping for OrderType enum values

Types (src/types/)

  • OrderType enum — MARKET, LIMIT, STOP_MARKET, STOP_LIMIT, TAKE_PROFIT_MARKET, TAKE_PROFIT_LIMIT
  • Order, position, account, fill, market, and API types shared across SDK packages

Branded primitives (src/primitives.ts)

  • Price, Qty, Usd, Margin, Bps — branded bigint types (18 decimals)
  • Each brand: constructor, .parse(str), .fmt(val), .zod schema, .mul() arithmetic

Prices (src/prices/)

  • REDSTONE_FEEDS — RedStone push-feed addresses on MegaETH testnet (chainId 6343), keyed by symbol
  • RedStoneFeedSymbol — feed symbol type; a key of REDSTONE_FEEDS
  • REDSTONE_DECIMALS — decimals of every RedStone feed (8)
  • isRedStoneFeedSymbol(value) — type guard for a feed symbol
  • redstoneFeedAddress(feedId) — feed address for a Market.feedId symbol, or undefined when unknown

Скобки позиции — positionBrackets(position, conditional) (src/positions/)

С 0.65.0 принимает позицию ({ marketId, size }), а не рынок. Скобка — условный reduce-only ордер этого рынка в TRIGGER_PENDING на стороне, закрывающей позицию (у длинной — SELL, у короткой — BUY). Нет позиции — нет скобок. У каждой скобки size (подписанный размер, модулем) и effectiveSize = min(size, |position.size|) — столько она закроет: движок урезает reduce-only до позиции, и после частичного закрытия показывать надо effectiveSize.

reduceOnlyLegs(position, orders) (src/positions/reduce-only-legs.ts, с 0.66.0) — шире positionBrackets: все reduce-only ордера позиции на закрывающей стороне (TP/SL в TRIGGER_PENDING, отдыхающие LIMIT / STOP_LIMIT / TAKE_PROFIT_LIMIT в PENDING / PARTIALLY_FILLED), у каждого effectiveSize = min(остаток, |position.size|); остаток — remainingSize, а если его нет, то |sizeDelta|. Дубль по id — первое вхождение, свежий список передают первым. Резерв сматченных, но не рассчитанных ордеров не учитывается.

GatewayOrder.reduceOnly — с 0.65.0 в типе. Список ордеров шлюз отдавал с колонкой и раньше; одиночный orders.get(id) — только у шлюза с 0.65.0.

describeOrderOutcome называет снятие скобки вместе с позицией: position_closed, position_flipped, no_position, и отмену reduce-only лимитки, под которую не осталось позиции: reduce_only.

Маржа ордера и аккаунта (с 0.67.0)

validateOrder (src/order/validate.ts) судит доступность по требованию протокола. Ломающее изменение: из OrderVerdictInput ушли available и marginCost, пришли requiredMargin и free (Margin | undefined). requiredMargin — поле requiredMargin предпросмотра маржи ордера (getOrderMarginPreview в @liq/onchain, useOrderMarginPreview в @liq/react), free — free шлюза (client.accounts.getMargin, useAccountMargin). Предупреждение exceeds-available-margin — когда оба известны и requiredMargin > free; равенство не предупреждает. Неизвестное — undefined, пока чтение не пришло; Margin(0n) вместо него не подставлять: 0n и отрицательный free — известные значения, и они предупреждают. Это предупреждение, а не блок: requiredMargin не включает убыток филла хуже марка, который ворота протокола списывают с доступной маржи, так что requiredMargin <= free необходимо, но не достаточно; решает шлюз.

const verdict = validateOrder({
    markPrice,
    sizeQty,
    minSize,
    leverage,
    maxLeverage,
    requiredMargin: preview?.requiredMargin,
    free: margin === undefined ? undefined : Margin(margin.free),
});

marginUsage({ requiredInitialMargin, available }) (src/margin/usage.ts) — доля начального требования в доступной марже, WAD: getRequiredMargins(accountId)[0] (награда за ликвидацию уже внутри) на ончейн getAvailableMargin (уже за вычетом долга). Нулевое требование — 0n; положительное при available <= 0n — undefined (под водой).

marginCost (src/order/math.ts) — калькулятор размера для слайдера плеча (notional / leverage), а не маржа; маржа ордера — requiredMargin предпросмотра. draftLiquidationPrice — @deprecated: с кросс-позициями не сходится; оценка — estimatedLiquidationPrice предпросмотра или accountMargin(...).liquidationPriceFor.

Install

pnpm add @liq/core

Build

moon run liq-core:build    # tsup → dist/

版本与发布记录

@liqpro/liq-core 共发布 53 个版本,首次发布于 2026/06/14;过去 12 个月发布了 53 个版本。

版本发布日期距今
0.83.0latest2026/11/021 天前
0.80.02026/10/295 天前
0.79.02026/10/277 天前
0.78.02026/10/2410 天前
0.77.02026/10/2410 天前
0.74.02026/10/2113 天前

关于 @liqpro/liq-core 的常见问题

@liqpro/liq-core 是什么?

SDK基础-类型,枚举,EIP-712助手,链配置和Liq永久交换的合约地址。

如何安装 @liqpro/liq-core?

在项目目录运行 npm install @liqpro/liq-core,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:zod(^4.0.0)、viem(^2.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@liqpro/liq-core 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@liqpro/liq-core 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@liqpro/liq-core 可以商用吗?

@liqpro/liq-core 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@liqpro/liq-core 还在维护吗?

最新版本 0.83.0 发布于 2026/11/02(1 天前);至今共发布 53 个版本,其中过去 12 个月发布了 53 个;首次发布于 2026/06/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。