@andy-liquid-labs/lighter-ts-sdk 1.0.0
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 +381 -0
- package/dist/index.d.mts +3686 -0
- package/dist/index.d.ts +3686 -0
- package/dist/index.js +6168 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5939 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +57 -0
- package/src/api/exchange/change-account-tier.ts +38 -0
- package/src/api/exchange/fastwithdraw.ts +38 -0
- package/src/api/exchange/index.ts +7 -0
- package/src/api/exchange/notification-ack.ts +36 -0
- package/src/api/exchange/send-tx-batch.ts +53 -0
- package/src/api/exchange/send-tx.ts +105 -0
- package/src/api/exchange/tokens-create.ts +50 -0
- package/src/api/exchange/tokens-revoke.ts +38 -0
- package/src/api/index.ts +3 -0
- package/src/api/info/account-by-l1-address.ts +23 -0
- package/src/api/info/account.ts +80 -0
- package/src/api/info/announcement.ts +24 -0
- package/src/api/info/api-keys.ts +32 -0
- package/src/api/info/asset-details.ts +42 -0
- package/src/api/info/candles.ts +31 -0
- package/src/api/info/exchange-stats.ts +16 -0
- package/src/api/info/fastbridge-info.ts +15 -0
- package/src/api/info/funding-rates.ts +22 -0
- package/src/api/info/fundings.ts +29 -0
- package/src/api/info/index.ts +20 -0
- package/src/api/info/next-nonce.ts +26 -0
- package/src/api/info/order-book-details.ts +125 -0
- package/src/api/info/order-books.ts +23 -0
- package/src/api/info/recent-trades.ts +24 -0
- package/src/api/info/root-info.ts +13 -0
- package/src/api/info/root-status.ts +13 -0
- package/src/api/info/tx-from-l1-hash.ts +20 -0
- package/src/api/info/tx.ts +45 -0
- package/src/api/info/txs.ts +19 -0
- package/src/api/info/withdrawal-delay.ts +13 -0
- package/src/api/info-private/account-active-orders.ts +31 -0
- package/src/api/info-private/account-inactive-orders.ts +83 -0
- package/src/api/info-private/account-limits.ts +35 -0
- package/src/api/info-private/account-metadata.ts +43 -0
- package/src/api/info-private/deposit-history.ts +49 -0
- package/src/api/info-private/export.ts +41 -0
- package/src/api/info-private/fastwithdraw-info.ts +35 -0
- package/src/api/info-private/index.ts +18 -0
- package/src/api/info-private/l1-metadata.ts +35 -0
- package/src/api/info-private/liquidations.ts +96 -0
- package/src/api/info-private/pnl.ts +52 -0
- package/src/api/info-private/position-funding.ts +54 -0
- package/src/api/info-private/public-pools-metadata.ts +46 -0
- package/src/api/info-private/referral-points.ts +43 -0
- package/src/api/info-private/tokens.ts +44 -0
- package/src/api/info-private/trades.ts +66 -0
- package/src/api/info-private/transfer-fee-info.ts +37 -0
- package/src/api/info-private/transfer-history.ts +54 -0
- package/src/api/info-private/withdraw-history.ts +49 -0
- package/src/client/clientManager.ts +121 -0
- package/src/client/exchange-client.ts +637 -0
- package/src/client/http/client.ts +137 -0
- package/src/client/http/index.ts +6 -0
- package/src/client/http/interface.ts +89 -0
- package/src/client/index.ts +11 -0
- package/src/client/info-client.ts +383 -0
- package/src/client/info-private-client.ts +444 -0
- package/src/client/txClient.ts +597 -0
- package/src/client/ws-client.ts +457 -0
- package/src/crypto/ecgfp5.ts +722 -0
- package/src/crypto/goldilocks.ts +136 -0
- package/src/crypto/gorand.ts +777 -0
- package/src/crypto/index.ts +6 -0
- package/src/crypto/poseidon2.ts +365 -0
- package/src/crypto/scalar.ts +375 -0
- package/src/index.ts +112 -0
- package/src/signer/index.ts +5 -0
- package/src/signer/keyManager.ts +132 -0
- package/src/types/bridge.ts +24 -0
- package/src/types/constants.ts +252 -0
- package/src/types/errors.ts +168 -0
- package/src/types/index.ts +12 -0
- package/src/types/requests.ts +197 -0
- package/src/types/txInfo.ts +1277 -0
- package/src/types/txInfoPools.ts +502 -0
- package/src/types/txInfoSerializer.ts +348 -0
- package/src/types/ws.ts +407 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/http/client.ts","../src/crypto/goldilocks.ts","../src/crypto/poseidon2.ts","../src/crypto/ecgfp5.ts","../src/crypto/gorand.ts","../src/crypto/scalar.ts","../src/signer/keyManager.ts","../src/types/constants.ts","../src/types/errors.ts","../src/types/txInfo.ts","../src/types/txInfoPools.ts","../src/types/txInfoSerializer.ts","../src/client/txClient.ts","../src/client/clientManager.ts","../src/client/info-client.ts","../src/api/info/index.ts","../src/api/info/account.ts","../src/api/info/account-by-l1-address.ts","../src/api/info/announcement.ts","../src/api/info/api-keys.ts","../src/api/info/asset-details.ts","../src/api/info/candles.ts","../src/api/info/exchange-stats.ts","../src/api/info/fastbridge-info.ts","../src/api/info/funding-rates.ts","../src/api/info/fundings.ts","../src/api/info/next-nonce.ts","../src/api/info/order-book-details.ts","../src/api/info/order-books.ts","../src/api/info/recent-trades.ts","../src/api/info/root-info.ts","../src/api/info/root-status.ts","../src/api/info/tx.ts","../src/api/info/tx-from-l1-hash.ts","../src/api/info/txs.ts","../src/api/info/withdrawal-delay.ts","../src/client/info-private-client.ts","../src/api/info-private/index.ts","../src/api/info-private/account-active-orders.ts","../src/api/info-private/account-inactive-orders.ts","../src/api/info-private/account-limits.ts","../src/api/info-private/account-metadata.ts","../src/api/info-private/deposit-history.ts","../src/api/info-private/export.ts","../src/api/info-private/fastwithdraw-info.ts","../src/api/info-private/l1-metadata.ts","../src/api/info-private/liquidations.ts","../src/api/info-private/pnl.ts","../src/api/info-private/position-funding.ts","../src/api/info-private/public-pools-metadata.ts","../src/api/info-private/referral-points.ts","../src/api/info-private/tokens.ts","../src/api/info-private/trades.ts","../src/api/info-private/transfer-fee-info.ts","../src/api/info-private/transfer-history.ts","../src/api/info-private/withdraw-history.ts","../src/client/exchange-client.ts","../src/api/exchange/index.ts","../src/api/exchange/change-account-tier.ts","../src/api/exchange/fastwithdraw.ts","../src/api/exchange/notification-ack.ts","../src/api/exchange/send-tx.ts","../src/api/exchange/send-tx-batch.ts","../src/api/exchange/tokens-create.ts","../src/api/exchange/tokens-revoke.ts","../src/client/ws-client.ts"],"sourcesContent":["/**\n * HTTP Client implementation for Lighter API\n */\n\nimport {\n MinimalHTTPClient,\n NextNonceResponse,\n AccountApiKeysResponse,\n GetAccountResponse,\n LighterAccount,\n} from './interface';\n\nconst CODE_OK = 200;\n\n/**\n * HTTP Client for Lighter exchange API\n */\nexport class HttpClient implements MinimalHTTPClient {\n private readonly endpoint: string;\n private readonly timeout: number;\n\n constructor(baseUrl: string, timeout: number = 30000) {\n if (!baseUrl) {\n throw new Error('Base URL is required');\n }\n this.endpoint = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n this.timeout = timeout;\n }\n\n /**\n * Make a GET request to the API\n */\n private async get<T>(\n path: string,\n params: Record<string, string | number | bigint>\n ): Promise<T> {\n const url = new URL(path, this.endpoint);\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, String(value));\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n\n const data = (await response.json()) as T & { code?: number; message?: string };\n\n // Check result code\n if (data.code !== undefined && data.code !== CODE_OK) {\n throw new Error(data.message || `API error: ${data.code}`);\n }\n\n return data;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Get the next nonce for an account and API key\n */\n async getNextNonce(accountIndex: bigint, apiKeyIndex: number): Promise<bigint> {\n const result = await this.get<NextNonceResponse>('/api/v1/nextNonce', {\n account_index: accountIndex,\n api_key_index: apiKeyIndex,\n });\n return BigInt(result.nonce);\n }\n\n /**\n * Get the public key for an account and API key\n */\n async getApiKey(accountIndex: bigint, apiKeyIndex: number): Promise<string> {\n const result = await this.get<AccountApiKeysResponse>('/api/v1/apikeys', {\n account_index: accountIndex,\n api_key_index: apiKeyIndex,\n });\n\n if (!result.api_keys || result.api_keys.length === 0) {\n throw new Error('No API keys returned');\n }\n\n return result.api_keys[0].public_key;\n }\n\n /**\n * Get account information by L1 address or account index\n */\n async getAccount(\n by: 'l1_address' | 'account_index',\n value: string\n ): Promise<LighterAccount[]> {\n const result = await this.get<GetAccountResponse>('/api/v1/account', {\n by,\n value,\n });\n\n return result.accounts ?? [];\n }\n\n /**\n * Get account information by L1 address (convenience method)\n */\n async getAccountByL1Address(l1Address: string): Promise<LighterAccount[]> {\n return this.getAccount('l1_address', l1Address);\n }\n\n /**\n * Get account information by account index (convenience method)\n */\n async getAccountByIndex(accountIndex: string): Promise<LighterAccount[]> {\n return this.getAccount('account_index', accountIndex);\n }\n}\n\n/**\n * Create a new HTTP client\n */\nexport function newHttpClient(baseUrl: string): MinimalHTTPClient | null {\n if (!baseUrl) {\n return null;\n }\n return new HttpClient(baseUrl);\n}\n","/**\n * Goldilocks Prime Field implementation\n * Field modulus: p = 2^64 - 2^32 + 1\n */\n\nexport const GOLDILOCKS_MODULUS = 0xffffffff00000001n;\n\nexport function toCanonicalUint64(x: bigint): bigint {\n return x >= GOLDILOCKS_MODULUS ? x - GOLDILOCKS_MODULUS : x;\n}\n\n/**\n * Goldilocks field element\n */\nexport class GoldilocksElement {\n readonly value: bigint;\n\n constructor(value: bigint) {\n this.value = mod(value, GOLDILOCKS_MODULUS);\n }\n\n add(other: GoldilocksElement): GoldilocksElement {\n return new GoldilocksElement(this.value + other.value);\n }\n\n sub(other: GoldilocksElement): GoldilocksElement {\n return new GoldilocksElement(this.value - other.value + GOLDILOCKS_MODULUS);\n }\n\n mul(other: GoldilocksElement): GoldilocksElement {\n return new GoldilocksElement(this.value * other.value);\n }\n\n square(): GoldilocksElement {\n return this.mul(this);\n }\n\n static fromUint32(value: number): GoldilocksElement {\n return new GoldilocksElement(BigInt(value >>> 0));\n }\n\n static fromInt64(value: bigint): GoldilocksElement {\n // Handle signed values\n if (value < 0n) {\n return new GoldilocksElement(value + GOLDILOCKS_MODULUS);\n }\n return new GoldilocksElement(value);\n }\n\n static fromUint64(value: bigint): GoldilocksElement {\n return new GoldilocksElement(value & 0xffffffffffffffffn);\n }\n\n static zero(): GoldilocksElement {\n return new GoldilocksElement(0n);\n }\n\n static one(): GoldilocksElement {\n return new GoldilocksElement(1n);\n }\n\n toLittleEndianBytes(): Uint8Array {\n const bytes = new Uint8Array(8);\n let val = this.value;\n for (let i = 0; i < 8; i++) {\n bytes[i] = Number(val & 0xffn);\n val >>= 8n;\n }\n return bytes;\n }\n\n static fromLittleEndianBytes(bytes: Uint8Array): GoldilocksElement {\n let value = 0n;\n for (let i = bytes.length - 1; i >= 0; i--) {\n value = (value << 8n) | BigInt(bytes[i]);\n }\n return new GoldilocksElement(value);\n }\n}\n\n/**\n * Modular reduction\n */\nfunction mod(a: bigint, m: bigint): bigint {\n const result = a % m;\n return result >= 0n ? result : result + m;\n}\n\n/**\n * Convert bytes to Goldilocks field elements\n * Each element holds up to 7 bytes of data\n */\nexport function bytesToFieldElements(bytes: Uint8Array): GoldilocksElement[] {\n const elements: GoldilocksElement[] = [];\n const bytesPerElement = 7;\n\n for (let i = 0; i < bytes.length; i += bytesPerElement) {\n const chunk = bytes.slice(i, Math.min(i + bytesPerElement, bytes.length));\n let value = 0n;\n for (let j = chunk.length - 1; j >= 0; j--) {\n value = (value << 8n) | BigInt(chunk[j]);\n }\n elements.push(new GoldilocksElement(value));\n }\n\n return elements;\n}\n\n/**\n * Convert bytes to Goldilocks field elements using canonical little-endian\n * 8-byte chunks, matching ArrayFromCanonicalLittleEndianBytes in Go.\n */\nexport function bytesToFieldElementsCanonicalLE(\n bytes: Uint8Array,\n): GoldilocksElement[] {\n const elements: GoldilocksElement[] = [];\n const bytesPerElement = 8;\n\n for (let i = 0; i < bytes.length; i += bytesPerElement) {\n const chunk = bytes.slice(i, Math.min(i + bytesPerElement, bytes.length));\n let value = 0n;\n for (let j = chunk.length - 1; j >= 0; j--) {\n value = (value << 8n) | BigInt(chunk[j]);\n }\n\n if (value >= GOLDILOCKS_MODULUS) {\n throw new Error(\n `Non-canonical Goldilocks element from bytes: ${value.toString(16)}`,\n );\n }\n\n elements.push(new GoldilocksElement(value));\n }\n\n return elements;\n}\n","/**\n * Poseidon2 hash function over Goldilocks field (Plonky2 variant)\n * \n * This is a correct implementation matching the Go poseidon_crypto library.\n * Constants are taken from the Plonky3/Plonky2 reference implementation.\n */\n\nimport {\n GoldilocksElement,\n GOLDILOCKS_MODULUS,\n bytesToFieldElements,\n} from './goldilocks';\n\n// Configuration constants\nconst WIDTH = 12;\nconst RATE = 8;\nconst D = 7; // S-box exponent\nconst ROUNDS_F = 8;\nconst ROUNDS_F_HALF = 4;\nconst ROUNDS_P = 22;\n\n// External (full) round constants - from Go poseidon_crypto\nconst EXTERNAL_CONSTANTS: bigint[][] = [\n [\n 15492826721047263190n, 11728330187201910315n, 8836021247773420868n, 16777404051263952451n,\n 5510875212538051896n, 6173089941271892285n, 2927757366422211339n, 10340958981325008808n,\n 8541987352684552425n, 9739599543776434497n, 15073950188101532019n, 12084856431752384512n\n ],\n [\n 4584713381960671270n, 8807052963476652830n, 54136601502601741n, 4872702333905478703n,\n 5551030319979516287n, 12889366755535460989n, 16329242193178844328n, 412018088475211848n,\n 10505784623379650541n, 9758812378619434837n, 7421979329386275117n, 375240370024755551n\n ],\n [\n 3331431125640721931n, 15684937309956309981n, 578521833432107983n, 14379242000670861838n,\n 17922409828154900976n, 8153494278429192257n, 15904673920630731971n, 11217863998460634216n,\n 3301540195510742136n, 9937973023749922003n, 3059102938155026419n, 1895288289490976132n\n ],\n [\n 5580912693628927540n, 10064804080494788323n, 9582481583369602410n, 10186259561546797986n,\n 247426333829703916n, 13193193905461376067n, 6386232593701758044n, 17954717245501896472n,\n 1531720443376282699n, 2455761864255501970n, 11234429217864304495n, 4746959618548874102n\n ],\n [\n 13571697342473846203n, 17477857865056504753n, 15963032953523553760n, 16033593225279635898n,\n 14252634232868282405n, 8219748254835277737n, 7459165569491914711n, 15855939513193752003n,\n 16788866461340278896n, 7102224659693946577n, 3024718005636976471n, 13695468978618890430n\n ],\n [\n 8214202050877825436n, 2670727992739346204n, 16259532062589659211n, 11869922396257088411n,\n 3179482916972760137n, 13525476046633427808n, 3217337278042947412n, 14494689598654046340n,\n 15837379330312175383n, 8029037639801151344n, 2153456285263517937n, 8301106462311849241n\n ],\n [\n 13294194396455217955n, 17394768489610594315n, 12847609130464867455n, 14015739446356528640n,\n 5879251655839607853n, 9747000124977436185n, 8950393546890284269n, 10765765936405694368n,\n 14695323910334139959n, 16366254691123000864n, 15292774414889043182n, 10910394433429313384n\n ],\n [\n 17253424460214596184n, 3442854447664030446n, 3005570425335613727n, 10859158614900201063n,\n 9763230642109343539n, 6647722546511515039n, 909012944955815706n, 18101204076790399111n,\n 11588128829349125809n, 15863878496612806566n, 5201119062417750399n, 176665553780565743n\n ]\n];\n\n// Internal (partial) round constants - from Go poseidon_crypto\nconst INTERNAL_CONSTANTS: bigint[] = [\n 11921381764981422944n, 10318423381711320787n, 8291411502347000766n, 229948027109387563n,\n 9152521390190983261n, 7129306032690285515n, 15395989607365232011n, 8641397269074305925n,\n 17256848792241043600n, 6046475228902245682n, 12041608676381094092n, 12785542378683951657n,\n 14546032085337914034n, 3304199118235116851n, 16499627707072547655n, 10386478025625759321n,\n 13475579315436919170n, 16042710511297532028n, 1411266850385657080n, 9024840976168649958n,\n 14047056970978379368n, 838728605080212101n\n];\n\n// Matrix diagonal for internal linear layer - from Plonky3\nconst MATRIX_DIAG_12: bigint[] = [\n 0xc3b6c08e23ba9300n, 0xd84b5de94a324fb6n, 0x0d0c371c5b35b84fn, 0x7964f570e7188037n,\n 0x5daf18bbd996604bn, 0x6743bc47b9595257n, 0x5528b9362c59bb70n, 0xac45e25b7127b68bn,\n 0xa2077d7dfbb606b5n, 0xf3faac6faee378aen, 0x0c6388b51545e883n, 0xd27dbb6944917b60n\n];\n\n/**\n * Goldilocks field modular reduction\n * Uses the special form of p = 2^64 - 2^32 + 1\n */\nfunction mod(x: bigint): bigint {\n // Handle negative numbers\n if (x < 0n) {\n x = ((x % GOLDILOCKS_MODULUS) + GOLDILOCKS_MODULUS) % GOLDILOCKS_MODULUS;\n }\n return x % GOLDILOCKS_MODULUS;\n}\n\n/**\n * Goldilocks addition\n */\nfunction addF(a: bigint, b: bigint): bigint {\n return mod(a + b);\n}\n\n/**\n * Goldilocks multiplication\n */\nfunction mulF(a: bigint, b: bigint): bigint {\n return mod(a * b);\n}\n\n/**\n * Goldilocks squaring\n */\nfunction squareF(x: bigint): bigint {\n return mod(x * x);\n}\n\n/**\n * S-box: x^7\n */\nfunction sboxP(x: bigint): bigint {\n const x2 = squareF(x);\n const x3 = mulF(x2, x);\n const x6 = squareF(x3);\n return mulF(x6, x);\n}\n\n/**\n * Add external round constants\n */\nfunction addRC(state: bigint[], round: number): void {\n for (let i = 0; i < WIDTH; i++) {\n state[i] = addF(state[i], EXTERNAL_CONSTANTS[round][i]);\n }\n}\n\n/**\n * Add internal round constant (only to first element)\n */\nfunction addRCI(state: bigint[], round: number): void {\n state[0] = addF(state[0], INTERNAL_CONSTANTS[round]);\n}\n\n/**\n * Apply S-box to all elements\n */\nfunction sbox(state: bigint[]): void {\n for (let i = 0; i < WIDTH; i++) {\n state[i] = sboxP(state[i]);\n }\n}\n\n/**\n * External linear layer (used in full rounds)\n * Based on gnark-crypto goldilocks Poseidon2 implementation (NOT Plonky2)\n */\nfunction externalLinearLayer(state: bigint[]): void {\n // Process three 4-element windows\n for (let i = 0; i < 3; i++) {\n const base = 4 * i;\n const s0 = state[base];\n const s1 = state[base + 1];\n const s2 = state[base + 2];\n const s3 = state[base + 3];\n \n const t0 = addF(s0, s1); // s0+s1\n const t1 = addF(s2, s3); // s2+s3\n const t2 = addF(t0, t1); // t0+t1 = s0+s1+s2+s3\n const t3 = addF(t2, s1); // t2+s1 = s0+2s1+s2+s3\n const t4 = addF(t2, s3); // t2+s3 = s0+s1+s2+2s3\n const t5 = addF(s0, s0); // 2s0 (double)\n const t6 = addF(s2, s2); // 2s2 (double)\n \n state[base] = addF(t3, t0); // t3 + t0\n state[base + 1] = addF(t6, t3); // t6 + t3\n state[base + 2] = addF(t1, t4); // t1 + t4\n state[base + 3] = addF(t5, t4); // t5 + t4\n }\n\n // Then add column sums\n const sums: bigint[] = [0n, 0n, 0n, 0n];\n for (let k = 0; k < 4; k++) {\n for (let j = 0; j < WIDTH; j += 4) {\n sums[k] = addF(sums[k], state[j + k]);\n }\n }\n\n for (let i = 0; i < WIDTH; i++) {\n state[i] = addF(state[i], sums[i % 4]);\n }\n}\n\n/**\n * Internal linear layer (used in partial rounds)\n */\nfunction internalLinearLayer(state: bigint[]): void {\n // Compute sum of all elements\n let sum = 0n;\n for (let i = 0; i < WIDTH; i++) {\n sum = addF(sum, state[i]);\n }\n\n // Apply diagonal multiplication and add sum\n for (let i = 0; i < WIDTH; i++) {\n // state[i] = sum + state[i] * MATRIX_DIAG_12[i]\n state[i] = addF(sum, mulF(state[i], MATRIX_DIAG_12[i]));\n }\n}\n\n/**\n * Full rounds (external rounds)\n */\nfunction fullRounds(state: bigint[], startRound: number): void {\n for (let r = startRound; r < startRound + ROUNDS_F_HALF; r++) {\n addRC(state, r);\n sbox(state);\n externalLinearLayer(state);\n }\n}\n\n/**\n * Partial rounds (internal rounds)\n */\nfunction partialRounds(state: bigint[]): void {\n for (let r = 0; r < ROUNDS_P; r++) {\n addRCI(state, r);\n state[0] = sboxP(state[0]); // S-box only on first element\n internalLinearLayer(state);\n }\n}\n\n/**\n * Poseidon2 permutation\n */\nexport function permute(state: bigint[]): void {\n externalLinearLayer(state);\n fullRounds(state, 0);\n partialRounds(state);\n fullRounds(state, ROUNDS_F_HALF);\n}\n\n/**\n * Hash N field elements to M field elements (no padding)\n */\nfunction hashNToMNoPad(input: bigint[], numOutputs: number): bigint[] {\n const state: bigint[] = new Array(WIDTH).fill(0n);\n\n // Absorb phase\n for (let i = 0; i < input.length; i += RATE) {\n for (let j = 0; j < RATE && i + j < input.length; j++) {\n state[j] = input[i + j];\n }\n permute(state);\n }\n\n // Squeeze phase\n const outputs: bigint[] = [];\n while (outputs.length < numOutputs) {\n for (let i = 0; i < RATE && outputs.length < numOutputs; i++) {\n outputs.push(state[i]);\n }\n if (outputs.length < numOutputs) {\n permute(state);\n }\n }\n\n return outputs;\n}\n\n/**\n * Hash to quintic extension (5 field elements)\n */\nexport function hashToQuinticExtensionElements(input: GoldilocksElement[]): GoldilocksElement[] {\n const inputBigints = input.map(e => e.value);\n const output = hashNToMNoPad(inputBigints, 5);\n return output.map(v => new GoldilocksElement(v));\n}\n\n/**\n * Poseidon2 sponge hash function\n * Compatible with Go HashToQuinticExtension\n */\nexport function poseidon2Hash(inputs: GoldilocksElement[]): GoldilocksElement[] {\n return hashToQuinticExtensionElements(inputs);\n}\n\n/**\n * Hash field elements to a quintic extension element (40 bytes)\n */\nexport function hashToQuinticExtension(\n elements: GoldilocksElement[]\n): Uint8Array {\n const hashResult = poseidon2Hash(elements);\n\n // Convert 5 field elements to 40 bytes\n const result = new Uint8Array(40);\n for (let i = 0; i < 5; i++) {\n const bytes = hashResult[i].toLittleEndianBytes();\n result.set(bytes, i * 8);\n }\n\n return result;\n}\n\n/**\n * Hash bytes to a quintic extension element\n */\nexport function hashBytesToQuinticExtension(bytes: Uint8Array): Uint8Array {\n const elements = bytesToFieldElements(bytes);\n return hashToQuinticExtension(elements);\n}\n\n\n\n/**\n * Hash N field elements to 4 field elements (HashOut)\n * Compatible with Go HashNoPad / HashNToHashNoPad\n */\nexport function hashNoPad(input: GoldilocksElement[]): GoldilocksElement[] {\n const inputBigints = input.map(e => e.value);\n const output = hashNToMNoPad(inputBigints, 4);\n return output.map(v => new GoldilocksElement(v));\n}\n\n/**\n * Hash two HashOut values together (8 elements -> 4 elements)\n * Compatible with Go HashTwoToOne\n */\nexport function hashTwoToOne(hash1: GoldilocksElement[], hash2: GoldilocksElement[]): GoldilocksElement[] {\n if (hash1.length !== 4 || hash2.length !== 4) {\n throw new Error('hashTwoToOne requires two 4-element arrays');\n }\n const combined = [...hash1, ...hash2];\n return hashNoPad(combined);\n}\n\n/**\n * Aggregate multiple HashOut values into one\n * Compatible with Go HashNToOne\n */\nexport function hashNToOne(hashes: GoldilocksElement[][]): GoldilocksElement[] {\n if (hashes.length === 0) {\n throw new Error('hashNToOne requires at least one HashOut (4-element array)');\n }\n if (hashes.length === 1) {\n return hashes[0];\n }\n\n let result = hashTwoToOne(hashes[0], hashes[1]);\n for (let i = 2; i < hashes.length; i++) {\n result = hashTwoToOne(result, hashes[i]);\n }\n return result;\n}\n\n/**\n * Create an empty HashOut (4 zero elements)\n * Compatible with Go EmptyHashOut\n */\nexport function emptyHashOut(): GoldilocksElement[] {\n return [\n new GoldilocksElement(0n),\n new GoldilocksElement(0n),\n new GoldilocksElement(0n),\n new GoldilocksElement(0n)\n ];\n}","/**\n * ECgFp5 Elliptic Curve Implementation\n * \n * This implements the ECgFp5 curve used in the Lighter protocol for Schnorr signatures.\n * ECgFp5 is an elliptic curve defined over the quintic extension of the Goldilocks field.\n * \n * Key properties:\n * - Prime order (no cofactor) - eliminates small subgroup attacks\n * - Complete addition formulas\n * - Canonical point encoding\n * \n * Reference: https://github.com/pornin/ecgfp5\n */\n\nimport { GoldilocksElement, GOLDILOCKS_MODULUS } from './goldilocks';\nimport { poseidon2Hash } from './poseidon2';\nimport {sha256} from \"js-sha256\";\nimport {goRandBigInt, GoRandSource} from \"./gorand\";\nimport { ORDER } from \"./scalar\";\n\n// The group order (prime) of ECgFp5, approximately 2^319\n// ORDER = 1067993516717146951041484916571792702745057740581727230159139685185762082554198619328292418486241\nexport const SCALAR_ORDER = 1067993516717146951041484916571792702745057740581727230159139685185762082554198619328292418486241n;\n\n// W constant for quintic extension: x^5 - 3 = 0\nconst FP5_W = 3n;\n\n// d-th root constant for Frobenius\nconst FP5_DTH_ROOT = 1041288259238279555n;\n\n/**\n * GFp5 Element - Quintic extension of Goldilocks field\n * Represents elements as polynomials a0 + a1*x + a2*x^2 + a3*x^3 + a4*x^4 mod (x^5 - 3)\n */\nexport class GFp5Element {\n readonly coeffs: bigint[]; // 5 coefficients in Goldilocks field\n\n constructor(coeffs: bigint[]) {\n if (coeffs.length !== 5) {\n throw new Error('GFp5Element requires exactly 5 coefficients');\n }\n this.coeffs = coeffs.map(c => mod(c, GOLDILOCKS_MODULUS));\n }\n\n static zero(): GFp5Element {\n return new GFp5Element([0n, 0n, 0n, 0n, 0n]);\n }\n\n static one(): GFp5Element {\n return new GFp5Element([1n, 0n, 0n, 0n, 0n]);\n }\n\n static two(): GFp5Element {\n return new GFp5Element([2n, 0n, 0n, 0n, 0n]);\n }\n\n isZero(): boolean {\n return this.coeffs.every(c => c === 0n);\n }\n\n equals(other: GFp5Element): boolean {\n for (let i = 0; i < 5; i++) {\n if (this.coeffs[i] !== other.coeffs[i]) return false;\n }\n return true;\n }\n\n neg(): GFp5Element {\n return new GFp5Element(this.coeffs.map(c => mod(-c, GOLDILOCKS_MODULUS)));\n }\n\n add(other: GFp5Element): GFp5Element {\n const result: bigint[] = [];\n for (let i = 0; i < 5; i++) {\n result.push(mod(this.coeffs[i] + other.coeffs[i], GOLDILOCKS_MODULUS));\n }\n return new GFp5Element(result);\n }\n\n sub(other: GFp5Element): GFp5Element {\n const result: bigint[] = [];\n for (let i = 0; i < 5; i++) {\n result.push(mod(this.coeffs[i] - other.coeffs[i], GOLDILOCKS_MODULUS));\n }\n return new GFp5Element(result);\n }\n\n double(): GFp5Element {\n return this.add(this);\n }\n\n /**\n * Multiply two GFp5 elements\n * Uses the reduction rule: x^5 = 3 (since x^5 - 3 = 0)\n */\n mul(other: GFp5Element): GFp5Element {\n const a = this.coeffs;\n const b = other.coeffs;\n const w = FP5_W;\n\n // c0 = a0*b0 + w*(a1*b4 + a2*b3 + a3*b2 + a4*b1)\n const a0b0 = mulMod(a[0], b[0]);\n const a1b4 = mulMod(a[1], b[4]);\n const a2b3 = mulMod(a[2], b[3]);\n const a3b2 = mulMod(a[3], b[2]);\n const a4b1 = mulMod(a[4], b[1]);\n const c0 = addMod(a0b0, mulMod(w, addMod(addMod(a1b4, a2b3), addMod(a3b2, a4b1))));\n\n // c1 = a0*b1 + a1*b0 + w*(a2*b4 + a3*b3 + a4*b2)\n const a0b1 = mulMod(a[0], b[1]);\n const a1b0 = mulMod(a[1], b[0]);\n const a2b4 = mulMod(a[2], b[4]);\n const a3b3 = mulMod(a[3], b[3]);\n const a4b2 = mulMod(a[4], b[2]);\n const c1 = addMod(addMod(a0b1, a1b0), mulMod(w, addMod(addMod(a2b4, a3b3), a4b2)));\n\n // c2 = a0*b2 + a1*b1 + a2*b0 + w*(a3*b4 + a4*b3)\n const a0b2 = mulMod(a[0], b[2]);\n const a1b1 = mulMod(a[1], b[1]);\n const a2b0 = mulMod(a[2], b[0]);\n const a3b4 = mulMod(a[3], b[4]);\n const a4b3 = mulMod(a[4], b[3]);\n const c2 = addMod(addMod(a0b2, a1b1), addMod(a2b0, mulMod(w, addMod(a3b4, a4b3))));\n\n // c3 = a0*b3 + a1*b2 + a2*b1 + a3*b0 + w*a4*b4\n const a0b3 = mulMod(a[0], b[3]);\n const a1b2 = mulMod(a[1], b[2]);\n const a2b1 = mulMod(a[2], b[1]);\n const a3b0 = mulMod(a[3], b[0]);\n const a4b4 = mulMod(a[4], b[4]);\n const c3 = addMod(addMod(addMod(a0b3, a1b2), addMod(a2b1, a3b0)), mulMod(w, a4b4));\n\n // c4 = a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0\n const a0b4 = mulMod(a[0], b[4]);\n const a1b3 = mulMod(a[1], b[3]);\n const a2b2 = mulMod(a[2], b[2]);\n const a3b1 = mulMod(a[3], b[1]);\n const a4b0 = mulMod(a[4], b[0]);\n const c4 = addMod(addMod(addMod(a0b4, a1b3), addMod(a2b2, a3b1)), a4b0);\n\n return new GFp5Element([c0, c1, c2, c3, c4]);\n }\n\n square(): GFp5Element {\n const a = this.coeffs;\n const w = FP5_W;\n const double_w = addMod(w, w);\n\n const a0s = mulMod(a[0], a[0]);\n const a1a4 = mulMod(a[1], a[4]);\n const a2a3 = mulMod(a[2], a[3]);\n const c0 = addMod(a0s, mulMod(double_w, addMod(a1a4, a2a3)));\n\n const a0Double = addMod(a[0], a[0]);\n const c1 = addMod(\n addMod(mulMod(a0Double, a[1]), mulMod(mulMod(a[2], a[4]), double_w)),\n mulMod(mulMod(a[3], a[3]), w)\n );\n\n const c2 = addMod(\n addMod(mulMod(a0Double, a[2]), mulMod(a[1], a[1])),\n mulMod(mulMod(a[4], a[3]), double_w)\n );\n\n const a1Double = addMod(a[1], a[1]);\n const c3 = addMod(\n addMod(mulMod(a0Double, a[3]), mulMod(a1Double, a[2])),\n mulMod(mulMod(a[4], a[4]), w)\n );\n\n const c4 = addMod(\n addMod(mulMod(a0Double, a[4]), mulMod(a1Double, a[3])),\n mulMod(a[2], a[2])\n );\n\n return new GFp5Element([c0, c1, c2, c3, c4]);\n }\n\n /**\n * Scalar multiplication\n */\n scalarMul(scalar: bigint): GFp5Element {\n return new GFp5Element(this.coeffs.map(c => mulMod(c, scalar)));\n }\n\n /**\n * Compute self^(2^power)\n */\n expPowerOf2(power: number): GFp5Element {\n let res: GFp5Element = new GFp5Element([...this.coeffs]);\n for (let i = 0; i < power; i++) {\n res = res.square();\n }\n return res;\n }\n\n /**\n * Frobenius endomorphism: x -> x^p\n */\n frobenius(): GFp5Element {\n return this.repeatedFrobenius(1);\n }\n\n repeatedFrobenius(count: number): GFp5Element {\n if (count === 0) return this;\n count = count % 5;\n if (count === 0) return this;\n\n let z0 = FP5_DTH_ROOT;\n for (let i = 1; i < count; i++) {\n z0 = mulMod(FP5_DTH_ROOT, z0);\n }\n\n const powers = goldilocksP(z0, 5);\n const result: bigint[] = [];\n for (let i = 0; i < 5; i++) {\n result.push(mulMod(this.coeffs[i], powers[i]));\n }\n return new GFp5Element(result);\n }\n\n /**\n * Compute multiplicative inverse (or zero if input is zero)\n */\n inverseOrZero(): GFp5Element {\n if (this.isZero()) return GFp5Element.zero();\n\n const d = this.frobenius();\n const e = d.mul(d.frobenius());\n const f = e.mul(e.repeatedFrobenius(2));\n\n // Compute the norm in the base field\n const a = this.coeffs;\n const fCoeffs = f.coeffs;\n\n const a0b0 = mulMod(a[0], fCoeffs[0]);\n const a1b4 = mulMod(a[1], fCoeffs[4]);\n const a2b3 = mulMod(a[2], fCoeffs[3]);\n const a3b2 = mulMod(a[3], fCoeffs[2]);\n const a4b1 = mulMod(a[4], fCoeffs[1]);\n const added = addMod(addMod(a1b4, a2b3), addMod(a3b2, a4b1));\n const g = addMod(a0b0, mulMod(FP5_W, added));\n\n const gInv = modInverse(g, GOLDILOCKS_MODULUS);\n return f.scalarMul(gInv);\n }\n\n div(other: GFp5Element): GFp5Element {\n return this.mul(other.inverseOrZero());\n }\n\n toLittleEndianBytes(): Uint8Array {\n const bytes = new Uint8Array(40);\n for (let i = 0; i < 5; i++) {\n let val = this.coeffs[i];\n for (let j = 0; j < 8; j++) {\n bytes[i * 8 + j] = Number(val & 0xffn);\n val >>= 8n;\n }\n }\n return bytes;\n }\n\n static fromLittleEndianBytes(bytes: Uint8Array): GFp5Element {\n if (bytes.length !== 40) {\n throw new Error(`Invalid length: expected 40, got ${bytes.length}`);\n }\n const coeffs: bigint[] = [];\n for (let i = 0; i < 5; i++) {\n let value = 0n;\n for (let j = 7; j >= 0; j--) {\n value = (value << 8n) | BigInt(bytes[i * 8 + j]);\n }\n coeffs.push(mod(value, GOLDILOCKS_MODULUS));\n }\n return new GFp5Element(coeffs);\n }\n}\n\n/**\n * ECgFp5 Scalar - Element of the scalar field (mod ORDER)\n */\nexport class ECgFp5Scalar {\n readonly value: bigint; // 320-bit value mod ORDER\n\n constructor(value: bigint) {\n this.value = mod(value, SCALAR_ORDER);\n }\n\n static zero(): ECgFp5Scalar {\n return new ECgFp5Scalar(0n);\n }\n\n static one(): ECgFp5Scalar {\n return new ECgFp5Scalar(1n);\n }\n\n isCanonical(): boolean {\n return this.value >= 0n && this.value < SCALAR_ORDER;\n }\n\n equals(other: ECgFp5Scalar): boolean {\n return this.value === other.value;\n }\n\n add(other: ECgFp5Scalar): ECgFp5Scalar {\n return new ECgFp5Scalar(this.value + other.value);\n }\n\n sub(other: ECgFp5Scalar): ECgFp5Scalar {\n return new ECgFp5Scalar(this.value - other.value + SCALAR_ORDER);\n }\n\n mul(other: ECgFp5Scalar): ECgFp5Scalar {\n return new ECgFp5Scalar(this.value * other.value);\n }\n\n toLittleEndianBytes(): Uint8Array {\n const bytes = new Uint8Array(40);\n let val = this.value;\n for (let i = 0; i < 40; i++) {\n bytes[i] = Number(val & 0xffn);\n val >>= 8n;\n }\n return bytes;\n }\n\n static fromLittleEndianBytes(bytes: Uint8Array): ECgFp5Scalar {\n if (bytes.length !== 40) {\n throw new Error(`Invalid length: expected 40, got ${bytes.length}`);\n }\n let value = 0n;\n for (let i = 39; i >= 0; i--) {\n value = (value << 8n) | BigInt(bytes[i]);\n }\n return new ECgFp5Scalar(value);\n }\n\n /**\n * Create from big integer (reduces mod ORDER)\n */\n static fromNonCanonicalBigInt(val: bigint): ECgFp5Scalar {\n const reduced = ((val % SCALAR_ORDER) + SCALAR_ORDER) % SCALAR_ORDER;\n return new ECgFp5Scalar(reduced);\n }\n\n /**\n * Convert from a GFp5Element to a scalar\n * This is used when converting hash output to a scalar\n * Note: Each coefficient is already reduced mod GOLDILOCKS_MODULUS (< 2^64),\n * so the combined value fits in 320 bits and is then reduced mod SCALAR_ORDER\n */\n static fromGFp5(fp5: GFp5Element): ECgFp5Scalar {\n // Each coefficient is guaranteed to be < GOLDILOCKS_MODULUS (< 2^64)\n // since GFp5Element reduces all coefficients on construction\n let result = 0n;\n for (let i = 4; i >= 0; i--) {\n const coeff = fp5.coeffs[i];\n // Validate coefficient is in expected range\n if (coeff < 0n || coeff >= GOLDILOCKS_MODULUS) {\n throw new Error(`Invalid GFp5 coefficient: ${coeff} is not in range [0, ${GOLDILOCKS_MODULUS})`);\n }\n result = (result << 64n) | coeff;\n }\n // Result is reduced mod SCALAR_ORDER in ECgFp5Scalar constructor\n return new ECgFp5Scalar(result);\n }\n}\n\n/**\n * ECgFp5 Point - A point on the ECgFp5 curve\n * Uses fractional (x, z, u, t) coordinates where (x, u) = (x, x/y) = (X/Z, U/T)\n */\nexport class ECgFp5Point {\n readonly x: GFp5Element;\n readonly z: GFp5Element;\n readonly u: GFp5Element;\n readonly t: GFp5Element;\n\n constructor(x: GFp5Element, z: GFp5Element, u: GFp5Element, t: GFp5Element) {\n this.x = x;\n this.z = z;\n this.u = u;\n this.t = t;\n }\n\n static neutral(): ECgFp5Point {\n return new ECgFp5Point(\n GFp5Element.zero(),\n GFp5Element.one(),\n GFp5Element.zero(),\n GFp5Element.one()\n );\n }\n\n // Curve constant B (coefficient in curve equation)\n static B(): GFp5Element {\n return new GFp5Element([0n, 263n, 0n, 0n, 0n]);\n }\n\n static B_MUL2(): GFp5Element {\n return new GFp5Element([0n, 526n, 0n, 0n, 0n]);\n }\n\n static B_MUL4(): GFp5Element {\n return new GFp5Element([0n, 1052n, 0n, 0n, 0n]);\n }\n\n // Generator point\n static generator(): ECgFp5Point {\n return new ECgFp5Point(\n new GFp5Element([\n 12883135586176881569n,\n 4356519642755055268n,\n 5248930565894896907n,\n 2165973894480315022n,\n 2448410071095648785n\n ]),\n GFp5Element.one(),\n GFp5Element.one(),\n new GFp5Element([4n, 0n, 0n, 0n, 0n])\n );\n }\n\n isNeutral(): boolean {\n return this.u.isZero();\n }\n\n equals(other: ECgFp5Point): boolean {\n // Check u1*t2 == u2*t1\n return this.u.mul(other.t).equals(other.u.mul(this.t));\n }\n\n /**\n * Encode point to GFp5 element (w = t/u)\n */\n encode(): GFp5Element {\n return this.t.mul(this.u.inverseOrZero());\n }\n\n /**\n * Add two points using complete addition formulas\n * Cost: 10 field multiplications\n */\n add(other: ECgFp5Point): ECgFp5Point {\n const x1 = this.x, z1 = this.z, u1 = this.u, t1 = this.t;\n const x2 = other.x, z2 = other.z, u2 = other.u, t2 = other.t;\n const B = ECgFp5Point.B();\n const B_MUL2 = ECgFp5Point.B_MUL2();\n\n const _t1 = x1.mul(x2);\n const _t2 = z1.mul(z2);\n const _t3 = u1.mul(u2);\n const _t4 = t1.mul(t2);\n const _t5 = x1.add(z1).mul(x2.add(z2)).sub(_t1).sub(_t2);\n const _t6 = u1.add(t1).mul(u2.add(t2)).sub(_t3).sub(_t4);\n const _t7 = _t1.add(_t2.mul(B));\n const _t8 = _t4.mul(_t7);\n const _t9 = _t3.mul(_t5.mul(B_MUL2).add(_t7.double()));\n const _t10 = _t4.add(_t3.double()).mul(_t5.add(_t7));\n\n const xNew = _t10.sub(_t8).mul(B);\n const zNew = _t8.sub(_t9);\n const uNew = _t6.mul(_t2.mul(B).sub(_t1));\n const tNew = _t8.add(_t9);\n\n return new ECgFp5Point(xNew, zNew, uNew, tNew);\n }\n\n /**\n * Double this point\n */\n double(): ECgFp5Point {\n const x = this.x, z = this.z, u = this.u, t = this.t;\n const B = ECgFp5Point.B();\n const B_MUL4 = ECgFp5Point.B_MUL4();\n\n const _t1 = z.mul(t);\n const _t2 = _t1.mul(t);\n const x1 = _t2.square();\n const z1 = _t1.mul(u);\n const _t3 = u.square();\n const w1 = _t2.sub(_t3.mul(x.add(z).double()));\n const _t4 = z1.square();\n\n const xNew = _t4.mul(B_MUL4);\n const zNew = w1.square();\n const uNew = w1.add(z1).square().sub(_t4).sub(zNew);\n const tNew = x1.double().sub(_t4.scalarMul(4n).add(zNew));\n\n return new ECgFp5Point(xNew, zNew, uNew, tNew);\n }\n\n /**\n * Multiply point by scalar using double-and-add\n */\n mul(scalar: ECgFp5Scalar): ECgFp5Point {\n let result = ECgFp5Point.neutral();\n let temp = this as ECgFp5Point;\n let s = scalar.value;\n\n while (s > 0n) {\n if (s & 1n) {\n result = result.add(temp);\n }\n temp = temp.double();\n s >>= 1n;\n }\n\n return result;\n }\n}\n\n// Helper functions for modular arithmetic\n\nfunction mod(a: bigint, m: bigint): bigint {\n const result = a % m;\n return result >= 0n ? result : result + m;\n}\n\nfunction addMod(a: bigint, b: bigint): bigint {\n return mod(a + b, GOLDILOCKS_MODULUS);\n}\n\nfunction mulMod(a: bigint, b: bigint): bigint {\n return mod(a * b, GOLDILOCKS_MODULUS);\n}\n\nfunction modInverse(a: bigint, m: bigint): bigint {\n let [old_r, r] = [mod(a, m), m];\n let [old_s, s] = [1n, 0n];\n\n while (r !== 0n) {\n const quotient = old_r / r;\n [old_r, r] = [r, old_r - quotient * r];\n [old_s, s] = [s, old_s - quotient * s];\n }\n\n return mod(old_s, m);\n}\n\n/**\n * Compute powers of x: [1, x, x^2, x^3, x^4]\n */\nfunction goldilocksP(x: bigint, count: number): bigint[] {\n const result: bigint[] = [1n];\n for (let i = 1; i < count; i++) {\n result.push(mulMod(result[i - 1], x));\n }\n return result;\n}\n\n/**\n * Sample a random scalar using cryptographically secure random number generator\n */\nexport function sampleScalar(): ECgFp5Scalar {\n const bytes = new Uint8Array(40);\n \n // Try Web Crypto API first (works in browsers and modern Node.js)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else if (typeof globalThis !== 'undefined' && \n typeof (globalThis as { require?: (mod: string) => { randomBytes: (len: number) => Buffer } }).require === 'function') {\n // Try Node.js crypto module\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nodeCrypto = (globalThis as { require: (mod: string) => { randomBytes: (len: number) => Buffer } }).require('crypto');\n const randomBytes = nodeCrypto.randomBytes(40);\n bytes.set(randomBytes);\n } catch {\n throw new Error('No cryptographically secure random number generator available');\n }\n } else {\n throw new Error('No cryptographically secure random number generator available');\n }\n \n return ECgFp5Scalar.fromLittleEndianBytes(bytes);\n}\n\n/**\n * Generate a scalar deterministically from a seed (async)\n * Derives scalar from seed using SHA256 + Go's math/rand\n * This matches the Go v0.0.11 poseidon_crypto SampleScalar implementation\n */\nexport async function sampleScalarFromSeed(\n seed: string,\n): Promise<ECgFp5Scalar> {\n // Deterministic generation from seed - matches Go implementation:\n // 1. SHA256 hash the seed STRING (including 0x prefix if present)\n // 2. Take first 8 bytes as int64 big-endian for rand seed\n // 3. Use Go's math/rand to generate random BigInt in [0, ORDER)\n\n // SHA256 hash the seed string as UTF-8 bytes\n const seedStringBytes = new TextEncoder().encode(seed);\n const hashHex = sha256(seedStringBytes);\n\n // Convert hex string to byte array\n const hashBytes = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n hashBytes[i] = parseInt(hashHex.substr(i * 2, 2), 16);\n }\n\n // Convert first 8 bytes to int64 (big-endian, like Go)\n let intSeed = 0n;\n for (let i = 0; i < 8; i++) {\n intSeed = (intSeed << 8n) | BigInt(hashBytes[i]);\n }\n\n // Use Go's rand algorithm\n const rng = new GoRandSource(intSeed);\n const randomValue = goRandBigInt(rng, ORDER);\n\n return ECgFp5Scalar.fromNonCanonicalBigInt(randomValue);\n}\n\n/**\n * Generate public key from private key: pk = sk * G\n */\nexport function schnorrPkFromSk(sk: ECgFp5Scalar): GFp5Element {\n const G = ECgFp5Point.generator();\n return G.mul(sk).encode();\n}\n\n/**\n * Schnorr Signature\n */\nexport class SchnorrSignature {\n readonly s: ECgFp5Scalar;\n readonly e: ECgFp5Scalar;\n\n constructor(s: ECgFp5Scalar, e: ECgFp5Scalar) {\n this.s = s;\n this.e = e;\n }\n\n /**\n * Serialize to bytes: s (40 bytes) || e (40 bytes)\n */\n toBytes(): Uint8Array {\n const bytes = new Uint8Array(80);\n bytes.set(this.s.toLittleEndianBytes(), 0);\n bytes.set(this.e.toLittleEndianBytes(), 40);\n return bytes;\n }\n\n static fromBytes(bytes: Uint8Array): SchnorrSignature {\n if (bytes.length !== 80) {\n throw new Error(`Invalid signature length: expected 80, got ${bytes.length}`);\n }\n const s = ECgFp5Scalar.fromLittleEndianBytes(bytes.slice(0, 40));\n const e = ECgFp5Scalar.fromLittleEndianBytes(bytes.slice(40, 80));\n return new SchnorrSignature(s, e);\n }\n}\n\n/**\n * Sign a pre-hashed message using Schnorr signature\n * hashedMessage should be a GFp5Element (the output of HashToQuinticExtension)\n * \n * Algorithm:\n * 1. Sample random k\n * 2. Compute r = k * G (commitment)\n * 3. Encode r to get r_encoded (a GFp5 element)\n * 4. Compute e = H(r_encoded || hashedMessage)\n * 5. Compute s = k - e * sk\n * 6. Return (s, e)\n */\nexport function schnorrSignHashedMessage(hashedMessage: GFp5Element, sk: ECgFp5Scalar): SchnorrSignature {\n // Sample random k\n const k = sampleScalar();\n \n // r = k * G\n const G = ECgFp5Point.generator();\n const r = G.mul(k).encode();\n\n // e = H(r || hashedMessage)\n // Create input for poseidon: r[0..4] || hashedMessage[0..4]\n const preImage: GoldilocksElement[] = [];\n for (let i = 0; i < 5; i++) {\n preImage.push(new GoldilocksElement(r.coeffs[i]));\n }\n for (let i = 0; i < 5; i++) {\n preImage.push(new GoldilocksElement(hashedMessage.coeffs[i]));\n }\n\n const eHash = poseidon2Hash(preImage);\n const eGFp5 = new GFp5Element(eHash.map(e => e.value));\n const e = ECgFp5Scalar.fromGFp5(eGFp5);\n\n // s = k - e * sk\n const s = k.sub(e.mul(sk));\n\n return new SchnorrSignature(s, e);\n}\n\n/**\n * Sign a pre-hashed message using Schnorr signature with deterministic k (for testing)\n * WARNING: Only for testing! Using a fixed k in production is insecure.\n */\nexport function schnorrSignHashedMessageDeterministic(hashedMessage: GFp5Element, sk: ECgFp5Scalar, k: ECgFp5Scalar): SchnorrSignature {\n // r = k * G\n const G = ECgFp5Point.generator();\n const r = G.mul(k).encode();\n\n // e = H(r || hashedMessage)\n const preImage: GoldilocksElement[] = [];\n for (let i = 0; i < 5; i++) {\n preImage.push(new GoldilocksElement(r.coeffs[i]));\n }\n for (let i = 0; i < 5; i++) {\n preImage.push(new GoldilocksElement(hashedMessage.coeffs[i]));\n }\n\n const eHash = poseidon2Hash(preImage);\n const eGFp5 = new GFp5Element(eHash.map(e => e.value));\n const e = ECgFp5Scalar.fromGFp5(eGFp5);\n\n // s = k - e * sk\n const s = k.sub(e.mul(sk));\n\n return new SchnorrSignature(s, e);\n}\n","/**\n * Go math/rand implementation for TypeScript\n * This replicates Go 1.x's math/rand algorithm exactly for deterministic seed-based random generation\n *\n * Based on: https://cs.opensource.google/go/go/+/refs/tags/go1.21.0:src/math/rand/rng.go\n */\n\n// Constants\nconst RNG_LEN = 607;\nconst RNG_TAP = 273;\nconst RNG_MAX = 1n << 63n;\nconst RNG_MASK = RNG_MAX - 1n;\nconst INT32_MAX = 2147483647; // 2^31 - 1 (don't use bit shift, it causes sign issues in JS)\n\n// Pre-computed cooked values (from Go's rng.go)\n// These are used during seeding to initialize the state vector\nconst RNG_COOKED: bigint[] = [\n -4181792142133755926n,\n -4576982950128230565n,\n 1395769623340756751n,\n 5333664234075297259n,\n -6347679516498800754n,\n 9033628115061424579n,\n 7143218595135194537n,\n 4812947590706362721n,\n 7937252194349799378n,\n 5307299880338848416n,\n 8209348851763925077n,\n -7107630437535961764n,\n 4593015457530856296n,\n 8140875735541888011n,\n -5903942795589686782n,\n -603556388664454774n,\n -7496297993371156308n,\n 113108499721038619n,\n 4569519971459345583n,\n -4160538177779461077n,\n -6835753265595711384n,\n -6507240692498089696n,\n 6559392774825876886n,\n 7650093201692370310n,\n 7684323884043752161n,\n -8965504200858744418n,\n -2629915517445760644n,\n 271327514973697897n,\n -6433985589514657524n,\n 1065192797246149621n,\n 3344507881999356393n,\n -4763574095074709175n,\n 7465081662728599889n,\n 1014950805555097187n,\n -4773931307508785033n,\n -5742262670416273165n,\n 2418672789110888383n,\n 5796562887576294778n,\n 4484266064449540171n,\n 3738982361971787048n,\n -4699774852342421385n,\n 10530508058128498n,\n -589538253572429690n,\n -6598062107225984180n,\n 8660405965245884302n,\n 10162832508971942n,\n -2682657355892958417n,\n 7031802312784620857n,\n 6240911277345944669n,\n 831864355460801054n,\n -1218937899312622917n,\n 2116287251661052151n,\n 2202309800992166967n,\n 9161020366945053561n,\n 4069299552407763864n,\n 4936383537992622449n,\n 457351505131524928n,\n -8881176990926596454n,\n -6375600354038175299n,\n -7155351920868399290n,\n 4368649989588021065n,\n 887231587095185257n,\n -3659780529968199312n,\n -2407146836602825512n,\n 5616972787034086048n,\n -751562733459939242n,\n 1686575021641186857n,\n -5177887698780513806n,\n -4979215821652996885n,\n -1375154703071198421n,\n 5632136521049761902n,\n -8390088894796940536n,\n -193645528485698615n,\n -5979788902190688516n,\n -4907000935050298721n,\n -285522056888777828n,\n -2776431630044341707n,\n 1679342092332374735n,\n 6050638460742422078n,\n -2229851317345194226n,\n -1582494184340482199n,\n 5881353426285907985n,\n 812786550756860885n,\n 4541845584483343330n,\n -6497901820577766722n,\n 4980675660146853729n,\n -4012602956251539747n,\n -329088717864244987n,\n -2896929232104691526n,\n 1495812843684243920n,\n -2153620458055647789n,\n 7370257291860230865n,\n -2466442761497833547n,\n 4706794511633873654n,\n -1398851569026877145n,\n 8549875090542453214n,\n -9189721207376179652n,\n -7894453601103453165n,\n 7297902601803624459n,\n 1011190183918857495n,\n -6985347000036920864n,\n 5147159997473910359n,\n -8326859945294252826n,\n 2659470849286379941n,\n 6097729358393448602n,\n -7491646050550022124n,\n -5117116194870963097n,\n -896216826133240300n,\n -745860416168701406n,\n 5803876044675762232n,\n -787954255994554146n,\n -3234519180203704564n,\n -4507534739750823898n,\n -1657200065590290694n,\n 505808562678895611n,\n -4153273856159712438n,\n -8381261370078904295n,\n 572156825025677802n,\n 1791881013492340891n,\n 3393267094866038768n,\n -5444650186382539299n,\n 2352769483186201278n,\n -7930912453007408350n,\n -325464993179687389n,\n -3441562999710612272n,\n -6489413242825283295n,\n 5092019688680754699n,\n -227247482082248967n,\n 4234737173186232084n,\n 5027558287275472836n,\n 4635198586344772304n,\n -536033143587636457n,\n 5907508150730407386n,\n -8438615781380831356n,\n 972392927514829904n,\n -3801314342046600696n,\n -4064951393885491917n,\n -174840358296132583n,\n 2407211146698877100n,\n -1640089820333676239n,\n 3940796514530962282n,\n -5882197405809569433n,\n 3095313889586102949n,\n -1818050141166537098n,\n 5832080132947175283n,\n 7890064875145919662n,\n 8184139210799583195n,\n -8073512175445549678n,\n -7758774793014564506n,\n -4581724029666783935n,\n 3516491885471466898n,\n -8267083515063118116n,\n 6657089965014657519n,\n 5220884358887979358n,\n 1796677326474620641n,\n 5340761970648932916n,\n 1147977171614181568n,\n 5066037465548252321n,\n 2574765911837859848n,\n 1085848279845204775n,\n -5873264506986385449n,\n 6116438694366558490n,\n 2107701075971293812n,\n -7420077970933506541n,\n 2469478054175558874n,\n -1855128755834809824n,\n -5431463669011098282n,\n -9038325065738319171n,\n -6966276280341336160n,\n 7217693971077460129n,\n -8314322083775271549n,\n 7196649268545224266n,\n -3585711691453906209n,\n -5267827091426810625n,\n 8057528650917418961n,\n -5084103596553648165n,\n -2601445448341207749n,\n -7850010900052094367n,\n 6527366231383600011n,\n 3507654575162700890n,\n 9202058512774729859n,\n 1954818376891585542n,\n -2582991129724600103n,\n 8299563319178235687n,\n -5321504681635821435n,\n 7046310742295574065n,\n -2376176645520785576n,\n -7650733936335907755n,\n 8850422670118399721n,\n 3631909142291992901n,\n 5158881091950831288n,\n -6340413719511654215n,\n 4763258931815816403n,\n 6280052734341785344n,\n -4979582628649810958n,\n 2043464728020827976n,\n -2678071570832690343n,\n 4562580375758598164n,\n 5495451168795427352n,\n -7485059175264624713n,\n 553004618757816492n,\n 6895160632757959823n,\n -989748114590090637n,\n 7139506338801360852n,\n -672480814466784139n,\n 5535668688139305547n,\n 2430933853350256242n,\n -3821430778991574732n,\n -1063731997747047009n,\n -3065878205254005442n,\n 7632066283658143750n,\n 6308328381617103346n,\n 3681878764086140361n,\n 3289686137190109749n,\n 6587997200611086848n,\n 244714774258135476n,\n -5143583659437639708n,\n 8090302575944624335n,\n 2945117363431356361n,\n -8359047641006034763n,\n 3009039260312620700n,\n -793344576772241777n,\n 401084700045993341n,\n -1968749590416080887n,\n 4707864159563588614n,\n -3583123505891281857n,\n -3240864324164777915n,\n -5908273794572565703n,\n -3719524458082857382n,\n -5281400669679581926n,\n 8118566580304798074n,\n 3839261274019871296n,\n 7062410411742090847n,\n -8481991033874568140n,\n 6027994129690250817n,\n -6725542042704711878n,\n -2971981702428546974n,\n -7854441788951256975n,\n 8809096399316380241n,\n 6492004350391900708n,\n 2462145737463489636n,\n -8818543617934476634n,\n -5070345602623085213n,\n -8961586321599299868n,\n -3758656652254704451n,\n -8630661632476012791n,\n 6764129236657751224n,\n -709716318315418359n,\n -3403028373052861600n,\n -8838073512170985897n,\n -3999237033416576341n,\n -2920240395515973663n,\n -2073249475545404416n,\n 368107899140673753n,\n -6108185202296464250n,\n -6307735683270494757n,\n 4782583894627718279n,\n 6718292300699989587n,\n 8387085186914375220n,\n 3387513132024756289n,\n 4654329375432538231n,\n -292704475491394206n,\n -3848998599978456535n,\n 7623042350483453954n,\n 7725442901813263321n,\n 9186225467561587250n,\n -5132344747257272453n,\n -6865740430362196008n,\n 2530936820058611833n,\n 1636551876240043639n,\n -3658707362519810009n,\n 1452244145334316253n,\n -7161729655835084979n,\n -7943791770359481772n,\n 9108481583171221009n,\n -3200093350120725999n,\n 5007630032676973346n,\n 2153168792952589781n,\n 6720334534964750538n,\n -3181825545719981703n,\n 3433922409283786309n,\n 2285479922797300912n,\n 3110614940896576130n,\n -2856812446131932915n,\n -3804580617188639299n,\n 7163298419643543757n,\n 4891138053923696990n,\n 580618510277907015n,\n 1684034065251686769n,\n 4429514767357295841n,\n -8893025458299325803n,\n -8103734041042601133n,\n 7177515271653460134n,\n 4589042248470800257n,\n -1530083407795771245n,\n 143607045258444228n,\n 246994305896273627n,\n -8356954712051676521n,\n 6473547110565816071n,\n 3092379936208876896n,\n 2058427839513754051n,\n -4089587328327907870n,\n 8785882556301281247n,\n -3074039370013608197n,\n -637529855400303673n,\n 6137678347805511274n,\n -7152924852417805802n,\n 5708223427705576541n,\n -3223714144396531304n,\n 4358391411789012426n,\n 325123008708389849n,\n 6837621693887290924n,\n 4843721905315627004n,\n -3212720814705499393n,\n -3825019837890901156n,\n 4602025990114250980n,\n 1044646352569048800n,\n 9106614159853161675n,\n -8394115921626182539n,\n -4304087667751778808n,\n 2681532557646850893n,\n 3681559472488511871n,\n -3915372517896561773n,\n -2889241648411946534n,\n -6564663803938238204n,\n -8060058171802589521n,\n 581945337509520675n,\n 3648778920718647903n,\n -4799698790548231394n,\n -7602572252857820065n,\n 220828013409515943n,\n -1072987336855386047n,\n 4287360518296753003n,\n -4633371852008891965n,\n 5513660857261085186n,\n -2258542936462001533n,\n -8744380348503999773n,\n 8746140185685648781n,\n 228500091334420247n,\n 1356187007457302238n,\n 3019253992034194581n,\n 3152601605678500003n,\n -8793219284148773595n,\n 5559581553696971176n,\n 4916432985369275664n,\n -8559797105120221417n,\n -5802598197927043732n,\n 2868348622579915573n,\n -7224052902810357288n,\n -5894682518218493085n,\n 2587672709781371173n,\n -7706116723325376475n,\n 3092343956317362483n,\n -5561119517847711700n,\n 972445599196498113n,\n -1558506600978816441n,\n 1708913533482282562n,\n -2305554874185907314n,\n -6005743014309462908n,\n -6653329009633068701n,\n -483583197311151195n,\n 2488075924621352812n,\n -4529369641467339140n,\n -4663743555056261452n,\n 2997203966153298104n,\n 1282559373026354493n,\n 240113143146674385n,\n 8665713329246516443n,\n 628141331766346752n,\n -4651421219668005332n,\n -7750560848702540400n,\n 7596648026010355826n,\n -3132152619100351065n,\n 7834161864828164065n,\n 7103445518877254909n,\n 4390861237357459201n,\n -4780718172614204074n,\n -319889632007444440n,\n 622261699494173647n,\n -3186110786557562560n,\n -8718967088789066690n,\n -1948156510637662747n,\n -8212195255998774408n,\n -7028621931231314745n,\n 2623071828615234808n,\n -4066058308780939700n,\n -5484966924888173764n,\n -6683604512778046238n,\n -6756087640505506466n,\n 5256026990536851868n,\n 7841086888628396109n,\n 6640857538655893162n,\n -8021284697816458310n,\n -7109857044414059830n,\n -1689021141511844405n,\n -4298087301956291063n,\n -4077748265377282003n,\n -998231156719803476n,\n 2719520354384050532n,\n 9132346697815513771n,\n 4332154495710163773n,\n -2085582442760428892n,\n 6994721091344268833n,\n -2556143461985726874n,\n -8567931991128098309n,\n 59934747298466858n,\n -3098398008776739403n,\n -265597256199410390n,\n 2332206071942466437n,\n -7522315324568406181n,\n 3154897383618636503n,\n -7585605855467168281n,\n -6762850759087199275n,\n 197309393502684135n,\n -8579694182469508493n,\n 2543179307861934850n,\n 4350769010207485119n,\n -4468719947444108136n,\n -7207776534213261296n,\n -1224312577878317200n,\n 4287946071480840813n,\n 8362686366770308971n,\n 6486469209321732151n,\n -5605644191012979782n,\n -1669018511020473564n,\n 4450022655153542367n,\n -7618176296641240059n,\n -3896357471549267421n,\n -4596796223304447488n,\n -6531150016257070659n,\n -8982326463137525940n,\n -4125325062227681798n,\n -1306489741394045544n,\n -8338554946557245229n,\n 5329160409530630596n,\n 7790979528857726136n,\n 4955070238059373407n,\n -4304834761432101506n,\n -6215295852904371179n,\n 3007769226071157901n,\n -6753025801236972788n,\n 8928702772696731736n,\n 7856187920214445904n,\n -4748497451462800923n,\n 7900176660600710914n,\n -7082800908938549136n,\n -6797926979589575837n,\n -6737316883512927978n,\n 4186670094382025798n,\n 1883939007446035042n,\n -414705992779907823n,\n 3734134241178479257n,\n 4065968871360089196n,\n 6953124200385847784n,\n -7917685222115876751n,\n -7585632937840318161n,\n -5567246375906782599n,\n -5256612402221608788n,\n 3106378204088556331n,\n -2894472214076325998n,\n 4565385105440252958n,\n 1979884289539493806n,\n -6891578849933910383n,\n 3783206694208922581n,\n 8464961209802336085n,\n 2843963751609577687n,\n 3030678195484896323n,\n -4429654462759003204n,\n 4459239494808162889n,\n 402587895800087237n,\n 8057891408711167515n,\n 4541888170938985079n,\n 1042662272908816815n,\n -3666068979732206850n,\n 2647678726283249984n,\n 2144477441549833761n,\n -3417019821499388721n,\n -2105601033380872185n,\n 5916597177708541638n,\n -8760774321402454447n,\n 8833658097025758785n,\n 5970273481425315300n,\n 563813119381731307n,\n -6455022486202078793n,\n 1598828206250873866n,\n -4016978389451217698n,\n -2988328551145513985n,\n -6071154634840136312n,\n 8469693267274066490n,\n 125672920241807416n,\n -3912292412830714870n,\n -2559617104544284221n,\n -486523741806024092n,\n -4735332261862713930n,\n 5923302823487327109n,\n -9082480245771672572n,\n -1808429243461201518n,\n 7990420780896957397n,\n 4317817392807076702n,\n 3625184369705367340n,\n -6482649271566653105n,\n -3480272027152017464n,\n -3225473396345736649n,\n -368878695502291645n,\n -3981164001421868007n,\n -8522033136963788610n,\n 7609280429197514109n,\n 3020985755112334161n,\n -2572049329799262942n,\n 2635195723621160615n,\n 5144520864246028816n,\n -8188285521126945980n,\n 1567242097116389047n,\n 8172389260191636581n,\n -2885551685425483535n,\n -7060359469858316883n,\n -6480181133964513127n,\n -7317004403633452381n,\n 6011544915663598137n,\n 5932255307352610768n,\n 2241128460406315459n,\n -8327867140638080220n,\n 3094483003111372717n,\n 4583857460292963101n,\n 9079887171656594975n,\n -384082854924064405n,\n -3460631649611717935n,\n 4225072055348026230n,\n -7385151438465742745n,\n 3801620336801580414n,\n -399845416774701952n,\n -7446754431269675473n,\n 7899055018877642622n,\n 5421679761463003041n,\n 5521102963086275121n,\n -4975092593295409910n,\n 8735487530905098534n,\n -7462844945281082830n,\n -2080886987197029914n,\n -1000715163927557685n,\n -4253840471931071485n,\n -5828896094657903328n,\n 6424174453260338141n,\n 359248545074932887n,\n -5949720754023045210n,\n -2426265837057637212n,\n 3030918217665093212n,\n -9077771202237461772n,\n -3186796180789149575n,\n 740416251634527158n,\n -2142944401404840226n,\n 6951781370868335478n,\n 399922722363687927n,\n -8928469722407522623n,\n -1378421100515597285n,\n -8343051178220066766n,\n -3030716356046100229n,\n -8811767350470065420n,\n 9026808440365124461n,\n 6440783557497587732n,\n 4615674634722404292n,\n 539897290441580544n,\n 2096238225866883852n,\n 8751955639408182687n,\n -7316147128802486205n,\n 7381039757301768559n,\n 6157238513393239656n,\n -1473377804940618233n,\n 8629571604380892756n,\n 5280433031239081479n,\n 7101611890139813254n,\n 2479018537985767835n,\n 7169176924412769570n,\n -1281305539061572506n,\n -7865612307799218120n,\n 2278447439451174845n,\n 3625338785743880657n,\n 6477479539006708521n,\n 8976185375579272206n,\n -3712000482142939688n,\n 1326024180520890843n,\n 7537449876596048829n,\n 5464680203499696154n,\n 3189671183162196045n,\n 6346751753565857109n,\n -8982212049534145501n,\n -6127578587196093755n,\n -245039190118465649n,\n -6320577374581628592n,\n 7208698530190629697n,\n 7276901792339343736n,\n -7490986807540332668n,\n 4133292154170828382n,\n 2918308698224194548n,\n -7703910638917631350n,\n -3929437324238184044n,\n -4300543082831323144n,\n -6344160503358350167n,\n 5896236396443472108n,\n -758328221503023383n,\n -1894351639983151068n,\n -307900319840287220n,\n -6278469401177312761n,\n -2171292963361310674n,\n 8382142935188824023n,\n 9103922860780351547n,\n 4152330101494654406n,\n];\n\n/**\n * Go's math/rand rngSource implementation\n * Uses the Mitchell-Reeds additive feedback generator\n */\nexport class GoRandSource {\n private tap: number;\n private feed: number;\n private vec: bigint[];\n\n constructor(seed: bigint) {\n this.tap = 0;\n this.feed = RNG_LEN - RNG_TAP;\n this.vec = new Array(RNG_LEN).fill(0n);\n this.seedInternal(seed);\n }\n\n /**\n * Seed algorithm: x[n+1] = 48271 * x[n] mod (2^31 - 1)\n */\n private seedRand(x: number): number {\n const A = 48271;\n const Q = 44488;\n const R = 3399;\n\n const hi = Math.floor(x / Q);\n const lo = x % Q;\n x = A * lo - R * hi;\n if (x < 0) {\n x += INT32_MAX;\n }\n return x;\n }\n\n /**\n * Initialize the state vector from seed\n * The seed is treated as a signed int64 in Go, so we need to handle negative values\n */\n private seedInternal(seed: bigint): void {\n // Go treats the seed as a signed int64\n // Convert to signed interpretation\n const signedSeed = BigInt.asIntN(64, seed);\n\n // seed = seed % int32max (Go uses signed modulo)\n let s = Number(signedSeed % BigInt(INT32_MAX));\n if (s < 0) {\n s += INT32_MAX;\n }\n if (s === 0) {\n s = 89482311;\n }\n\n let x = s;\n\n // Warm up with 20 iterations\n for (let i = -20; i < RNG_LEN; i++) {\n x = this.seedRand(x);\n if (i >= 0) {\n let u = BigInt(x) << 40n;\n x = this.seedRand(x);\n u ^= BigInt(x) << 20n;\n x = this.seedRand(x);\n u ^= BigInt(x);\n u ^= RNG_COOKED[i];\n // Store as signed int64\n this.vec[i] = BigInt.asIntN(64, u);\n }\n }\n }\n\n /**\n * Generate a random uint64\n */\n uint64(): bigint {\n this.tap--;\n if (this.tap < 0) {\n this.tap += RNG_LEN;\n }\n\n this.feed--;\n if (this.feed < 0) {\n this.feed += RNG_LEN;\n }\n\n // Add with 64-bit overflow semantics\n const x = BigInt.asIntN(64, this.vec[this.feed] + this.vec[this.tap]);\n this.vec[this.feed] = x;\n\n // Return as unsigned\n return BigInt.asUintN(64, x);\n }\n\n /**\n * Generate a random int63 (non-negative 63-bit integer)\n * Go: return int64(rng.Uint64() & rngMask) where rngMask = 1<<63 - 1\n */\n int63(): bigint {\n return this.uint64() & RNG_MASK;\n }\n\n /**\n * Generate a random uint32\n * Go: return uint32(rng.Int63() >> 31)\n * This is how Go's Rand.Uint32() works - it generates int63 and takes top 32 bits\n */\n uint32(): bigint {\n return this.int63() >> 31n;\n }\n}\n\n/**\n * Generate a random BigInt in range [0, max) using Go's algorithm\n * This matches big.Int.Rand(rng, max)\n *\n * Go's nat.random uses Uint32() to fill words:\n * For 64-bit words: Word(rand.Uint32()) | Word(rand.Uint32())<<32\n */\nexport function goRandBigInt(rng: GoRandSource, max: bigint): bigint {\n // Calculate number of 64-bit words needed\n const maxBits = max.toString(2).length;\n const numWords = Math.ceil(maxBits / 64);\n\n // Calculate mask for most significant word\n const bitLengthOfMSW = maxBits % 64 || 64;\n const mswMask = (1n << BigInt(bitLengthOfMSW)) - 1n;\n\n // Generate random number by rejection sampling (like Go's nat.random)\n while (true) {\n // Generate words using Uint32() pairs (lo | hi<<32), like Go does for 64-bit systems\n const words: bigint[] = [];\n for (let i = 0; i < numWords; i++) {\n const lo = rng.uint32();\n const hi = rng.uint32();\n words.push(lo | (hi << 32n));\n }\n\n // Mask the most significant word\n words[numWords - 1] &= mswMask;\n\n // Convert words to BigInt (little-endian words, but big-endian result)\n // Words are stored little-endian: words[0] is least significant\n let result = 0n;\n for (let i = numWords - 1; i >= 0; i--) {\n result = (result << 64n) | words[i];\n }\n\n // Rejection sampling: if result >= max, try again\n if (result < max) {\n return result;\n }\n }\n}\n","/**\n * ECgFp5 Scalar Field\n *\n * The scalar field for ECgFp5 curve with prime order ~2^319\n * ORDER = 1067993516717146951041484916571792702745057740581727230159139685185762082554198619328292418486241\n *\n * Ported from Go poseidon_crypto/curve/ecgfp5/scalar_field.go\n */\n\nimport { GOLDILOCKS_MODULUS, toCanonicalUint64 } from \"./goldilocks\";\nimport { GFp5Element } from \"./ecgfp5\";\n\n// GROUP ORDER (PRIME): ~2^319\n// p = 1067993516717146951041484916571792702745057740581727230159139685185762082554198619328292418486241\nexport const ORDER =\n 1067993516717146951041484916571792702745057740581727230159139685185762082554198619328292418486241n;\n\n// Modulus in 5 x 64-bit limbs (little-endian)\nconst N: bigint[] = [\n 0xe80fd996948bffe1n,\n 0xe8885c39d724a09cn,\n 0x7fffffe6cfb80639n,\n 0x7ffffff100000016n,\n 0x7ffffffd80000007n,\n];\n\n// -1/N[0] mod 2^64\nconst N0I = 0xd78bef72057b7bdfn;\n\n// 2^640 mod n (for Montgomery multiplication)\nconst R2: bigint[] = [\n 0xa01001dce33dc739n,\n 0x6c3228d33f62accfn,\n 0xd1d796cc91cf8525n,\n 0xaadfff5d1574c1d8n,\n 0x4aca13b28ca251f5n,\n];\n\nconst U64_MAX = 0xffffffffffffffffn;\n\n/**\n * ECgFp5 Scalar - represents an element of the scalar field\n * Stored as 5 x 64-bit limbs in little-endian order\n */\nexport class ECgFp5Scalar {\n readonly limbs: bigint[]; // 5 limbs\n\n constructor(limbs: bigint[]) {\n if (limbs.length !== 5) {\n throw new Error(\"ECgFp5Scalar requires exactly 5 limbs\");\n }\n this.limbs = limbs.map((l) => l & U64_MAX);\n }\n\n /**\n * Zero scalar\n */\n static zero(): ECgFp5Scalar {\n return new ECgFp5Scalar([0n, 0n, 0n, 0n, 0n]);\n }\n\n /**\n * One scalar\n */\n static one(): ECgFp5Scalar {\n return new ECgFp5Scalar([1n, 0n, 0n, 0n, 0n]);\n }\n\n /**\n * Check if scalar is in canonical form (< ORDER)\n */\n isCanonical(): boolean {\n return this.toNonCanonicalBigInt() < ORDER;\n }\n\n /**\n * Convert to big integer (may be >= ORDER)\n */\n toNonCanonicalBigInt(): bigint {\n let result = 0n;\n for (let i = 4; i >= 0; i--) {\n result = (result << 64n) | this.limbs[i];\n }\n return result;\n }\n\n /**\n * Create from big integer (reduces mod ORDER)\n */\n static fromNonCanonicalBigInt(val: bigint): ECgFp5Scalar {\n const reduced = ((val % ORDER) + ORDER) % ORDER;\n const limbs: bigint[] = [];\n let v = reduced;\n for (let i = 0; i < 5; i++) {\n limbs.push(v & U64_MAX);\n v >>= 64n;\n }\n return new ECgFp5Scalar(limbs);\n }\n\n /**\n * Create from GFp5 element (5 Goldilocks field elements)\n */\n static fromGfp5(fp5: bigint[]): ECgFp5Scalar {\n // Construct 320-bit value from 5 x 64-bit limbs\n let result = 0n;\n for (let i = 4; i >= 0; i--) {\n result = (result << 64n) | toCanonicalUint64(fp5[i]);\n }\n return ECgFp5Scalar.fromNonCanonicalBigInt(result);\n }\n\n /**\n * Convert to little-endian bytes (40 bytes)\n */\n toLittleEndianBytes(): Uint8Array {\n const result = new Uint8Array(40);\n for (let i = 0; i < 5; i++) {\n let val = this.limbs[i];\n for (let j = 0; j < 8; j++) {\n result[i * 8 + j] = Number(val & 0xffn);\n val >>= 8n;\n }\n }\n return result;\n }\n\n /**\n * Create from little-endian bytes (40 bytes)\n */\n static fromLittleEndianBytes(data: Uint8Array): ECgFp5Scalar {\n if (data.length !== 40) {\n throw new Error(`Invalid length: expected 40, got ${data.length}`);\n }\n\n const limbs: bigint[] = [];\n for (let i = 0; i < 5; i++) {\n let value = 0n;\n for (let j = 7; j >= 0; j--) {\n value = (value << 8n) | BigInt(data[i * 8 + j]);\n }\n limbs.push(value);\n }\n\n const scalar = new ECgFp5Scalar(limbs);\n\n // If value >= ORDER, reduce it\n if (!scalar.isCanonical()) {\n return ECgFp5Scalar.fromNonCanonicalBigInt(scalar.toNonCanonicalBigInt());\n }\n\n return scalar;\n }\n\n /**\n * Check equality\n */\n equals(rhs: ECgFp5Scalar): boolean {\n return (\n this.limbs[0] === rhs.limbs[0] &&\n this.limbs[1] === rhs.limbs[1] &&\n this.limbs[2] === rhs.limbs[2] &&\n this.limbs[3] === rhs.limbs[3] &&\n this.limbs[4] === rhs.limbs[4]\n );\n }\n\n /**\n * Raw addition (no reduction)\n */\n private addInner(a: ECgFp5Scalar): ECgFp5Scalar {\n const r: bigint[] = [];\n let c = 0n;\n for (let i = 0; i < 5; i++) {\n const sum = this.limbs[i] + a.limbs[i] + c;\n r.push(sum & U64_MAX);\n c = sum >> 64n;\n }\n return new ECgFp5Scalar(r);\n }\n\n /**\n * Raw subtraction (no reduction)\n * Returns [result, borrow] where borrow is 0 or U64_MAX\n */\n private subInner(a: ECgFp5Scalar): [ECgFp5Scalar, bigint] {\n const r: bigint[] = [];\n let c = 0n;\n for (let i = 0; i < 5; i++) {\n const diff = this.limbs[i] - a.limbs[i] - c;\n if (diff < 0n) {\n r.push((diff + 0x10000000000000000n) & U64_MAX);\n c = 1n;\n } else {\n r.push(diff & U64_MAX);\n c = 0n;\n }\n }\n return [new ECgFp5Scalar(r), c !== 0n ? U64_MAX : 0n];\n }\n\n /**\n * Conditional select: if c == 0, return a0; if c == U64_MAX, return a1\n */\n private static select(\n c: bigint,\n a0: ECgFp5Scalar,\n a1: ECgFp5Scalar,\n ): ECgFp5Scalar {\n return new ECgFp5Scalar([\n a0.limbs[0] ^ (c & (a0.limbs[0] ^ a1.limbs[0])),\n a0.limbs[1] ^ (c & (a0.limbs[1] ^ a1.limbs[1])),\n a0.limbs[2] ^ (c & (a0.limbs[2] ^ a1.limbs[2])),\n a0.limbs[3] ^ (c & (a0.limbs[3] ^ a1.limbs[3])),\n a0.limbs[4] ^ (c & (a0.limbs[4] ^ a1.limbs[4])),\n ]);\n }\n\n /**\n * Addition mod ORDER\n */\n add(rhs: ECgFp5Scalar): ECgFp5Scalar {\n const r0 = this.addInner(rhs);\n const [r1, c] = r0.subInner(new ECgFp5Scalar(N));\n return ECgFp5Scalar.select(c, r1, r0);\n }\n\n /**\n * Subtraction mod ORDER\n */\n sub(rhs: ECgFp5Scalar): ECgFp5Scalar {\n const [r0, c] = this.subInner(rhs);\n const r1 = r0.addInner(new ECgFp5Scalar(N));\n return ECgFp5Scalar.select(c, r0, r1);\n }\n\n /**\n * Montgomery multiplication: (self * rhs) / 2^320 mod n\n *\n * This implements the Montgomery reduction algorithm.\n * Key insight: we need to simulate Go's uint64 wraparound behavior.\n * In Go, operations on uint64 naturally wrap at 2^64.\n * In TypeScript with bigint, we must explicitly mask.\n */\n private montyMul(rhs: ECgFp5Scalar): ECgFp5Scalar {\n const r: bigint[] = [0n, 0n, 0n, 0n, 0n];\n\n for (let i = 0; i < 5; i++) {\n const m = rhs.limbs[i];\n\n // f = (self[0]*m + r[0]) * N0I mod 2^64\n // In Go, each operation on uint64 wraps automatically.\n // We need to mask after each step to simulate this.\n const sm = (this.limbs[0] * m) & U64_MAX; // s[0] * m (mod 2^64)\n const smr = (sm + r[0]) & U64_MAX; // + r[0] (mod 2^64)\n const f = (smr * N0I) & U64_MAX; // * N0I (mod 2^64)\n\n let cc1 = 0n;\n let cc2 = 0n;\n\n for (let j = 0; j < 5; j++) {\n // z = self[j] * m + r[j] + cc1\n let z = this.limbs[j] * m + r[j] + cc1;\n cc1 = z >> 64n;\n z = z & U64_MAX;\n\n // z = f * N[j] + z + cc2\n z = f * N[j] + z + cc2;\n cc2 = z >> 64n;\n\n if (j > 0) {\n r[j - 1] = z & U64_MAX;\n }\n }\n\n r[4] = (cc1 + cc2) & U64_MAX;\n }\n\n // Final reduction\n const result = new ECgFp5Scalar(r);\n const [r2, c] = result.subInner(new ECgFp5Scalar(N));\n return ECgFp5Scalar.select(c, r2, result);\n }\n\n /**\n * Multiplication mod ORDER\n */\n mul(rhs: ECgFp5Scalar): ECgFp5Scalar {\n // Convert to Montgomery form, multiply, convert back\n const aR = this.montyMul(new ECgFp5Scalar(R2));\n return aR.montyMul(rhs);\n }\n\n /**\n * Recode scalar to signed digits for windowed multiplication\n * Window width w must be between 2 and 10\n * Returns signed integers in range [-(2^w - 1), 2^w]\n *\n * This is a direct port of Go's RecodeSignedFromLimbs function\n */\n recodeSigned(ss: Int32Array, w: number): void {\n const mw = (1 << w) - 1; // mask for w bits\n const hw = 1 << (w - 1); // half window\n const mwn = BigInt(mw);\n const wn = BigInt(w);\n\n // acc holds leftover bits from previous limb extractions\n // In Go this is uint64, here we use bigint but mask to 64 bits where needed\n let acc = 0n;\n let accLen = 0;\n let j = 0;\n let cc = 0;\n\n for (let i = 0; i < ss.length; i++) {\n // Get next w-bit chunk in bb\n let bb: number;\n if (accLen < w) {\n if (j < 5) {\n const nl = this.limbs[j];\n j++;\n // Combine acc with the new limb shifted appropriately\n // In Go: bb = (uint32(acc | (nl << accLen))) & mw\n const combined = acc | (nl << BigInt(accLen));\n bb = Number(combined & mwn);\n\n // Update acc: shift right to remove the bits we used\n // In Go: acc = nl >> (w - accLen)\n acc = nl >> BigInt(w - accLen);\n } else {\n bb = Number(acc & mwn);\n acc = 0n;\n }\n accLen += 64 - w;\n } else {\n // Extract w bits from acc\n bb = Number(acc & mwn);\n accLen -= w;\n acc >>= wn;\n }\n\n // If bb is greater than 2^(w-1), subtract 2^w and propagate a carry\n bb += cc;\n\n // cc = (hw - bb) >> 31 in Go uint32\n // If bb > hw, then (hw - bb) is negative, wraps to large uint32, >> 31 gives 1\n // If bb <= hw, then (hw - bb) >= 0, >> 31 gives 0\n cc = bb > hw ? 1 : 0;\n ss[i] = bb - (cc << w);\n }\n }\n\n /**\n * Convert from a GFp5Element to a scalar\n * This is used when converting hash output to a scalar\n * Note: Each coefficient is already reduced mod GOLDILOCKS_MODULUS (< 2^64),\n * so the combined value fits in 320 bits and is then reduced mod SCALAR_ORDER\n */\n static fromGFp5(fp5: GFp5Element): ECgFp5Scalar {\n // Each coefficient is guaranteed to be < GOLDILOCKS_MODULUS (< 2^64)\n // since GFp5Element reduces all coefficients on construction\n let result = 0n;\n for (let i = 4; i >= 0; i--) {\n const coeff = fp5.coeffs[i];\n // Validate coefficient is in expected range\n if (coeff < 0n || coeff >= GOLDILOCKS_MODULUS) {\n throw new Error(\n `Invalid GFp5 coefficient: ${coeff} is not in range [0, ${GOLDILOCKS_MODULUS})`,\n );\n }\n result = (result << 64n) | coeff;\n }\n // Convert to 5 limbs and reduce mod SCALAR_ORDER\n return ECgFp5Scalar.fromNonCanonicalBigInt(result);\n }\n}\n","/**\n * Key Manager for Lighter protocol\n * Handles key generation and signing using the Schnorr signature scheme over ECgFp5\n */\n\nimport {\n ECgFp5Scalar,\n GFp5Element,\n sampleScalar, sampleScalarFromSeed,\n schnorrPkFromSk,\n SchnorrSignature,\n schnorrSignHashedMessage,\n} from '../crypto/ecgfp5';\n\n// Re-export types for backwards compatibility\nexport {ECgFp5Scalar, GFp5Element, SchnorrSignature};\n\n/**\n * Signer interface\n */\nexport interface Signer {\n sign(hashedMessage: Uint8Array): Uint8Array;\n}\n\n/**\n * Key Manager interface\n */\nexport interface KeyManager extends Signer {\n pubKey(): GFp5Element;\n\n pubKeyBytes(): Uint8Array;\n\n prvKeyBytes(): Uint8Array;\n}\n\n/**\n * Key Manager implementation\n */\nclass KeyManagerImpl implements KeyManager {\n private readonly key: ECgFp5Scalar;\n private readonly _pubKey: GFp5Element;\n\n constructor(privateKeyBytes: Uint8Array) {\n if (privateKeyBytes.length !== 40) {\n throw new Error(\n `Invalid private key length. expected: 40, got: ${privateKeyBytes.length}`\n );\n }\n this.key = ECgFp5Scalar.fromLittleEndianBytes(privateKeyBytes);\n this._pubKey = schnorrPkFromSk(this.key);\n }\n\n sign(hashedMessage: Uint8Array): Uint8Array {\n if (hashedMessage.length !== 40) {\n throw new Error(`Invalid hashed message length: expected 40, got ${hashedMessage.length}`);\n }\n\n // Convert hashed message to GFp5Element\n const msgElement = GFp5Element.fromLittleEndianBytes(hashedMessage);\n\n // Sign using the proper Schnorr algorithm\n const signature = schnorrSignHashedMessage(msgElement, this.key);\n\n return signature.toBytes();\n }\n\n pubKey(): GFp5Element {\n return this._pubKey;\n }\n\n pubKeyBytes(): Uint8Array {\n return this._pubKey.toLittleEndianBytes();\n }\n\n prvKeyBytes(): Uint8Array {\n return this.key.toLittleEndianBytes();\n }\n}\n\n/**\n * Create a new KeyManager from private key bytes\n */\nexport function newKeyManager(privateKeyBytes: Uint8Array): KeyManager {\n return new KeyManagerImpl(privateKeyBytes);\n}\n\n/**\n * Generate a new API key pair\n * Returns [privateKey, publicKey] as hex strings\n */\nexport async function generateApiKey(seed?: string): Promise<[string, string]> {\n const key = seed ? await sampleScalarFromSeed(seed) : sampleScalar();\n const publicKey = schnorrPkFromSk(key);\n\n const privateKeyStr = bytesToHex(key.toLittleEndianBytes());\n const publicKeyStr = bytesToHex(publicKey.toLittleEndianBytes());\n\n return [privateKeyStr, publicKeyStr];\n}\n\n/**\n * Convert bytes to hex string\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Convert hex string to bytes\n */\nexport function hexToBytes(hex: string): Uint8Array {\n // Remove 0x prefix if present\n if (hex.startsWith('0x')) {\n hex = hex.slice(2);\n }\n\n if (hex.length % 2 !== 0) {\n throw new Error('Invalid hex string length');\n }\n\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n\n return bytes;\n}\n\n// Re-export sampleScalar for backwards compatibility\nexport {sampleScalar};\n","/**\n * Transaction Types\n */\nexport const TxType = {\n Empty: 0,\n L1Deposit: 1,\n L1ChangePubKey: 2,\n L1CreateMarket: 3,\n L1UpdateMarket: 4,\n L1CancelAllOrders: 5,\n L1Withdraw: 6,\n L1CreateOrder: 7,\n L2ChangePubKey: 8,\n L2CreateSubAccount: 9,\n L2CreatePublicPool: 10,\n L2UpdatePublicPool: 11,\n L2Transfer: 12,\n L2Withdraw: 13,\n L2CreateOrder: 14,\n L2CancelOrder: 15,\n L2CancelAllOrders: 16,\n L2ModifyOrder: 17,\n L2MintShares: 18,\n L2BurnShares: 19,\n L2UpdateLeverage: 20,\n InternalClaimOrder: 21,\n InternalCancelOrder: 22,\n InternalDeleverage: 23,\n InternalExitPosition: 24,\n InternalCancelAllOrders: 25,\n InternalLiquidatePosition: 26,\n InternalCreateOrder: 27,\n L2CreateGroupedOrders: 28,\n L2UpdateMargin: 29,\n L1BurnShares: 30,\n} as const;\n\nexport type TxTypeValue = (typeof TxType)[keyof typeof TxType];\n\n/**\n * Order Types\n */\nexport const OrderType = {\n Limit: 0,\n Market: 1,\n StopLoss: 2,\n StopLossLimit: 3,\n TakeProfit: 4,\n TakeProfitLimit: 5,\n TWAP: 6,\n TWAPSub: 7,\n Liquidation: 8,\n} as const;\n\nexport type OrderTypeValue = (typeof OrderType)[keyof typeof OrderType];\n\nexport const ApiMaxOrderType = OrderType.TWAP;\n\n/**\n * Order Time-In-Force\n */\nexport const TimeInForce = {\n ImmediateOrCancel: 0,\n GoodTillTime: 1,\n PostOnly: 2,\n} as const;\n\nexport type TimeInForceValue = (typeof TimeInForce)[keyof typeof TimeInForce];\n\n/**\n * Grouping Types\n */\nexport const GroupingType = {\n None: 0,\n OneTriggersTheOther: 1,\n OneCancelsTheOther: 2,\n OneTriggersAOneCancelsTheOther: 3,\n} as const;\n\nexport type GroupingTypeValue =\n (typeof GroupingType)[keyof typeof GroupingType];\n\n/**\n * Cancel All Orders Time-In-Force\n */\nexport const CancelAllTimeInForce = {\n Immediate: 0,\n Scheduled: 1,\n AbortScheduled: 2,\n} as const;\n\nexport type CancelAllTimeInForceValue =\n (typeof CancelAllTimeInForce)[keyof typeof CancelAllTimeInForce];\n\n/**\n * Asset Margin Mode\n */\nexport const AssetMarginMode = {\n Disabled: 0,\n Enabled: 1,\n} as const;\n\nexport type AssetMarginModeValue =\n (typeof AssetMarginMode)[keyof typeof AssetMarginMode];\n\n/**\n * Asset Route Type\n */\nexport const AssetRouteType = {\n Perps: 0,\n Spot: 1,\n} as const;\n\nexport type AssetRouteTypeValue =\n (typeof AssetRouteType)[keyof typeof AssetRouteType];\n\n/**\n * Position Margin Mode\n */\nexport const MarginMode = {\n Cross: 0,\n Isolated: 1,\n} as const;\n\nexport type MarginModeValue = (typeof MarginMode)[keyof typeof MarginMode];\n\n/**\n * Margin Update Direction\n */\nexport const MarginDirection = {\n Remove: 0,\n Add: 1,\n} as const;\n\nexport type MarginDirectionValue =\n (typeof MarginDirection)[keyof typeof MarginDirection];\n\n/**\n * Numeric Constants\n */\nexport const ONE_USDC = 1_000_000n;\nexport const FEE_TICK = 1_000_000n;\nexport const MARGIN_FRACTION_TICK = 10_000n;\nexport const SHARE_TICK = 10_000;\n\n// Account Index bounds\nexport const MIN_ACCOUNT_INDEX = 0n;\nexport const MAX_ACCOUNT_INDEX = 281474976710654n; // (1 << 48) - 2\nexport const MAX_MASTER_ACCOUNT_INDEX = 140737488355327n; // (1 << 47) - 1\nexport const MIN_SUB_ACCOUNT_INDEX = 140737488355328n; // (1 << 47)\n\n// API Key Index bounds\nexport const MIN_API_KEY_INDEX = 0;\nexport const MAX_API_KEY_INDEX = 254; // (1 << 8) - 2\nexport const NIL_API_KEY_INDEX = 255;\n\n// Market Index bounds\nexport const MIN_MARKET_INDEX = 0;\nexport const MIN_PERPS_MARKET_INDEX = 0;\nexport const MAX_PERPS_MARKET_INDEX = 254; // (1 << 8) - 2\nexport const NIL_MARKET_INDEX = 255;\nexport const MIN_SPOT_MARKET_INDEX = 2048; // (1 << 11)\nexport const MAX_SPOT_MARKET_INDEX = 4094; // (1 << 12) - 2\n\n// Asset Index bounds\nexport const NATIVE_ASSET_INDEX = 1;\nexport const USDC_ASSET_INDEX = 3;\nexport const MIN_ASSET_INDEX = 1;\nexport const MAX_ASSET_INDEX = 62; // (1 << 6) - 2\nexport const NIL_ASSET_INDEX = 0;\n\n// Pool constants\nexport const MAX_INVESTED_PUBLIC_POOL_COUNT = 16n;\nexport const INITIAL_POOL_SHARE_VALUE = 1_000n; // 0.001 USDC\nexport const MIN_INITIAL_TOTAL_SHARES =\n (1_000n * ONE_USDC) / INITIAL_POOL_SHARE_VALUE;\nexport const MAX_INITIAL_TOTAL_SHARES =\n (1_000_000_000n * ONE_USDC) / INITIAL_POOL_SHARE_VALUE;\nexport const MAX_POOL_SHARES = (1n << 60n) - 1n;\nexport const MAX_BURNT_SHARE_USDC_VALUE = (1n << 60n) - 1n;\nexport const MAX_POOL_ENTRY_USDC = (1n << 56n) - 1n;\nexport const MIN_POOL_SHARES_TO_MINT_OR_BURN = 1n;\nexport const MAX_POOL_SHARES_TO_MINT_OR_BURN = (1n << 60n) - 1n;\n\n// Nonce bounds\nexport const MIN_NONCE = 0n;\n\n// Order Nonce bounds\nexport const MIN_ORDER_NONCE = 0n;\nexport const MAX_ORDER_NONCE = (1n << 48n) - 1n;\n\n// Order Index bounds\nexport const NIL_CLIENT_ORDER_INDEX = 0n;\nexport const NIL_ORDER_INDEX = 0n;\nexport const MIN_CLIENT_ORDER_INDEX = 1n;\nexport const MAX_CLIENT_ORDER_INDEX = (1n << 48n) - 1n;\nexport const MIN_ORDER_INDEX = MAX_CLIENT_ORDER_INDEX + 1n;\nexport const MAX_ORDER_INDEX = (1n << 60n) - 1n;\n\n// Order Base Amount bounds\nexport const MIN_ORDER_BASE_AMOUNT = 1n;\nexport const MAX_ORDER_BASE_AMOUNT = (1n << 48n) - 1n;\nexport const NIL_ORDER_BASE_AMOUNT = 0n;\n\n// Order Price bounds\nexport const NIL_ORDER_PRICE = 0;\nexport const MIN_ORDER_PRICE = 1;\nexport const MAX_ORDER_PRICE = 0xffffffff; // (1 << 32) - 1\n\n// Cancel All Order Period bounds (in milliseconds)\nexport const MIN_ORDER_CANCEL_ALL_PERIOD = 1000 * 60 * 5; // 5 minutes\nexport const MAX_ORDER_CANCEL_ALL_PERIOD = 1000 * 60 * 60 * 24 * 15; // 15 days\n\n// Order Expiry bounds\nexport const NIL_ORDER_EXPIRY = 0n;\nexport const MIN_ORDER_EXPIRY = 1n;\nexport const MAX_ORDER_EXPIRY = BigInt(Number.MAX_SAFE_INTEGER);\n\n// Order Expiry Period bounds (in milliseconds)\nexport const MIN_ORDER_EXPIRY_PERIOD = 1000 * 60 * 5; // 5 minutes\nexport const MAX_ORDER_EXPIRY_PERIOD = 1000 * 60 * 60 * 24 * 30; // 30 days\n\n// Order Trigger Price bounds\nexport const NIL_ORDER_TRIGGER_PRICE = 0;\nexport const MIN_ORDER_TRIGGER_PRICE = 1;\nexport const MAX_ORDER_TRIGGER_PRICE = 0xffffffff; // (1 << 32) - 1\n\n// Grouped Order bounds\nexport const MAX_GROUPED_ORDER_COUNT = 4;\n\n// Transfer bounds\nexport const MIN_TRANSFER_AMOUNT = 0n;\nexport const MAX_TRANSFER_AMOUNT = (1n << 56n) - 1n;\nexport const MAX_TRANSFER_FEE = (1n << 40n) - 1n;\n\n// Withdrawal bounds\nexport const MIN_WITHDRAWAL_AMOUNT = 1n;\nexport const MAX_WITHDRAWAL_AMOUNT = (1n << 56n) - 1n;\n\n// USDC Amount bounds\nexport const MIN_USDC_AMOUNT = 0n;\nexport const MAX_USDC_AMOUNT = (1n << 56n) - 1n;\n\n// Timestamp bounds\nexport const MIN_TIMESTAMP = 0n;\nexport const MAX_TIMESTAMP = (1n << 63n) - 1n;\n\n// Default expire time (10 minutes minus 1 second margin)\nexport const DEFAULT_EXPIRE_TIME_MS = 10 * 60 * 1000 - 1000;\n\n// Special nonce value to fetch from server\nexport const FETCH_NONCE_FROM_SERVER = -1n;\n","/**\n * Validation errors for transactions\n */\nexport class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\n// Account Index errors\nexport const ErrAccountIndexTooLow = new ValidationError(\n 'account index too low'\n);\nexport const ErrAccountIndexTooHigh = new ValidationError(\n 'account index too high'\n);\nexport const ErrFromAccountIndexTooLow = new ValidationError(\n 'from account index too low'\n);\nexport const ErrFromAccountIndexTooHigh = new ValidationError(\n 'from account index too high'\n);\nexport const ErrToAccountIndexTooLow = new ValidationError(\n 'to account index too low'\n);\nexport const ErrToAccountIndexTooHigh = new ValidationError(\n 'to account index too high'\n);\n\n// API Key Index errors\nexport const ErrApiKeyIndexTooLow = new ValidationError(\n 'api key index too low'\n);\nexport const ErrApiKeyIndexTooHigh = new ValidationError(\n 'api key index too high'\n);\n\n// Market Index errors\nexport const ErrInvalidMarketIndex = new ValidationError('invalid market index');\n\n// Asset Index errors\nexport const ErrAssetIndexTooLow = new ValidationError('asset index too low');\nexport const ErrAssetIndexTooHigh = new ValidationError('asset index too high');\n\n// Route Type errors\nexport const ErrRouteTypeInvalid = new ValidationError('invalid route type');\n\n// Order Index errors\nexport const ErrClientOrderIndexTooLow = new ValidationError(\n 'client order index too low'\n);\nexport const ErrClientOrderIndexTooHigh = new ValidationError(\n 'client order index too high'\n);\nexport const ErrOrderIndexTooLow = new ValidationError('order index too low');\nexport const ErrOrderIndexTooHigh = new ValidationError('order index too high');\n\n// Order Amount errors\nexport const ErrBaseAmountTooLow = new ValidationError('base amount too low');\nexport const ErrBaseAmountTooHigh = new ValidationError('base amount too high');\n\n// Price errors\nexport const ErrPriceTooLow = new ValidationError('price too low');\nexport const ErrPriceTooHigh = new ValidationError('price too high');\n\n// Order Type errors\nexport const ErrIsAskInvalid = new ValidationError('invalid isAsk value');\nexport const ErrOrderTypeInvalid = new ValidationError('invalid order type');\nexport const ErrOrderTimeInForceInvalid = new ValidationError(\n 'invalid time in force'\n);\nexport const ErrOrderReduceOnlyInvalid = new ValidationError(\n 'invalid reduce only value'\n);\nexport const ErrOrderExpiryInvalid = new ValidationError(\n 'invalid order expiry'\n);\nexport const ErrOrderTriggerPriceInvalid = new ValidationError(\n 'invalid trigger price'\n);\n\n// Nonce errors\nexport const ErrNonceTooLow = new ValidationError('nonce too low');\n\n// Expiry errors\nexport const ErrExpiredAtInvalid = new ValidationError('invalid expiredAt');\n\n// Transfer errors\nexport const ErrTransferAmountTooLow = new ValidationError(\n 'transfer amount too low'\n);\nexport const ErrTransferAmountTooHigh = new ValidationError(\n 'transfer amount too high'\n);\nexport const ErrTransferFeeNegative = new ValidationError(\n 'transfer fee cannot be negative'\n);\nexport const ErrTransferFeeTooHigh = new ValidationError(\n 'transfer fee too high'\n);\n\n// Withdrawal errors\nexport const ErrWithdrawalAmountTooLow = new ValidationError(\n 'withdrawal amount too low'\n);\nexport const ErrWithdrawalAmountTooHigh = new ValidationError(\n 'withdrawal amount too high'\n);\n\n// USDC errors\nexport const ErrUSDCAmountTooLow = new ValidationError('usdc amount too low');\nexport const ErrUSDCAmountTooHigh = new ValidationError('usdc amount too high');\n\n// Public Key errors\nexport const ErrInvalidPublicKeyLength = new ValidationError(\n 'invalid public key length'\n);\n\n// Margin errors\nexport const ErrMarginModeInvalid = new ValidationError('invalid margin mode');\nexport const ErrMarginDirectionInvalid = new ValidationError(\n 'invalid margin direction'\n);\n\n// Pool errors\nexport const ErrPublicPoolIndexTooLow = new ValidationError(\n 'public pool index too low'\n);\nexport const ErrShareAmountTooLow = new ValidationError(\n 'share amount too low'\n);\nexport const ErrShareAmountTooHigh = new ValidationError(\n 'share amount too high'\n);\nexport const ErrOperatorFeeTooLow = new ValidationError('operator fee too low');\nexport const ErrOperatorFeeTooHigh = new ValidationError(\n 'operator fee too high'\n);\nexport const ErrInitialTotalSharesTooLow = new ValidationError(\n 'initial total shares too low'\n);\nexport const ErrInitialTotalSharesTooHigh = new ValidationError(\n 'initial total shares too high'\n);\nexport const ErrMinOperatorShareRateTooHigh = new ValidationError(\n 'min operator share rate too high'\n);\n\n// Cancel All errors\nexport const ErrCancelAllTimeInForceInvalid = new ValidationError(\n 'invalid cancel all time in force'\n);\nexport const ErrCancelAllTimeTooLow = new ValidationError(\n 'cancel all time too low'\n);\nexport const ErrCancelAllTimeTooHigh = new ValidationError(\n 'cancel all time too high'\n);\n\n// Grouped orders errors\nexport const ErrGroupingTypeInvalid = new ValidationError(\n 'invalid grouping type'\n);\nexport const ErrTooManyGroupedOrders = new ValidationError(\n 'too many grouped orders'\n);\nexport const ErrNoOrdersInGroup = new ValidationError('no orders in group');\n","/**\n * Transaction Info types with validation and hashing\n */\n\nimport { GoldilocksElement } from '../crypto/goldilocks';\nimport { hashToQuinticExtension } from '../crypto/poseidon2';\nimport * as constants from './constants';\nimport * as errors from './errors';\n\n/**\n * Base interface for transaction info\n */\nexport interface TxInfo {\n getTxType(): number;\n validate(): void;\n hash(chainId: number): Uint8Array;\n signature?: Uint8Array;\n signedHash?: string;\n}\n\n/**\n * Order Info structure\n */\nexport interface OrderInfo {\n marketIndex: number;\n clientOrderIndex: bigint;\n baseAmount: bigint;\n price: number;\n isAsk: number;\n type: number;\n timeInForce: number;\n reduceOnly: number;\n triggerPrice: number;\n orderExpiry: bigint;\n}\n\n/**\n * Helper to check if market is spot\n */\nfunction isSpotMarket(marketIndex: number): boolean {\n return (\n marketIndex >= constants.MIN_SPOT_MARKET_INDEX &&\n marketIndex <= constants.MAX_SPOT_MARKET_INDEX\n );\n}\n\n/**\n * Helper to check if market is perps\n */\nfunction isPerpsMarket(marketIndex: number): boolean {\n return (\n marketIndex >= constants.MIN_PERPS_MARKET_INDEX &&\n marketIndex <= constants.MAX_PERPS_MARKET_INDEX\n );\n}\n\n/**\n * Helper to format uint64 as hex10 string (0x followed by 16 hex digits)\n */\nfunction getHex10FromUint64(value: bigint): string {\n let hex = value.toString(16);\n // Pad to 16 characters\n while (hex.length < 16) {\n hex = '0' + hex;\n }\n return '0x' + hex;\n}\n\n/**\n * Helper to convert bytes to hex string\n */\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Templates for L1 signature bodies\n */\nconst TEMPLATE_CHANGE_PUB_KEY =\n 'Register Lighter Account\\n\\npubkey: 0x%s\\nnonce: %s\\naccount index: %s\\napi key index: %s\\nOnly sign this message for a trusted client!';\nconst TEMPLATE_TRANSFER =\n 'Transfer\\n\\nnonce: %s\\nfrom: %s (route %s)\\napi key: %s\\nto: %s (route %s)\\nasset: %s\\namount: %s\\nfee: %s\\nchainId: %s\\nmemo: %s\\nOnly sign this message for a trusted client!';\n\n/**\n * Helper to format strings with placeholders\n */\nfunction formatString(template: string, ...args: string[]): string {\n let result = template;\n for (const arg of args) {\n result = result.replace('%s', arg);\n }\n return result;\n}\n\n/**\n * L2 Create Order Transaction Info\n */\nexport class L2CreateOrderTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n orderInfo: OrderInfo;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n orderInfo: OrderInfo;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.orderInfo = params.orderInfo;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2CreateOrder;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // MarketIndex\n const isSpot = isSpotMarket(this.orderInfo.marketIndex);\n const isPerps = isPerpsMarket(this.orderInfo.marketIndex);\n if (!isSpot && !isPerps) {\n throw errors.ErrInvalidMarketIndex;\n }\n\n // ClientOrderIndex\n if (this.orderInfo.clientOrderIndex !== constants.NIL_CLIENT_ORDER_INDEX) {\n if (this.orderInfo.clientOrderIndex < constants.MIN_CLIENT_ORDER_INDEX) {\n throw errors.ErrClientOrderIndexTooLow;\n }\n if (this.orderInfo.clientOrderIndex > constants.MAX_CLIENT_ORDER_INDEX) {\n throw errors.ErrClientOrderIndexTooHigh;\n }\n }\n\n // BaseAmount\n if (\n this.orderInfo.reduceOnly !== 1 &&\n this.orderInfo.baseAmount === constants.NIL_ORDER_BASE_AMOUNT\n ) {\n throw errors.ErrBaseAmountTooLow;\n }\n if (\n this.orderInfo.baseAmount !== constants.NIL_ORDER_BASE_AMOUNT &&\n this.orderInfo.baseAmount < constants.MIN_ORDER_BASE_AMOUNT\n ) {\n throw errors.ErrBaseAmountTooLow;\n }\n if (this.orderInfo.baseAmount > constants.MAX_ORDER_BASE_AMOUNT) {\n throw errors.ErrBaseAmountTooHigh;\n }\n\n // Price\n if (this.orderInfo.price < constants.MIN_ORDER_PRICE) {\n throw errors.ErrPriceTooLow;\n }\n if (this.orderInfo.price > constants.MAX_ORDER_PRICE) {\n throw errors.ErrPriceTooHigh;\n }\n\n // IsAsk\n if (this.orderInfo.isAsk !== 0 && this.orderInfo.isAsk !== 1) {\n throw errors.ErrIsAskInvalid;\n }\n\n // TimeInForce\n if (\n this.orderInfo.timeInForce !== constants.TimeInForce.ImmediateOrCancel &&\n this.orderInfo.timeInForce !== constants.TimeInForce.GoodTillTime &&\n this.orderInfo.timeInForce !== constants.TimeInForce.PostOnly\n ) {\n throw errors.ErrOrderTimeInForceInvalid;\n }\n\n // ReduceOnly\n if (\n (this.orderInfo.reduceOnly !== 0 && this.orderInfo.reduceOnly !== 1) ||\n (isSpot && this.orderInfo.reduceOnly === 1)\n ) {\n throw errors.ErrOrderReduceOnlyInvalid;\n }\n\n // Order type specific validation\n this.validateOrderType(isPerps);\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n private validateOrderType(isPerps: boolean): void {\n const { type, timeInForce, orderExpiry, triggerPrice } = this.orderInfo;\n\n switch (type) {\n case constants.OrderType.Market:\n if (timeInForce !== constants.TimeInForce.ImmediateOrCancel) {\n throw errors.ErrOrderTimeInForceInvalid;\n }\n if (orderExpiry !== constants.NIL_ORDER_EXPIRY) {\n throw errors.ErrOrderExpiryInvalid;\n }\n if (triggerPrice !== constants.NIL_ORDER_TRIGGER_PRICE) {\n throw errors.ErrOrderTriggerPriceInvalid;\n }\n break;\n\n case constants.OrderType.Limit:\n if (triggerPrice !== constants.NIL_ORDER_TRIGGER_PRICE) {\n throw errors.ErrOrderTriggerPriceInvalid;\n }\n if (\n timeInForce === constants.TimeInForce.ImmediateOrCancel &&\n orderExpiry !== constants.NIL_ORDER_EXPIRY\n ) {\n throw errors.ErrOrderExpiryInvalid;\n }\n if (\n timeInForce !== constants.TimeInForce.ImmediateOrCancel &&\n orderExpiry === constants.NIL_ORDER_EXPIRY\n ) {\n throw errors.ErrOrderExpiryInvalid;\n }\n break;\n\n case constants.OrderType.StopLoss:\n case constants.OrderType.TakeProfit:\n if (!isPerps) {\n throw errors.ErrOrderTypeInvalid;\n }\n if (timeInForce !== constants.TimeInForce.ImmediateOrCancel) {\n throw errors.ErrOrderTimeInForceInvalid;\n }\n if (triggerPrice === constants.NIL_ORDER_TRIGGER_PRICE) {\n throw errors.ErrOrderTriggerPriceInvalid;\n }\n if (orderExpiry === constants.NIL_ORDER_EXPIRY) {\n throw errors.ErrOrderExpiryInvalid;\n }\n break;\n\n case constants.OrderType.StopLossLimit:\n case constants.OrderType.TakeProfitLimit:\n if (!isPerps) {\n throw errors.ErrOrderTypeInvalid;\n }\n if (triggerPrice === constants.NIL_ORDER_TRIGGER_PRICE) {\n throw errors.ErrOrderTriggerPriceInvalid;\n }\n if (orderExpiry === constants.NIL_ORDER_EXPIRY) {\n throw errors.ErrOrderExpiryInvalid;\n }\n break;\n\n case constants.OrderType.TWAP:\n if (timeInForce !== constants.TimeInForce.GoodTillTime) {\n throw errors.ErrOrderTimeInForceInvalid;\n }\n if (triggerPrice !== constants.NIL_ORDER_TRIGGER_PRICE) {\n throw errors.ErrOrderTriggerPriceInvalid;\n }\n if (orderExpiry === constants.NIL_ORDER_EXPIRY) {\n throw errors.ErrOrderExpiryInvalid;\n }\n break;\n\n default:\n throw new errors.ValidationError(`invalid order type: ${type}`);\n }\n\n // TriggerPrice bounds\n if (\n triggerPrice !== constants.NIL_ORDER_TRIGGER_PRICE &&\n (triggerPrice < constants.MIN_ORDER_TRIGGER_PRICE ||\n triggerPrice > constants.MAX_ORDER_TRIGGER_PRICE)\n ) {\n throw errors.ErrOrderTriggerPriceInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(GoldilocksElement.fromUint32(constants.TxType.L2CreateOrder));\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromUint32(this.orderInfo.marketIndex));\n elements.push(GoldilocksElement.fromInt64(this.orderInfo.clientOrderIndex));\n elements.push(GoldilocksElement.fromInt64(this.orderInfo.baseAmount));\n elements.push(GoldilocksElement.fromUint32(this.orderInfo.price));\n elements.push(GoldilocksElement.fromUint32(this.orderInfo.isAsk));\n elements.push(GoldilocksElement.fromUint32(this.orderInfo.type));\n elements.push(GoldilocksElement.fromUint32(this.orderInfo.timeInForce));\n elements.push(GoldilocksElement.fromUint32(this.orderInfo.reduceOnly));\n elements.push(GoldilocksElement.fromUint32(this.orderInfo.triggerPrice));\n elements.push(GoldilocksElement.fromInt64(this.orderInfo.orderExpiry));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Cancel Order Transaction Info\n */\nexport class L2CancelOrderTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n index: bigint;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n index: bigint;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.marketIndex = params.marketIndex;\n this.index = params.index;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2CancelOrder;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // MarketIndex\n if (!isSpotMarket(this.marketIndex) && !isPerpsMarket(this.marketIndex)) {\n throw errors.ErrInvalidMarketIndex;\n }\n\n // Index\n if (\n this.index < constants.MIN_CLIENT_ORDER_INDEX &&\n this.index < constants.MIN_ORDER_INDEX\n ) {\n throw errors.ErrOrderIndexTooLow;\n }\n if (\n this.index > constants.MAX_CLIENT_ORDER_INDEX &&\n this.index > constants.MAX_ORDER_INDEX\n ) {\n throw errors.ErrOrderIndexTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(GoldilocksElement.fromUint32(constants.TxType.L2CancelOrder));\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromUint32(this.marketIndex));\n elements.push(GoldilocksElement.fromInt64(this.index));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Modify Order Transaction Info\n */\nexport class L2ModifyOrderTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n index: bigint;\n baseAmount: bigint;\n price: number;\n triggerPrice: number;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n index: bigint;\n baseAmount: bigint;\n price: number;\n triggerPrice: number;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.marketIndex = params.marketIndex;\n this.index = params.index;\n this.baseAmount = params.baseAmount;\n this.price = params.price;\n this.triggerPrice = params.triggerPrice;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2ModifyOrder;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // MarketIndex\n if (!isSpotMarket(this.marketIndex) && !isPerpsMarket(this.marketIndex)) {\n throw errors.ErrInvalidMarketIndex;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(GoldilocksElement.fromUint32(constants.TxType.L2ModifyOrder));\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromUint32(this.marketIndex));\n elements.push(GoldilocksElement.fromInt64(this.index));\n elements.push(GoldilocksElement.fromInt64(this.baseAmount));\n elements.push(GoldilocksElement.fromUint32(this.price));\n elements.push(GoldilocksElement.fromUint32(this.triggerPrice));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Cancel All Orders Transaction Info\n */\nexport class L2CancelAllOrdersTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n timeInForce: number;\n time: bigint;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n timeInForce: number;\n time: bigint;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.timeInForce = params.timeInForce;\n this.time = params.time;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2CancelAllOrders;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // TimeInForce\n if (\n this.timeInForce !== constants.CancelAllTimeInForce.Immediate &&\n this.timeInForce !== constants.CancelAllTimeInForce.Scheduled &&\n this.timeInForce !== constants.CancelAllTimeInForce.AbortScheduled\n ) {\n throw errors.ErrCancelAllTimeInForceInvalid;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2CancelAllOrders)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromUint32(this.timeInForce));\n elements.push(GoldilocksElement.fromInt64(this.time));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Withdraw Transaction Info\n */\nexport class L2WithdrawTxInfo implements TxInfo {\n fromAccountIndex: bigint;\n apiKeyIndex: number;\n assetIndex: number;\n routeType: number;\n amount: bigint;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n fromAccountIndex: bigint;\n apiKeyIndex: number;\n assetIndex: number;\n routeType: number;\n amount: bigint;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.fromAccountIndex = params.fromAccountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.assetIndex = params.assetIndex;\n this.routeType = params.routeType;\n this.amount = params.amount;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2Withdraw;\n }\n\n validate(): void {\n // FromAccountIndex\n if (this.fromAccountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrFromAccountIndexTooLow;\n }\n if (this.fromAccountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrFromAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // AssetIndex\n if (this.assetIndex < constants.MIN_ASSET_INDEX) {\n throw errors.ErrAssetIndexTooLow;\n }\n if (this.assetIndex > constants.MAX_ASSET_INDEX) {\n throw errors.ErrAssetIndexTooHigh;\n }\n\n // RouteType\n if (\n this.routeType !== constants.AssetRouteType.Perps &&\n this.routeType !== constants.AssetRouteType.Spot\n ) {\n throw errors.ErrRouteTypeInvalid;\n }\n\n // Amount\n if (this.amount === 0n) {\n throw errors.ErrWithdrawalAmountTooLow;\n }\n if (this.amount > constants.MAX_WITHDRAWAL_AMOUNT) {\n throw errors.ErrWithdrawalAmountTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(GoldilocksElement.fromUint32(constants.TxType.L2Withdraw));\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.fromAccountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromUint32(this.assetIndex));\n elements.push(GoldilocksElement.fromUint32(this.routeType));\n elements.push(GoldilocksElement.fromUint64(this.amount & 0xffffffffn));\n elements.push(GoldilocksElement.fromUint64(this.amount >> 32n));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Transfer Transaction Info\n */\nexport class L2TransferTxInfo implements TxInfo {\n fromAccountIndex: bigint;\n apiKeyIndex: number;\n toAccountIndex: bigint;\n assetIndex: number;\n fromRouteType: number;\n toRouteType: number;\n amount: bigint;\n usdcFee: bigint;\n memo: Uint8Array;\n expiredAt: bigint;\n nonce: bigint;\n l1Sig?: string;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n fromAccountIndex: bigint;\n apiKeyIndex: number;\n toAccountIndex: bigint;\n assetIndex: number;\n fromRouteType: number;\n toRouteType: number;\n amount: bigint;\n usdcFee: bigint;\n memo: Uint8Array;\n expiredAt: bigint;\n nonce: bigint;\n l1Sig?: string;\n }) {\n this.fromAccountIndex = params.fromAccountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.toAccountIndex = params.toAccountIndex;\n this.assetIndex = params.assetIndex;\n this.fromRouteType = params.fromRouteType;\n this.toRouteType = params.toRouteType;\n this.amount = params.amount;\n this.usdcFee = params.usdcFee;\n this.memo = params.memo;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n this.l1Sig = params.l1Sig;\n }\n\n getTxType(): number {\n return constants.TxType.L2Transfer;\n }\n\n validate(): void {\n // FromAccountIndex\n if (this.fromAccountIndex < constants.MIN_ACCOUNT_INDEX + 1n) {\n throw errors.ErrFromAccountIndexTooLow;\n }\n if (this.fromAccountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrFromAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // ToAccountIndex\n if (this.toAccountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrToAccountIndexTooLow;\n }\n if (this.toAccountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrToAccountIndexTooHigh;\n }\n\n // AssetIndex\n if (this.assetIndex < constants.MIN_ASSET_INDEX) {\n throw errors.ErrAssetIndexTooLow;\n }\n if (this.assetIndex > constants.MAX_ASSET_INDEX) {\n throw errors.ErrAssetIndexTooHigh;\n }\n\n // RouteTypes\n if (\n this.fromRouteType !== constants.AssetRouteType.Perps &&\n this.fromRouteType !== constants.AssetRouteType.Spot\n ) {\n throw errors.ErrRouteTypeInvalid;\n }\n if (\n this.toRouteType !== constants.AssetRouteType.Perps &&\n this.toRouteType !== constants.AssetRouteType.Spot\n ) {\n throw errors.ErrRouteTypeInvalid;\n }\n\n // Amount\n if (this.amount <= 0n) {\n throw errors.ErrTransferAmountTooLow;\n }\n if (this.amount > constants.MAX_TRANSFER_AMOUNT) {\n throw errors.ErrTransferAmountTooHigh;\n }\n\n // Fee\n if (this.usdcFee < 0n) {\n throw errors.ErrTransferFeeNegative;\n }\n if (this.usdcFee > constants.MAX_TRANSFER_FEE) {\n throw errors.ErrTransferFeeTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(GoldilocksElement.fromUint32(constants.TxType.L2Transfer));\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.fromAccountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromInt64(this.toAccountIndex));\n elements.push(GoldilocksElement.fromUint32(this.assetIndex));\n elements.push(GoldilocksElement.fromUint32(this.fromRouteType));\n elements.push(GoldilocksElement.fromUint32(this.toRouteType));\n // Split amount into two 32-bit parts\n elements.push(GoldilocksElement.fromUint64(this.amount & 0xffffffffn));\n elements.push(GoldilocksElement.fromUint64(this.amount >> 32n));\n // Split usdcFee into two 32-bit parts\n elements.push(GoldilocksElement.fromUint64(this.usdcFee & 0xffffffffn));\n elements.push(GoldilocksElement.fromUint64(this.usdcFee >> 32n));\n\n return hashToQuinticExtension(elements);\n }\n\n /**\n * Get L1 signature body for this transfer transaction\n * Used for calculating L1 address from signature\n */\n getL1SignatureBody(chainId: number): string {\n const hexMemo = bytesToHex(this.memo);\n return formatString(\n TEMPLATE_TRANSFER,\n getHex10FromUint64(this.nonce),\n getHex10FromUint64(this.fromAccountIndex),\n getHex10FromUint64(BigInt(this.fromRouteType)),\n getHex10FromUint64(BigInt(this.apiKeyIndex)),\n getHex10FromUint64(this.toAccountIndex),\n getHex10FromUint64(BigInt(this.toRouteType)),\n getHex10FromUint64(BigInt(this.assetIndex)),\n getHex10FromUint64(this.amount),\n getHex10FromUint64(this.usdcFee),\n getHex10FromUint64(BigInt(chainId)),\n hexMemo\n );\n }\n}\n\n/**\n * L2 Change Pub Key Transaction Info\n */\nexport class L2ChangePubKeyTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n pubKey: Uint8Array;\n expiredAt: bigint;\n nonce: bigint;\n l1Sig?: string;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n pubKey: Uint8Array;\n expiredAt: bigint;\n nonce: bigint;\n l1Sig?: string;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.pubKey = params.pubKey;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n this.l1Sig = params.l1Sig;\n }\n\n getTxType(): number {\n return constants.TxType.L2ChangePubKey;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // PubKey\n if (this.pubKey.length !== 40) {\n throw errors.ErrInvalidPublicKeyLength;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2ChangePubKey)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n\n // Add pubKey as field elements (5 x 8 bytes)\n for (let i = 0; i < 40; i += 8) {\n let val = 0n;\n for (let j = 0; j < 8; j++) {\n val |= BigInt(this.pubKey[i + j]) << BigInt(j * 8);\n }\n elements.push(new GoldilocksElement(val));\n }\n\n return hashToQuinticExtension(elements);\n }\n\n /**\n * Get L1 signature body for this change pub key transaction\n * Used for calculating L1 address from signature\n */\n getL1SignatureBody(): string {\n const hexPubKey = bytesToHex(this.pubKey);\n return formatString(\n TEMPLATE_CHANGE_PUB_KEY,\n hexPubKey,\n getHex10FromUint64(this.nonce),\n getHex10FromUint64(this.accountIndex),\n getHex10FromUint64(BigInt(this.apiKeyIndex))\n );\n }\n}\n\n/**\n * L2 Create Sub Account Transaction Info\n */\nexport class L2CreateSubAccountTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2CreateSubAccount;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2CreateSubAccount)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Update Leverage Transaction Info\n */\nexport class L2UpdateLeverageTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n initialMarginFraction: number;\n marginMode: number;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n initialMarginFraction: number;\n marginMode: number;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.marketIndex = params.marketIndex;\n this.initialMarginFraction = params.initialMarginFraction;\n this.marginMode = params.marginMode;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2UpdateLeverage;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // MarketIndex\n if (!isPerpsMarket(this.marketIndex)) {\n throw errors.ErrInvalidMarketIndex;\n }\n\n // MarginMode\n if (\n this.marginMode !== constants.MarginMode.Cross &&\n this.marginMode !== constants.MarginMode.Isolated\n ) {\n throw errors.ErrMarginModeInvalid;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2UpdateLeverage)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromUint32(this.marketIndex));\n elements.push(GoldilocksElement.fromUint32(this.initialMarginFraction));\n elements.push(GoldilocksElement.fromUint32(this.marginMode));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Update Margin Transaction Info\n */\nexport class L2UpdateMarginTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n usdcAmount: bigint;\n direction: number;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n marketIndex: number;\n usdcAmount: bigint;\n direction: number;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.marketIndex = params.marketIndex;\n this.usdcAmount = params.usdcAmount;\n this.direction = params.direction;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2UpdateMargin;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // MarketIndex\n if (!isPerpsMarket(this.marketIndex)) {\n throw errors.ErrInvalidMarketIndex;\n }\n\n // Direction\n if (\n this.direction !== constants.MarginDirection.Remove &&\n this.direction !== constants.MarginDirection.Add\n ) {\n throw errors.ErrMarginDirectionInvalid;\n }\n\n // USDCAmount\n if (this.usdcAmount <= 0n) {\n throw errors.ErrUSDCAmountTooLow;\n }\n if (this.usdcAmount > constants.MAX_USDC_AMOUNT) {\n throw errors.ErrUSDCAmountTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2UpdateMargin)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromInt64(BigInt(this.marketIndex)));\n // Split usdcAmount into two 32-bit parts\n elements.push(GoldilocksElement.fromUint64(this.usdcAmount & 0xffffffffn));\n elements.push(GoldilocksElement.fromUint64(this.usdcAmount >> 32n));\n elements.push(GoldilocksElement.fromUint32(this.direction));\n\n return hashToQuinticExtension(elements);\n }\n}\n","/**\n * Additional Transaction Info types for pools and grouped orders\n */\n\nimport {GoldilocksElement} from '../crypto/goldilocks';\nimport {hashNoPad, hashNToOne, hashToQuinticExtension} from '../crypto/poseidon2';\nimport * as constants from './constants';\nimport * as errors from './errors';\nimport {OrderInfo, TxInfo} from './txInfo';\n\n/**\n * L2 Create Grouped Orders Transaction Info\n */\nexport class L2CreateGroupedOrdersTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n groupingType: number;\n orders: OrderInfo[];\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n groupingType: number;\n orders: OrderInfo[];\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.groupingType = params.groupingType;\n this.orders = params.orders;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2CreateGroupedOrders;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // GroupingType\n if (\n this.groupingType !== constants.GroupingType.None &&\n this.groupingType !== constants.GroupingType.OneTriggersTheOther &&\n this.groupingType !== constants.GroupingType.OneCancelsTheOther &&\n this.groupingType !== constants.GroupingType.OneTriggersAOneCancelsTheOther\n ) {\n throw errors.ErrGroupingTypeInvalid;\n }\n\n // Orders\n if (this.orders.length === 0) {\n throw errors.ErrNoOrdersInGroup;\n }\n if (this.orders.length > constants.MAX_GROUPED_ORDER_COUNT) {\n throw errors.ErrTooManyGroupedOrders;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2CreateGroupedOrders)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromUint32(this.groupingType));\n\n // Hash each order separately and aggregate them\n const orderHashes: GoldilocksElement[][] = [];\n for (const order of this.orders) {\n const orderElements: GoldilocksElement[] = [\n GoldilocksElement.fromUint32(order.marketIndex),\n GoldilocksElement.fromInt64(order.clientOrderIndex),\n GoldilocksElement.fromInt64(order.baseAmount),\n GoldilocksElement.fromUint32(order.price),\n GoldilocksElement.fromUint32(order.isAsk),\n GoldilocksElement.fromUint32(order.type),\n GoldilocksElement.fromUint32(order.timeInForce),\n GoldilocksElement.fromUint32(order.reduceOnly),\n GoldilocksElement.fromUint32(order.triggerPrice),\n GoldilocksElement.fromInt64(order.orderExpiry),\n ];\n orderHashes.push(hashNoPad(orderElements));\n }\n\n // Aggregate order hashes\n const aggregatedOrderHash = hashNToOne(orderHashes);\n\n // Add all 4 elements from the aggregated hash\n elements.push(...aggregatedOrderHash);\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Create Public Pool Transaction Info\n */\nexport class L2CreatePublicPoolTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n operatorFee: bigint;\n initialTotalShares: bigint;\n minOperatorShareRate: number;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n operatorFee: bigint;\n initialTotalShares: bigint;\n minOperatorShareRate: number;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.operatorFee = params.operatorFee;\n this.initialTotalShares = params.initialTotalShares;\n this.minOperatorShareRate = params.minOperatorShareRate;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2CreatePublicPool;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // InitialTotalShares\n if (this.initialTotalShares < constants.MIN_INITIAL_TOTAL_SHARES) {\n throw errors.ErrInitialTotalSharesTooLow;\n }\n if (this.initialTotalShares > constants.MAX_INITIAL_TOTAL_SHARES) {\n throw errors.ErrInitialTotalSharesTooHigh;\n }\n\n // MinOperatorShareRate\n if (this.minOperatorShareRate > constants.SHARE_TICK) {\n throw errors.ErrMinOperatorShareRateTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2CreatePublicPool)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromInt64(this.operatorFee));\n elements.push(GoldilocksElement.fromInt64(this.initialTotalShares));\n elements.push(GoldilocksElement.fromUint32(this.minOperatorShareRate));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Update Public Pool Transaction Info\n */\nexport class L2UpdatePublicPoolTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n publicPoolIndex: bigint;\n status: number;\n operatorFee: bigint;\n minOperatorShareRate: number;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n publicPoolIndex: bigint;\n status: number;\n operatorFee: bigint;\n minOperatorShareRate: number;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.publicPoolIndex = params.publicPoolIndex;\n this.status = params.status;\n this.operatorFee = params.operatorFee;\n this.minOperatorShareRate = params.minOperatorShareRate;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2UpdatePublicPool;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // PublicPoolIndex\n if (this.publicPoolIndex < 0n) {\n throw errors.ErrPublicPoolIndexTooLow;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(\n GoldilocksElement.fromUint32(constants.TxType.L2UpdatePublicPool)\n );\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromInt64(this.publicPoolIndex));\n elements.push(GoldilocksElement.fromUint32(this.status));\n elements.push(GoldilocksElement.fromInt64(this.operatorFee));\n elements.push(GoldilocksElement.fromUint32(this.minOperatorShareRate));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Mint Shares Transaction Info\n */\nexport class L2MintSharesTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n publicPoolIndex: bigint;\n shareAmount: bigint;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n publicPoolIndex: bigint;\n shareAmount: bigint;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.publicPoolIndex = params.publicPoolIndex;\n this.shareAmount = params.shareAmount;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2MintShares;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // PublicPoolIndex\n if (this.publicPoolIndex < 0n) {\n throw errors.ErrPublicPoolIndexTooLow;\n }\n\n // ShareAmount\n if (this.shareAmount < constants.MIN_POOL_SHARES_TO_MINT_OR_BURN) {\n throw errors.ErrShareAmountTooLow;\n }\n if (this.shareAmount > constants.MAX_POOL_SHARES_TO_MINT_OR_BURN) {\n throw errors.ErrShareAmountTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(GoldilocksElement.fromUint32(constants.TxType.L2MintShares));\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromInt64(this.publicPoolIndex));\n elements.push(GoldilocksElement.fromInt64(this.shareAmount));\n\n return hashToQuinticExtension(elements);\n }\n}\n\n/**\n * L2 Burn Shares Transaction Info\n */\nexport class L2BurnSharesTxInfo implements TxInfo {\n accountIndex: bigint;\n apiKeyIndex: number;\n publicPoolIndex: bigint;\n shareAmount: bigint;\n expiredAt: bigint;\n nonce: bigint;\n signature?: Uint8Array;\n signedHash?: string;\n\n constructor(params: {\n accountIndex: bigint;\n apiKeyIndex: number;\n publicPoolIndex: bigint;\n shareAmount: bigint;\n expiredAt: bigint;\n nonce: bigint;\n }) {\n this.accountIndex = params.accountIndex;\n this.apiKeyIndex = params.apiKeyIndex;\n this.publicPoolIndex = params.publicPoolIndex;\n this.shareAmount = params.shareAmount;\n this.expiredAt = params.expiredAt;\n this.nonce = params.nonce;\n }\n\n getTxType(): number {\n return constants.TxType.L2BurnShares;\n }\n\n validate(): void {\n // AccountIndex\n if (this.accountIndex < constants.MIN_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooLow;\n }\n if (this.accountIndex > constants.MAX_ACCOUNT_INDEX) {\n throw errors.ErrAccountIndexTooHigh;\n }\n\n // ApiKeyIndex\n if (this.apiKeyIndex < constants.MIN_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooLow;\n }\n if (this.apiKeyIndex > constants.MAX_API_KEY_INDEX) {\n throw errors.ErrApiKeyIndexTooHigh;\n }\n\n // PublicPoolIndex\n if (this.publicPoolIndex < 0n) {\n throw errors.ErrPublicPoolIndexTooLow;\n }\n\n // ShareAmount\n if (this.shareAmount < constants.MIN_POOL_SHARES_TO_MINT_OR_BURN) {\n throw errors.ErrShareAmountTooLow;\n }\n if (this.shareAmount > constants.MAX_POOL_SHARES_TO_MINT_OR_BURN) {\n throw errors.ErrShareAmountTooHigh;\n }\n\n // Nonce\n if (this.nonce < constants.MIN_NONCE) {\n throw errors.ErrNonceTooLow;\n }\n\n // ExpiredAt\n if (this.expiredAt < 0n || this.expiredAt > constants.MAX_TIMESTAMP) {\n throw errors.ErrExpiredAtInvalid;\n }\n }\n\n hash(chainId: number): Uint8Array {\n const elements: GoldilocksElement[] = [];\n\n elements.push(GoldilocksElement.fromUint32(chainId));\n elements.push(GoldilocksElement.fromUint32(constants.TxType.L2BurnShares));\n elements.push(GoldilocksElement.fromInt64(this.nonce));\n elements.push(GoldilocksElement.fromInt64(this.expiredAt));\n\n elements.push(GoldilocksElement.fromInt64(this.accountIndex));\n elements.push(GoldilocksElement.fromUint32(this.apiKeyIndex));\n elements.push(GoldilocksElement.fromInt64(this.publicPoolIndex));\n elements.push(GoldilocksElement.fromInt64(this.shareAmount));\n\n return hashToQuinticExtension(elements);\n }\n}\n","/**\n * Transaction Info Serializer\n *\n * Converts TypeScript TxInfo objects to JSON format compatible with the Lighter API.\n * The API expects PascalCase field names matching the Go struct definitions.\n */\n\nimport * as types from \"./index\";\n\n/**\n * Convert Uint8Array to base64 string (Go json.Marshal format for []byte)\n */\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n // Browser fallback\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Serialize L2CreateOrderTxInfo to JSON\n */\nexport function serializeCreateOrder(\n txInfo: types.L2CreateOrderTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n MarketIndex: txInfo.orderInfo.marketIndex,\n ClientOrderIndex: Number(txInfo.orderInfo.clientOrderIndex),\n BaseAmount: Number(txInfo.orderInfo.baseAmount),\n Price: txInfo.orderInfo.price,\n IsAsk: txInfo.orderInfo.isAsk,\n Type: txInfo.orderInfo.type,\n TimeInForce: txInfo.orderInfo.timeInForce,\n ReduceOnly: txInfo.orderInfo.reduceOnly,\n TriggerPrice: txInfo.orderInfo.triggerPrice,\n OrderExpiry: Number(txInfo.orderInfo.orderExpiry),\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2CancelOrderTxInfo to JSON\n */\nexport function serializeCancelOrder(\n txInfo: types.L2CancelOrderTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n MarketIndex: txInfo.marketIndex,\n Index: Number(txInfo.index),\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2ModifyOrderTxInfo to JSON\n */\nexport function serializeModifyOrder(\n txInfo: types.L2ModifyOrderTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n MarketIndex: txInfo.marketIndex,\n Index: Number(txInfo.index),\n BaseAmount: Number(txInfo.baseAmount),\n Price: txInfo.price,\n TriggerPrice: txInfo.triggerPrice,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2CancelAllOrdersTxInfo to JSON\n */\nexport function serializeCancelAllOrders(\n txInfo: types.L2CancelAllOrdersTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n TimeInForce: txInfo.timeInForce,\n Time: Number(txInfo.time),\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2WithdrawTxInfo to JSON\n */\nexport function serializeWithdraw(txInfo: types.L2WithdrawTxInfo): string {\n return JSON.stringify({\n FromAccountIndex: Number(txInfo.fromAccountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n AssetIndex: txInfo.assetIndex,\n RouteType: txInfo.routeType,\n Amount: Number(txInfo.amount),\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2TransferTxInfo to JSON\n */\nexport function serializeTransfer(txInfo: types.L2TransferTxInfo): string {\n // Convert memo bytes to string if it's a Uint8Array\n\n return JSON.stringify({\n FromAccountIndex: Number(txInfo.fromAccountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n ToAccountIndex: Number(txInfo.toAccountIndex),\n AssetIndex: txInfo.assetIndex,\n FromRouteType: txInfo.fromRouteType,\n ToRouteType: txInfo.toRouteType,\n Amount: Number(txInfo.amount),\n USDCFee: Number(txInfo.usdcFee),\n Memo: Array.from(txInfo.memo),\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2ChangePubKeyTxInfo to JSON\n */\nexport function serializeChangePubKey(\n txInfo: types.L2ChangePubKeyTxInfo,\n): string {\n // Convert pubKey bytes to hex string\n const pubKeyHex = Array.from(txInfo.pubKey)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n PubKey: pubKeyHex,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2CreateSubAccountTxInfo to JSON\n */\nexport function serializeCreateSubAccount(\n txInfo: types.L2CreateSubAccountTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2UpdateLeverageTxInfo to JSON\n */\nexport function serializeUpdateLeverage(\n txInfo: types.L2UpdateLeverageTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n MarketIndex: txInfo.marketIndex,\n InitialMarginFraction: txInfo.initialMarginFraction,\n MarginMode: txInfo.marginMode,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2UpdateMarginTxInfo to JSON\n */\nexport function serializeUpdateMargin(\n txInfo: types.L2UpdateMarginTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n MarketIndex: txInfo.marketIndex,\n UsdcAmount: Number(txInfo.usdcAmount),\n Direction: txInfo.direction,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2CreatePublicPoolTxInfo to JSON\n */\nexport function serializeCreatePublicPool(\n txInfo: types.L2CreatePublicPoolTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n OperatorFee: Number(txInfo.operatorFee),\n InitialTotalShares: Number(txInfo.initialTotalShares),\n MinOperatorShareRate: txInfo.minOperatorShareRate,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2UpdatePublicPoolTxInfo to JSON\n */\nexport function serializeUpdatePublicPool(\n txInfo: types.L2UpdatePublicPoolTxInfo,\n): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n PublicPoolIndex: Number(txInfo.publicPoolIndex),\n Status: txInfo.status,\n OperatorFee: Number(txInfo.operatorFee),\n MinOperatorShareRate: txInfo.minOperatorShareRate,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2MintSharesTxInfo to JSON\n */\nexport function serializeMintShares(txInfo: types.L2MintSharesTxInfo): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n PublicPoolIndex: Number(txInfo.publicPoolIndex),\n ShareAmount: Number(txInfo.shareAmount),\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2BurnSharesTxInfo to JSON\n */\nexport function serializeBurnShares(txInfo: types.L2BurnSharesTxInfo): string {\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n PublicPoolIndex: Number(txInfo.publicPoolIndex),\n ShareAmount: Number(txInfo.shareAmount),\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Serialize L2CreateGroupedOrdersTxInfo to JSON\n */\nexport function serializeCreateGroupedOrders(\n txInfo: types.L2CreateGroupedOrdersTxInfo,\n): string {\n const orders = txInfo.orders.map((order) => ({\n MarketIndex: order.marketIndex,\n ClientOrderIndex: Number(order.clientOrderIndex),\n BaseAmount: Number(order.baseAmount),\n Price: order.price,\n IsAsk: order.isAsk,\n Type: order.type,\n TimeInForce: order.timeInForce,\n ReduceOnly: order.reduceOnly,\n TriggerPrice: order.triggerPrice,\n OrderExpiry: Number(order.orderExpiry),\n }));\n\n return JSON.stringify({\n AccountIndex: Number(txInfo.accountIndex),\n ApiKeyIndex: txInfo.apiKeyIndex,\n GroupingType: txInfo.groupingType,\n Orders: orders,\n ExpiredAt: Number(txInfo.expiredAt),\n Nonce: Number(txInfo.nonce),\n Sig: txInfo.signature ? uint8ArrayToBase64(txInfo.signature) : null,\n });\n}\n\n/**\n * Generic serializer - determines the type and calls the appropriate serializer\n */\nexport function serializeTxInfo(txInfo: types.TxInfo): string {\n if (txInfo instanceof types.L2CreateOrderTxInfo) {\n return serializeCreateOrder(txInfo);\n } else if (txInfo instanceof types.L2CancelOrderTxInfo) {\n return serializeCancelOrder(txInfo);\n } else if (txInfo instanceof types.L2ModifyOrderTxInfo) {\n return serializeModifyOrder(txInfo);\n } else if (txInfo instanceof types.L2CancelAllOrdersTxInfo) {\n return serializeCancelAllOrders(txInfo);\n } else if (txInfo instanceof types.L2WithdrawTxInfo) {\n return serializeWithdraw(txInfo);\n } else if (txInfo instanceof types.L2TransferTxInfo) {\n return serializeTransfer(txInfo);\n } else if (txInfo instanceof types.L2ChangePubKeyTxInfo) {\n return serializeChangePubKey(txInfo);\n } else if (txInfo instanceof types.L2CreateSubAccountTxInfo) {\n return serializeCreateSubAccount(txInfo);\n } else if (txInfo instanceof types.L2UpdateLeverageTxInfo) {\n return serializeUpdateLeverage(txInfo);\n } else if (txInfo instanceof types.L2UpdateMarginTxInfo) {\n return serializeUpdateMargin(txInfo);\n } else if (txInfo instanceof types.L2CreatePublicPoolTxInfo) {\n return serializeCreatePublicPool(txInfo);\n } else if (txInfo instanceof types.L2UpdatePublicPoolTxInfo) {\n return serializeUpdatePublicPool(txInfo);\n } else if (txInfo instanceof types.L2MintSharesTxInfo) {\n return serializeMintShares(txInfo);\n } else if (txInfo instanceof types.L2BurnSharesTxInfo) {\n return serializeBurnShares(txInfo);\n } else if (txInfo instanceof types.L2CreateGroupedOrdersTxInfo) {\n return serializeCreateGroupedOrders(txInfo);\n }\n\n throw new Error(`Unknown TxInfo type: ${txInfo.constructor.name}`);\n}\n","/**\n * Transaction Client for signing and managing Lighter transactions\n */\n\nimport { MinimalHTTPClient } from \"./http\";\nimport {\n KeyManager,\n newKeyManager,\n hexToBytes,\n bytesToHex,\n} from \"../signer/keyManager\";\nimport {\n TransactOpts,\n DEFAULT_EXPIRE_TIME_MS,\n FETCH_NONCE_FROM_SERVER,\n} from \"../types\";\nimport { bytesToFieldElementsCanonicalLE } from \"../crypto/goldilocks\";\nimport { hashToQuinticExtension } from \"../crypto/poseidon2\";\nimport * as types from \"../types\";\n\n/**\n * Transaction Client for a specific (account, apiKey) pair\n */\nexport class TxClient {\n private readonly apiClient: MinimalHTTPClient | null;\n private readonly chainId: number;\n private readonly keyManager: KeyManager;\n private readonly _accountIndex: bigint;\n private readonly _apiKeyIndex: number;\n\n constructor(\n apiClient: MinimalHTTPClient | null,\n privateKey: string,\n accountIndex: bigint,\n apiKeyIndex: number,\n chainId: number,\n ) {\n // Parse private key\n let privateKeyBytes: Uint8Array;\n try {\n privateKeyBytes = hexToBytes(privateKey);\n } catch {\n throw new Error(\"Invalid private key format\");\n }\n\n if (privateKeyBytes.length !== 40) {\n throw new Error(\n `Invalid private key length: expected 40, got ${privateKeyBytes.length}`,\n );\n }\n\n this.apiClient = apiClient;\n this.chainId = chainId;\n this.keyManager = newKeyManager(privateKeyBytes);\n this._accountIndex = accountIndex;\n this._apiKeyIndex = apiKeyIndex;\n }\n\n /**\n * Fill in default transaction options\n */\n async fulfillDefaultOpts(opts?: TransactOpts): Promise<TransactOpts> {\n const filledOpts: TransactOpts = { ...opts };\n\n if (filledOpts.expiredAt === undefined) {\n filledOpts.expiredAt = BigInt(Date.now() + DEFAULT_EXPIRE_TIME_MS);\n }\n\n if (filledOpts.fromAccountIndex === undefined) {\n filledOpts.fromAccountIndex = this._accountIndex;\n }\n\n if (filledOpts.apiKeyIndex === undefined) {\n filledOpts.apiKeyIndex = this._apiKeyIndex;\n }\n\n if (\n filledOpts.nonce === undefined ||\n filledOpts.nonce === FETCH_NONCE_FROM_SERVER\n ) {\n if (!this.apiClient) {\n throw new Error(\n \"Nonce was not provided & HTTPClient is null. Either provide the nonce or enable HTTPClient to get the nonce from Lighter\",\n );\n }\n filledOpts.nonce = await this.apiClient.getNextNonce(\n filledOpts.fromAccountIndex,\n filledOpts.apiKeyIndex,\n );\n }\n\n return filledOpts;\n }\n\n /**\n * Get chain ID\n */\n getChainId(): number {\n return this.chainId;\n }\n\n /**\n * Get key manager\n */\n getKeyManager(): KeyManager {\n return this.keyManager;\n }\n\n /**\n * Get account index\n */\n get accountIndex(): bigint {\n return this._accountIndex;\n }\n\n /**\n * Get API key index\n */\n get apiKeyIndex(): number {\n return this._apiKeyIndex;\n }\n\n /**\n * Get HTTP client\n */\n http(): MinimalHTTPClient | null {\n return this.apiClient;\n }\n\n /**\n * Check that the client's API key matches the one on the server\n */\n async check(): Promise<void> {\n if (!this.apiClient) {\n throw new Error(\"HTTP client is not configured\");\n }\n\n const publicKey = await this.apiClient.getApiKey(\n this._accountIndex,\n this._apiKeyIndex,\n );\n\n const pubKeyBytes = this.keyManager.pubKeyBytes();\n const pubKeyStr = bytesToHex(pubKeyBytes);\n\n // Compare without 0x prefix\n const normalizedPublicKey = publicKey.replace(/^0x/, \"\").toLowerCase();\n const normalizedPubKeyStr = pubKeyStr.toLowerCase();\n\n if (normalizedPublicKey !== normalizedPubKeyStr) {\n throw new Error(\n `Private key does not match the one on Lighter. ownPubKey: ${pubKeyStr}, response: ${publicKey}`,\n );\n }\n }\n\n /**\n * Create an auth token\n */\n async getAuthToken(deadline: Date): Promise<string> {\n const message = `${Math.floor(deadline.getTime() / 1000)}:${this._accountIndex}:${this._apiKeyIndex}`;\n\n // Convert message to field elements\n const msgBytes = new TextEncoder().encode(message);\n const msgElements = bytesToFieldElementsCanonicalLE(msgBytes);\n\n // Hash the message\n const msgHash = hashToQuinticExtension(msgElements);\n\n // Sign the hash\n const signatureBytes = this.keyManager.sign(msgHash);\n const signature = bytesToHex(signatureBytes);\n\n return `${message}:${signature}`;\n }\n\n /**\n * Sign a create order transaction\n */\n async signCreateOrder(\n tx: types.CreateOrderTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2CreateOrderTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2CreateOrderTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n orderInfo: {\n marketIndex: tx.marketIndex,\n clientOrderIndex: tx.clientOrderIndex,\n baseAmount: tx.baseAmount,\n price: tx.price,\n isAsk: tx.isAsk,\n type: tx.type,\n timeInForce: tx.timeInForce,\n reduceOnly: tx.reduceOnly,\n triggerPrice: tx.triggerPrice,\n orderExpiry: tx.orderExpiry,\n },\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a cancel order transaction\n */\n async signCancelOrder(\n tx: types.CancelOrderTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2CancelOrderTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2CancelOrderTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n marketIndex: tx.marketIndex,\n index: tx.index,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a modify order transaction\n */\n async signModifyOrder(\n tx: types.ModifyOrderTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2ModifyOrderTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2ModifyOrderTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n marketIndex: tx.marketIndex,\n index: tx.index,\n baseAmount: tx.baseAmount,\n price: tx.price,\n triggerPrice: tx.triggerPrice,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a cancel all orders transaction\n */\n async signCancelAllOrders(\n tx: types.CancelAllOrdersTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2CancelAllOrdersTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2CancelAllOrdersTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n timeInForce: tx.timeInForce,\n time: tx.time,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a withdraw transaction\n */\n async signWithdraw(\n tx: types.WithdrawTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2WithdrawTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2WithdrawTxInfo({\n fromAccountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n assetIndex: tx.assetIndex,\n routeType: tx.routeType,\n amount: tx.amount,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a transfer transaction\n */\n async signTransfer(\n tx: types.TransferTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2TransferTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2TransferTxInfo({\n fromAccountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n toAccountIndex: tx.toAccountIndex,\n assetIndex: tx.assetIndex,\n fromRouteType: tx.fromRouteType,\n toRouteType: tx.toRouteType,\n amount: tx.amount,\n usdcFee: tx.usdcFee,\n memo: tx.memo,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a change public key transaction\n */\n async signChangePubKey(\n tx: types.ChangePubKeyReq,\n opts?: TransactOpts,\n ): Promise<types.L2ChangePubKeyTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2ChangePubKeyTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n pubKey: tx.pubKey,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a create sub account transaction\n */\n async signCreateSubAccount(\n opts?: TransactOpts,\n ): Promise<types.L2CreateSubAccountTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2CreateSubAccountTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign an update leverage transaction\n */\n async signUpdateLeverage(\n tx: types.UpdateLeverageTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2UpdateLeverageTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2UpdateLeverageTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n marketIndex: tx.marketIndex,\n initialMarginFraction: tx.initialMarginFraction,\n marginMode: tx.marginMode,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign an update margin transaction\n */\n async signUpdateMargin(\n tx: types.UpdateMarginTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2UpdateMarginTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2UpdateMarginTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n marketIndex: tx.marketIndex,\n usdcAmount: tx.usdcAmount,\n direction: tx.direction,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a create grouped orders transaction\n */\n async signCreateGroupedOrders(\n tx: types.CreateGroupedOrdersTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2CreateGroupedOrdersTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2CreateGroupedOrdersTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n groupingType: tx.groupingType,\n orders: tx.orders.map((order) => ({\n marketIndex: order.marketIndex,\n clientOrderIndex: order.clientOrderIndex,\n baseAmount: order.baseAmount,\n price: order.price,\n isAsk: order.isAsk,\n type: order.type,\n timeInForce: order.timeInForce,\n reduceOnly: order.reduceOnly,\n triggerPrice: order.triggerPrice,\n orderExpiry: order.orderExpiry,\n })),\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a create public pool transaction\n */\n async signCreatePublicPool(\n tx: types.CreatePublicPoolTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2CreatePublicPoolTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2CreatePublicPoolTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n operatorFee: tx.operatorFee,\n initialTotalShares: tx.initialTotalShares,\n minOperatorShareRate: tx.minOperatorShareRate,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign an update public pool transaction\n */\n async signUpdatePublicPool(\n tx: types.UpdatePublicPoolTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2UpdatePublicPoolTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2UpdatePublicPoolTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n publicPoolIndex: tx.publicPoolIndex,\n status: tx.status,\n operatorFee: tx.operatorFee,\n minOperatorShareRate: tx.minOperatorShareRate,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a mint shares transaction\n */\n async signMintShares(\n tx: types.MintSharesTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2MintSharesTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2MintSharesTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n publicPoolIndex: tx.publicPoolIndex,\n shareAmount: tx.shareAmount,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n\n /**\n * Sign a burn shares transaction\n */\n async signBurnShares(\n tx: types.BurnSharesTxReq,\n opts?: TransactOpts,\n ): Promise<types.L2BurnSharesTxInfo> {\n const filledOpts = await this.fulfillDefaultOpts(opts);\n\n const txInfo = new types.L2BurnSharesTxInfo({\n accountIndex: filledOpts.fromAccountIndex!,\n apiKeyIndex: filledOpts.apiKeyIndex!,\n publicPoolIndex: tx.publicPoolIndex,\n shareAmount: tx.shareAmount,\n expiredAt: filledOpts.expiredAt!,\n nonce: filledOpts.nonce!,\n });\n\n txInfo.validate();\n const msgHash = txInfo.hash(this.chainId);\n txInfo.signature = this.keyManager.sign(msgHash);\n txInfo.signedHash = bytesToHex(msgHash);\n\n return txInfo;\n }\n}\n","/**\n * Client Manager for handling multiple TxClients\n * Similar to the Go SDK's SharedClientManager\n */\n\nimport { TxClient } from './txClient';\nimport { MinimalHTTPClient } from './http';\nimport { generateApiKey } from '../signer/keyManager';\n\n// Global client storage\nlet defaultTxClient: TxClient | null = null;\nconst defaultClientPerAccount: Map<bigint, TxClient> = new Map();\nconst allTxClients: Map<bigint, Map<number, TxClient>> = new Map();\n\n// Default values for optional parameters\nexport const DEFAULT_API_KEY_INDEX = 255;\nexport const DEFAULT_ACCOUNT_INDEX = -1n;\n\n/**\n * Get a client for specific account and API key\n */\nexport function getClient(\n apiKeyIndex: number = DEFAULT_API_KEY_INDEX,\n accountIndex: bigint = DEFAULT_ACCOUNT_INDEX\n): TxClient {\n // If apiKeyIndex==255 && accountIndex!=-1, return default client for that account\n if (apiKeyIndex === DEFAULT_API_KEY_INDEX && accountIndex !== DEFAULT_ACCOUNT_INDEX) {\n const client = defaultClientPerAccount.get(accountIndex);\n if (client) {\n return client;\n }\n }\n\n // Special case: return default client\n if (apiKeyIndex === DEFAULT_API_KEY_INDEX && accountIndex === DEFAULT_ACCOUNT_INDEX) {\n if (!defaultTxClient) {\n throw new Error('Client is not created, call createClient() first');\n }\n return defaultTxClient;\n }\n\n // Look up client in double map\n const accountClients = allTxClients.get(accountIndex);\n const client = accountClients?.get(apiKeyIndex);\n\n if (!client) {\n throw new Error(\n `Client is not created for apiKeyIndex: ${apiKeyIndex} accountIndex: ${accountIndex}`\n );\n }\n\n return client;\n}\n\n/**\n * Create a new TxClient and store it\n */\nexport function createClient(\n httpClient: MinimalHTTPClient | null,\n privateKey: string,\n chainId: number,\n apiKeyIndex: number,\n accountIndex: bigint\n): TxClient {\n if (accountIndex <= 0n) {\n throw new Error('Invalid account index');\n }\n\n const txClientInstance = new TxClient(\n httpClient,\n privateKey,\n accountIndex,\n apiKeyIndex,\n chainId\n );\n\n // Store in allTxClients map\n if (!allTxClients.has(accountIndex)) {\n allTxClients.set(accountIndex, new Map());\n }\n allTxClients.get(accountIndex)!.set(apiKeyIndex, txClientInstance);\n\n // Update default client (most recently created becomes default)\n defaultTxClient = txClientInstance;\n defaultClientPerAccount.set(accountIndex, txClientInstance);\n\n return txClientInstance;\n}\n\n/**\n * Check that a client exists and the API key matches the one on the server\n */\nexport async function checkClient(\n apiKeyIndex: number = DEFAULT_API_KEY_INDEX,\n accountIndex: bigint = DEFAULT_ACCOUNT_INDEX\n): Promise<void> {\n const client = getClient(apiKeyIndex, accountIndex);\n await client.check();\n}\n\n/**\n * Generate a new API key pair\n * Returns [privateKey, publicKey] as hex strings\n */\nexport { generateApiKey };\n\n/**\n * Clear all stored clients (useful for testing)\n */\nexport function clearClients(): void {\n defaultTxClient = null;\n defaultClientPerAccount.clear();\n allTxClients.clear();\n}\n\n/**\n * Get the default client\n */\nexport function getDefaultClient(): TxClient | null {\n return defaultTxClient;\n}\n","import axios, { AxiosInstance } from \"axios\";\n\nimport {\n AccountAccountByL1AddressResponse,\n AccountByL1AddressRequest,\n AccountRequest,\n AccountResponse,\n AnnouncementsResponse,\n ApiKeysRequest,\n ApiKeysResponse,\n AssetDetailsRequest,\n AssetDetailsResponse,\n CandlesRequest,\n CandlesResponse,\n ExchangeStatsResponse,\n FastBridgeInfoResponse,\n FundingRatesResponse,\n FundingsRequest,\n FundingsResponse,\n getAccountByL1Address,\n getAccountInfo,\n getAnnouncements,\n getApiKeys,\n getAssetDetails,\n getCandlesticks,\n getExchangeStats,\n getFastBridgeInfo,\n getFundingRates,\n getFundings,\n getNextNonce,\n getOrderBookDetails,\n getOrderBookOrders,\n getOrderBooks,\n getRecentTrades,\n getRootStatus,\n getTransaction,\n getTransactionFromL1TxHash,\n getTransactions,\n getWithdrawalDelay,\n NextNonceRequest,\n NextNonceResponse,\n OrderBookDetailsRequest,\n OrderBookDetailsResponse,\n OrderBookOrdersRequest,\n OrderBookOrdersResponse,\n OrderBooksResponse,\n RecentTradesRequest,\n RecentTradesResponse,\n RootStatusResponse,\n Transaction,\n TransactionFromL1TxHashRequest,\n TransactionRequest,\n TransactionsRequest,\n TransactionsResponse,\n WithdrawalDelayResponse,\n} from \"../api/info\";\n\nexport interface InfoClientConfig {\n baseURL?: string;\n}\n\n/**\n * InfoClient - Client for public info endpoints\n *\n * Provides access to all public API endpoints that don't require authentication.\n *\n * @example\n * ```typescript\n * const client = new InfoClient({\n * baseURL: \"https://mainnet.zklighter.elliot.ai\"\n * });\n *\n * const account = await client.getAccountInfo({ by: \"index\", value: \"0\" });\n * const orderBooks = await client.getOrderBooks();\n * ```\n */\nexport class InfoClient {\n private readonly config: InfoClientConfig;\n private readonly axiosInstance: AxiosInstance;\n\n constructor(config?: InfoClientConfig) {\n this.config = {\n baseURL: config?.baseURL || \"https://mainnet.zklighter.elliot.ai\",\n };\n\n this.axiosInstance = this.createAxiosInstance();\n }\n\n private createAxiosInstance(): AxiosInstance {\n return axios.create({\n baseURL: this.config.baseURL,\n });\n }\n\n /**\n * Get account information by index or L2 address\n * @param params - Account lookup parameters (by index or L2 address)\n * @returns Account information including balances and positions\n * @example\n * ```typescript\n * const account = await client.getAccountInfo({ by: \"index\", value: \"0\" });\n * ```\n */\n public async getAccountInfo(\n params: AccountRequest,\n ): Promise<AccountResponse> {\n return getAccountInfo(this.axiosInstance, params);\n }\n\n /**\n * Get account information by L1 address\n * @param params - L1 address lookup parameters\n * @returns Account information associated with the L1 address\n * @example\n * ```typescript\n * const account = await client.getAccountByL1Address({ l1_address: \"0x...\" });\n * ```\n */\n public async getAccountByL1Address(\n params: AccountByL1AddressRequest,\n ): Promise<AccountAccountByL1AddressResponse> {\n return getAccountByL1Address(this.axiosInstance, params);\n }\n\n /**\n * Get API keys for an account\n * @param params - Account index to retrieve API keys for\n * @returns List of API keys associated with the account\n * @example\n * ```typescript\n * const keys = await client.getApiKeys({ account_index: 0 });\n * ```\n */\n public async getApiKeys(params: ApiKeysRequest): Promise<ApiKeysResponse> {\n return getApiKeys(this.axiosInstance, params);\n }\n\n /**\n * Get system announcements\n * @returns List of active announcements\n * @example\n * ```typescript\n * const announcements = await client.getAnnouncements();\n * ```\n */\n public async getAnnouncements(): Promise<AnnouncementsResponse> {\n return getAnnouncements(this.axiosInstance);\n }\n\n /**\n * Get asset details for a specific asset or all assets\n * @param params - Optional asset_index to get details for a specific asset\n * @returns Asset details including symbol, decimals, limits, and pricing information\n * @example\n * ```typescript\n * // Get all assets\n * const allAssets = await client.getAssetDetails();\n *\n * // Get specific asset\n * const asset = await client.getAssetDetails({ asset_index: 0 });\n * ```\n */\n public async getAssetDetails(\n params?: AssetDetailsRequest,\n ): Promise<AssetDetailsResponse> {\n return getAssetDetails(this.axiosInstance, params);\n }\n\n /**\n * Get candlestick data for a market\n * @param params - Candlestick query parameters including market_id, resolution, and time range\n * @returns Array of candlestick data\n * @example\n * ```typescript\n * const candles = await client.getCandlesticks({\n * market_id: 1,\n * resolution: \"1h\",\n * start_timestamp: 1234567890,\n * end_timestamp: 1234567900\n * });\n * ```\n */\n public async getCandlesticks(\n params: CandlesRequest,\n ): Promise<CandlesResponse> {\n return getCandlesticks(this.axiosInstance, params);\n }\n\n /**\n * Get funding history for a market\n * @param params - Funding query parameters including market_id and time range\n * @returns Array of funding data\n * @example\n * ```typescript\n * const fundings = await client.getFundings({\n * market_id: 1,\n * start_timestamp: 1234567890,\n * end_timestamp: 1234567900\n * });\n * ```\n */\n public async getFundings(params: FundingsRequest): Promise<FundingsResponse> {\n return getFundings(this.axiosInstance, params);\n }\n\n /**\n * Get exchange statistics\n * @returns Exchange-wide statistics including volume, fees, and markets\n * @example\n * ```typescript\n * const stats = await client.getExchangeStats();\n * ```\n */\n public async getExchangeStats(): Promise<ExchangeStatsResponse> {\n return getExchangeStats(this.axiosInstance);\n }\n\n /**\n * Get fast bridge information\n * @returns Fast bridge configuration and status\n * @example\n * ```typescript\n * const bridgeInfo = await client.getFastBridgeInfo();\n * ```\n */\n public async getFastBridgeInfo(): Promise<FastBridgeInfoResponse> {\n return getFastBridgeInfo(this.axiosInstance);\n }\n\n /**\n * Get current funding rates for all markets\n * @returns Funding rates for all markets\n * @example\n * ```typescript\n * const rates = await client.getFundingRates();\n * ```\n */\n public async getFundingRates(): Promise<FundingRatesResponse> {\n return getFundingRates(this.axiosInstance);\n }\n\n /**\n * Get the next nonce for an account\n * @param params - Account index to get nonce for\n * @returns Next nonce value\n * @example\n * ```typescript\n * const nonce = await client.getNextNonce({ account_index: 0 });\n * ```\n */\n public async getNextNonce(\n params: NextNonceRequest,\n ): Promise<NextNonceResponse> {\n return getNextNonce(this.axiosInstance, params);\n }\n\n /**\n * Get all order books\n * @returns List of all order books with their configurations\n * @example\n * ```typescript\n * const orderBooks = await client.getOrderBooks();\n * ```\n */\n public async getOrderBooks(): Promise<OrderBooksResponse> {\n return getOrderBooks(this.axiosInstance);\n }\n\n /**\n * Get detailed information about a specific order book\n * @param params - Optional market_id to get details for a specific market\n * @returns Order book details including market information\n * @example\n * ```typescript\n * const details = await client.getOrderBookDetails({ market_id: 1 });\n * ```\n */\n public async getOrderBookDetails(\n params?: OrderBookDetailsRequest,\n ): Promise<OrderBookDetailsResponse> {\n return getOrderBookDetails(this.axiosInstance, params);\n }\n\n /**\n * Get orders in an order book\n * @param params - Market ID and optional depth/limit parameters\n * @returns Bids and asks in the order book\n * @example\n * ```typescript\n * const orders = await client.getOrderBookOrders({ market_id: 1, limit: 50 });\n * ```\n */\n public async getOrderBookOrders(\n params: OrderBookOrdersRequest,\n ): Promise<OrderBookOrdersResponse> {\n return getOrderBookOrders(this.axiosInstance, params);\n }\n\n /**\n * Get recent trades for a market\n * @param params - Market ID and optional limit\n * @returns Recent trades for the market\n * @example\n * ```typescript\n * const trades = await client.getRecentTrades({ market_id: 1, limit: 50 });\n * ```\n */\n public async getRecentTrades(\n params: RecentTradesRequest,\n ): Promise<RecentTradesResponse> {\n return getRecentTrades(this.axiosInstance, params);\n }\n\n /**\n * Get a specific transaction by hash\n * @param params - Transaction hash to look up\n * @returns Transaction details\n * @example\n * ```typescript\n * const tx = await client.getTransaction({ tx_hash: \"0x...\" });\n * ```\n */\n public async getTransaction(\n params: TransactionRequest,\n ): Promise<Transaction> {\n return getTransaction(this.axiosInstance, params);\n }\n\n /**\n * Get transactions with optional filtering\n * @param params - Optional filter parameters for transaction queries\n * @returns List of transactions\n * @example\n * ```typescript\n * const txs = await client.getTransactions({ limit: 50 });\n * ```\n */\n public async getTransactions(\n params?: TransactionsRequest,\n ): Promise<TransactionsResponse> {\n return getTransactions(this.axiosInstance, params);\n }\n\n /**\n * Get L2 transaction from L1 transaction hash\n * @param params - L1 transaction hash\n * @returns Corresponding L2 transaction\n * @example\n * ```typescript\n * const tx = await client.getTransactionFromL1TxHash({ l1_tx_hash: \"0x...\" });\n * ```\n */\n public async getTransactionFromL1TxHash(\n params: TransactionFromL1TxHashRequest,\n ): Promise<Transaction> {\n return getTransactionFromL1TxHash(this.axiosInstance, params);\n }\n\n /**\n * Get withdrawal delay in seconds\n * @returns Withdrawal delay configuration\n * @example\n * ```typescript\n * const delay = await client.getWithdrawalDelay();\n * console.log(`Withdrawal delay: ${delay.seconds} seconds`);\n * ```\n */\n public async getWithdrawalDelay(): Promise<WithdrawalDelayResponse> {\n return getWithdrawalDelay(this.axiosInstance);\n }\n\n /**\n * Get root status information\n * @returns Root status including network status, network_id, and timestamp\n * @example\n * ```typescript\n * const status = await client.getRootStatus();\n * ```\n */\n public async getRootStatus(): Promise<RootStatusResponse> {\n return getRootStatus(this.axiosInstance);\n }\n}\n","export * from \"./account\";\nexport * from \"./account-by-l1-address\";\nexport * from \"./announcement\";\nexport * from \"./api-keys\";\nexport * from \"./asset-details\";\nexport * from \"./candles\";\nexport * from \"./exchange-stats\";\nexport * from \"./fastbridge-info\";\nexport * from \"./funding-rates\";\nexport * from \"./fundings\";\nexport * from \"./next-nonce\";\nexport * from \"./order-book-details\";\nexport * from \"./order-books\";\nexport * from \"./recent-trades\";\nexport * from \"./root-info\";\nexport * from \"./root-status\";\nexport * from \"./tx\";\nexport * from \"./tx-from-l1-hash\";\nexport * from \"./txs\";\nexport * from \"./withdrawal-delay\";\n","import { AxiosInstance } from \"axios\";\n\nexport interface AccountRequest {\n by: \"index\" | \"l1_address\";\n value: string;\n}\n\nexport interface AccountPosition {\n market_id: number;\n symbol: string;\n initial_margin_fraction: string;\n open_order_count: number;\n pending_order_count: number;\n position_tied_order_count: number;\n sign: number;\n position: string;\n avg_entry_price: string;\n position_value: string;\n unrealized_pnl: string;\n realized_pnl: string;\n liquidation_price: string;\n margin_mode: number;\n allocated_margin: string;\n}\n\nexport interface AccountAsset {\n symbol: string;\n asset_id: number;\n balance: string;\n locked_balance: string;\n}\n\nexport interface AccountShare {\n public_pool_index: number;\n shares_amount: number;\n entry_usdc: string;\n}\n\nexport interface AccountInfo {\n code: number;\n message?: string;\n account_type: number;\n index: number;\n l1_address: string;\n cancel_all_time: number;\n total_order_count: number;\n total_isolated_order_count: number;\n pending_order_count: number;\n available_balance: string;\n status: number;\n collateral: string;\n account_index: number;\n name: string;\n description: string;\n can_invite: boolean;\n referral_points_percentage: string;\n positions: AccountPosition[];\n assets: AccountAsset[];\n total_asset_value: string;\n cross_asset_value: string;\n shares: AccountShare[];\n}\n\nexport interface AccountResponse {\n code: number;\n message?: string;\n total: number;\n accounts: AccountInfo[];\n}\n\nexport async function getAccountInfo(\n client: AxiosInstance,\n params: AccountRequest,\n): Promise<AccountResponse> {\n return client\n .get<AccountResponse>(\"/api/v1/account\", {\n params: params,\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface AccountByL1AddressRequest {\n l1_address: string;\n}\n\nexport interface AccountAccountByL1AddressResponse {\n code: number;\n message?: string;\n account_index: number;\n l1_address: string;\n}\n\nexport async function getAccountByL1Address(\n client: AxiosInstance,\n params: AccountByL1AddressRequest,\n): Promise<AccountAccountByL1AddressResponse> {\n return client\n .get<AccountAccountByL1AddressResponse>(\"/api/v1/accountByL1Address\", {\n params: params,\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface Announcement {\n id: number;\n title: string;\n content: string;\n created_at: number;\n updated_at: number;\n is_active: boolean;\n}\n\nexport interface AnnouncementsResponse {\n code: number;\n message?: string;\n announcements: Announcement[];\n}\n\nexport async function getAnnouncements(\n client: AxiosInstance,\n): Promise<AnnouncementsResponse> {\n return client\n .get<AnnouncementsResponse>(\"/api/v1/announcements\")\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface ApiKeysRequest {\n account_index: number;\n api_key_index: number;\n}\n\nexport interface ApiKey {\n account_index: number;\n api_key_index: number;\n nonce: number;\n public_key: string;\n transaction_time: number;\n}\n\nexport interface ApiKeysResponse {\n api_keys: ApiKey[];\n}\n\nexport async function getApiKeys(\n client: AxiosInstance,\n params: ApiKeysRequest,\n): Promise<ApiKeysResponse> {\n return client\n .get<ApiKeysResponse>(\"/api/v1/apikeys\", {\n params: {\n account_index: params.account_index,\n api_key_index: params.api_key_index,\n },\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface AssetDetailsRequest {\n asset_id?: number;\n}\n\nexport interface AssetDetail {\n asset_id: number;\n symbol: string;\n l1_decimals: number;\n decimals: number;\n extension_multiplier: number;\n min_transfer_amount: number;\n min_withdrawal_amount: number;\n margin_mode: number;\n index_price: number;\n l1_address: string;\n tick_size: string;\n}\n\nexport interface AssetDetailsResponse {\n code: number;\n message?: string;\n asset_details: AssetDetail[];\n}\n\nexport async function getAssetDetails(\n client: AxiosInstance,\n params?: AssetDetailsRequest,\n): Promise<AssetDetailsResponse> {\n const config: AxiosRequestConfig = {\n params: {\n ...(params?.asset_id !== undefined\n ? { asset_id: params.asset_id }\n : {}),\n },\n };\n\n return client\n .get<AssetDetailsResponse>(\"/api/v1/assetDetails\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface Candlestick {\n t: number;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n}\n\nexport interface CandlesRequest {\n market_id: number;\n resolution: string;\n start_timestamp: number;\n end_timestamp: number;\n count_back: number;\n}\n\nexport interface CandlesResponse {\n c: Candlestick[];\n}\n\nexport async function getCandlesticks(\n client: AxiosInstance,\n params: CandlesRequest,\n): Promise<CandlesResponse> {\n return client\n .get<CandlesResponse>(\"/api/v1/candles\", { params })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface ExchangeStatsResponse {\n total_volume_24h: string;\n total_trades_24h: number;\n total_orders_24h: number;\n active_markets: number;\n}\n\nexport async function getExchangeStats(\n client: AxiosInstance,\n): Promise<ExchangeStatsResponse> {\n return client\n .get<ExchangeStatsResponse>(\"/api/v1/exchangeStats\")\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface FastBridgeInfoResponse {\n code: number;\n message?: string;\n fast_bridge_limit: string;\n}\n\nexport async function getFastBridgeInfo(\n client: AxiosInstance,\n): Promise<FastBridgeInfoResponse> {\n return client\n .get<FastBridgeInfoResponse>(\"/api/v1/fastbridge/info\")\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface FundingRate {\n market_id: number;\n exchange: \"binance\" | \"bybit\" | \"hyperliquid\" | \"lighter\";\n symbol: string;\n rate: number;\n}\n\nexport interface FundingRatesResponse {\n code: number;\n message?: string;\n funding_rates: FundingRate[];\n}\n\nexport async function getFundingRates(\n client: AxiosInstance,\n): Promise<FundingRatesResponse> {\n return client\n .get<FundingRatesResponse>(\"/api/v1/funding-rates\")\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface Funding {\n timestamp: number;\n market_id: number;\n funding_id: number;\n rate: string;\n}\n\nexport interface FundingsRequest {\n market_id: number;\n resolution: string;\n start_timestamp?: number;\n end_timestamp?: number;\n count_back?: number;\n}\n\nexport interface FundingsResponse {\n fundings: Funding[];\n}\n\nexport async function getFundings(\n client: AxiosInstance,\n params: FundingsRequest,\n): Promise<FundingsResponse> {\n return client\n .get<FundingsResponse>(\"/api/v1/fundings\", { params })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface NextNonceRequest {\n account_index: number;\n api_key_index: number;\n}\n\nexport interface NextNonceResponse {\n account_index: number;\n api_key_index: number;\n nonce: number;\n}\n\nexport async function getNextNonce(\n client: AxiosInstance,\n params: NextNonceRequest,\n): Promise<NextNonceResponse> {\n return client\n .get<NextNonceResponse>(\"/api/v1/nextNonce\", {\n params: {\n account_index: params.account_index,\n api_key_index: params.api_key_index,\n },\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface OrderBookDetailsRequest {\n market_id?: number;\n}\n\nexport interface OrderBookDetail {\n symbol: string;\n market_id: number;\n market_type: string;\n status: string;\n taker_fee: string;\n maker_fee: string;\n liquidation_fee: string;\n min_base_amount: string;\n min_quote_amount: string;\n order_quote_limit: string;\n supported_size_decimals: number;\n supported_price_decimals: number;\n supported_quote_decimals: number;\n size_decimals: number;\n price_decimals: number;\n quote_multiplier: number;\n default_initial_margin_fraction: number;\n min_initial_margin_fraction: number;\n maintenance_margin_fraction: number;\n closeout_margin_fraction: number;\n last_trade_price: number;\n daily_trades_count: number;\n daily_base_token_volume: number;\n daily_quote_token_volume: number;\n daily_price_low: number;\n daily_price_high: number;\n daily_price_change: number;\n open_interest: number;\n daily_chart: any;\n market_config: {\n market_margin_mode: number;\n insurance_fund_account_index: number;\n };\n}\n\nexport interface SpotOrderBookDetail {\n symbol: string;\n market_id: number;\n market_type: string;\n base_asset_id: string;\n quote_asset_id: string;\n status: string;\n taker_fee: string;\n maker_fee: string;\n liquidation_fee: string;\n min_base_amount: string;\n min_quote_amount: string;\n order_quote_limit: string;\n supported_size_decimals: number;\n supported_price_decimals: number;\n supported_quote_decimals: number;\n size_decimals: number;\n price_decimals: number;\n last_trade_price: number;\n daily_trades_count: number;\n daily_base_token_volume: number;\n daily_quote_token_volume: number;\n daily_price_low: number;\n daily_price_high: number;\n daily_price_change: number;\n}\n\nexport interface OrderBookDetailsResponse {\n code: number;\n order_book_details: OrderBookDetail[];\n spot_order_book_details: SpotOrderBookDetail[];\n}\n\nexport async function getOrderBookDetails(\n client: AxiosInstance,\n params?: OrderBookDetailsRequest,\n): Promise<OrderBookDetailsResponse> {\n return client\n .get<OrderBookDetailsResponse>(\"/api/v1/orderBookDetails\", {\n params:\n params?.market_id !== undefined\n ? { market_id: params.market_id }\n : undefined,\n })\n .then((response) => response.data);\n}\n\nexport interface OrderBookOrdersRequest {\n market_id: number;\n limit?: number;\n}\n\nexport interface OrderBookOrder {\n order_index: number;\n order_id: string;\n owner_account_index: number;\n initial_base_amount: string;\n remaining_base_amount: string;\n price: string;\n order_expiry: number;\n}\n\nexport interface OrderBookOrdersResponse {\n code?: number;\n total_asks?: number;\n total_bids?: number;\n bids?: OrderBookOrder[];\n asks?: OrderBookOrder[];\n}\n\nexport async function getOrderBookOrders(\n client: AxiosInstance,\n params: OrderBookOrdersRequest,\n): Promise<OrderBookOrdersResponse> {\n return client\n .get<OrderBookOrdersResponse>(\"/api/v1/orderBookOrders\", {\n params: {\n market_id: params.market_id,\n ...(params.limit !== undefined ? { limit: params.limit } : {}),\n },\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface PriceLevel {\n price: string;\n size: string;\n}\n\nexport interface OrderBook {\n market_id: number;\n bids: PriceLevel[];\n asks: PriceLevel[];\n last_update_id: string;\n}\n\nexport type OrderBooksResponse = OrderBook[];\n\nexport async function getOrderBooks(\n client: AxiosInstance,\n): Promise<OrderBooksResponse> {\n return client\n .get<OrderBooksResponse>(\"/api/v1/orderBooks\")\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nimport { Trade } from \"../info-private/trades\";\n\nexport interface RecentTradesRequest {\n market_id: number;\n limit: number;\n}\n\nexport type RecentTradesResponse = Trade[];\n\nexport async function getRecentTrades(\n client: AxiosInstance,\n params: RecentTradesRequest,\n): Promise<RecentTradesResponse> {\n return client\n .get<RecentTradesResponse>(\"/api/v1/recentTrades\", {\n params: {\n market_id: params.market_id,\n limit: params.limit,\n },\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface RootInfoResponse {\n contract_address: string;\n}\n\nexport async function getRootInfo(\n client: AxiosInstance,\n): Promise<RootInfoResponse> {\n return client\n .get<RootInfoResponse>(\"/info\")\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface RootStatusResponse {\n status: number;\n network_id: number;\n timestamp: string;\n}\n\nexport async function getRootStatus(\n client: AxiosInstance,\n): Promise<RootStatusResponse> {\n return client.get<RootStatusResponse>(\"/\").then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface TransactionRequest {\n by: \"hash\" | \"index\";\n value: string;\n}\n\nexport interface Transaction {\n hash: string;\n block_height: number;\n sequence_index: number;\n account_index: number;\n nonce: number;\n type: string | number;\n info?: string;\n event_info?: string;\n data?: any;\n status: number | \"pending\" | \"confirmed\" | \"failed\";\n transaction_index?: number;\n l1_address?: string;\n expire_at?: number;\n queued_at?: number;\n committed_at?: number;\n verified_at?: number;\n executed_at?: number;\n parent_hash?: string;\n created_at?: string;\n updated_at?: string;\n code?: number;\n message?: string;\n}\n\nexport async function getTransaction(\n client: AxiosInstance,\n params: TransactionRequest,\n): Promise<Transaction> {\n return client\n .get<Transaction>(\"/api/v1/tx\", {\n params: {\n by: params.by,\n value: params.value,\n },\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nimport { Transaction } from \"./tx\";\n\nexport interface TransactionFromL1TxHashRequest {\n l1_tx_hash: string;\n}\n\nexport async function getTransactionFromL1TxHash(\n client: AxiosInstance,\n params: TransactionFromL1TxHashRequest,\n): Promise<Transaction> {\n return client\n .get<Transaction>(\"/api/v1/txFromL1TxHash\", {\n params: {\n l1_tx_hash: params.l1_tx_hash,\n },\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nimport { Transaction } from \"./tx\";\n\nexport interface TransactionsRequest {\n cursor?: string;\n limit?: number;\n}\n\nexport type TransactionsResponse = Transaction[];\n\nexport async function getTransactions(\n client: AxiosInstance,\n params?: TransactionsRequest,\n): Promise<TransactionsResponse> {\n return client\n .get<TransactionsResponse>(\"/api/v1/txs\", { params })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface WithdrawalDelayResponse {\n seconds: number;\n}\n\nexport async function getWithdrawalDelay(\n client: AxiosInstance,\n): Promise<WithdrawalDelayResponse> {\n return client\n .get<WithdrawalDelayResponse>(\"/api/v1/withdrawalDelay\")\n .then((response) => response.data);\n}\n","import axios, { AxiosInstance } from \"axios\";\n\nimport {\n AccountActiveOrdersRequest,\n AccountInactiveOrdersRequest,\n AccountLimitsRequest,\n AccountLimitsResponse,\n AccountMetadataRequest,\n AccountMetadataResponse,\n DepositHistoryRequest,\n DepositHistoryResponse,\n ExportRequest,\n ExportResponse,\n FastWithdrawInfoRequest,\n FastWithdrawInfoResponse,\n getAccountActiveOrders,\n getAccountInactiveOrders,\n getAccountLimits,\n getAccountMetadata,\n getDepositHistory,\n getExport,\n getFastWithdrawInfo,\n getL1Metadata,\n getLiquidations,\n getPnL,\n getPositionFunding,\n getPublicPools,\n getReferralPoints,\n getTokens,\n getTrades,\n getTransferFeeInfo,\n getTransferHistory,\n getWithdrawHistory,\n L1MetadataRequest,\n L1MetadataResponse,\n LiquidationsRequest,\n LiquidationsResponse,\n Orders,\n PnLRequest,\n PnLResponse,\n PositionFundingRequest,\n PositionFundingResponse,\n PublicPoolsRequest,\n PublicPoolsResponse,\n ReferralPointsRequest,\n ReferralPointsResponse,\n TokensRequest,\n TokensResponse,\n TradesRequest,\n TradesResponse,\n TransferFeeInfoRequest,\n TransferFeeInfoResponse,\n TransferHistoryRequest,\n TransferHistoryResponse,\n WithdrawHistoryRequest,\n WithdrawHistoryResponse,\n} from \"../api/info-private\";\nimport { TxClient } from \"./txClient\";\n\nexport interface InfoPrivateClientConfig {\n baseURL?: string;\n txClient: TxClient;\n}\n\nconst DEFAULT_DEADLINE = 120;\n\n/**\n * InfoPrivateClient - Client for private/authenticated info endpoints\n *\n * Provides access to API endpoints that require authentication.\n * Authentication is handled automatically using the provided TxClient.\n *\n * @example\n * ```typescript\n * const txClient = createClient(httpClient, privateKey, chainId, apiKeyIndex, accountIndex);\n * const client = new InfoPrivateClient({\n * baseURL: \"https://mainnet.zklighter.elliot.ai\",\n * txClient\n * });\n *\n * const orders = await client.getAccountActiveOrders({\n * account_index: 0,\n * market_id: 1\n * });\n * ```\n */\nexport class InfoPrivateClient {\n private readonly baseURL: string;\n private readonly axiosInstance: AxiosInstance;\n private readonly txClient: TxClient;\n\n constructor(config: InfoPrivateClientConfig) {\n this.baseURL = config.baseURL || \"https://mainnet.zklighter.elliot.ai\";\n this.txClient = config.txClient;\n\n this.axiosInstance = this.createAxiosInstance();\n }\n\n private createAxiosInstance(): AxiosInstance {\n return axios.create({\n baseURL: this.baseURL,\n });\n }\n\n /**\n * Get the axios instance for custom requests\n */\n public getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n\n /**\n * Get active orders for an account in a specific market\n * @param params - Account index and market ID to retrieve active orders for\n * @returns List of active orders\n * @example\n * ```typescript\n * const orders = await client.getAccountActiveOrders({\n * account_index: 0,\n * market_id: 1\n * });\n * ```\n */\n public async getAccountActiveOrders(\n params: AccountActiveOrdersRequest,\n ): Promise<Orders> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getAccountActiveOrders(this.axiosInstance, params, auth);\n }\n\n /**\n * Get inactive orders for an account\n * @param params - Account index and optional filters for inactive orders\n * @returns List of inactive orders with pagination support\n * @example\n * ```typescript\n * const orders = await client.getAccountInactiveOrders({\n * account_index: 0,\n * limit: 50,\n * market_id: 1\n * });\n * ```\n */\n public async getAccountInactiveOrders(\n params: AccountInactiveOrdersRequest,\n ): Promise<Orders> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getAccountInactiveOrders(this.axiosInstance, params, auth);\n }\n\n /**\n * Get account limits and tier information\n * @param params - Account index to retrieve limits for\n * @returns Account limits including max LLP percentage, user tier, and pool creation permissions\n * @example\n * ```typescript\n * const limits = await client.getAccountLimits({ account_index: 0 });\n * ```\n */\n public async getAccountLimits(\n params: AccountLimitsRequest,\n ): Promise<AccountLimitsResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getAccountLimits(this.axiosInstance, params, auth);\n }\n\n /**\n * Get account metadata by index or L1 address\n * @param params - Account index or L1 address to retrieve metadata for\n * @returns Account metadata including account index, L1 address, and public key\n * @example\n * ```typescript\n * const metadata = await client.getAccountMetadata({ account_index: 0 });\n * ```\n */\n public async getAccountMetadata(\n params: AccountMetadataRequest,\n ): Promise<AccountMetadataResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getAccountMetadata(this.axiosInstance, params, auth);\n }\n\n /**\n * Get L1 metadata for an address\n * @param params - L1 address to retrieve metadata for\n * @returns L1 metadata including all account indices associated with the address\n * @example\n * ```typescript\n * const metadata = await client.getL1Metadata({ l1_address: '0x...' });\n * ```\n */\n public async getL1Metadata(\n params: L1MetadataRequest,\n ): Promise<L1MetadataResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getL1Metadata(this.axiosInstance, params, auth);\n }\n\n /**\n * Get API tokens for an account\n * @param params - Account index to retrieve tokens for\n * @returns List of API tokens with their creation dates and expiry information\n * @example\n * ```typescript\n * const tokens = await client.getTokens({ account_index: 0 });\n * ```\n */\n public async getTokens(params: TokensRequest): Promise<TokensResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getTokens(this.axiosInstance, params, auth);\n }\n\n /**\n * Get deposit history for an account\n * @param params - Account index and optional filters\n * @returns List of deposits with pagination support\n * @example\n * ```typescript\n * const deposits = await client.getDepositHistory({\n * account_index: 0,\n * limit: 50\n * });\n * ```\n */\n public async getDepositHistory(\n params: DepositHistoryRequest,\n ): Promise<DepositHistoryResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getDepositHistory(this.axiosInstance, params, auth);\n }\n\n /**\n * Get withdrawal history for an account\n * @param params - Account index and optional filters\n * @returns List of withdrawals with pagination support\n * @example\n * ```typescript\n * const withdrawals = await client.getWithdrawHistory({\n * account_index: 0,\n * limit: 50\n * });\n * ```\n */\n public async getWithdrawHistory(\n params: WithdrawHistoryRequest,\n ): Promise<WithdrawHistoryResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getWithdrawHistory(this.axiosInstance, params, auth);\n }\n\n /**\n * Get fast withdraw information for an account\n * @param params - Account index to retrieve fast withdraw info for\n * @returns Fast withdraw information including available liquidity and fees\n * @example\n * ```typescript\n * const info = await client.getFastWithdrawInfo({ account_index: 0 });\n * ```\n */\n public async getFastWithdrawInfo(\n params: FastWithdrawInfoRequest,\n ): Promise<FastWithdrawInfoResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getFastWithdrawInfo(this.axiosInstance, params, auth);\n }\n\n /**\n * Get transfer fee information between accounts\n * @param params - From and to account indices and optional asset index\n * @returns Transfer fee information including fee amount and fee percentage\n * @example\n * ```typescript\n * const feeInfo = await client.getTransferFeeInfo({\n * from_account_index: 0,\n * to_account_index: 1\n * });\n * ```\n */\n public async getTransferFeeInfo(\n params: TransferFeeInfoRequest,\n ): Promise<TransferFeeInfoResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getTransferFeeInfo(this.axiosInstance, params, auth);\n }\n\n /**\n * Get transfer history for an account\n * @param params - Account index and optional filters\n * @returns List of transfers with pagination support\n * @example\n * ```typescript\n * const transfers = await client.getTransferHistory({\n * account_index: 0,\n * limit: 50\n * });\n * ```\n */\n public async getTransferHistory(\n params: TransferHistoryRequest,\n ): Promise<TransferHistoryResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getTransferHistory(this.axiosInstance, params, auth);\n }\n\n /**\n * Get liquidation history for an account\n * @param params - Account index and optional filters\n * @returns List of liquidations with pagination support\n * @example\n * ```typescript\n * const liquidations = await client.getLiquidations({\n * account_index: 0,\n * limit: 50\n * });\n * ```\n */\n public async getLiquidations(\n params: LiquidationsRequest,\n ): Promise<LiquidationsResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getLiquidations(this.axiosInstance, params, auth);\n }\n\n /**\n * Get profit and loss data for an account or market\n * @param params - Account index and optional market ID\n * @returns PnL data including realized and unrealized PnL\n * @example\n * ```typescript\n * const pnl = await client.getPnL({\n * account_index: 0,\n * market_id: 1\n * });\n * ```\n */\n public async getPnL(params: PnLRequest): Promise<PnLResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getPnL(this.axiosInstance, params, auth);\n }\n\n /**\n * Get position funding history for an account\n * @param params - Account index and optional filters\n * @returns List of funding payments with pagination support\n * @example\n * ```typescript\n * const funding = await client.getPositionFunding({\n * account_index: 0,\n * limit: 50\n * });\n * ```\n */\n public async getPositionFunding(\n params: PositionFundingRequest,\n ): Promise<PositionFundingResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getPositionFunding(this.axiosInstance, params, auth);\n }\n\n /**\n * Get public liquidity pools metadata\n * @param params - Optional account index to filter by owner\n * @returns List of public pools with metadata\n * @example\n * ```typescript\n * const pools = await client.getPublicPools({ account_index: 0 });\n * ```\n */\n public async getPublicPools(\n params?: PublicPoolsRequest,\n ): Promise<PublicPoolsResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getPublicPools(this.axiosInstance, params, auth);\n }\n\n /**\n * Get referral points for an account\n * @param params - Account index to retrieve referral points for\n * @returns Referral points data including total points and referral code\n * @example\n * ```typescript\n * const points = await client.getReferralPoints({ account_index: 0 });\n * ```\n */\n public async getReferralPoints(\n params: ReferralPointsRequest,\n ): Promise<ReferralPointsResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getReferralPoints(this.axiosInstance, params, auth);\n }\n\n /**\n * Get trades for an account or market\n * @param params - Account index and optional market ID and filters\n * @returns List of trades with pagination support\n * @example\n * ```typescript\n * const trades = await client.getTrades({\n * account_index: 0,\n * market_id: 1,\n * limit: 50\n * });\n * ```\n */\n public async getTrades(params: TradesRequest): Promise<TradesResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getTrades(this.axiosInstance, params, auth);\n }\n\n /**\n * Export data (funding or trade data) for an account\n * @param params - Account index and export type\n * @returns Export data in CSV format\n * @example\n * ```typescript\n * const exportData = await client.getExport({\n * account_index: 0,\n * export_type: 'trades'\n * });\n * ```\n */\n public async getExport(params: ExportRequest): Promise<ExportResponse> {\n const deadline = Math.floor(Date.now() / 1000) + DEFAULT_DEADLINE;\n const auth = await this.txClient.getAuthToken(new Date(deadline * 1000));\n return getExport(this.axiosInstance, params, auth);\n }\n}\n","export * from \"./account-active-orders\";\nexport * from \"./account-inactive-orders\";\nexport * from \"./account-limits\";\nexport * from \"./account-metadata\";\nexport * from \"./deposit-history\";\nexport * from \"./export\";\nexport * from \"./fastwithdraw-info\";\nexport * from \"./l1-metadata\";\nexport * from \"./liquidations\";\nexport * from \"./pnl\";\nexport * from \"./position-funding\";\nexport * from \"./public-pools-metadata\";\nexport * from \"./referral-points\";\nexport * from \"./tokens\";\nexport * from \"./trades\";\nexport * from \"./transfer-fee-info\";\nexport * from \"./transfer-history\";\nexport * from \"./withdraw-history\";\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nimport { Orders } from \"./account-inactive-orders\";\n\nexport interface AccountActiveOrdersRequest {\n account_index: number;\n market_id: number;\n auth?: string;\n}\n\nexport async function getAccountActiveOrders(\n client: AxiosInstance,\n params: AccountActiveOrdersRequest,\n authorization?: string,\n): Promise<Orders> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n market_id: params.market_id,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<Orders>(\"/api/v1/accountActiveOrders\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface Order {\n order_index: number;\n client_order_index: number;\n order_id: string;\n client_order_id: string;\n market_index: number;\n owner_account_index: number;\n initial_base_amount: string;\n price: string;\n nonce: number;\n remaining_base_amount: string;\n is_ask: boolean;\n base_size: number;\n base_price: number;\n filled_base_amount: string;\n filled_quote_amount: string;\n side: string;\n type: string;\n time_in_force: string;\n reduce_only: boolean;\n trigger_price: string;\n order_expiry: number;\n status: string;\n trigger_status: string;\n trigger_time: number;\n parent_order_index: number;\n parent_order_id: string;\n to_trigger_order_id_0?: string;\n to_trigger_order_id_1?: string;\n to_cancel_order_id_0?: string;\n to_cancel_order_id_1?: string;\n block_height: number;\n timestamp: number;\n}\n\nexport interface Orders {\n code: number;\n orders: Order[];\n}\n\nexport interface AccountInactiveOrdersRequest {\n account_index: number;\n limit: number;\n auth?: string;\n market_id?: number;\n ask_filter?: number;\n between_timestamps?: string;\n cursor?: string;\n}\n\nexport async function getAccountInactiveOrders(\n client: AxiosInstance,\n params: AccountInactiveOrdersRequest,\n authorization?: string,\n): Promise<Orders> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n limit: params.limit,\n ...(params.auth ? { auth: params.auth } : {}),\n ...(params.market_id !== undefined\n ? { market_id: params.market_id }\n : {}),\n ...(params.ask_filter !== undefined\n ? { ask_filter: params.ask_filter }\n : {}),\n ...(params.between_timestamps\n ? { between_timestamps: params.between_timestamps }\n : {}),\n ...(params.cursor ? { cursor: params.cursor } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<Orders>(\"/api/v1/accountInactiveOrders\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface AccountLimitsRequest {\n account_index: number;\n auth?: string;\n}\n\nexport interface AccountLimitsResponse {\n code: number;\n message?: string;\n max_llp_percentage: number;\n user_tier: string;\n can_create_public_pool: boolean;\n}\n\nexport async function getAccountLimits(\n client: AxiosInstance,\n params: AccountLimitsRequest,\n authorization?: string,\n): Promise<AccountLimitsResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<AccountLimitsResponse>(\"/api/v1/accountLimits\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface AccountMetadataRequest {\n by: \"index\" | \"l1_address\";\n value: string;\n auth?: string;\n}\n\nexport interface AccountMetadataInfo {\n account_index: number;\n name: string;\n description: string;\n can_invite: boolean;\n referral_points_percentage: string;\n}\n\nexport interface AccountMetadataResponse {\n code: number;\n message?: string;\n account_metadatas: AccountMetadataInfo;\n}\n\nexport async function getAccountMetadata(\n client: AxiosInstance,\n params: AccountMetadataRequest,\n authorization?: string,\n): Promise<AccountMetadataResponse> {\n const config: AxiosRequestConfig = {\n params: {\n by: params.by,\n value: params.value,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<AccountMetadataResponse>(\"/api/v1/accountMetadata\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface DepositHistoryRequest {\n account_index: number;\n l1_address: string;\n cursor?: string;\n filter?: string;\n}\n\nexport interface DepositHistoryItem {\n id: string;\n account_index: number;\n l1_address: string;\n l2_address: string;\n amount: string;\n l1_tx_hash: string;\n status: string;\n timestamp: number;\n created_at: string;\n}\n\nexport interface DepositHistoryResponse {\n code: number;\n deposits: DepositHistoryItem[];\n cursor?: string;\n}\n\nexport async function getDepositHistory(\n client: AxiosInstance,\n params: DepositHistoryRequest,\n authorization?: string,\n): Promise<DepositHistoryResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n l1_address: params.l1_address,\n ...(params.cursor ? { cursor: params.cursor } : {}),\n ...(params.filter ? { filter: params.filter } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<DepositHistoryResponse>(\"/api/v1/deposit/history\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface ExportRequest {\n type: \"funding\" | \"trade\";\n account_index?: number;\n market_id?: number;\n auth?: string;\n}\n\nexport interface ExportResponse {\n code: number;\n message?: string;\n data_url: string;\n}\n\nexport async function getExport(\n client: AxiosInstance,\n params: ExportRequest,\n authorization?: string,\n): Promise<ExportResponse> {\n const config: AxiosRequestConfig = {\n params: {\n type: params.type,\n ...(params.account_index !== undefined\n ? { account_index: params.account_index }\n : {}),\n ...(params.market_id !== undefined\n ? { market_id: params.market_id }\n : {}),\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<ExportResponse>(\"/api/v1/export\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface FastWithdrawInfoRequest {\n account_index: number;\n auth?: string;\n}\n\nexport interface FastWithdrawInfoResponse {\n code: number;\n message?: string;\n to_account_index: number;\n withdraw_limit: string;\n max_withdrawal_amount: string;\n}\n\nexport async function getFastWithdrawInfo(\n client: AxiosInstance,\n params: FastWithdrawInfoRequest,\n authorization?: string,\n): Promise<FastWithdrawInfoResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<FastWithdrawInfoResponse>(\"/api/v1/fastwithdraw/info\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface L1MetadataRequest {\n l1_address: string;\n auth?: string;\n}\n\nexport interface L1MetadataResponse {\n code: number;\n message?: string;\n l1_address: string;\n can_invite: boolean;\n referral_points_percentage: string;\n}\n\nexport async function getL1Metadata(\n client: AxiosInstance,\n params: L1MetadataRequest,\n authorization?: string,\n): Promise<L1MetadataResponse> {\n const config: AxiosRequestConfig = {\n params: {\n l1_address: params.l1_address,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<L1MetadataResponse>(\"/api/v1/l1Metadata\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface LiquidationsRequest {\n account_index: number;\n market_id?: number;\n cursor?: string;\n limit: number;\n auth?: string;\n}\n\nexport interface LiquidationTrade {\n price: string;\n size: string;\n taker_fee: string;\n maker_fee: string;\n}\n\nexport interface LiquidationPosition {\n market_id: number;\n symbol: string;\n initial_margin_fraction: string;\n open_order_count: number;\n pending_order_count: number;\n position_tied_order_count: number;\n sign: number;\n position: string;\n avg_entry_price: string;\n position_value: string;\n unrealized_pnl: string;\n realized_pnl: string;\n liquidation_price: string;\n total_funding_paid_out?: string;\n margin_mode: number;\n allocated_margin: string;\n}\n\nexport interface RiskParameters {\n market_id: number;\n collateral: string;\n total_account_value: string;\n initial_margin_req: string;\n maintenance_margin_req: string;\n close_out_margin_req: string;\n}\n\nexport interface RiskInfo {\n cross_risk_parameters: RiskParameters;\n isolated_risk_parameters: RiskParameters[];\n}\n\nexport interface LiquidationInfoObject {\n positions: LiquidationPosition[];\n risk_info_before: RiskInfo;\n risk_info_after: RiskInfo;\n mark_prices: Record<string, any>;\n}\n\nexport interface LiquidationInfo {\n id: string;\n market_id: number;\n type: \"partial\" | \"deleverage\";\n trade: LiquidationTrade;\n info: LiquidationInfoObject;\n executed_at: number;\n}\n\nexport interface LiquidationsResponse {\n code: number;\n liquidations: LiquidationInfo[];\n}\n\nexport async function getLiquidations(\n client: AxiosInstance,\n params: LiquidationsRequest,\n authorization?: string,\n): Promise<LiquidationsResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n limit: params.limit,\n ...(params.market_id !== undefined\n ? { market_id: params.market_id }\n : {}),\n ...(params.cursor ? { cursor: params.cursor } : {}),\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<LiquidationsResponse>(\"/api/v1/liquidations\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface PnLRequest {\n by: string;\n value: string;\n resolution: string;\n start_timestamp: number;\n end_timestamp: number;\n count_back: number;\n auth?: string;\n ignore_transfers?: boolean;\n}\n\nexport interface PnLEntry {\n timestamp: number;\n pnl: string;\n cumulative_pnl: string;\n}\n\nexport interface PnLResponse {\n code: number;\n entries: PnLEntry[];\n}\n\nexport async function getPnL(\n client: AxiosInstance,\n params: PnLRequest,\n authorization?: string,\n): Promise<PnLResponse> {\n const config: AxiosRequestConfig = {\n params: {\n by: params.by,\n value: params.value,\n resolution: params.resolution,\n start_timestamp: params.start_timestamp,\n end_timestamp: params.end_timestamp,\n count_back: params.count_back,\n ...(params.auth ? { auth: params.auth } : {}),\n ...(params.ignore_transfers !== undefined\n ? { ignore_transfers: params.ignore_transfers }\n : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<PnLResponse>(\"/api/v1/pnl\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface PositionFundingRequest {\n account_index: number;\n limit: number;\n market_id?: number;\n cursor?: string;\n side?: \"long\" | \"short\" | \"all\";\n auth?: string;\n}\n\nexport interface PositionFundingItem {\n timestamp: number;\n market_id: number;\n funding_id: number;\n change: string;\n rate: string;\n position_size: string;\n position_side: \"long\" | \"short\";\n}\n\nexport interface PositionFundingResponse {\n code: number;\n message?: string;\n position_fundings: PositionFundingItem[];\n next_cursor?: string;\n}\n\nexport async function getPositionFunding(\n client: AxiosInstance,\n params: PositionFundingRequest,\n authorization?: string,\n): Promise<PositionFundingResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n limit: params.limit,\n ...(params.market_id !== undefined\n ? { market_id: params.market_id }\n : {}),\n ...(params.cursor ? { cursor: params.cursor } : {}),\n ...(params.side ? { side: params.side } : {}),\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<PositionFundingResponse>(\"/api/v1/positionFunding\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface PublicPoolsRequest {\n filter?: string;\n limit?: number;\n index?: number;\n}\n\nexport interface PublicPoolShare {\n token: string;\n amount: string;\n value: string;\n}\n\nexport interface PublicPool {\n id: string;\n name: string;\n description: string;\n total_value_locked: string;\n apy: string;\n shares: PublicPoolShare[];\n}\n\nexport type PublicPoolsResponse = PublicPool[];\n\nexport async function getPublicPools(\n client: AxiosInstance,\n params: PublicPoolsRequest = {},\n authorization?: string,\n): Promise<PublicPoolsResponse> {\n const config: AxiosRequestConfig = {\n params: {\n filter: params.filter ?? \"all\",\n limit: params.limit ?? 10,\n index: params.index ?? 0,\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<PublicPoolsResponse>(\"/api/v1/publicPools\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface ReferralPointsRequest {\n account_index: number;\n}\n\nexport interface ReferralPointEntry {\n l1_address: string;\n total_points: number;\n week_points: number;\n total_reward_points: number;\n week_reward_points: number;\n reward_point_multiplier: string;\n}\n\nexport interface ReferralPointsResponse {\n referrals: ReferralPointEntry[];\n user_total_points: number;\n user_last_week_points: number;\n user_total_referral_reward_points: number;\n user_last_week_referral_reward_points: number;\n reward_point_multiplier: string;\n}\n\nexport async function getReferralPoints(\n client: AxiosInstance,\n params: ReferralPointsRequest,\n authorization?: string,\n): Promise<ReferralPointsResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<ReferralPointsResponse>(\"/api/v1/referral/points\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface TokensRequest {\n account_index: number;\n auth?: string;\n}\n\nexport interface ApiToken {\n token_id: number;\n api_token: string;\n name: string;\n account_index: number;\n expiry: number;\n sub_account_access: boolean;\n revoked: boolean;\n scopes: string;\n}\n\nexport interface TokensResponse {\n code: number;\n message?: string;\n api_tokens: ApiToken[];\n}\n\nexport async function getTokens(\n client: AxiosInstance,\n params: TokensRequest,\n authorization?: string,\n): Promise<TokensResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<TokensResponse>(\"/api/v1/tokens\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface TradesRequest {\n auth?: string;\n market_id?: number;\n account_index?: number;\n order_index?: number;\n sort_by: \"block_height\" | \"timestamp\" | \"trade_id\";\n sort_dir?: \"desc\";\n cursor?: string;\n from?: number;\n ask_filter?: number;\n limit: number;\n}\n\nexport interface Trade {\n trade_id: number;\n tx_hash: string;\n type: \"trade\" | \"liquidation\" | \"deleverage\";\n market_id: number;\n size: string;\n price: string;\n usd_amount: string;\n ask_id: number;\n bid_id: number;\n ask_account_id: number;\n bid_account_id: number;\n is_maker_ask: boolean;\n block_height: number;\n timestamp: number;\n taker_fee: number;\n taker_position_size_before: string;\n taker_entry_quote_before: string;\n taker_initial_margin_fraction_before: number;\n taker_position_sign_changed: boolean;\n maker_fee: number;\n maker_position_size_before: string;\n maker_entry_quote_before: string;\n maker_initial_margin_fraction_before: number;\n maker_position_sign_changed: boolean;\n}\n\nexport interface TradesResponse {\n code: number;\n message?: string;\n next_cursor?: string;\n trades: Trade[];\n}\n\nexport async function getTrades(\n client: AxiosInstance,\n params: TradesRequest,\n authorization?: string,\n): Promise<TradesResponse> {\n const config: AxiosRequestConfig = {\n params,\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<TradesResponse>(\"/api/v1/trades\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface TransferFeeInfoRequest {\n account_index: number;\n to_account_index?: number;\n auth?: string;\n}\n\nexport interface TransferFeeInfoResponse {\n code: number;\n message?: string;\n transfer_fee_usdc: number;\n}\n\nexport async function getTransferFeeInfo(\n client: AxiosInstance,\n params: TransferFeeInfoRequest,\n authorization?: string,\n): Promise<TransferFeeInfoResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n ...(params.to_account_index !== undefined\n ? { to_account_index: params.to_account_index }\n : {}),\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<TransferFeeInfoResponse>(\"/api/v1/transferFeeInfo\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface TransferHistoryRequest {\n account_index: number;\n cursor?: string;\n auth?: string;\n}\n\nexport interface Transfer {\n id: string;\n amount: string;\n timestamp: number;\n type:\n | \"L2TransferInflow\"\n | \"L2TransferOutflow\"\n | \"L2BurnSharesInflow\"\n | \"L2BurnSharesOutflow\"\n | \"L2MintSharesInflow\"\n | \"L2MintSharesOutflow\";\n from_l1_address: string;\n to_l1_address: string;\n from_account_index: number;\n to_account_index: number;\n tx_hash: string;\n}\n\nexport interface TransferHistoryResponse {\n code: number;\n message?: string;\n transfers: Transfer[];\n cursor: string;\n}\n\nexport async function getTransferHistory(\n client: AxiosInstance,\n params: TransferHistoryRequest,\n authorization?: string,\n): Promise<TransferHistoryResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n ...(params.cursor ? { cursor: params.cursor } : {}),\n ...(params.auth ? { auth: params.auth } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<TransferHistoryResponse>(\"/api/v1/transfer/history\", config)\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface WithdrawHistoryRequest {\n account_index: number;\n l1_address: string;\n cursor?: string;\n filter?: string;\n}\n\nexport interface WithdrawHistoryItem {\n id: string;\n account_index: number;\n l1_address: string;\n l2_address: string;\n amount: string;\n l1_tx_hash: string;\n status: string;\n timestamp: number;\n created_at: string;\n}\n\nexport interface WithdrawHistoryResponse {\n code: number;\n withdrawals: WithdrawHistoryItem[];\n cursor?: string;\n}\n\nexport async function getWithdrawHistory(\n client: AxiosInstance,\n params: WithdrawHistoryRequest,\n authorization?: string,\n): Promise<WithdrawHistoryResponse> {\n const config: AxiosRequestConfig = {\n params: {\n account_index: params.account_index,\n l1_address: params.l1_address,\n ...(params.cursor ? { cursor: params.cursor } : {}),\n ...(params.filter ? { filter: params.filter } : {}),\n },\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .get<WithdrawHistoryResponse>(\"/api/v1/withdraw/history\", config)\n .then((response) => response.data);\n}\n","import axios, { AxiosInstance } from \"axios\";\n\nimport {\n acknowledgeNotification,\n changeAccountTier,\n ChangeAccountTierRequest,\n ChangeAccountTierResponse,\n createToken,\n fastWithdraw,\n FastWithdrawRequest,\n FastWithdrawResponse,\n NotificationAckRequest,\n NotificationAckResponse,\n revokeToken,\n sendTransaction,\n sendTransactionBatch,\n SendTransactionBatchRequest,\n SendTransactionRequest,\n sendTx,\n SendTxFormRequest,\n sendTxJson,\n sendTxWithIndices,\n SendTxWithIndicesRequest,\n TokensCreateRequest,\n TokensCreateResponse,\n TokensRevokeRequest,\n TokensRevokeResponse,\n TxHashesResponse,\n TxHashResponse,\n} from \"../api/exchange\";\nimport { TxClient } from \"./txClient\";\nimport { hexToBytes } from \"../signer/keyManager\";\nimport {\n serializeCreateOrder,\n serializeCancelOrder,\n serializeCancelAllOrders,\n serializeTransfer,\n serializeWithdraw,\n serializeUpdateLeverage,\n serializeModifyOrder,\n serializeCreateSubAccount,\n serializeCreatePublicPool,\n serializeUpdatePublicPool,\n serializeMintShares,\n serializeBurnShares,\n serializeUpdateMargin,\n serializeCreateGroupedOrders,\n serializeChangePubKey,\n} from \"../types/txInfoSerializer\";\nimport { TxType } from \"../types/constants\";\n\nexport interface ExchangeClientConfig {\n baseURL?: string;\n txClient: TxClient;\n}\n\nconst DEFAULT_DEADLINE = 120;\n\n/**\n * ExchangeClient - Client for exchange/transaction endpoints\n *\n * Provides access to transaction sending and signing endpoints.\n * Uses TypeScript-based signing via TxClient instead of WASM.\n *\n * @example\n * ```typescript\n * const txClient = createClient(httpClient, privateKey, chainId, apiKeyIndex, accountIndex);\n * const client = new ExchangeClient({\n * baseURL: \"https://mainnet.zklighter.elliot.ai\",\n * txClient\n * });\n *\n * const result = await client.createOrder({\n * marketIndex: 0,\n * clientOrderIndex: 1,\n * baseAmount: 1000000n,\n * price: 50000,\n * isAsk: 0,\n * orderType: 0,\n * timeInForce: 1,\n * reduceOnly: 0,\n * triggerPrice: 0,\n * orderExpiry: BigInt(Date.now() + 3600000),\n * });\n * ```\n */\nexport class ExchangeClient {\n private readonly baseURL: string;\n private readonly axiosInstance: AxiosInstance;\n private readonly txClient: TxClient;\n\n constructor(config: ExchangeClientConfig) {\n this.baseURL = config?.baseURL || \"https://mainnet.zklighter.elliot.ai\";\n this.txClient = config.txClient;\n this.axiosInstance = this.createAxiosInstance();\n }\n\n private createAxiosInstance(): AxiosInstance {\n return axios.create({\n baseURL: this.baseURL,\n });\n }\n\n /**\n * Create an auth token using the TxClient\n */\n private async createAuthToken(): Promise<string> {\n const deadline = new Date(Date.now() + DEFAULT_DEADLINE * 1000);\n return this.txClient.getAuthToken(deadline);\n }\n\n /**\n * Get the axios instance for custom requests\n */\n public getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n\n /**\n * Get the TxClient for direct signing operations\n */\n public getTxClient(): TxClient {\n return this.txClient;\n }\n\n /**\n * Send a transaction\n */\n public async sendTransaction(\n params: SendTransactionRequest,\n ): Promise<TxHashResponse> {\n return sendTransaction(this.axiosInstance, params);\n }\n\n /**\n * Send a transaction with form data\n */\n public async sendTx(params: SendTxFormRequest): Promise<TxHashResponse> {\n return sendTx(this.axiosInstance, params);\n }\n\n /**\n * Send a transaction with account and API key indices\n */\n public async sendTxWithIndices(\n params: SendTxWithIndicesRequest,\n ): Promise<TxHashResponse> {\n return sendTxWithIndices(this.axiosInstance, params);\n }\n\n /**\n * Send a transaction with JSON payload\n */\n public async sendTxJson(\n params: SendTxWithIndicesRequest,\n ): Promise<TxHashResponse> {\n return sendTxJson(this.axiosInstance, params);\n }\n\n /**\n * Send a batch of transactions\n */\n public async sendTransactionBatch(\n params: SendTransactionBatchRequest,\n ): Promise<TxHashesResponse> {\n return sendTransactionBatch(this.axiosInstance, params);\n }\n\n /**\n * Create and send an order using TypeScript signing\n */\n public async createOrder(params: {\n marketIndex: number;\n clientOrderIndex: bigint;\n baseAmount: bigint;\n price: number;\n isAsk: number;\n orderType: number;\n timeInForce: number;\n reduceOnly: number;\n triggerPrice: number;\n orderExpiry: bigint;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signCreateOrder({\n marketIndex: params.marketIndex,\n clientOrderIndex: params.clientOrderIndex,\n baseAmount: params.baseAmount,\n price: params.price,\n isAsk: params.isAsk,\n type: params.orderType,\n timeInForce: params.timeInForce,\n reduceOnly: params.reduceOnly,\n triggerPrice: params.triggerPrice,\n orderExpiry: params.orderExpiry,\n });\n\n return this.sendTx({\n tx_type: TxType.L2CreateOrder,\n tx_info: serializeCreateOrder(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Cancel an order using TypeScript signing\n */\n public async cancelOrder(params: {\n marketIndex: number;\n orderIndex: bigint;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signCancelOrder({\n marketIndex: params.marketIndex,\n index: params.orderIndex,\n });\n\n return this.sendTx({\n tx_type: TxType.L2CancelOrder,\n tx_info: serializeCancelOrder(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Cancel all orders using TypeScript signing\n */\n public async cancelAllOrders(params: {\n timeInForce: number;\n time: bigint;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signCancelAllOrders({\n timeInForce: params.timeInForce,\n time: params.time,\n });\n\n return this.sendTx({\n tx_type: TxType.L2CancelAllOrders,\n tx_info: serializeCancelAllOrders(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Transfer funds using TypeScript signing\n */\n public async transfer(params: {\n toAccountIndex: bigint;\n assetIndex: number;\n fromRouteType: number;\n toRouteType: number;\n amount: bigint;\n usdcFee: bigint;\n memo: string;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const memoBytes = new TextEncoder().encode(params.memo);\n const txInfo = await this.txClient.signTransfer({\n toAccountIndex: params.toAccountIndex,\n assetIndex: params.assetIndex,\n fromRouteType: params.fromRouteType,\n toRouteType: params.toRouteType,\n amount: params.amount,\n usdcFee: params.usdcFee,\n memo: memoBytes,\n });\n\n return this.sendTx({\n tx_type: TxType.L2Transfer,\n tx_info: serializeTransfer(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Withdraw funds using TypeScript signing\n */\n public async withdraw(params: {\n assetIndex: number;\n routeType: number;\n amount: bigint;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signWithdraw({\n assetIndex: params.assetIndex,\n routeType: params.routeType,\n amount: params.amount,\n });\n\n return this.sendTx({\n tx_type: TxType.L2Withdraw,\n tx_info: serializeWithdraw(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Update leverage using TypeScript signing\n */\n public async updateLeverage(params: {\n marketIndex: number;\n initialMarginFraction: number;\n marginMode: number;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signUpdateLeverage({\n marketIndex: params.marketIndex,\n initialMarginFraction: params.initialMarginFraction,\n marginMode: params.marginMode,\n });\n\n return this.sendTx({\n tx_type: TxType.L2UpdateLeverage,\n tx_info: serializeUpdateLeverage(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Modify an order using TypeScript signing\n */\n public async modifyOrder(params: {\n marketIndex: number;\n index: bigint;\n baseAmount: bigint;\n price: number;\n triggerPrice: number;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signModifyOrder({\n marketIndex: params.marketIndex,\n index: params.index,\n baseAmount: params.baseAmount,\n price: params.price,\n triggerPrice: params.triggerPrice,\n });\n\n return this.sendTx({\n tx_type: TxType.L2ModifyOrder,\n tx_info: serializeModifyOrder(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Create a subaccount using TypeScript signing\n */\n public async createSubAccount(params?: {\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signCreateSubAccount();\n\n return this.sendTx({\n tx_type: TxType.L2CreateSubAccount,\n tx_info: serializeCreateSubAccount(txInfo),\n price_protection: params?.priceProtection,\n });\n }\n\n /**\n * Create a public pool using TypeScript signing\n */\n public async createPublicPool(params: {\n operatorFee: bigint;\n initialTotalShares: bigint;\n minOperatorShareRate: number;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signCreatePublicPool({\n operatorFee: params.operatorFee,\n initialTotalShares: params.initialTotalShares,\n minOperatorShareRate: params.minOperatorShareRate,\n });\n\n return this.sendTx({\n tx_type: TxType.L2CreatePublicPool,\n tx_info: serializeCreatePublicPool(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Update a public pool using TypeScript signing\n */\n public async updatePublicPool(params: {\n publicPoolIndex: bigint;\n status: number;\n operatorFee: bigint;\n minOperatorShareRate: number;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signUpdatePublicPool({\n publicPoolIndex: params.publicPoolIndex,\n status: params.status,\n operatorFee: params.operatorFee,\n minOperatorShareRate: params.minOperatorShareRate,\n });\n\n return this.sendTx({\n tx_type: TxType.L2UpdatePublicPool,\n tx_info: serializeUpdatePublicPool(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Mint shares using TypeScript signing\n */\n public async mintShares(params: {\n publicPoolIndex: bigint;\n shareAmount: bigint;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signMintShares({\n publicPoolIndex: params.publicPoolIndex,\n shareAmount: params.shareAmount,\n });\n\n return this.sendTx({\n tx_type: TxType.L2MintShares,\n tx_info: serializeMintShares(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Burn shares using TypeScript signing\n */\n public async burnShares(params: {\n publicPoolIndex: bigint;\n shareAmount: bigint;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signBurnShares({\n publicPoolIndex: params.publicPoolIndex,\n shareAmount: params.shareAmount,\n });\n\n return this.sendTx({\n tx_type: TxType.L2BurnShares,\n tx_info: serializeBurnShares(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Update margin using TypeScript signing\n */\n public async updateMargin(params: {\n marketIndex: number;\n usdcAmount: bigint;\n direction: number;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signUpdateMargin({\n marketIndex: params.marketIndex,\n usdcAmount: params.usdcAmount,\n direction: params.direction,\n });\n\n return this.sendTx({\n tx_type: TxType.L2UpdateMargin,\n tx_info: serializeUpdateMargin(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Create grouped orders using TypeScript signing\n */\n public async createGroupedOrders(params: {\n groupingType: number;\n orders: Array<{\n marketIndex: number;\n clientOrderIndex: bigint;\n baseAmount: bigint;\n price: number;\n isAsk: number;\n type: number;\n timeInForce: number;\n reduceOnly: number;\n triggerPrice: number;\n orderExpiry: bigint;\n }>;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const txInfo = await this.txClient.signCreateGroupedOrders({\n groupingType: params.groupingType,\n orders: params.orders,\n });\n\n return this.sendTx({\n tx_type: TxType.L2CreateGroupedOrders,\n tx_info: serializeCreateGroupedOrders(txInfo),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Create multiple orders in a batch using TypeScript signing\n */\n public async createBatchOrders(params: {\n orders: Array<{\n marketIndex: number;\n clientOrderIndex: bigint;\n baseAmount: bigint;\n price: number;\n isAsk: number;\n orderType: number;\n timeInForce: number;\n reduceOnly: number;\n triggerPrice: number;\n orderExpiry: bigint;\n }>;\n }): Promise<TxHashesResponse> {\n const txTypes: number[] = [];\n const txInfos: string[] = [];\n\n // Sign each order\n for (const order of params.orders) {\n const txInfo = await this.txClient.signCreateOrder({\n marketIndex: order.marketIndex,\n clientOrderIndex: order.clientOrderIndex,\n baseAmount: order.baseAmount,\n price: order.price,\n isAsk: order.isAsk,\n type: order.orderType,\n timeInForce: order.timeInForce,\n reduceOnly: order.reduceOnly,\n triggerPrice: order.triggerPrice,\n orderExpiry: order.orderExpiry,\n });\n\n txTypes.push(TxType.L2CreateOrder);\n txInfos.push(serializeCreateOrder(txInfo));\n }\n\n return this.sendTransactionBatch({\n tx_types: JSON.stringify(txTypes),\n tx_infos: JSON.stringify(txInfos),\n });\n }\n\n /**\n * Generate change public key L1 sign message\n */\n public generateChangePubKeyL1SignMessage(\n pubKeyHex: string,\n nonce: number,\n accountIndex: bigint,\n newApiKeyIndex: number,\n ): string {\n const formatHex16Bytes = (value: bigint | number): string => {\n const hex = BigInt(value).toString(16);\n return \"0x\" + hex.padStart(16, \"0\");\n };\n\n return `Register Lighter Account\\n\\npubkey: 0x${pubKeyHex.replace(\"0x\", \"\")}\\nnonce: ${formatHex16Bytes(nonce)}\\naccount index: ${formatHex16Bytes(accountIndex)}\\napi key index: ${formatHex16Bytes(newApiKeyIndex)}\\nOnly sign this message for a trusted client!`;\n }\n\n /**\n * Change public key using TypeScript signing\n */\n public async changePubKey(params: {\n pubKey: string;\n l1Sig: string;\n priceProtection?: boolean;\n }): Promise<TxHashResponse> {\n const pubKeyBytes = hexToBytes(params.pubKey);\n const txInfo = await this.txClient.signChangePubKey({\n pubKey: pubKeyBytes,\n });\n\n // Add L1 signature to the tx info\n const txInfoWithL1Sig = {\n ...JSON.parse(serializeChangePubKey(txInfo)),\n L1Sig: params.l1Sig,\n };\n\n return this.sendTx({\n tx_type: TxType.L2ChangePubKey,\n tx_info: JSON.stringify(txInfoWithL1Sig),\n price_protection: params.priceProtection,\n });\n }\n\n /**\n * Acknowledge a notification\n */\n public async acknowledgeNotification(\n params: NotificationAckRequest,\n ): Promise<NotificationAckResponse> {\n const auth = await this.createAuthToken();\n return acknowledgeNotification(this.axiosInstance, params, auth);\n }\n\n /**\n * Change account tier\n */\n public async changeAccountTier(\n params: ChangeAccountTierRequest,\n ): Promise<ChangeAccountTierResponse> {\n const auth = await this.createAuthToken();\n return changeAccountTier(this.axiosInstance, params, auth);\n }\n\n /**\n * Fast withdraw funds\n */\n public async fastWithdraw(\n params: FastWithdrawRequest,\n ): Promise<FastWithdrawResponse> {\n const auth = await this.createAuthToken();\n return fastWithdraw(this.axiosInstance, params, auth);\n }\n\n /**\n * Create API token\n */\n public async createToken(\n params: TokensCreateRequest,\n ): Promise<TokensCreateResponse> {\n const auth = await this.createAuthToken();\n return createToken(this.axiosInstance, params, auth);\n }\n\n /**\n * Revoke API token\n */\n public async revokeToken(\n params: TokensRevokeRequest,\n ): Promise<TokensRevokeResponse> {\n const auth = await this.createAuthToken();\n return revokeToken(this.axiosInstance, params, auth);\n }\n}\n","export * from \"./change-account-tier\";\nexport * from \"./fastwithdraw\";\nexport * from \"./notification-ack\";\nexport * from \"./send-tx\";\nexport * from \"./send-tx-batch\";\nexport * from \"./tokens-create\";\nexport * from \"./tokens-revoke\";\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface ChangeAccountTierRequest {\n account_index: number;\n new_tier: string;\n auth?: string;\n}\n\nexport interface ChangeAccountTierResponse {\n code: number;\n message?: string;\n}\n\nexport async function changeAccountTier(\n client: AxiosInstance,\n params: ChangeAccountTierRequest,\n authorization?: string,\n): Promise<ChangeAccountTierResponse> {\n const config: AxiosRequestConfig = {\n headers: {},\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .post<ChangeAccountTierResponse>(\n \"/api/v1/changeAccountTier\",\n {\n account_index: params.account_index,\n new_tier: params.new_tier,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n config,\n )\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface FastWithdrawRequest {\n tx_info: string;\n to_address: string;\n auth?: string;\n}\n\nexport interface FastWithdrawResponse {\n code: number;\n message?: string;\n}\n\nexport async function fastWithdraw(\n client: AxiosInstance,\n params: FastWithdrawRequest,\n authorization?: string,\n): Promise<FastWithdrawResponse> {\n const config: AxiosRequestConfig = {\n headers: {},\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .post<FastWithdrawResponse>(\n \"/api/v1/fastwithdraw\",\n {\n tx_info: params.tx_info,\n to_address: params.to_address,\n ...(params.auth ? { auth: params.auth } : {}),\n },\n config,\n )\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface NotificationAckRequest {\n notif_id: string;\n account_index: number;\n}\n\nexport interface NotificationAckResponse {\n code: number;\n message?: string;\n}\n\nexport async function acknowledgeNotification(\n client: AxiosInstance,\n params: NotificationAckRequest,\n authorization?: string,\n): Promise<NotificationAckResponse> {\n const queryParams: Record<string, string> = {\n notif_id: params.notif_id,\n account_index: params.account_index.toString(),\n };\n\n const headers: Record<string, string> = {};\n if (authorization) {\n headers[\"Authorization\"] = authorization;\n headers[\"auth\"] = authorization;\n }\n\n return client\n .post<NotificationAckResponse>(\n \"/api/v1/notification/ack\",\n {},\n { params: queryParams, headers },\n )\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface SendTransactionRequest {\n account_index: number;\n api_key_index: number;\n transaction: string;\n price_protection?: boolean;\n}\n\nexport interface SendTxFormRequest {\n tx_type: number;\n tx_info: string;\n price_protection?: boolean;\n}\n\nexport interface SendTxWithIndicesRequest {\n tx_type: number;\n tx_info: string;\n account_index: number;\n api_key_index: number;\n price_protection?: boolean;\n}\n\nexport interface TxHashResponse {\n hash?: string;\n tx_hash?: string;\n code?: number;\n message?: string;\n predicted_execution_time_ms?: number;\n}\n\nexport async function sendTransaction(\n client: AxiosInstance,\n params: SendTransactionRequest,\n): Promise<TxHashResponse> {\n return client\n .post<TxHashResponse>(\"/api/v1/sendTx\", {\n account_index: params.account_index,\n api_key_index: params.api_key_index,\n transaction: params.transaction,\n ...(params.price_protection !== undefined\n ? { price_protection: params.price_protection }\n : {}),\n })\n .then((response) => response.data);\n}\n\nexport async function sendTx(\n client: AxiosInstance,\n params: SendTxFormRequest,\n): Promise<TxHashResponse> {\n const urlParams = new URLSearchParams();\n urlParams.append(\"tx_type\", params.tx_type.toString());\n urlParams.append(\"tx_info\", params.tx_info);\n urlParams.append(\n \"price_protection\",\n params.price_protection !== false ? \"true\" : \"false\",\n );\n\n return client\n .post<TxHashResponse>(\"/api/v1/sendTx\", urlParams, {\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n })\n .then((response) => response.data);\n}\n\nexport async function sendTxWithIndices(\n client: AxiosInstance,\n params: SendTxWithIndicesRequest,\n): Promise<TxHashResponse> {\n const urlParams = new URLSearchParams();\n urlParams.append(\"tx_type\", params.tx_type.toString());\n urlParams.append(\"tx_info\", params.tx_info);\n urlParams.append(\"account_index\", params.account_index.toString());\n urlParams.append(\"api_key_index\", params.api_key_index.toString());\n urlParams.append(\n \"price_protection\",\n params.price_protection !== false ? \"true\" : \"false\",\n );\n\n return client\n .post<TxHashResponse>(\"/api/v1/sendTx\", urlParams, {\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n })\n .then((response) => response.data);\n}\n\nexport async function sendTxJson(\n client: AxiosInstance,\n params: SendTxWithIndicesRequest,\n): Promise<TxHashResponse> {\n const payload = {\n tx_type: params.tx_type,\n tx_info: params.tx_info,\n account_index: params.account_index,\n api_key_index: params.api_key_index,\n price_protection: params.price_protection !== false,\n };\n\n return client\n .post<TxHashResponse>(\"/api/v1/sendTx\", payload, {\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then((response) => response.data);\n}\n","import { AxiosInstance } from \"axios\";\n\nexport interface SendTransactionBatchFormRequest {\n tx_types: string;\n tx_infos: string;\n}\n\nexport interface SendTransactionBatchJsonRequest {\n account_index: number;\n api_key_index: number;\n transactions: string[];\n}\n\nexport type SendTransactionBatchRequest =\n | SendTransactionBatchFormRequest\n | SendTransactionBatchJsonRequest;\n\nexport interface TxHashesResponse {\n hashes?: string[];\n tx_hash?: string[];\n code?: number;\n message?: string;\n predicted_execution_time_ms?: number;\n}\n\nexport async function sendTransactionBatch(\n client: AxiosInstance,\n params: SendTransactionBatchRequest,\n): Promise<TxHashesResponse> {\n if (\"tx_types\" in params && \"tx_infos\" in params) {\n const urlParams = new URLSearchParams();\n urlParams.append(\"tx_types\", params.tx_types);\n urlParams.append(\"tx_infos\", params.tx_infos);\n\n return client\n .post<TxHashesResponse>(\"/api/v1/sendTxBatch\", urlParams, {\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n })\n .then((response) => response.data);\n } else if (\"transactions\" in params) {\n return client\n .post<TxHashesResponse>(\"/api/v1/sendTxBatch\", {\n account_index: params.account_index,\n api_key_index: params.api_key_index,\n transactions: params.transactions,\n })\n .then((response) => response.data);\n }\n\n throw new Error(\n \"Invalid batch params: must provide either (tx_types, tx_infos) or (transactions)\",\n );\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface TokensCreateRequest {\n name: string;\n account_index: number;\n expiry: number;\n sub_account_access: boolean;\n scopes?: string;\n}\n\nexport interface TokensCreateResponse {\n code: number;\n message?: string;\n token_id: number;\n api_token: string;\n name: string;\n account_index: number;\n expiry: number;\n sub_account_access: boolean;\n revoked: boolean;\n scopes: string;\n}\n\nexport async function createToken(\n client: AxiosInstance,\n params: TokensCreateRequest,\n authorization?: string,\n): Promise<TokensCreateResponse> {\n const config: AxiosRequestConfig = {\n headers: {},\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .post<TokensCreateResponse>(\n \"/api/v1/tokens/create\",\n {\n name: params.name,\n account_index: params.account_index,\n expiry: params.expiry,\n sub_account_access: params.sub_account_access,\n ...(params.scopes ? { scopes: params.scopes } : { scopes: \"read.*\" }),\n },\n config,\n )\n .then((response) => response.data);\n}\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nexport interface TokensRevokeRequest {\n token_id: number;\n account_index: number;\n}\n\nexport interface TokensRevokeResponse {\n code: number;\n message?: string;\n token_id: number;\n revoked: boolean;\n}\n\nexport async function revokeToken(\n client: AxiosInstance,\n params: TokensRevokeRequest,\n authorization?: string,\n): Promise<TokensRevokeResponse> {\n const config: AxiosRequestConfig = {\n headers: {},\n };\n\n if (authorization) {\n config.headers = { Authorization: authorization };\n }\n\n return client\n .post<TokensRevokeResponse>(\n \"/api/v1/tokens/revoke\",\n {\n token_id: params.token_id,\n account_index: params.account_index,\n },\n config,\n )\n .then((response) => response.data);\n}\n","import ReconnectingWebSocket, {\n Options as RWSOptions,\n} from \"reconnecting-websocket\";\n\nimport {\n WebSocketConfig,\n WsAccountAllAssetsUpdate,\n WsAccountAllOrdersUpdate,\n WsAccountAllPositionsUpdate,\n WsAccountAllTradesUpdate,\n WsAccountAllUpdate,\n WsAccountMarketUpdate,\n WsAccountOrdersUpdate,\n WsHeightUpdate,\n WsMarketStatsUpdate,\n WsNotificationUpdate,\n WsOrderBookUpdate,\n WsPoolDataUpdate,\n WsPoolInfoUpdate,\n WsSpotMarketStatsUpdate,\n WsTradeUpdate,\n WsTransactionUpdate,\n WsUserStatsUpdate,\n} from \"../types\";\n\nexport type Unsubscribe = () => void;\n\ninterface SubscriptionHandler<T = any> {\n handler: (data: T) => void;\n parser?: (payload: any) => T;\n auth?: string;\n}\n\nexport class WsClient {\n private ws: ReconnectingWebSocket | null = null;\n private config: WebSocketConfig;\n private readonly url: string;\n private messageHandlers: Map<string, Array<SubscriptionHandler>> = new Map();\n\n constructor(config?: WebSocketConfig) {\n this.config = {\n minReconnectionDelay: 1000,\n maxReconnectionDelay: 10000,\n maxReconnectAttempts: 5,\n ...config,\n };\n this.url = this.config.url || \"wss://mainnet.zklighter.elliot.ai/stream\";\n }\n\n public connect(): void {\n if (this.ws) {\n this.disconnect();\n }\n\n const options: RWSOptions = {\n connectionTimeout: 10000,\n maxRetries: this.config.maxReconnectAttempts || 5,\n maxReconnectionDelay: this.config.maxReconnectionDelay || 10000,\n minReconnectionDelay: this.config.minReconnectionDelay || 1000,\n reconnectionDelayGrowFactor: 1.5,\n minUptime: 5000,\n };\n\n this.ws = new ReconnectingWebSocket(this.url, [], options);\n\n this.ws.addEventListener(\"open\", () => {\n this.config.onOpen?.();\n this.resubscribeAll();\n });\n\n this.ws.addEventListener(\"message\", (event: MessageEvent) => {\n try {\n const message = JSON.parse(event.data);\n this.config.onMessage?.(message);\n this.handleSubscriptionMessage(message);\n } catch (error) {\n // Silently ignore parse errors\n }\n });\n\n this.ws.addEventListener(\"close\", () => {\n this.config.onClose?.();\n });\n\n this.ws.addEventListener(\"error\", (err) => {\n this.config.onError?.(new Error(\"WebSocket error: \" + err.message));\n });\n }\n\n public disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n private subscribe<TPayload = any>(\n channel: string,\n handler: (data: TPayload) => void,\n auth?: string,\n parser?: (payload: any) => TPayload,\n ): Unsubscribe {\n const normalizedChannel = this.normalizeChannel(channel);\n\n if (!this.messageHandlers.has(normalizedChannel)) {\n this.messageHandlers.set(normalizedChannel, []);\n }\n\n const handlers = this.messageHandlers.get(normalizedChannel)!;\n const subscriptionHandler: SubscriptionHandler<TPayload> = {\n handler,\n parser,\n auth,\n };\n handlers.push(subscriptionHandler);\n\n // If this is the first handler for the channel, send subscribe message\n if (handlers.length === 1) {\n const message: any = {\n type: \"subscribe\",\n channel: channel.replace(/:/g, \"/\"),\n };\n\n if (auth) {\n message.auth = auth;\n }\n\n this.ws?.send(JSON.stringify(message));\n }\n\n // Return unsubscribe function\n return () => {\n const handlers = this.messageHandlers.get(normalizedChannel);\n if (handlers) {\n const index = handlers.indexOf(subscriptionHandler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n if (handlers.length === 0) {\n this.messageHandlers.delete(normalizedChannel);\n this.ws?.send(\n JSON.stringify({\n type: \"unsubscribe\",\n channel: channel.replace(/:/g, \"/\"),\n }),\n );\n }\n }\n };\n }\n\n public subscribeOrderBook(\n marketIndex: number,\n handler: (update: WsOrderBookUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsOrderBookUpdate>(\n `order_book:${marketIndex}`,\n handler,\n undefined,\n this.passthroughParser<WsOrderBookUpdate>(),\n );\n }\n\n public subscribeMarketStats(\n market: number | \"all\",\n handler: (update: WsMarketStatsUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsMarketStatsUpdate>(\n `market_stats:${market}`,\n handler,\n undefined,\n this.passthroughParser<WsMarketStatsUpdate>(),\n );\n }\n\n public subscribeSpotMarketStats(\n market: number | \"all\",\n handler: (update: WsSpotMarketStatsUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsSpotMarketStatsUpdate>(\n `spot_market_stats:${market}`,\n handler,\n undefined,\n this.passthroughParser<WsSpotMarketStatsUpdate>(),\n );\n }\n\n public subscribeTrades(\n marketIndex: number,\n handler: (update: WsTradeUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsTradeUpdate>(\n `trade:${marketIndex}`,\n handler,\n undefined,\n this.passthroughParser<WsTradeUpdate>(),\n );\n }\n\n public subscribeAccountAll(\n accountId: number,\n handler: (update: WsAccountAllUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsAccountAllUpdate>(\n `account_all:${accountId}`,\n handler,\n undefined,\n this.passthroughParser<WsAccountAllUpdate>(),\n );\n }\n\n public subscribeAccountMarket(\n marketId: number,\n accountId: number,\n auth: string,\n handler: (update: WsAccountMarketUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsAccountMarketUpdate>(\n `account_market:${marketId}:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsAccountMarketUpdate>(),\n );\n }\n\n public subscribeUserStats(\n accountId: number,\n handler: (update: WsUserStatsUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsUserStatsUpdate>(\n `user_stats:${accountId}`,\n handler,\n undefined,\n this.passthroughParser<WsUserStatsUpdate>(),\n );\n }\n\n public subscribeAccountAllAssets(\n accountId: number,\n auth: string,\n handler: (update: WsAccountAllAssetsUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsAccountAllAssetsUpdate>(\n `account_all_assets:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsAccountAllAssetsUpdate>(),\n );\n }\n\n public subscribeTransactions(\n handler: (update: WsTransactionUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsTransactionUpdate>(\n \"transaction\",\n handler,\n undefined,\n this.passthroughParser<WsTransactionUpdate>(),\n );\n }\n\n public subscribeExecutedTransactions(\n handler: (update: WsTransactionUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsTransactionUpdate>(\n \"executed_transaction\",\n handler,\n undefined,\n this.passthroughParser<WsTransactionUpdate>(),\n );\n }\n\n public subscribeAccountTransactions(\n accountId: number,\n auth: string,\n handler: (update: WsTransactionUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsTransactionUpdate>(\n `account_tx:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsTransactionUpdate>(),\n );\n }\n\n public subscribeAccountAllOrders(\n accountId: number,\n auth: string,\n handler: (update: WsAccountAllOrdersUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsAccountAllOrdersUpdate>(\n `account_all_orders:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsAccountAllOrdersUpdate>(),\n );\n }\n\n public subscribeHeight(\n handler: (update: WsHeightUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsHeightUpdate>(\n \"height\",\n handler,\n undefined,\n this.passthroughParser<WsHeightUpdate>(),\n );\n }\n\n public subscribePoolData(\n accountId: number,\n auth: string,\n handler: (update: WsPoolDataUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsPoolDataUpdate>(\n `pool_data:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsPoolDataUpdate>(),\n );\n }\n\n public subscribePoolInfo(\n accountId: number,\n auth: string,\n handler: (update: WsPoolInfoUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsPoolInfoUpdate>(\n `pool_info:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsPoolInfoUpdate>(),\n );\n }\n\n public subscribeNotifications(\n accountId: number,\n auth: string,\n handler: (update: WsNotificationUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsNotificationUpdate>(\n `notification:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsNotificationUpdate>(),\n );\n }\n\n public subscribeAccountOrders(\n marketIndex: number,\n accountId: number,\n auth: string,\n handler: (update: WsAccountOrdersUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsAccountOrdersUpdate>(\n `account_orders:${marketIndex}:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsAccountOrdersUpdate>(),\n );\n }\n\n public subscribeAccountAllTrades(\n accountId: number,\n auth: string,\n handler: (update: WsAccountAllTradesUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsAccountAllTradesUpdate>(\n `account_all_trades:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsAccountAllTradesUpdate>(),\n );\n }\n\n public subscribeAccountAllPositions(\n accountId: number,\n auth: string,\n handler: (update: WsAccountAllPositionsUpdate) => void,\n ): Unsubscribe {\n return this.subscribe<WsAccountAllPositionsUpdate>(\n `account_all_positions:${accountId}`,\n handler,\n auth,\n this.passthroughParser<WsAccountAllPositionsUpdate>(),\n );\n }\n\n public send(message: any): void {\n this.ws?.send(JSON.stringify(message));\n }\n\n private normalizeChannel(channel: string): string {\n return channel.replace(/:/g, \"/\");\n }\n\n private passthroughParser<T>(): (payload: any) => T {\n return (payload: any) => payload as T;\n }\n\n private handleSubscriptionMessage(rawMessage: any): void {\n if (!rawMessage || typeof rawMessage !== \"object\") {\n return;\n }\n\n const channelName =\n typeof rawMessage.channel === \"string\" ? rawMessage.channel : undefined;\n if (!channelName) {\n return;\n }\n\n const normalizedChannel = this.normalizeChannel(channelName);\n const handlers = this.messageHandlers.get(normalizedChannel);\n\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n // Call all handlers for this channel\n handlers.forEach((subscriptionHandler) => {\n try {\n const parser =\n typeof subscriptionHandler.parser === \"function\"\n ? subscriptionHandler.parser\n : (payload: any) => payload;\n const parsed = parser(rawMessage);\n subscriptionHandler.handler(parsed);\n } catch (error) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(normalizedError);\n }\n });\n }\n\n private resubscribeAll(): void {\n this.messageHandlers.forEach((handlers, channel) => {\n if (handlers.length > 0) {\n const firstHandler = handlers[0];\n const message: any = {\n type: \"subscribe\",\n channel: channel.replace(/:/g, \"/\"),\n };\n\n if (firstHandler.auth) {\n message.auth = firstHandler.auth;\n }\n\n this.ws?.send(JSON.stringify(message));\n }\n });\n }\n\n public getSubscriptions(): string[] {\n return Array.from(this.messageHandlers.keys());\n }\n}\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,CA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","names":["mod","mod","e","bytesToHex","client","axios","axios","axios","DEFAULT_DEADLINE","axios","handlers"]}
|