@metamask-previews/perps-controller 16.1.0-preview-7dd72ded9 → 16.1.0-preview-d8fceeabc

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.
@@ -60,9 +60,9 @@ const PositiveDecimalStringStruct = (0, superstruct_1.define)('positive finite d
60
60
  return parsed !== null && parsed > 0;
61
61
  });
62
62
  const NonNegativeFiniteNumberStruct = (0, superstruct_1.define)('non-negative finite number', (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0);
63
- const MarginFractionStruct = (0, superstruct_1.define)('margin fraction in (0, 10000]', (value) => typeof value === 'number' &&
63
+ const NonNegativeMarginFractionStruct = (0, superstruct_1.define)('margin fraction in [0, 10000]', (value) => typeof value === 'number' &&
64
64
  Number.isSafeInteger(value) &&
65
- value >= 1 &&
65
+ value >= 0 &&
66
66
  value <= 10000);
67
67
  const NonNegativeFinancialNumberStruct = (0, superstruct_1.union)([
68
68
  NonNegativeFiniteNumberStruct,
@@ -99,25 +99,31 @@ const AccountStruct = (0, superstruct_1.type)({
99
99
  availableBalance: NonNegativeDecimalStringStruct,
100
100
  positions: (0, superstruct_1.optional)((0, superstruct_1.array)(PositionStruct)),
101
101
  });
102
- const MarketStruct = (0, superstruct_1.type)({
102
+ const MarketBaseStruct = (0, superstruct_1.type)({
103
103
  symbol: (0, superstruct_1.string)(),
104
104
  marketId: NonNegativeIntegerStruct,
105
105
  marketType: (0, superstruct_1.string)(),
106
106
  status: (0, superstruct_1.string)(),
107
107
  takerFee: SignedDecimalStringStruct,
108
108
  makerFee: SignedDecimalStringStruct,
109
- minBaseAmount: PositiveDecimalStringStruct,
110
- minQuoteAmount: PositiveDecimalStringStruct,
109
+ minBaseAmount: NonNegativeDecimalStringStruct,
110
+ minQuoteAmount: NonNegativeDecimalStringStruct,
111
111
  supportedSizeDecimals: NonNegativeIntegerStruct,
112
112
  supportedPriceDecimals: NonNegativeIntegerStruct,
113
113
  supportedQuoteDecimals: NonNegativeIntegerStruct,
114
114
  });
115
- const MarketDetailStruct = (0, superstruct_1.type)({
116
- ...MarketStruct.schema,
115
+ const hasValidMarketMinimums = (market) => market.status === 'inactive' ||
116
+ [market.minBaseAmount, market.minQuoteAmount].every((value) => {
117
+ const parsed = parseStrictDecimalString(value);
118
+ return parsed !== null && parsed > 0;
119
+ });
120
+ const MarketStruct = (0, superstruct_1.refine)(MarketBaseStruct, 'positive minimum amounts for tradable markets', hasValidMarketMinimums);
121
+ const MarketDetailBaseStruct = (0, superstruct_1.type)({
122
+ ...MarketBaseStruct.schema,
117
123
  lastTradePrice: NonNegativeFiniteNumberStruct,
118
- defaultInitialMarginFraction: (0, superstruct_1.optional)(MarginFractionStruct),
119
- minInitialMarginFraction: (0, superstruct_1.optional)(MarginFractionStruct),
120
- maintenanceMarginFraction: (0, superstruct_1.optional)(MarginFractionStruct),
124
+ defaultInitialMarginFraction: (0, superstruct_1.optional)(NonNegativeMarginFractionStruct),
125
+ minInitialMarginFraction: (0, superstruct_1.optional)(NonNegativeMarginFractionStruct),
126
+ maintenanceMarginFraction: (0, superstruct_1.optional)(NonNegativeMarginFractionStruct),
121
127
  dailyTradesCount: NonNegativeFiniteNumberStruct,
122
128
  dailyBaseTokenVolume: NonNegativeFiniteNumberStruct,
123
129
  dailyQuoteTokenVolume: NonNegativeFiniteNumberStruct,
@@ -127,6 +133,13 @@ const MarketDetailStruct = (0, superstruct_1.type)({
127
133
  openInterest: NonNegativeFiniteNumberStruct,
128
134
  dailyChart: (0, superstruct_1.record)((0, superstruct_1.string)(), FiniteNumberStruct),
129
135
  });
136
+ const hasValidMarketMarginFractions = (market) => market.status === 'inactive' ||
137
+ [
138
+ market.defaultInitialMarginFraction,
139
+ market.minInitialMarginFraction,
140
+ market.maintenanceMarginFraction,
141
+ ].every((value) => value === undefined || value > 0);
142
+ const MarketDetailStruct = (0, superstruct_1.refine)((0, superstruct_1.refine)(MarketDetailBaseStruct, 'positive minimum amounts for tradable markets', hasValidMarketMinimums), 'positive margin fractions for tradable markets', hasValidMarketMarginFractions);
130
143
  const OrderStruct = (0, superstruct_1.type)({
131
144
  orderIndex: NonNegativeIntegerStruct,
132
145
  clientOrderIndex: NonNegativeIntegerStruct,
@@ -1 +1 @@
1
- {"version":3,"file":"LighterClientService.cjs","sourceRoot":"","sources":["../../src/services/LighterClientService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lighter Client Service\n *\n * Thin REST client for the zkLighter API. No SDK dependency — endpoints are\n * called with the platform `fetch` global. Each successful endpoint response\n * is decoded before it reaches provider signing or trading logic.\n *\n * Endpoints used (https://apidocs.lighter.xyz):\n * - GET /api/v1/orderBooks market metadata\n * - GET /api/v1/orderBookDetails market stats\n * - GET /api/v1/account account (+positions) by index\n * - GET /api/v1/accountsByL1Address account discovery\n * - GET /api/v1/apikeys registered venue keys\n * - GET /api/v1/nextNonce per-key nonce\n * - GET /api/v1/accountActiveOrders open orders (auth token header)\n * - POST /api/v1/sendTx submit signed L2 transaction\n */\n\nimport type { Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n define,\n optional,\n record,\n string,\n type,\n union,\n} from '@metamask/superstruct';\n\nimport {\n getLighterHttpEndpoint,\n LIGHTER_DATA_INTEGRITY_PREFIX,\n LIGHTER_HTTP_TIMEOUT_MS,\n} from '../constants/lighterConfig.js';\nimport type { PerpsPlatformDependencies } from '../types/index.js';\nimport type {\n LighterAccountResponse,\n LighterAccountsByL1AddressResponse,\n LighterActiveOrdersResponse,\n LighterApiKeysResponse,\n LighterNetwork,\n LighterNextNonceResponse,\n LighterTxLookupResponse,\n LighterOrderBookMeta,\n LighterOrderBookDetailsResponse,\n LighterOrderBooksResponse,\n LighterCandlesResponse,\n LighterDepositHistoryResponse,\n LighterInactiveOrdersResponse,\n LighterPnlResponse,\n LighterPositionFundingsResponse,\n LighterSendTxResponse,\n LighterTradesResponse,\n LighterTradesQuery,\n LighterTransferType,\n LighterTransferHistoryResponse,\n LighterWithdrawHistoryResponse,\n} from '../types/lighter-types.js';\n\n/**\n * Duration market metadata stays cached before a refetch.\n */\nconst MARKETS_CACHE_TTL_MS = 5 * 60 * 1000;\n\nconst FiniteNumberStruct = define<number>('finite number', (value) =>\n typeof value === 'number' ? Number.isFinite(value) : false,\n);\nconst SafeIntegerStruct = define<number>('safe integer', (value) =>\n typeof value === 'number' ? Number.isSafeInteger(value) : false,\n);\nconst NonNegativeIntegerStruct = define<number>(\n 'non-negative safe integer',\n (value) =>\n typeof value === 'number'\n ? Number.isSafeInteger(value) && value >= 0\n : false,\n);\nconst parseStrictDecimalString = (value: unknown): number | null => {\n if (\n typeof value !== 'string' ||\n !/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/u.test(value)\n ) {\n return null;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n};\nconst SignedDecimalStringStruct = define<string>(\n 'finite decimal string',\n (value) => parseStrictDecimalString(value) !== null,\n);\nconst NonNegativeDecimalStringStruct = define<string>(\n 'non-negative finite decimal string',\n (value) => {\n const parsed = parseStrictDecimalString(value);\n return parsed !== null && parsed >= 0;\n },\n);\nconst TransferTypeStruct = define<LighterTransferType>(\n 'Lighter transfer type',\n (value) => value === 'L2TransferInflow' || value === 'L2TransferOutflow',\n);\nconst PositiveDecimalStringStruct = define<string>(\n 'positive finite decimal string',\n (value) => {\n const parsed = parseStrictDecimalString(value);\n return parsed !== null && parsed > 0;\n },\n);\nconst NonNegativeFiniteNumberStruct = define<number>(\n 'non-negative finite number',\n (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0,\n);\nconst MarginFractionStruct = define<number>(\n 'margin fraction in (0, 10000]',\n (value) =>\n typeof value === 'number' &&\n Number.isSafeInteger(value) &&\n value >= 1 &&\n value <= 10_000,\n);\nconst NonNegativeFinancialNumberStruct = union([\n NonNegativeFiniteNumberStruct,\n NonNegativeDecimalStringStruct,\n]);\nconst BaseResponseStruct = type({\n code: SafeIntegerStruct,\n message: optional(string()),\n});\nconst PositionStruct = type({\n marketId: NonNegativeIntegerStruct,\n symbol: string(),\n initialMarginFraction: NonNegativeDecimalStringStruct,\n openOrderCount: NonNegativeIntegerStruct,\n sign: SafeIntegerStruct,\n position: NonNegativeDecimalStringStruct,\n avgEntryPrice: NonNegativeDecimalStringStruct,\n positionValue: NonNegativeDecimalStringStruct,\n unrealizedPnl: SignedDecimalStringStruct,\n realizedPnl: SignedDecimalStringStruct,\n liquidationPrice: NonNegativeDecimalStringStruct,\n marginMode: optional(SafeIntegerStruct),\n});\nconst AccountStruct = type({\n code: SafeIntegerStruct,\n accountType: SafeIntegerStruct,\n index: NonNegativeIntegerStruct,\n l1Address: string(),\n cancelAllTime: NonNegativeIntegerStruct,\n totalOrderCount: NonNegativeIntegerStruct,\n pendingOrderCount: NonNegativeIntegerStruct,\n status: SafeIntegerStruct,\n collateral: NonNegativeDecimalStringStruct,\n availableBalance: NonNegativeDecimalStringStruct,\n positions: optional(array(PositionStruct)),\n});\nconst MarketStruct = type({\n symbol: string(),\n marketId: NonNegativeIntegerStruct,\n marketType: string(),\n status: string(),\n takerFee: SignedDecimalStringStruct,\n makerFee: SignedDecimalStringStruct,\n minBaseAmount: PositiveDecimalStringStruct,\n minQuoteAmount: PositiveDecimalStringStruct,\n supportedSizeDecimals: NonNegativeIntegerStruct,\n supportedPriceDecimals: NonNegativeIntegerStruct,\n supportedQuoteDecimals: NonNegativeIntegerStruct,\n});\nconst MarketDetailStruct = type({\n ...MarketStruct.schema,\n lastTradePrice: NonNegativeFiniteNumberStruct,\n defaultInitialMarginFraction: optional(MarginFractionStruct),\n minInitialMarginFraction: optional(MarginFractionStruct),\n maintenanceMarginFraction: optional(MarginFractionStruct),\n dailyTradesCount: NonNegativeFiniteNumberStruct,\n dailyBaseTokenVolume: NonNegativeFiniteNumberStruct,\n dailyQuoteTokenVolume: NonNegativeFiniteNumberStruct,\n dailyPriceLow: NonNegativeFiniteNumberStruct,\n dailyPriceHigh: NonNegativeFiniteNumberStruct,\n dailyPriceChange: FiniteNumberStruct,\n openInterest: NonNegativeFiniteNumberStruct,\n dailyChart: record(string(), FiniteNumberStruct),\n});\nconst OrderStruct = type({\n orderIndex: NonNegativeIntegerStruct,\n clientOrderIndex: NonNegativeIntegerStruct,\n marketIndex: NonNegativeIntegerStruct,\n ownerAccountIndex: NonNegativeIntegerStruct,\n initialBaseAmount: PositiveDecimalStringStruct,\n remainingBaseAmount: NonNegativeDecimalStringStruct,\n price: PositiveDecimalStringStruct,\n isAsk: boolean(),\n type: string(),\n timeInForce: string(),\n reduceOnly: union([FiniteNumberStruct, boolean()]),\n status: string(),\n orderExpiry: SafeIntegerStruct,\n timestamp: NonNegativeIntegerStruct,\n triggerPrice: optional(NonNegativeDecimalStringStruct),\n orderId: optional(string()),\n parentOrderIndex: optional(NonNegativeIntegerStruct),\n parentOrderId: optional(string()),\n toCancelOrderId0: optional(string()),\n toTriggerOrderId0: optional(string()),\n toTriggerOrderId1: optional(string()),\n});\nconst TradeStruct = type({\n tradeId: NonNegativeIntegerStruct,\n txHash: string(),\n type: string(),\n marketId: NonNegativeIntegerStruct,\n size: PositiveDecimalStringStruct,\n price: PositiveDecimalStringStruct,\n usdAmount: PositiveDecimalStringStruct,\n askId: NonNegativeIntegerStruct,\n bidId: NonNegativeIntegerStruct,\n askAccountId: NonNegativeIntegerStruct,\n bidAccountId: NonNegativeIntegerStruct,\n isMakerAsk: boolean(),\n timestamp: NonNegativeIntegerStruct,\n askAccountPnl: SignedDecimalStringStruct,\n bidAccountPnl: SignedDecimalStringStruct,\n takerFee: optional(NonNegativeFinancialNumberStruct),\n makerFee: optional(NonNegativeFinancialNumberStruct),\n takerPositionSizeBefore: NonNegativeDecimalStringStruct,\n makerPositionSizeBefore: NonNegativeDecimalStringStruct,\n takerPositionSignChanged: boolean(),\n makerPositionSignChanged: boolean(),\n});\n\nconst ResponseStructs = {\n orderBooks: type({\n ...BaseResponseStruct.schema,\n orderBooks: array(MarketStruct),\n }),\n orderBookDetails: type({\n ...BaseResponseStruct.schema,\n orderBookDetails: array(MarketDetailStruct),\n }),\n account: type({\n ...BaseResponseStruct.schema,\n accounts: array(AccountStruct),\n }),\n accountsByAddress: type({\n ...BaseResponseStruct.schema,\n l1Address: string(),\n subAccounts: array(AccountStruct),\n }),\n apiKeys: type({\n ...BaseResponseStruct.schema,\n apiKeys: array(\n type({\n accountIndex: NonNegativeIntegerStruct,\n apiKeyIndex: NonNegativeIntegerStruct,\n nonce: NonNegativeIntegerStruct,\n publicKey: string(),\n }),\n ),\n }),\n nextNonce: type({\n ...BaseResponseStruct.schema,\n nonce: NonNegativeIntegerStruct,\n }),\n transaction: type({\n ...BaseResponseStruct.schema,\n hash: string(),\n accountIndex: NonNegativeIntegerStruct,\n apiKeyIndex: NonNegativeIntegerStruct,\n nonce: NonNegativeIntegerStruct,\n status: SafeIntegerStruct,\n }),\n sendTransaction: type({\n ...BaseResponseStruct.schema,\n txHash: string(),\n }),\n activeOrders: type({\n ...BaseResponseStruct.schema,\n orders: array(OrderStruct),\n }),\n inactiveOrders: type({\n ...BaseResponseStruct.schema,\n nextCursor: optional(string()),\n orders: array(OrderStruct),\n }),\n deposits: type({\n ...BaseResponseStruct.schema,\n deposits: array(\n type({\n id: string(),\n assetId: NonNegativeIntegerStruct,\n amount: PositiveDecimalStringStruct,\n timestamp: NonNegativeIntegerStruct,\n status: string(),\n l1TxHash: string(),\n }),\n ),\n cursor: optional(string()),\n }),\n withdrawals: type({\n ...BaseResponseStruct.schema,\n withdraws: array(\n type({\n id: string(),\n assetId: NonNegativeIntegerStruct,\n amount: PositiveDecimalStringStruct,\n timestamp: NonNegativeIntegerStruct,\n status: string(),\n type: string(),\n l1TxHash: string(),\n }),\n ),\n cursor: optional(string()),\n }),\n transfers: type({\n ...BaseResponseStruct.schema,\n transfers: array(\n type({\n id: string(),\n assetId: NonNegativeIntegerStruct,\n amount: PositiveDecimalStringStruct,\n fee: NonNegativeDecimalStringStruct,\n timestamp: NonNegativeIntegerStruct,\n type: TransferTypeStruct,\n fromL1Address: string(),\n toL1Address: string(),\n fromAccountIndex: NonNegativeIntegerStruct,\n toAccountIndex: NonNegativeIntegerStruct,\n txHash: string(),\n }),\n ),\n cursor: optional(string()),\n }),\n trades: type({\n ...BaseResponseStruct.schema,\n nextCursor: optional(string()),\n trades: array(TradeStruct),\n }),\n fundings: type({\n ...BaseResponseStruct.schema,\n positionFundings: array(\n type({\n timestamp: NonNegativeIntegerStruct,\n marketId: NonNegativeIntegerStruct,\n fundingId: NonNegativeIntegerStruct,\n change: SignedDecimalStringStruct,\n rate: SignedDecimalStringStruct,\n positionSize: NonNegativeDecimalStringStruct,\n positionSide: string(),\n }),\n ),\n }),\n pnl: type({\n ...BaseResponseStruct.schema,\n resolution: optional(string()),\n pnl: optional(\n array(\n type({\n timestamp: NonNegativeIntegerStruct,\n tradePnl: FiniteNumberStruct,\n inflow: FiniteNumberStruct,\n outflow: FiniteNumberStruct,\n volume: FiniteNumberStruct,\n }),\n ),\n ),\n }),\n candles: type({\n ...BaseResponseStruct.schema,\n r: optional(string()),\n c: optional(\n array(\n type({\n t: NonNegativeIntegerStruct,\n o: FiniteNumberStruct,\n h: FiniteNumberStruct,\n l: FiniteNumberStruct,\n c: FiniteNumberStruct,\n v: FiniteNumberStruct,\n }),\n ),\n ),\n }),\n} as const;\n\n/**\n * Convert a snake_case wire key to camelCase.\n *\n * @param key - Wire key (e.g. `min_base_amount`).\n * @returns camelCase key (e.g. `minBaseAmount`).\n */\nfunction toCamelKey(key: string): string {\n return key.replace(/_([a-z0-9])/gu, (_match, char: string) =>\n char.toUpperCase(),\n );\n}\n\n/**\n * Recursively convert all object keys from snake_case to camelCase.\n * The zkLighter wire format is snake_case; parsed shapes in this package\n * follow camelCase conventions (see types/lighter-types.ts).\n *\n * @param value - Parsed JSON value.\n * @returns The value with camelCase keys.\n */\nexport function convertKeysToCamelCase(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(convertKeysToCamelCase);\n }\n if (value !== null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [\n toCamelKey(key),\n convertKeysToCamelCase(entry),\n ]),\n );\n }\n return value;\n}\n\n/**\n * Error thrown for non-2xx HTTP responses or API-level error codes.\n */\nexport class LighterApiError extends Error {\n readonly code: number | undefined;\n\n constructor(message: string, code?: number) {\n super(message);\n this.name = 'LighterApiError';\n this.code = code;\n }\n}\n\n/**\n * REST client for the zkLighter API.\n */\nexport class LighterClientService {\n readonly #deps: PerpsPlatformDependencies;\n\n readonly #isTestnet: boolean;\n\n #marketsCache: LighterOrderBookMeta[] | null = null;\n\n #marketsCacheTime = 0;\n\n constructor(deps: PerpsPlatformDependencies, config: { isTestnet: boolean }) {\n this.#deps = deps;\n this.#isTestnet = config.isTestnet;\n }\n\n get network(): LighterNetwork {\n return this.#isTestnet ? 'testnet' : 'mainnet';\n }\n\n get baseUrl(): string {\n return getLighterHttpEndpoint(this.network);\n }\n\n /**\n * Fetch market metadata, cached for 5 minutes.\n *\n * @param forceRefresh - Skip the cache and refetch.\n * @returns Market metadata entries.\n */\n async getOrderBooks(forceRefresh = false): Promise<LighterOrderBookMeta[]> {\n const now = Date.now();\n if (\n !forceRefresh &&\n this.#marketsCache &&\n now - this.#marketsCacheTime < MARKETS_CACHE_TTL_MS\n ) {\n return this.#marketsCache;\n }\n\n const response = await this.#get<LighterOrderBooksResponse>(\n '/api/v1/orderBooks',\n ResponseStructs.orderBooks,\n );\n this.#marketsCache = response.orderBooks;\n this.#marketsCacheTime = now;\n return response.orderBooks;\n }\n\n /**\n * Fetch market stats for all markets.\n *\n * @returns Order book details entries.\n */\n async getOrderBookDetails(): Promise<LighterOrderBookDetailsResponse> {\n return await this.#get<LighterOrderBookDetailsResponse>(\n '/api/v1/orderBookDetails',\n ResponseStructs.orderBookDetails,\n );\n }\n\n /**\n * Fetch an account (including positions) by its Lighter index.\n *\n * @param accountIndex - The Lighter account index.\n * @returns Account payload.\n */\n async getAccountByIndex(\n accountIndex: number,\n ): Promise<LighterAccountResponse> {\n return await this.#get<LighterAccountResponse>(\n `/api/v1/account?by=index&value=${accountIndex}`,\n ResponseStructs.account,\n );\n }\n\n /**\n * Discover Lighter accounts owned by an L1 address.\n *\n * @param l1Address - The owning EVM address.\n * @returns Accounts payload.\n */\n async getAccountsByL1Address(\n l1Address: string,\n ): Promise<LighterAccountsByL1AddressResponse> {\n return await this.#get<LighterAccountsByL1AddressResponse>(\n `/api/v1/accountsByL1Address?l1_address=${l1Address}`,\n ResponseStructs.accountsByAddress,\n );\n }\n\n /**\n * Fetch registered API keys for an account.\n *\n * @param accountIndex - The Lighter account index.\n * @param apiKeyIndex - Key slot, or 255 for all slots.\n * @returns API keys payload.\n */\n async getApiKeys(\n accountIndex: number,\n apiKeyIndex = 255,\n ): Promise<LighterApiKeysResponse> {\n return await this.#get<LighterApiKeysResponse>(\n `/api/v1/apikeys?account_index=${accountIndex}&api_key_index=${apiKeyIndex}`,\n ResponseStructs.apiKeys,\n );\n }\n\n /**\n * Fetch the next nonce for a key slot.\n *\n * @param accountIndex - The Lighter account index.\n * @param apiKeyIndex - Key slot.\n * @returns Next nonce payload.\n */\n async getNextNonce(\n accountIndex: number,\n apiKeyIndex: number,\n ): Promise<LighterNextNonceResponse> {\n return await this.#get<LighterNextNonceResponse>(\n `/api/v1/nextNonce?account_index=${accountIndex}&api_key_index=${apiKeyIndex}`,\n ResponseStructs.nextNonce,\n );\n }\n\n /**\n * Look up a transaction by its exact hash (`GET /api/v1/tx`). Used to\n * resolve submission-acceptance ambiguity authoritatively: an exact-hash\n * match proves the signed payload reached the sequencer.\n *\n * Contract: a venue-confirmed \"transaction not found\" (API error code\n * 21500) resolves to NULL; transport failures and every other API error\n * RETHROW — they are ambiguity, never evidence of non-acceptance.\n *\n * @param txHash - The signed transaction hash.\n * @returns The venue's transaction payload, or null when the venue\n * confirms the hash is unknown.\n */\n async getTx(txHash: string): Promise<LighterTxLookupResponse | null> {\n try {\n return await this.#get<LighterTxLookupResponse>(\n `/api/v1/tx?by=hash&value=${encodeURIComponent(txHash)}`,\n ResponseStructs.transaction,\n );\n } catch (error) {\n if (error instanceof LighterApiError && error.code === 21500) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Fetch active (open) orders for an account.\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer (`_createAuthToken`).\n * @param marketId - Optional market filter (255 = all markets).\n * @returns Active orders payload.\n */\n async getActiveOrders(\n accountIndex: number,\n authToken: string,\n marketId = 255,\n ): Promise<LighterActiveOrdersResponse> {\n return await this.#get<LighterActiveOrdersResponse>(\n `/api/v1/accountActiveOrders?account_index=${accountIndex}&market_id=${marketId}`,\n ResponseStructs.activeOrders,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch historical (inactive) orders: filled and canceled lifecycle\n * states, newest first (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param limit - Maximum entries per page.\n * @param cursor - Pagination cursor from a previous page's `nextCursor`.\n * @param marketId - Optional market filter (official `market_id` query\n * param) — sharply bounds history scans to one symbol.\n * @returns Inactive orders payload.\n */\n async getInactiveOrders(\n accountIndex: number,\n authToken: string,\n limit = 50,\n cursor?: string,\n marketId?: number,\n ): Promise<LighterInactiveOrdersResponse> {\n return await this.#get<LighterInactiveOrdersResponse>(\n `/api/v1/accountInactiveOrders?account_index=${accountIndex}&limit=${limit}${\n cursor === undefined ? '' : `&cursor=${encodeURIComponent(cursor)}`\n }${marketId === undefined ? '' : `&market_id=${marketId}`}`,\n ResponseStructs.inactiveOrders,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch L1→L2 deposit history (auth token required). The venue requires\n * both the account index and its L1 address on this endpoint.\n *\n * @param accountIndex - The Lighter account index.\n * @param l1Address - The account's L1 address.\n * @param authToken - Auth token minted by the signer.\n * @returns Deposit history payload (newest first, cursor-paged).\n */\n async getDepositHistory(\n accountIndex: number,\n l1Address: string,\n authToken: string,\n ): Promise<LighterDepositHistoryResponse> {\n return await this.#get<LighterDepositHistoryResponse>(\n `/api/v1/deposit/history?account_index=${accountIndex}&l1_address=${l1Address}`,\n ResponseStructs.deposits,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch L2→L1 withdrawal history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @returns Withdrawal history payload (newest first, cursor-paged).\n */\n async getWithdrawHistory(\n accountIndex: number,\n authToken: string,\n ): Promise<LighterWithdrawHistoryResponse> {\n return await this.#get<LighterWithdrawHistoryResponse>(\n `/api/v1/withdraw/history?account_index=${accountIndex}`,\n ResponseStructs.withdrawals,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch L2 transfer history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @returns Transfer history payload (newest first, cursor-paged).\n */\n async getTransferHistory(\n accountIndex: number,\n authToken: string,\n ): Promise<LighterTransferHistoryResponse> {\n return await this.#get<LighterTransferHistoryResponse>(\n `/api/v1/transfer/history?account_index=${accountIndex}`,\n ResponseStructs.transfers,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch account trade history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param query - Pagination, range, and market filters.\n * @returns Trades payload (newest first).\n */\n async getTrades(\n accountIndex: number,\n authToken: string,\n query: LighterTradesQuery,\n ): Promise<LighterTradesResponse> {\n const { limit, cursor, from, marketId } = query;\n return await this.#get<LighterTradesResponse>(\n `/api/v1/trades?sort_by=timestamp&sort_dir=desc&limit=${limit}&account_index=${accountIndex}&market_type=perp${\n cursor === undefined ? '' : `&cursor=${encodeURIComponent(cursor)}`\n }${from === undefined ? '' : `&from=${from}`}${\n marketId === undefined ? '' : `&market_id=${marketId}`\n }`,\n ResponseStructs.trades,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch user funding payment history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param limit - Max entries.\n * @returns Position fundings payload.\n */\n async getPositionFundings(\n accountIndex: number,\n authToken: string,\n limit = 50,\n ): Promise<LighterPositionFundingsResponse> {\n return await this.#get<LighterPositionFundingsResponse>(\n `/api/v1/positionFunding?account_index=${accountIndex}&market_id=255&limit=${limit}&sort_by=timestamp&side=all`,\n ResponseStructs.fundings,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch account PnL history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param startTimestamp - Range start (ms).\n * @param endTimestamp - Range end (ms).\n * @param countBack - Records counted back from range end.\n * @returns PnL payload.\n */\n async getPnl(\n accountIndex: number,\n authToken: string,\n startTimestamp: number,\n endTimestamp: number,\n countBack: number,\n ): Promise<LighterPnlResponse> {\n return await this.#get<LighterPnlResponse>(\n `/api/v1/pnl?by=index&value=${accountIndex}&resolution=1d&count_back=${countBack}&start_timestamp=${startTimestamp}&end_timestamp=${endTimestamp}`,\n ResponseStructs.pnl,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch an OHLCV candle series for a market.\n *\n * @param marketId - Numeric Lighter market id.\n * @param resolution - Candle resolution (e.g. `1m`, `15m`, `1h`, `1d`).\n * @param startTimestamp - Range start (ms).\n * @param endTimestamp - Range end (ms).\n * @param countBack - Number of candles counted back from the range end.\n * @returns Candle series payload.\n */\n async getCandles(\n marketId: number,\n resolution: string,\n startTimestamp: number,\n endTimestamp: number,\n countBack: number,\n ): Promise<LighterCandlesResponse> {\n return await this.#get<LighterCandlesResponse>(\n `/api/v1/candles?market_id=${marketId}&resolution=${resolution}&start_timestamp=${startTimestamp}&end_timestamp=${endTimestamp}&count_back=${countBack}`,\n ResponseStructs.candles,\n );\n }\n\n /**\n * Submit a signed L2 transaction.\n *\n * @param txType - L2 transaction type code (see lighterConfig).\n * @param txInfo - Serialized signed transaction JSON.\n * @returns Send result payload.\n */\n async sendTx(txType: number, txInfo: string): Promise<LighterSendTxResponse> {\n const body = new URLSearchParams({\n tx_type: String(txType),\n tx_info: txInfo,\n });\n\n const response = await this.#request<LighterSendTxResponse>(\n '/api/v1/sendTx',\n {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n },\n ResponseStructs.sendTransaction,\n );\n return response;\n }\n\n readonly #get = async <Result extends { code: number; message?: string }>(\n path: string,\n responseStruct: Struct<Result, unknown>,\n headers?: Record<string, string>,\n ): Promise<Result> => {\n return await this.#request<Result>(\n path,\n { method: 'GET', headers },\n responseStruct,\n );\n };\n\n readonly #request = async <Result extends { code: number; message?: string }>(\n path: string,\n init: { method: string; headers?: Record<string, string>; body?: string },\n responseStruct: Struct<Result, unknown>,\n ): Promise<Result> => {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n LIGHTER_HTTP_TIMEOUT_MS,\n );\n\n try {\n const response = await fetch(url, {\n method: init.method,\n headers: init.headers,\n body: init.body,\n signal: controller.signal,\n });\n\n const payload: unknown = convertKeysToCamelCase(await response.json());\n assert(payload, BaseResponseStruct);\n\n // Lighter returns HTTP 200 with an application-level error code, and\n // 4xx/5xx with `{code, message}` bodies — treat both uniformly.\n if (!response.ok || payload.code !== 200) {\n throw new LighterApiError(\n payload.message ?? `Lighter API error (HTTP ${response.status})`,\n payload.code ?? response.status,\n );\n }\n try {\n assert(payload, responseStruct);\n } catch (error) {\n throw new LighterApiError(\n `${LIGHTER_DATA_INTEGRITY_PREFIX} response for ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return payload;\n } catch (error) {\n if (error instanceof LighterApiError) {\n throw error;\n }\n this.#deps.debugLogger?.log?.('LighterClientService request failed', {\n url,\n error,\n });\n throw new LighterApiError(\n error instanceof Error ? error.message : String(error),\n );\n } finally {\n clearTimeout(timeout);\n }\n };\n}\n"]}
1
+ {"version":3,"file":"LighterClientService.cjs","sourceRoot":"","sources":["../../src/services/LighterClientService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lighter Client Service\n *\n * Thin REST client for the zkLighter API. No SDK dependency — endpoints are\n * called with the platform `fetch` global. Each successful endpoint response\n * is decoded before it reaches provider signing or trading logic.\n *\n * Endpoints used (https://apidocs.lighter.xyz):\n * - GET /api/v1/orderBooks market metadata\n * - GET /api/v1/orderBookDetails market stats\n * - GET /api/v1/account account (+positions) by index\n * - GET /api/v1/accountsByL1Address account discovery\n * - GET /api/v1/apikeys registered venue keys\n * - GET /api/v1/nextNonce per-key nonce\n * - GET /api/v1/accountActiveOrders open orders (auth token header)\n * - POST /api/v1/sendTx submit signed L2 transaction\n */\n\nimport type { Struct } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n define,\n optional,\n record,\n refine,\n string,\n type,\n union,\n} from '@metamask/superstruct';\n\nimport {\n getLighterHttpEndpoint,\n LIGHTER_DATA_INTEGRITY_PREFIX,\n LIGHTER_HTTP_TIMEOUT_MS,\n} from '../constants/lighterConfig.js';\nimport type { PerpsPlatformDependencies } from '../types/index.js';\nimport type {\n LighterAccountResponse,\n LighterAccountsByL1AddressResponse,\n LighterActiveOrdersResponse,\n LighterApiKeysResponse,\n LighterNetwork,\n LighterNextNonceResponse,\n LighterTxLookupResponse,\n LighterOrderBookMeta,\n LighterOrderBookDetailsResponse,\n LighterOrderBooksResponse,\n LighterCandlesResponse,\n LighterDepositHistoryResponse,\n LighterInactiveOrdersResponse,\n LighterPnlResponse,\n LighterPositionFundingsResponse,\n LighterSendTxResponse,\n LighterTradesResponse,\n LighterTradesQuery,\n LighterTransferType,\n LighterTransferHistoryResponse,\n LighterWithdrawHistoryResponse,\n} from '../types/lighter-types.js';\n\n/**\n * Duration market metadata stays cached before a refetch.\n */\nconst MARKETS_CACHE_TTL_MS = 5 * 60 * 1000;\n\nconst FiniteNumberStruct = define<number>('finite number', (value) =>\n typeof value === 'number' ? Number.isFinite(value) : false,\n);\nconst SafeIntegerStruct = define<number>('safe integer', (value) =>\n typeof value === 'number' ? Number.isSafeInteger(value) : false,\n);\nconst NonNegativeIntegerStruct = define<number>(\n 'non-negative safe integer',\n (value) =>\n typeof value === 'number'\n ? Number.isSafeInteger(value) && value >= 0\n : false,\n);\nconst parseStrictDecimalString = (value: unknown): number | null => {\n if (\n typeof value !== 'string' ||\n !/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/u.test(value)\n ) {\n return null;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n};\nconst SignedDecimalStringStruct = define<string>(\n 'finite decimal string',\n (value) => parseStrictDecimalString(value) !== null,\n);\nconst NonNegativeDecimalStringStruct = define<string>(\n 'non-negative finite decimal string',\n (value) => {\n const parsed = parseStrictDecimalString(value);\n return parsed !== null && parsed >= 0;\n },\n);\nconst TransferTypeStruct = define<LighterTransferType>(\n 'Lighter transfer type',\n (value) => value === 'L2TransferInflow' || value === 'L2TransferOutflow',\n);\nconst PositiveDecimalStringStruct = define<string>(\n 'positive finite decimal string',\n (value) => {\n const parsed = parseStrictDecimalString(value);\n return parsed !== null && parsed > 0;\n },\n);\nconst NonNegativeFiniteNumberStruct = define<number>(\n 'non-negative finite number',\n (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0,\n);\nconst NonNegativeMarginFractionStruct = define<number>(\n 'margin fraction in [0, 10000]',\n (value) =>\n typeof value === 'number' &&\n Number.isSafeInteger(value) &&\n value >= 0 &&\n value <= 10_000,\n);\nconst NonNegativeFinancialNumberStruct = union([\n NonNegativeFiniteNumberStruct,\n NonNegativeDecimalStringStruct,\n]);\nconst BaseResponseStruct = type({\n code: SafeIntegerStruct,\n message: optional(string()),\n});\nconst PositionStruct = type({\n marketId: NonNegativeIntegerStruct,\n symbol: string(),\n initialMarginFraction: NonNegativeDecimalStringStruct,\n openOrderCount: NonNegativeIntegerStruct,\n sign: SafeIntegerStruct,\n position: NonNegativeDecimalStringStruct,\n avgEntryPrice: NonNegativeDecimalStringStruct,\n positionValue: NonNegativeDecimalStringStruct,\n unrealizedPnl: SignedDecimalStringStruct,\n realizedPnl: SignedDecimalStringStruct,\n liquidationPrice: NonNegativeDecimalStringStruct,\n marginMode: optional(SafeIntegerStruct),\n});\nconst AccountStruct = type({\n code: SafeIntegerStruct,\n accountType: SafeIntegerStruct,\n index: NonNegativeIntegerStruct,\n l1Address: string(),\n cancelAllTime: NonNegativeIntegerStruct,\n totalOrderCount: NonNegativeIntegerStruct,\n pendingOrderCount: NonNegativeIntegerStruct,\n status: SafeIntegerStruct,\n collateral: NonNegativeDecimalStringStruct,\n availableBalance: NonNegativeDecimalStringStruct,\n positions: optional(array(PositionStruct)),\n});\nconst MarketBaseStruct = type({\n symbol: string(),\n marketId: NonNegativeIntegerStruct,\n marketType: string(),\n status: string(),\n takerFee: SignedDecimalStringStruct,\n makerFee: SignedDecimalStringStruct,\n minBaseAmount: NonNegativeDecimalStringStruct,\n minQuoteAmount: NonNegativeDecimalStringStruct,\n supportedSizeDecimals: NonNegativeIntegerStruct,\n supportedPriceDecimals: NonNegativeIntegerStruct,\n supportedQuoteDecimals: NonNegativeIntegerStruct,\n});\nconst hasValidMarketMinimums = (\n market: Pick<\n LighterOrderBookMeta,\n 'status' | 'minBaseAmount' | 'minQuoteAmount'\n >,\n): boolean =>\n market.status === 'inactive' ||\n [market.minBaseAmount, market.minQuoteAmount].every((value) => {\n const parsed = parseStrictDecimalString(value);\n return parsed !== null && parsed > 0;\n });\nconst MarketStruct = refine(\n MarketBaseStruct,\n 'positive minimum amounts for tradable markets',\n hasValidMarketMinimums,\n);\nconst MarketDetailBaseStruct = type({\n ...MarketBaseStruct.schema,\n lastTradePrice: NonNegativeFiniteNumberStruct,\n defaultInitialMarginFraction: optional(NonNegativeMarginFractionStruct),\n minInitialMarginFraction: optional(NonNegativeMarginFractionStruct),\n maintenanceMarginFraction: optional(NonNegativeMarginFractionStruct),\n dailyTradesCount: NonNegativeFiniteNumberStruct,\n dailyBaseTokenVolume: NonNegativeFiniteNumberStruct,\n dailyQuoteTokenVolume: NonNegativeFiniteNumberStruct,\n dailyPriceLow: NonNegativeFiniteNumberStruct,\n dailyPriceHigh: NonNegativeFiniteNumberStruct,\n dailyPriceChange: FiniteNumberStruct,\n openInterest: NonNegativeFiniteNumberStruct,\n dailyChart: record(string(), FiniteNumberStruct),\n});\nconst hasValidMarketMarginFractions = (market: {\n status: string;\n defaultInitialMarginFraction?: number;\n minInitialMarginFraction?: number;\n maintenanceMarginFraction?: number;\n}): boolean =>\n market.status === 'inactive' ||\n [\n market.defaultInitialMarginFraction,\n market.minInitialMarginFraction,\n market.maintenanceMarginFraction,\n ].every((value) => value === undefined || value > 0);\nconst MarketDetailStruct = refine(\n refine(\n MarketDetailBaseStruct,\n 'positive minimum amounts for tradable markets',\n hasValidMarketMinimums,\n ),\n 'positive margin fractions for tradable markets',\n hasValidMarketMarginFractions,\n);\nconst OrderStruct = type({\n orderIndex: NonNegativeIntegerStruct,\n clientOrderIndex: NonNegativeIntegerStruct,\n marketIndex: NonNegativeIntegerStruct,\n ownerAccountIndex: NonNegativeIntegerStruct,\n initialBaseAmount: PositiveDecimalStringStruct,\n remainingBaseAmount: NonNegativeDecimalStringStruct,\n price: PositiveDecimalStringStruct,\n isAsk: boolean(),\n type: string(),\n timeInForce: string(),\n reduceOnly: union([FiniteNumberStruct, boolean()]),\n status: string(),\n orderExpiry: SafeIntegerStruct,\n timestamp: NonNegativeIntegerStruct,\n triggerPrice: optional(NonNegativeDecimalStringStruct),\n orderId: optional(string()),\n parentOrderIndex: optional(NonNegativeIntegerStruct),\n parentOrderId: optional(string()),\n toCancelOrderId0: optional(string()),\n toTriggerOrderId0: optional(string()),\n toTriggerOrderId1: optional(string()),\n});\nconst TradeStruct = type({\n tradeId: NonNegativeIntegerStruct,\n txHash: string(),\n type: string(),\n marketId: NonNegativeIntegerStruct,\n size: PositiveDecimalStringStruct,\n price: PositiveDecimalStringStruct,\n usdAmount: PositiveDecimalStringStruct,\n askId: NonNegativeIntegerStruct,\n bidId: NonNegativeIntegerStruct,\n askAccountId: NonNegativeIntegerStruct,\n bidAccountId: NonNegativeIntegerStruct,\n isMakerAsk: boolean(),\n timestamp: NonNegativeIntegerStruct,\n askAccountPnl: SignedDecimalStringStruct,\n bidAccountPnl: SignedDecimalStringStruct,\n takerFee: optional(NonNegativeFinancialNumberStruct),\n makerFee: optional(NonNegativeFinancialNumberStruct),\n takerPositionSizeBefore: NonNegativeDecimalStringStruct,\n makerPositionSizeBefore: NonNegativeDecimalStringStruct,\n takerPositionSignChanged: boolean(),\n makerPositionSignChanged: boolean(),\n});\n\nconst ResponseStructs = {\n orderBooks: type({\n ...BaseResponseStruct.schema,\n orderBooks: array(MarketStruct),\n }),\n orderBookDetails: type({\n ...BaseResponseStruct.schema,\n orderBookDetails: array(MarketDetailStruct),\n }),\n account: type({\n ...BaseResponseStruct.schema,\n accounts: array(AccountStruct),\n }),\n accountsByAddress: type({\n ...BaseResponseStruct.schema,\n l1Address: string(),\n subAccounts: array(AccountStruct),\n }),\n apiKeys: type({\n ...BaseResponseStruct.schema,\n apiKeys: array(\n type({\n accountIndex: NonNegativeIntegerStruct,\n apiKeyIndex: NonNegativeIntegerStruct,\n nonce: NonNegativeIntegerStruct,\n publicKey: string(),\n }),\n ),\n }),\n nextNonce: type({\n ...BaseResponseStruct.schema,\n nonce: NonNegativeIntegerStruct,\n }),\n transaction: type({\n ...BaseResponseStruct.schema,\n hash: string(),\n accountIndex: NonNegativeIntegerStruct,\n apiKeyIndex: NonNegativeIntegerStruct,\n nonce: NonNegativeIntegerStruct,\n status: SafeIntegerStruct,\n }),\n sendTransaction: type({\n ...BaseResponseStruct.schema,\n txHash: string(),\n }),\n activeOrders: type({\n ...BaseResponseStruct.schema,\n orders: array(OrderStruct),\n }),\n inactiveOrders: type({\n ...BaseResponseStruct.schema,\n nextCursor: optional(string()),\n orders: array(OrderStruct),\n }),\n deposits: type({\n ...BaseResponseStruct.schema,\n deposits: array(\n type({\n id: string(),\n assetId: NonNegativeIntegerStruct,\n amount: PositiveDecimalStringStruct,\n timestamp: NonNegativeIntegerStruct,\n status: string(),\n l1TxHash: string(),\n }),\n ),\n cursor: optional(string()),\n }),\n withdrawals: type({\n ...BaseResponseStruct.schema,\n withdraws: array(\n type({\n id: string(),\n assetId: NonNegativeIntegerStruct,\n amount: PositiveDecimalStringStruct,\n timestamp: NonNegativeIntegerStruct,\n status: string(),\n type: string(),\n l1TxHash: string(),\n }),\n ),\n cursor: optional(string()),\n }),\n transfers: type({\n ...BaseResponseStruct.schema,\n transfers: array(\n type({\n id: string(),\n assetId: NonNegativeIntegerStruct,\n amount: PositiveDecimalStringStruct,\n fee: NonNegativeDecimalStringStruct,\n timestamp: NonNegativeIntegerStruct,\n type: TransferTypeStruct,\n fromL1Address: string(),\n toL1Address: string(),\n fromAccountIndex: NonNegativeIntegerStruct,\n toAccountIndex: NonNegativeIntegerStruct,\n txHash: string(),\n }),\n ),\n cursor: optional(string()),\n }),\n trades: type({\n ...BaseResponseStruct.schema,\n nextCursor: optional(string()),\n trades: array(TradeStruct),\n }),\n fundings: type({\n ...BaseResponseStruct.schema,\n positionFundings: array(\n type({\n timestamp: NonNegativeIntegerStruct,\n marketId: NonNegativeIntegerStruct,\n fundingId: NonNegativeIntegerStruct,\n change: SignedDecimalStringStruct,\n rate: SignedDecimalStringStruct,\n positionSize: NonNegativeDecimalStringStruct,\n positionSide: string(),\n }),\n ),\n }),\n pnl: type({\n ...BaseResponseStruct.schema,\n resolution: optional(string()),\n pnl: optional(\n array(\n type({\n timestamp: NonNegativeIntegerStruct,\n tradePnl: FiniteNumberStruct,\n inflow: FiniteNumberStruct,\n outflow: FiniteNumberStruct,\n volume: FiniteNumberStruct,\n }),\n ),\n ),\n }),\n candles: type({\n ...BaseResponseStruct.schema,\n r: optional(string()),\n c: optional(\n array(\n type({\n t: NonNegativeIntegerStruct,\n o: FiniteNumberStruct,\n h: FiniteNumberStruct,\n l: FiniteNumberStruct,\n c: FiniteNumberStruct,\n v: FiniteNumberStruct,\n }),\n ),\n ),\n }),\n} as const;\n\n/**\n * Convert a snake_case wire key to camelCase.\n *\n * @param key - Wire key (e.g. `min_base_amount`).\n * @returns camelCase key (e.g. `minBaseAmount`).\n */\nfunction toCamelKey(key: string): string {\n return key.replace(/_([a-z0-9])/gu, (_match, char: string) =>\n char.toUpperCase(),\n );\n}\n\n/**\n * Recursively convert all object keys from snake_case to camelCase.\n * The zkLighter wire format is snake_case; parsed shapes in this package\n * follow camelCase conventions (see types/lighter-types.ts).\n *\n * @param value - Parsed JSON value.\n * @returns The value with camelCase keys.\n */\nexport function convertKeysToCamelCase(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(convertKeysToCamelCase);\n }\n if (value !== null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [\n toCamelKey(key),\n convertKeysToCamelCase(entry),\n ]),\n );\n }\n return value;\n}\n\n/**\n * Error thrown for non-2xx HTTP responses or API-level error codes.\n */\nexport class LighterApiError extends Error {\n readonly code: number | undefined;\n\n constructor(message: string, code?: number) {\n super(message);\n this.name = 'LighterApiError';\n this.code = code;\n }\n}\n\n/**\n * REST client for the zkLighter API.\n */\nexport class LighterClientService {\n readonly #deps: PerpsPlatformDependencies;\n\n readonly #isTestnet: boolean;\n\n #marketsCache: LighterOrderBookMeta[] | null = null;\n\n #marketsCacheTime = 0;\n\n constructor(deps: PerpsPlatformDependencies, config: { isTestnet: boolean }) {\n this.#deps = deps;\n this.#isTestnet = config.isTestnet;\n }\n\n get network(): LighterNetwork {\n return this.#isTestnet ? 'testnet' : 'mainnet';\n }\n\n get baseUrl(): string {\n return getLighterHttpEndpoint(this.network);\n }\n\n /**\n * Fetch market metadata, cached for 5 minutes.\n *\n * @param forceRefresh - Skip the cache and refetch.\n * @returns Market metadata entries.\n */\n async getOrderBooks(forceRefresh = false): Promise<LighterOrderBookMeta[]> {\n const now = Date.now();\n if (\n !forceRefresh &&\n this.#marketsCache &&\n now - this.#marketsCacheTime < MARKETS_CACHE_TTL_MS\n ) {\n return this.#marketsCache;\n }\n\n const response = await this.#get<LighterOrderBooksResponse>(\n '/api/v1/orderBooks',\n ResponseStructs.orderBooks,\n );\n this.#marketsCache = response.orderBooks;\n this.#marketsCacheTime = now;\n return response.orderBooks;\n }\n\n /**\n * Fetch market stats for all markets.\n *\n * @returns Order book details entries.\n */\n async getOrderBookDetails(): Promise<LighterOrderBookDetailsResponse> {\n return await this.#get<LighterOrderBookDetailsResponse>(\n '/api/v1/orderBookDetails',\n ResponseStructs.orderBookDetails,\n );\n }\n\n /**\n * Fetch an account (including positions) by its Lighter index.\n *\n * @param accountIndex - The Lighter account index.\n * @returns Account payload.\n */\n async getAccountByIndex(\n accountIndex: number,\n ): Promise<LighterAccountResponse> {\n return await this.#get<LighterAccountResponse>(\n `/api/v1/account?by=index&value=${accountIndex}`,\n ResponseStructs.account,\n );\n }\n\n /**\n * Discover Lighter accounts owned by an L1 address.\n *\n * @param l1Address - The owning EVM address.\n * @returns Accounts payload.\n */\n async getAccountsByL1Address(\n l1Address: string,\n ): Promise<LighterAccountsByL1AddressResponse> {\n return await this.#get<LighterAccountsByL1AddressResponse>(\n `/api/v1/accountsByL1Address?l1_address=${l1Address}`,\n ResponseStructs.accountsByAddress,\n );\n }\n\n /**\n * Fetch registered API keys for an account.\n *\n * @param accountIndex - The Lighter account index.\n * @param apiKeyIndex - Key slot, or 255 for all slots.\n * @returns API keys payload.\n */\n async getApiKeys(\n accountIndex: number,\n apiKeyIndex = 255,\n ): Promise<LighterApiKeysResponse> {\n return await this.#get<LighterApiKeysResponse>(\n `/api/v1/apikeys?account_index=${accountIndex}&api_key_index=${apiKeyIndex}`,\n ResponseStructs.apiKeys,\n );\n }\n\n /**\n * Fetch the next nonce for a key slot.\n *\n * @param accountIndex - The Lighter account index.\n * @param apiKeyIndex - Key slot.\n * @returns Next nonce payload.\n */\n async getNextNonce(\n accountIndex: number,\n apiKeyIndex: number,\n ): Promise<LighterNextNonceResponse> {\n return await this.#get<LighterNextNonceResponse>(\n `/api/v1/nextNonce?account_index=${accountIndex}&api_key_index=${apiKeyIndex}`,\n ResponseStructs.nextNonce,\n );\n }\n\n /**\n * Look up a transaction by its exact hash (`GET /api/v1/tx`). Used to\n * resolve submission-acceptance ambiguity authoritatively: an exact-hash\n * match proves the signed payload reached the sequencer.\n *\n * Contract: a venue-confirmed \"transaction not found\" (API error code\n * 21500) resolves to NULL; transport failures and every other API error\n * RETHROW — they are ambiguity, never evidence of non-acceptance.\n *\n * @param txHash - The signed transaction hash.\n * @returns The venue's transaction payload, or null when the venue\n * confirms the hash is unknown.\n */\n async getTx(txHash: string): Promise<LighterTxLookupResponse | null> {\n try {\n return await this.#get<LighterTxLookupResponse>(\n `/api/v1/tx?by=hash&value=${encodeURIComponent(txHash)}`,\n ResponseStructs.transaction,\n );\n } catch (error) {\n if (error instanceof LighterApiError && error.code === 21500) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Fetch active (open) orders for an account.\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer (`_createAuthToken`).\n * @param marketId - Optional market filter (255 = all markets).\n * @returns Active orders payload.\n */\n async getActiveOrders(\n accountIndex: number,\n authToken: string,\n marketId = 255,\n ): Promise<LighterActiveOrdersResponse> {\n return await this.#get<LighterActiveOrdersResponse>(\n `/api/v1/accountActiveOrders?account_index=${accountIndex}&market_id=${marketId}`,\n ResponseStructs.activeOrders,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch historical (inactive) orders: filled and canceled lifecycle\n * states, newest first (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param limit - Maximum entries per page.\n * @param cursor - Pagination cursor from a previous page's `nextCursor`.\n * @param marketId - Optional market filter (official `market_id` query\n * param) — sharply bounds history scans to one symbol.\n * @returns Inactive orders payload.\n */\n async getInactiveOrders(\n accountIndex: number,\n authToken: string,\n limit = 50,\n cursor?: string,\n marketId?: number,\n ): Promise<LighterInactiveOrdersResponse> {\n return await this.#get<LighterInactiveOrdersResponse>(\n `/api/v1/accountInactiveOrders?account_index=${accountIndex}&limit=${limit}${\n cursor === undefined ? '' : `&cursor=${encodeURIComponent(cursor)}`\n }${marketId === undefined ? '' : `&market_id=${marketId}`}`,\n ResponseStructs.inactiveOrders,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch L1→L2 deposit history (auth token required). The venue requires\n * both the account index and its L1 address on this endpoint.\n *\n * @param accountIndex - The Lighter account index.\n * @param l1Address - The account's L1 address.\n * @param authToken - Auth token minted by the signer.\n * @returns Deposit history payload (newest first, cursor-paged).\n */\n async getDepositHistory(\n accountIndex: number,\n l1Address: string,\n authToken: string,\n ): Promise<LighterDepositHistoryResponse> {\n return await this.#get<LighterDepositHistoryResponse>(\n `/api/v1/deposit/history?account_index=${accountIndex}&l1_address=${l1Address}`,\n ResponseStructs.deposits,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch L2→L1 withdrawal history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @returns Withdrawal history payload (newest first, cursor-paged).\n */\n async getWithdrawHistory(\n accountIndex: number,\n authToken: string,\n ): Promise<LighterWithdrawHistoryResponse> {\n return await this.#get<LighterWithdrawHistoryResponse>(\n `/api/v1/withdraw/history?account_index=${accountIndex}`,\n ResponseStructs.withdrawals,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch L2 transfer history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @returns Transfer history payload (newest first, cursor-paged).\n */\n async getTransferHistory(\n accountIndex: number,\n authToken: string,\n ): Promise<LighterTransferHistoryResponse> {\n return await this.#get<LighterTransferHistoryResponse>(\n `/api/v1/transfer/history?account_index=${accountIndex}`,\n ResponseStructs.transfers,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch account trade history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param query - Pagination, range, and market filters.\n * @returns Trades payload (newest first).\n */\n async getTrades(\n accountIndex: number,\n authToken: string,\n query: LighterTradesQuery,\n ): Promise<LighterTradesResponse> {\n const { limit, cursor, from, marketId } = query;\n return await this.#get<LighterTradesResponse>(\n `/api/v1/trades?sort_by=timestamp&sort_dir=desc&limit=${limit}&account_index=${accountIndex}&market_type=perp${\n cursor === undefined ? '' : `&cursor=${encodeURIComponent(cursor)}`\n }${from === undefined ? '' : `&from=${from}`}${\n marketId === undefined ? '' : `&market_id=${marketId}`\n }`,\n ResponseStructs.trades,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch user funding payment history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param limit - Max entries.\n * @returns Position fundings payload.\n */\n async getPositionFundings(\n accountIndex: number,\n authToken: string,\n limit = 50,\n ): Promise<LighterPositionFundingsResponse> {\n return await this.#get<LighterPositionFundingsResponse>(\n `/api/v1/positionFunding?account_index=${accountIndex}&market_id=255&limit=${limit}&sort_by=timestamp&side=all`,\n ResponseStructs.fundings,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch account PnL history (auth token required).\n *\n * @param accountIndex - The Lighter account index.\n * @param authToken - Auth token minted by the signer.\n * @param startTimestamp - Range start (ms).\n * @param endTimestamp - Range end (ms).\n * @param countBack - Records counted back from range end.\n * @returns PnL payload.\n */\n async getPnl(\n accountIndex: number,\n authToken: string,\n startTimestamp: number,\n endTimestamp: number,\n countBack: number,\n ): Promise<LighterPnlResponse> {\n return await this.#get<LighterPnlResponse>(\n `/api/v1/pnl?by=index&value=${accountIndex}&resolution=1d&count_back=${countBack}&start_timestamp=${startTimestamp}&end_timestamp=${endTimestamp}`,\n ResponseStructs.pnl,\n { authorization: authToken },\n );\n }\n\n /**\n * Fetch an OHLCV candle series for a market.\n *\n * @param marketId - Numeric Lighter market id.\n * @param resolution - Candle resolution (e.g. `1m`, `15m`, `1h`, `1d`).\n * @param startTimestamp - Range start (ms).\n * @param endTimestamp - Range end (ms).\n * @param countBack - Number of candles counted back from the range end.\n * @returns Candle series payload.\n */\n async getCandles(\n marketId: number,\n resolution: string,\n startTimestamp: number,\n endTimestamp: number,\n countBack: number,\n ): Promise<LighterCandlesResponse> {\n return await this.#get<LighterCandlesResponse>(\n `/api/v1/candles?market_id=${marketId}&resolution=${resolution}&start_timestamp=${startTimestamp}&end_timestamp=${endTimestamp}&count_back=${countBack}`,\n ResponseStructs.candles,\n );\n }\n\n /**\n * Submit a signed L2 transaction.\n *\n * @param txType - L2 transaction type code (see lighterConfig).\n * @param txInfo - Serialized signed transaction JSON.\n * @returns Send result payload.\n */\n async sendTx(txType: number, txInfo: string): Promise<LighterSendTxResponse> {\n const body = new URLSearchParams({\n tx_type: String(txType),\n tx_info: txInfo,\n });\n\n const response = await this.#request<LighterSendTxResponse>(\n '/api/v1/sendTx',\n {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n },\n ResponseStructs.sendTransaction,\n );\n return response;\n }\n\n readonly #get = async <Result extends { code: number; message?: string }>(\n path: string,\n responseStruct: Struct<Result, unknown>,\n headers?: Record<string, string>,\n ): Promise<Result> => {\n return await this.#request<Result>(\n path,\n { method: 'GET', headers },\n responseStruct,\n );\n };\n\n readonly #request = async <Result extends { code: number; message?: string }>(\n path: string,\n init: { method: string; headers?: Record<string, string>; body?: string },\n responseStruct: Struct<Result, unknown>,\n ): Promise<Result> => {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n LIGHTER_HTTP_TIMEOUT_MS,\n );\n\n try {\n const response = await fetch(url, {\n method: init.method,\n headers: init.headers,\n body: init.body,\n signal: controller.signal,\n });\n\n const payload: unknown = convertKeysToCamelCase(await response.json());\n assert(payload, BaseResponseStruct);\n\n // Lighter returns HTTP 200 with an application-level error code, and\n // 4xx/5xx with `{code, message}` bodies — treat both uniformly.\n if (!response.ok || payload.code !== 200) {\n throw new LighterApiError(\n payload.message ?? `Lighter API error (HTTP ${response.status})`,\n payload.code ?? response.status,\n );\n }\n try {\n assert(payload, responseStruct);\n } catch (error) {\n throw new LighterApiError(\n `${LIGHTER_DATA_INTEGRITY_PREFIX} response for ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return payload;\n } catch (error) {\n if (error instanceof LighterApiError) {\n throw error;\n }\n this.#deps.debugLogger?.log?.('LighterClientService request failed', {\n url,\n error,\n });\n throw new LighterApiError(\n error instanceof Error ? error.message : String(error),\n );\n } finally {\n clearTimeout(timeout);\n }\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LighterClientService.d.cts","sourceRoot":"","sources":["../../src/services/LighterClientService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LighterClientService.d.cts","sourceRoot":"","sources":["../../src/services/LighterClientService.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LighterClientService.d.mts","sourceRoot":"","sources":["../../src/services/LighterClientService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LighterClientService.d.mts","sourceRoot":"","sources":["../../src/services/LighterClientService.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
27
27
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
28
28
  };
29
29
  var _LighterClientService_deps, _LighterClientService_isTestnet, _LighterClientService_marketsCache, _LighterClientService_marketsCacheTime, _LighterClientService_get, _LighterClientService_request;
30
- import { array, assert, boolean, define, optional, record, string, type, union } from "@metamask/superstruct";
30
+ import { array, assert, boolean, define, optional, record, refine, string, type, union } from "@metamask/superstruct";
31
31
  import { getLighterHttpEndpoint, LIGHTER_DATA_INTEGRITY_PREFIX, LIGHTER_HTTP_TIMEOUT_MS } from "../constants/lighterConfig.mjs";
32
32
  /**
33
33
  * Duration market metadata stays cached before a refetch.
@@ -57,9 +57,9 @@ const PositiveDecimalStringStruct = define('positive finite decimal string', (va
57
57
  return parsed !== null && parsed > 0;
58
58
  });
59
59
  const NonNegativeFiniteNumberStruct = define('non-negative finite number', (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0);
60
- const MarginFractionStruct = define('margin fraction in (0, 10000]', (value) => typeof value === 'number' &&
60
+ const NonNegativeMarginFractionStruct = define('margin fraction in [0, 10000]', (value) => typeof value === 'number' &&
61
61
  Number.isSafeInteger(value) &&
62
- value >= 1 &&
62
+ value >= 0 &&
63
63
  value <= 10000);
64
64
  const NonNegativeFinancialNumberStruct = union([
65
65
  NonNegativeFiniteNumberStruct,
@@ -96,25 +96,31 @@ const AccountStruct = type({
96
96
  availableBalance: NonNegativeDecimalStringStruct,
97
97
  positions: optional(array(PositionStruct)),
98
98
  });
99
- const MarketStruct = type({
99
+ const MarketBaseStruct = type({
100
100
  symbol: string(),
101
101
  marketId: NonNegativeIntegerStruct,
102
102
  marketType: string(),
103
103
  status: string(),
104
104
  takerFee: SignedDecimalStringStruct,
105
105
  makerFee: SignedDecimalStringStruct,
106
- minBaseAmount: PositiveDecimalStringStruct,
107
- minQuoteAmount: PositiveDecimalStringStruct,
106
+ minBaseAmount: NonNegativeDecimalStringStruct,
107
+ minQuoteAmount: NonNegativeDecimalStringStruct,
108
108
  supportedSizeDecimals: NonNegativeIntegerStruct,
109
109
  supportedPriceDecimals: NonNegativeIntegerStruct,
110
110
  supportedQuoteDecimals: NonNegativeIntegerStruct,
111
111
  });
112
- const MarketDetailStruct = type({
113
- ...MarketStruct.schema,
112
+ const hasValidMarketMinimums = (market) => market.status === 'inactive' ||
113
+ [market.minBaseAmount, market.minQuoteAmount].every((value) => {
114
+ const parsed = parseStrictDecimalString(value);
115
+ return parsed !== null && parsed > 0;
116
+ });
117
+ const MarketStruct = refine(MarketBaseStruct, 'positive minimum amounts for tradable markets', hasValidMarketMinimums);
118
+ const MarketDetailBaseStruct = type({
119
+ ...MarketBaseStruct.schema,
114
120
  lastTradePrice: NonNegativeFiniteNumberStruct,
115
- defaultInitialMarginFraction: optional(MarginFractionStruct),
116
- minInitialMarginFraction: optional(MarginFractionStruct),
117
- maintenanceMarginFraction: optional(MarginFractionStruct),
121
+ defaultInitialMarginFraction: optional(NonNegativeMarginFractionStruct),
122
+ minInitialMarginFraction: optional(NonNegativeMarginFractionStruct),
123
+ maintenanceMarginFraction: optional(NonNegativeMarginFractionStruct),
118
124
  dailyTradesCount: NonNegativeFiniteNumberStruct,
119
125
  dailyBaseTokenVolume: NonNegativeFiniteNumberStruct,
120
126
  dailyQuoteTokenVolume: NonNegativeFiniteNumberStruct,
@@ -124,6 +130,13 @@ const MarketDetailStruct = type({
124
130
  openInterest: NonNegativeFiniteNumberStruct,
125
131
  dailyChart: record(string(), FiniteNumberStruct),
126
132
  });
133
+ const hasValidMarketMarginFractions = (market) => market.status === 'inactive' ||
134
+ [
135
+ market.defaultInitialMarginFraction,
136
+ market.minInitialMarginFraction,
137
+ market.maintenanceMarginFraction,
138
+ ].every((value) => value === undefined || value > 0);
139
+ const MarketDetailStruct = refine(refine(MarketDetailBaseStruct, 'positive minimum amounts for tradable markets', hasValidMarketMinimums), 'positive margin fractions for tradable markets', hasValidMarketMarginFractions);
127
140
  const OrderStruct = type({
128
141
  orderIndex: NonNegativeIntegerStruct,
129
142
  clientOrderIndex: NonNegativeIntegerStruct,