@gala-chain/gswap-sdk 0.0.9 → 1.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -35
- package/dist/browser/index.js +2 -24
- package/dist/browser/index.js.map +1 -1
- package/dist/index.cjs +2033 -1345
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1008 -774
- package/dist/index.d.ts +1008 -774
- package/dist/index.mjs +2012 -1337
- package/dist/index.mjs.map +1 -1
- package/package.json +37 -26
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/validation.ts","../src/classes/gswap_sdk_error.ts","../src/classes/assets.ts","../src/classes/bundler.ts","../src/utils/debug.ts","../src/classes/event_socket_client.ts","../src/classes/tx_waiter.ts","../src/classes/events.ts","../src/classes/pending_transaction.ts","../src/classes/http_client.ts","../src/classes/pools.ts","../src/utils/token.ts","../src/classes/positions.ts","../src/classes/quoting.ts","../src/types/fees.ts","../src/classes/swaps.ts","../src/classes/gswap.ts","../src/classes/signers.ts"],"sourcesContent":["export * from './classes/assets.js';\nexport * from './classes/bundler.js';\nexport * from './classes/event_socket_client.js';\nexport * from './classes/events.js';\nexport * from './classes/gswap.js';\nexport * from './classes/gswap_sdk_error.js';\nexport * from './classes/pending_transaction.js';\nexport * from './classes/pools.js';\nexport * from './classes/positions.js';\nexport * from './classes/quoting.js';\nexport * from './classes/signers.js';\nexport * from './classes/swaps.js';\nexport * from './types/amounts.js';\nexport * from './types/api_responses.js';\nexport * from './types/fees.js';\nexport * from './types/sdk_results.js';\nexport * from './types/token.js';\nexport * from './utils/token.js';\nexport * from './utils/validation.js';\n","import BigNumber from 'bignumber.js';\nimport { GSwapSDKError } from '../classes/gswap_sdk_error.js';\nimport { NumericAmount } from '../types/amounts.js';\n\nexport function validateNumericAmount(\n amount: NumericAmount,\n parameterName: string,\n allowZero = false,\n): void {\n const bnAmount = BigNumber(amount);\n\n if (!bnAmount.isFinite()) {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: must be a finite number`,\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_NUMERIC_AMOUNT',\n parameterName,\n value: amount,\n reason: 'not_finite',\n },\n );\n }\n\n if (!allowZero && bnAmount.isZero()) {\n throw new GSwapSDKError(`Invalid ${parameterName}: must be positive`, 'VALIDATION_ERROR', {\n type: 'INVALID_NUMERIC_AMOUNT',\n parameterName,\n value: amount,\n reason: 'zero_not_allowed',\n });\n }\n\n if (bnAmount.isNegative()) {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: must be ${allowZero ? 'non-negative' : 'positive'}`,\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_NUMERIC_AMOUNT',\n parameterName,\n value: amount,\n reason: 'negative',\n },\n );\n }\n}\n\nexport function validatePriceValues(\n spotPrice: NumericAmount,\n lowerPrice: NumericAmount,\n upperPrice: NumericAmount,\n): void {\n const bnSpotPrice = BigNumber(spotPrice);\n const bnLowerPrice = BigNumber(lowerPrice);\n let bnUpperPrice = BigNumber(upperPrice);\n\n bnUpperPrice = bnUpperPrice.isFinite() ? bnUpperPrice : BigNumber(1e18);\n\n if (\n !bnSpotPrice.isFinite() ||\n !bnLowerPrice.isFinite() ||\n !bnUpperPrice.isFinite() ||\n !bnSpotPrice.isPositive() ||\n !bnLowerPrice.isPositive() ||\n !bnUpperPrice.isPositive()\n ) {\n throw new GSwapSDKError(\n 'Invalid price values: all prices must be finite and positive',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_PRICE_VALUES',\n spotPrice,\n lowerPrice,\n upperPrice,\n },\n );\n }\n\n if (bnLowerPrice.isGreaterThan(bnUpperPrice)) {\n throw new GSwapSDKError(\n 'Invalid price range: lower price must be less than or equal to upper price',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_PRICE_RANGE',\n lowerPrice,\n upperPrice,\n },\n );\n }\n}\n\nexport function validateTokenDecimals(decimals: number, parameterName: string): void {\n if (decimals < 0 || !Number.isInteger(decimals)) {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: must be a non-negative integer`,\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TOKEN_DECIMALS',\n parameterName,\n value: decimals,\n },\n );\n }\n}\n\nexport function validateTickRange(tickLower: number, tickUpper: number): void {\n if (!Number.isInteger(tickLower) || !Number.isInteger(tickUpper)) {\n throw new GSwapSDKError('Invalid tick values: ticks must be integers', 'VALIDATION_ERROR', {\n type: 'INVALID_TICK_VALUES',\n tickLower,\n tickUpper,\n });\n }\n\n if (tickLower >= tickUpper) {\n throw new GSwapSDKError(\n 'Invalid tick range: tickLower must be less than tickUpper',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TICK_RANGE',\n tickLower,\n tickUpper,\n },\n );\n }\n\n if (tickLower < -886800 || tickUpper > 886800) {\n throw new GSwapSDKError(\n 'Invalid tick range: ticks must be between -886800 and 886800',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TICK_BOUNDS',\n tickLower,\n tickUpper,\n minTick: -886800,\n maxTick: 886800,\n },\n );\n }\n}\n\nexport function validateFee(fee: number): void {\n if (!Number.isInteger(fee) || fee < 0) {\n throw new GSwapSDKError('Invalid fee: must be a non-negative integer', 'VALIDATION_ERROR', {\n type: 'INVALID_FEE',\n value: fee,\n });\n }\n}\n\nexport function validateTickSpacing(tickSpacing: number): void {\n if (!Number.isInteger(tickSpacing) || tickSpacing <= 0) {\n throw new GSwapSDKError(\n 'Invalid tick spacing: must be a positive integer',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TICK_SPACING',\n value: tickSpacing,\n },\n );\n }\n}\n\nexport function validateWalletAddress(address?: string): asserts address is string {\n if (address === undefined) {\n throw new GSwapSDKError(\n 'Invalid wallet address: No wallet address provided',\n 'VALIDATION_ERROR',\n {\n type: 'MISSING_WALLET_ADDRESS',\n hint: 'Either provide a wallet address to the function you are calling, or set one when instantiating GSwapSDK',\n },\n );\n }\n\n if (!address || typeof address !== 'string' || address.trim().length === 0) {\n throw new GSwapSDKError(\n 'Invalid wallet address: must be a non-empty string',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_WALLET_ADDRESS',\n value: address,\n },\n );\n }\n}\n","import { HTTPResponse } from '../types/http_requestor.js';\nimport { GalaChainTokenClassKey } from '../types/token.js';\n\nexport class GSwapSDKError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'GSwapSDKError';\n }\n\n public static noSignerError() {\n return new GSwapSDKError(\n 'This method requires a signer. Please provide a signer to the GSwap constructor.',\n 'NO_SIGNER',\n );\n }\n\n public static async fromErrorResponse(url: string, response: HTTPResponse) {\n const bodyText = await response.text();\n const bodyJson: unknown = (() => {\n try {\n return JSON.parse(bodyText);\n } catch {\n return undefined;\n }\n })();\n\n const errorKey =\n typeof bodyJson === 'object' &&\n bodyJson &&\n 'error' in bodyJson &&\n typeof bodyJson.error === 'object' &&\n bodyJson.error &&\n 'ErrorKey' in bodyJson.error &&\n typeof bodyJson.error.ErrorKey === 'string'\n ? bodyJson.error.ErrorKey\n : undefined;\n\n const message =\n typeof bodyJson === 'object' &&\n bodyJson &&\n 'error' in bodyJson &&\n typeof bodyJson.error === 'object' &&\n bodyJson.error &&\n 'Message' in bodyJson.error &&\n typeof bodyJson.error.Message === 'string'\n ? bodyJson.error.Message\n : undefined;\n\n if (errorKey && message) {\n return new GSwapSDKError(`GalaChain Error ${errorKey} from ${url}: ${message}`, errorKey, {\n message,\n errorKey,\n status: response.status,\n body: bodyJson,\n url,\n });\n }\n\n return new GSwapSDKError(`Unexpected HTTP Error ${response.status} from ${url}`, 'HTTP_ERROR', {\n status: response.status,\n body: bodyJson ?? bodyText,\n url,\n });\n }\n\n public static incorrectTokenOrderingError(\n specifiedToken0: GalaChainTokenClassKey | string,\n specifiedToken1: GalaChainTokenClassKey | string,\n ) {\n return new GSwapSDKError(\n 'Token ordering is incorrect. token0 should sort below token1.',\n 'INCORRECT_TOKEN_ORDERING',\n {\n specifiedToken0,\n specifiedToken1,\n },\n );\n }\n\n public static transactionWaitTimeoutError(txId: string) {\n return new GSwapSDKError('Transaction wait timed out.', 'TRANSACTION_WAIT_TIMEOUT', {\n txId,\n });\n }\n\n public static transactionWaitFailedError(txId: string, detail: Record<string, unknown>) {\n const transactionHash =\n 'transactionId' in detail && typeof detail.transactionId === 'string'\n ? detail.transactionId\n : undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { transactionId, ...rest } = detail;\n\n return new GSwapSDKError('Transaction wait failed.', 'TRANSACTION_WAIT_FAILED', {\n txId,\n transactionHash,\n ...rest,\n });\n }\n\n public static socketConnectionRequiredError() {\n return new GSwapSDKError(\n 'This method requires a socket connection. Did you call connectSocket()?',\n 'SOCKET_CONNECTION_REQUIRED',\n );\n }\n\n public static noPoolAvailableError(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n fee?: number,\n ) {\n const message =\n fee !== undefined\n ? `No pool available for the specified token pair at fee tier ${fee}`\n : 'No pools available for the specified token pair';\n\n return new GSwapSDKError(message, 'NO_POOL_AVAILABLE', {\n tokenIn,\n tokenOut,\n fee,\n });\n }\n}\n","import { GetUserAssetsResult } from '../types/sdk_results.js';\nimport { validateWalletAddress } from '../utils/validation.js';\nimport { HttpClient } from './http_client.js';\n\n/**\n * Service for handling user asset operations.\n * Provides functionality to retrieve user token balances and asset information.\n */\nexport class Assets {\n constructor(\n private readonly dexBackendBaseUrl: string,\n private readonly httpClient: HttpClient,\n ) {}\n\n /**\n * Gets all token assets owned by a user with their balances.\n * @param ownerAddress - The wallet address to get assets for.\n * @param page - Page number for pagination (default: 1).\n * @param limit - Maximum number of assets to return per page (default: 10).\n * @returns User assets including token information and balances.\n * @example\n * ```typescript\n * const assets = await assetsService.getUserAssets('eth|123...abc', 1, 20);\n * console.log(`User has ${assets.count} different tokens`);\n * assets.tokens.forEach(token => {\n * console.log(`${token.symbol}: ${token.quantity}`);\n * });\n * ```\n */\n async getUserAssets(\n ownerAddress: string,\n page: number = 1,\n limit: number = 10,\n ): Promise<GetUserAssetsResult> {\n validateWalletAddress(ownerAddress);\n\n if (!Number.isInteger(page) || page < 1) {\n throw new Error('Invalid page: must be a positive integer');\n }\n\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error('Invalid limit: must be an integer between 1 and 100');\n }\n\n const json: {\n status: number;\n error: boolean;\n message: string;\n data: {\n token: Array<{\n image: string;\n name: string;\n decimals: string;\n verify: boolean;\n symbol: string;\n quantity: string;\n }>;\n count: number;\n };\n } = await this.httpClient.sendGetRequest(this.dexBackendBaseUrl, '/user/assets', '', {\n address: ownerAddress,\n page: page.toString(),\n limit: limit.toString(),\n });\n\n return {\n tokens:\n json.data.token.map((token) => ({\n ...token,\n decimals: parseInt(token.decimals, 10),\n })) || [],\n count: json.data.count || 0,\n };\n }\n}\n","import crypto from 'crypto';\nimport { TransactionPendingResponse } from '../types/api_responses.js';\nimport { debugLog } from '../utils/debug.js';\nimport { Events } from './events.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport { HttpClient } from './http_client.js';\nimport { PendingTransaction } from './pending_transaction.js';\nimport { GalaChainSigner } from './signers.js';\n\nfunction randomUUID() {\n if (globalThis.crypto) {\n return globalThis.crypto.randomUUID();\n }\n\n return crypto.randomUUID();\n}\n\nexport class Bundler {\n constructor(\n private readonly bundlerBaseUrl: string,\n private readonly bundlingAPIBasePath: string,\n private readonly transactionWaitTimeoutMs: number,\n private readonly signer: GalaChainSigner | undefined,\n private readonly httpClient: HttpClient,\n ) {}\n\n async signObject<TInputType extends Record<string, unknown>>(\n methodName: string,\n toSign: TInputType,\n ): Promise<TInputType & { signature: string }> {\n if (!this.signer) {\n throw GSwapSDKError.noSignerError();\n }\n\n const withUniqueKey = {\n ...toSign,\n uniqueKey: toSign.uniqueKey ?? `galaswap - operation - ${randomUUID()}`,\n };\n\n debugLog('Signing object for method', methodName, withUniqueKey);\n\n return this.signer.signObject(methodName, withUniqueKey);\n }\n\n async sendBundlerRequest(\n method: string,\n body: Record<string, unknown>,\n stringsInstructions: string[],\n ): Promise<PendingTransaction> {\n if (!this.hasSigner()) {\n throw GSwapSDKError.noSignerError();\n }\n\n const requestBody = {\n method,\n signedDto: await this.signObject(method, body),\n stringsInstructions,\n };\n\n debugLog('Sending bundler request', method, requestBody);\n\n const response = await this.httpClient.sendPostRequest<TransactionPendingResponse>(\n this.bundlerBaseUrl,\n this.bundlingAPIBasePath,\n '',\n requestBody,\n );\n\n debugLog('Received bundler response', method, response);\n\n Events.instance.registerTxId(response.data, this.transactionWaitTimeoutMs);\n\n const transaction = new PendingTransaction(\n response.data,\n response.message,\n response.error,\n () => {\n return Events.instance.wait(response.data);\n },\n );\n\n return transaction;\n }\n\n hasSigner(): boolean {\n return this.signer !== undefined;\n }\n}\n","import debug from 'debug';\n\nexport const debugLog = debug('GSWAP_SDK');\n","import { EventEmitter } from 'events';\nimport { Socket, io } from 'socket.io-client';\n\ninterface IRawBundlerResponse {\n status: string;\n data: Record<string, unknown> & {\n transactionId: string;\n };\n}\n\nexport type BundlerResponse =\n | {\n status: 'FAILED';\n transactionHash: string;\n data: {\n ErrorCode: number;\n ErrorKey: string;\n ErrorPayload: Record<string, unknown>;\n Message: string;\n transactionId: string;\n };\n }\n | {\n status: 'PROCESSED';\n transactionHash: string;\n data: {\n Data: Record<string, unknown>;\n transactionId: string;\n };\n };\n\nexport interface BundlerRequest {\n data: string; // The transaction ID\n message: string;\n error: boolean;\n}\n\nexport abstract class TradeEventEmitter extends EventEmitter {\n abstract connect(): Promise<void>;\n abstract disconnect(): void;\n abstract isConnected(): boolean;\n}\n\nexport class EventSocketClient extends TradeEventEmitter {\n private socket: Socket | null = null;\n private readonly bundlerUrl: string;\n\n constructor(bundlerUrl: string) {\n super();\n this.bundlerUrl = bundlerUrl;\n }\n\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.socket?.connected) {\n resolve();\n return;\n }\n\n this.socket = io(this.bundlerUrl, {\n transports: ['websocket'],\n autoConnect: true,\n });\n\n this.socket.on('connect', () => {\n console.log('Connected to bundler socket:', this.bundlerUrl);\n this.emit('connect');\n resolve();\n });\n\n this.socket.on('connect_error', (error) => {\n console.error('Failed to connect to bundler socket:', error);\n this.emit('error', error);\n reject(error);\n });\n\n this.socket.on('disconnect', (reason) => {\n console.log('Disconnected from bundler socket:', reason);\n this.emit('disconnect', reason);\n });\n\n // Listen for bundler responses and emit them as events\n this.socket.onAny((eventName: string, ...args: unknown[]) => {\n if (typeof eventName === 'string') {\n const [responseData] = args as [IRawBundlerResponse];\n this.emit('transaction', eventName, {\n ...responseData,\n transactionHash: responseData.data?.transactionId,\n });\n }\n });\n });\n }\n\n disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n }\n }\n\n isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n}\n","import { GSwapSDKError } from './gswap_sdk_error.js';\n\nexport class TransactionWaiter {\n private enabled = false;\n\n private readonly promiseInfoForTxId = new Map<\n string,\n {\n promise: Promise<{ txId: string; transactionHash: string; Data: Record<string, unknown> }>;\n resolve: (result: {\n txId: string;\n transactionHash: string;\n Data: Record<string, unknown>;\n }) => void;\n reject: (error: GSwapSDKError) => void;\n waited: boolean;\n timeoutId: number;\n }\n >();\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n if (!enabled) {\n for (const [txId, promiseInfo] of this.promiseInfoForTxId.entries()) {\n clearTimeout(promiseInfo.timeoutId);\n promiseInfo.reject(\n GSwapSDKError.transactionWaitFailedError(txId, {\n message: 'Transaction waiter disabled',\n }),\n );\n }\n\n this.promiseInfoForTxId.clear();\n }\n }\n\n registerTxId(txId: string, timeoutMs: number): void {\n if (this.promiseInfoForTxId.has(txId)) {\n throw new GSwapSDKError(\n `Transaction ID is already registered`,\n 'TRANSACTION_ID_ALREADY_REGISTERED',\n { txId },\n );\n }\n\n if (!this.enabled) {\n return;\n }\n\n let resolve: (args: {\n txId: string;\n transactionHash: string;\n Data: Record<string, unknown>;\n }) => void;\n let reject: () => void;\n\n const promise = new Promise<{\n txId: string;\n transactionHash: string;\n Data: Record<string, unknown>;\n }>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // Automatically remove the promise after the timeout\n const timeoutId = setTimeout(() => {\n const promiseInfo = this.promiseInfoForTxId.get(txId);\n if (promiseInfo) {\n if (promiseInfo.waited) {\n promiseInfo.reject(GSwapSDKError.transactionWaitTimeoutError(txId));\n } else {\n promiseInfo.resolve({ txId, transactionHash: txId, Data: {} });\n }\n\n this.promiseInfoForTxId.delete(txId);\n }\n }, timeoutMs);\n\n this.promiseInfoForTxId.set(txId, {\n promise,\n resolve: resolve!,\n reject: reject!,\n timeoutId: timeoutId as unknown as number,\n waited: false,\n });\n }\n\n wait(txId: string) {\n const promise = this.promiseInfoForTxId.get(txId);\n if (!promise) {\n throw new GSwapSDKError(\n `Transaction ID is not registered for waiting`,\n 'TRANSACTION_ID_NOT_REGISTERED',\n {\n txId,\n },\n );\n }\n\n promise.waited = true;\n return promise.promise;\n }\n\n notifySuccess(\n txId: string,\n data: { transactionId: string; Data: Record<string, unknown> },\n ): void {\n const promiseInfo = this.promiseInfoForTxId.get(txId);\n if (!promiseInfo) {\n return;\n }\n\n clearTimeout(promiseInfo.timeoutId);\n\n promiseInfo.resolve({\n txId,\n transactionHash: data.transactionId,\n Data: data.Data,\n });\n\n this.promiseInfoForTxId.delete(txId);\n }\n\n notifyFailure(txId: string, detail: Record<string, unknown>): void {\n const promiseInfo = this.promiseInfoForTxId.get(txId);\n if (!promiseInfo) {\n return;\n }\n\n clearTimeout(promiseInfo.timeoutId);\n\n if (promiseInfo.waited) {\n promiseInfo.reject(GSwapSDKError.transactionWaitFailedError(txId, detail));\n } else {\n promiseInfo.resolve({ txId, transactionHash: txId, Data: {} });\n }\n\n this.promiseInfoForTxId.delete(txId);\n }\n}\n","import { debugLog } from '../utils/debug.js';\nimport { BundlerResponse, EventSocketClient, TradeEventEmitter } from './event_socket_client.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport { TransactionWaiter } from './tx_waiter.js';\n\n/**\n * Service for handling real-time event streaming and socket connections.\n * Manages the global socket connection for transaction status updates.\n */\nexport class Events {\n private globalSocketClient?: TradeEventEmitter | undefined;\n private globalWaitHelper = new TransactionWaiter();\n private connectionPromise?: Promise<TradeEventEmitter> | undefined;\n\n public static readonly instance = new Events();\n public static tradeEventEmitterConstructor: new (url: string) => TradeEventEmitter =\n EventSocketClient;\n\n /**\n * Establishes a global socket connection for real-time event streaming.\n * This connection is shared across all service instances.\n * @param bundlerBaseUrl - Optional bundler base URL. If not provided, uses default.\n * @returns The connected EventSocketClient.\n * @example\n * ```typescript\n * await eventsService.connectEventSocket();\n *\n * // Socket is now available for transaction updates\n * ```\n */\n async connectEventSocket(bundlerBaseUrl?: string): Promise<TradeEventEmitter> {\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n if (this.globalSocketClient?.isConnected()) {\n return this.globalSocketClient;\n }\n\n const url = bundlerBaseUrl ?? 'https://bundle-backend-prod1.defi.gala.com';\n this.connectionPromise = (async () => {\n const client = new Events.tradeEventEmitterConstructor(url);\n await client.connect();\n\n if (!this.globalWaitHelper) {\n this.globalWaitHelper = new TransactionWaiter();\n }\n\n client.on('transaction', this.internalHandleSocketMessage.bind(this));\n\n return client;\n })();\n\n this.globalSocketClient = await this.connectionPromise;\n this.connectionPromise = undefined;\n this.globalWaitHelper.setEnabled(true);\n\n return this.globalSocketClient;\n }\n\n /**\n * Disconnects the global socket connection and cleans up resources.\n */\n disconnectEventSocket(): void {\n if (this.globalSocketClient) {\n this.globalSocketClient.off('transaction', this.internalHandleSocketMessage.bind(this));\n this.globalSocketClient.disconnect();\n this.globalSocketClient = undefined;\n this.globalWaitHelper.setEnabled(false);\n }\n }\n\n /**\n * Checks if the global socket connection is active.\n * @returns True if connected, false otherwise.\n */\n eventSocketConnected(): boolean {\n return this.globalSocketClient?.isConnected() ?? false;\n }\n\n /**\n * Registers a transaction ID for waiting and timeout handling.\n * @param txId - The transaction ID to register.\n * @param timeoutMs - Timeout in milliseconds.\n */\n registerTxId(txId: string, timeoutMs: number): void {\n this.globalWaitHelper.registerTxId(txId, timeoutMs);\n }\n\n /**\n * Waits for a transaction to complete.\n * @param txId - The transaction ID to wait for.\n * @returns Promise that resolves when the transaction completes.\n */\n async wait(\n txId: string,\n ): Promise<{ txId: string; transactionHash: string; Data: Record<string, unknown> }> {\n if (!this.eventSocketConnected()) {\n throw GSwapSDKError.socketConnectionRequiredError();\n }\n return this.globalWaitHelper.wait(txId);\n }\n\n /**\n * Internal handler for socket messages.\n * @param response - The bundler response.\n * @param txId - The transaction ID.\n */\n private internalHandleSocketMessage(txId: string, response: BundlerResponse): void {\n if (response.status === 'PROCESSED') {\n this.globalWaitHelper.notifySuccess(txId, response.data);\n } else if (response.status === 'FAILED') {\n this.globalWaitHelper.notifyFailure(txId, response.data);\n } else {\n // @ts-expect-error - Property 'status' does not exist on type 'never'.ts(2339)\n debugLog(`Unknown response status for transaction ${txId}:`, response.status);\n }\n }\n}\n","/**\n * @hideconstructor\n * Represents a pending blockchain transaction.\n *\n * Usage: Call `wait()` immediately after receiving the PendingTransaction\n * to ensure proper event handling:\n *```typescript\n * const pendingTx = await gSwap.swap(...);\n * const result = await pendingTx.wait(); // Call immediately - if you delay then the event may be missed\n *```\n */\nexport class PendingTransaction {\n constructor(\n public readonly transactionId: string,\n public readonly message: string,\n public readonly error: boolean,\n private readonly waitDelegate: () => Promise<{\n txId: string;\n transactionHash: string;\n Data: Record<string, unknown>;\n }>,\n ) {}\n\n /**\n * Waits for the transaction to be confirmed.\n * This should be called immediately after receiving the PendingTransaction\n * to ensure proper event handling. If you delay calling this method and the\n * transaction confirms before you call this method, an error will be thrown.\n *\n * @returns A promise that resolves when the transaction is confirmed.\n */\n wait() {\n return this.waitDelegate();\n }\n}\n","import { HttpRequestor } from '../types/http_requestor.js';\nimport { debugLog } from '../utils/debug.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\n\nexport class HttpClient {\n constructor(private readonly httpRequestor: HttpRequestor = fetch) {}\n\n private async sendRequest<TReturnType>(\n method: 'POST' | 'GET',\n baseUrl: string,\n basePath: string,\n endpoint: string,\n body?: unknown,\n ): Promise<TReturnType> {\n const url = `${baseUrl}${basePath}${endpoint}`;\n debugLog(`Sending request to ${url} with body:`, body);\n\n const response = await this.httpRequestor(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'GalaChain-SDK/0.0',\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!response.ok) {\n throw await GSwapSDKError.fromErrorResponse(url, response);\n }\n\n const json = await response.json();\n debugLog(`Response from ${baseUrl}${basePath}${endpoint}:`, json);\n\n return json as TReturnType;\n }\n\n async sendPostRequest<TReturnType>(\n baseUrl: string,\n basePath: string,\n endpoint: string,\n body: unknown,\n ): Promise<TReturnType> {\n return this.sendRequest('POST', baseUrl, basePath, endpoint, body);\n }\n\n async sendGetRequest<TReturnType>(\n baseUrl: string,\n basePath: string,\n endpoint: string,\n params?: Record<string, string>,\n ): Promise<TReturnType> {\n const searchParams = params ? new URLSearchParams(params) : undefined;\n const endpointWithParams = searchParams ? `${endpoint}?${searchParams.toString()}` : endpoint;\n\n return this.sendRequest('GET', baseUrl, basePath, endpointWithParams, undefined);\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { Price, PriceIn, SqrtPrice, SqrtPriceIn } from '../types/amounts.js';\nimport { GetPoolDataRawResponse, GetPoolDataResponse } from '../types/api_responses.js';\nimport { GalaChainTokenClassKey } from '../types/token.js';\nimport { getTokenOrdering, parseTokenClassKey } from '../utils/token.js';\nimport { validateFee, validateNumericAmount, validateTickSpacing } from '../utils/validation.js';\nimport { HttpClient } from './http_client.js';\n\nexport class Pools {\n constructor(\n private readonly gatewayBaseUrl: string,\n private readonly dexContractBasePath: string,\n private readonly httpClient: HttpClient,\n ) {}\n\n /**\n * Gets pool data for a specific token pair and fee tier.\n */\n async getPoolData(\n token0: GalaChainTokenClassKey | string,\n token1: GalaChainTokenClassKey | string,\n fee: number,\n ): Promise<GetPoolDataResponse> {\n validateFee(fee);\n\n const token0Class = parseTokenClassKey(token0);\n const token1Class = parseTokenClassKey(token1);\n const ordering = getTokenOrdering(token0Class, token1Class, false);\n\n const responseBody = await this.httpClient.sendPostRequest<{\n Status: number;\n Data: GetPoolDataRawResponse;\n }>(this.gatewayBaseUrl, this.dexContractBasePath, '/GetPoolData', {\n token0: ordering.token0,\n token1: ordering.token1,\n fee: fee,\n });\n\n const rawData = responseBody.Data;\n\n return {\n bitmap: rawData.bitmap,\n fee: rawData.fee,\n feeGrowthGlobal0: BigNumber(rawData.feeGrowthGlobal0),\n feeGrowthGlobal1: BigNumber(rawData.feeGrowthGlobal1),\n grossPoolLiquidity: BigNumber(rawData.grossPoolLiquidity),\n liquidity: BigNumber(rawData.liquidity),\n maxLiquidityPerTick: BigNumber(rawData.maxLiquidityPerTick),\n protocolFees: rawData.protocolFees,\n protocolFeesToken0: BigNumber(rawData.protocolFeesToken0),\n protocolFeesToken1: BigNumber(rawData.protocolFeesToken1),\n sqrtPrice: BigNumber(rawData.sqrtPrice) as SqrtPrice,\n tickSpacing: rawData.tickSpacing,\n token0: rawData.token0,\n token0ClassKey: rawData.token0ClassKey,\n token1: rawData.token1,\n token1ClassKey: rawData.token1ClassKey,\n };\n }\n\n /**\n * Calculates the nearest valid tick value for a given price.\n */\n calculateTicksForPrice(price: PriceIn, tickSpacing: number): number {\n validateNumericAmount(price, 'price', true);\n validateTickSpacing(tickSpacing);\n\n const priceNumber = BigNumber(price).toNumber();\n\n if (priceNumber === 0) {\n return -886800;\n }\n\n if (priceNumber === Infinity) {\n return 886800;\n }\n\n const uncoercedTicks = Math.round(Math.log(priceNumber) / Math.log(1.0001));\n const ticks = Math.floor(uncoercedTicks / tickSpacing) * tickSpacing;\n\n return Math.min(Math.max(ticks, -886800), 886800);\n }\n\n calculatePriceForTicks(tick: number): Price {\n if (tick === -886800) {\n return BigNumber('0') as Price;\n } else if (tick === 886800) {\n return BigNumber(Infinity) as Price;\n } else {\n const price = Math.pow(1.0001, tick);\n return BigNumber(price) as Price;\n }\n }\n\n /**\n * Calculates the current spot price of a pool based on sqrt price.\n * Price is defined as the amount of outToken you would receive for 1 inToken.\n */\n calculateSpotPrice(\n inToken: GalaChainTokenClassKey | string,\n outToken: GalaChainTokenClassKey | string,\n poolSqrtPrice: SqrtPriceIn,\n ): BigNumber {\n validateNumericAmount(poolSqrtPrice, 'poolSqrtPrice');\n\n const ordering = getTokenOrdering(inToken, outToken, false);\n const poolPrice = BigNumber(poolSqrtPrice).pow(2);\n\n if (ordering.zeroForOne) {\n return poolPrice;\n } else {\n return BigNumber(1).div(poolPrice);\n }\n }\n}\n","import { GSwapSDKError } from '../classes/gswap_sdk_error.js';\nimport { GalaChainTokenClassKey } from '../types/token.js';\n\nexport function stringifyTokenClassKey(\n tokenClassKey: GalaChainTokenClassKey | string,\n separator = '|',\n): string {\n if (typeof tokenClassKey === 'string') {\n return tokenClassKey;\n }\n\n return `${tokenClassKey.collection}${separator}${tokenClassKey.category}${separator}${tokenClassKey.type}${separator}${tokenClassKey.additionalKey}`;\n}\n\nexport function parseTokenClassKey(\n tokenClassKey: string | GalaChainTokenClassKey,\n): GalaChainTokenClassKey {\n if (typeof tokenClassKey === 'object') {\n return {\n collection: tokenClassKey.collection,\n category: tokenClassKey.category,\n type: tokenClassKey.type,\n additionalKey: tokenClassKey.additionalKey,\n };\n }\n\n const [collection, category, type, additionalKey] = tokenClassKey.split('|');\n\n if (!collection || !category || !type || !additionalKey) {\n throw new GSwapSDKError(`Invalid token class key`, 'INVALID_TOKEN_CLASS_KEY', {\n tokenClassKey,\n });\n }\n\n return {\n collection,\n category,\n type,\n additionalKey,\n };\n}\n\nexport function compareTokens(\n first: GalaChainTokenClassKey | string,\n second: GalaChainTokenClassKey | string,\n) {\n return stringifyTokenClassKey(first).localeCompare(stringifyTokenClassKey(second));\n}\n\nexport function getTokenOrdering<TAttributesType = undefined>(\n first: GalaChainTokenClassKey | string,\n second: GalaChainTokenClassKey | string,\n assertCorrectness: boolean,\n token1Data?: TAttributesType,\n token2Data?: TAttributesType,\n) {\n const zeroForOne = compareTokens(first, second) < 0;\n\n if (zeroForOne) {\n return {\n token0: first,\n token1: second,\n zeroForOne,\n token0Attributes: token1Data,\n token1Attributes: token2Data,\n };\n } else {\n if (assertCorrectness) {\n throw GSwapSDKError.incorrectTokenOrderingError(first, second);\n }\n\n return {\n token0: second,\n token1: first,\n zeroForOne,\n token0Attributes: token2Data,\n token1Attributes: token1Data,\n };\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { NumericAmount, PriceIn } from '../types/amounts.js';\nimport { FEE_TIER } from '../types/fees.js';\nimport type { GetPositionResult, GetUserPositionsResult } from '../types/sdk_results.js';\nimport type { GalaChainTokenClassKey } from '../types/token.js';\nimport { getTokenOrdering, parseTokenClassKey, stringifyTokenClassKey } from '../utils/token.js';\nimport {\n validateFee,\n validateNumericAmount,\n validatePriceValues,\n validateTickRange,\n validateTickSpacing,\n validateTokenDecimals,\n validateWalletAddress,\n} from '../utils/validation.js';\nimport { Bundler } from './bundler.js';\nimport { HttpClient } from './http_client.js';\nimport { Pools } from './pools.js';\n\n/**\n * Handles position management operations for liquidity positions.\n */\nexport class Positions {\n private readonly httpClient: HttpClient;\n private readonly bundlerService: Bundler;\n private readonly poolService: Pools;\n\n constructor(\n private readonly gatewayBaseUrl: string,\n private readonly dexContractBasePath: string,\n bundlerService: Bundler,\n poolService: Pools,\n httpClient: HttpClient,\n private readonly options?: {\n walletAddress?: string | undefined; // Optional default wallet address for operations\n },\n ) {\n this.httpClient = httpClient;\n this.bundlerService = bundlerService;\n this.poolService = poolService;\n }\n\n /**\n * Get all liquidity positions for a specific wallet address.\n * @param ownerAddress - The wallet address to get positions for.\n * @param limit - Maximum number of positions to return.\n * @param bookmark - Pagination bookmark for retrieving additional results. If you call this function and it returns a bookmark that is not an empty string, you can pass that bookmark as this parameter in a subsequent call to fetch the next page.\n * @returns User positions and pagination bookmark\n * @example\n * ```typescript\n * const positions = await gSwap.positions.getUserPositions('eth|123...abc');\n * console.log(positions);\n * ```\n */\n async getUserPositions(ownerAddress: string, limit?: number, bookmark?: string) {\n const results = await this.sendUserPositionsRequest('/GetUserPositions', {\n user: ownerAddress,\n limit,\n bookmark,\n });\n\n return {\n bookmark: results.nextBookMark,\n positions: results.positions,\n };\n }\n\n /**\n * Gets detailed information about a specific liquidity position.\n * @param ownerAddress - The wallet address that owns the position.\n * @param position - Position parameters including tokens, fee, and tick range.\n * @param position.token0ClassKey - The first token in the position.\n * @param position.token1ClassKey - The second token in the position.\n * @param position.fee - The pool fee tier.\n * @param position.tickLower - The lower tick of the position range.\n * @param position.tickUpper - The upper tick of the position range.\n * @returns Detailed position information.\n * @example\n * ```typescript\n * const position = await gSwap.positions.getPosition('eth|123...abc', {\n * token0ClassKey: 'GALA|Unit|none|none',\n * token1ClassKey: 'GUSDC|Unit|none|none',\n * fee: 500,\n * tickLower: -6000,\n * tickUpper: 6000\n * });\n * console.log('Position:', position);\n * ```\n */\n async getPosition(\n ownerAddress: string,\n position: {\n token0ClassKey: GalaChainTokenClassKey | string;\n token1ClassKey: GalaChainTokenClassKey | string;\n fee: number;\n tickLower: number;\n tickUpper: number;\n },\n ) {\n const result = await this.sendPositionRequest('/GetPositions', {\n owner: ownerAddress,\n token0: parseTokenClassKey(position.token0ClassKey),\n token1: parseTokenClassKey(position.token1ClassKey),\n fee: position.fee,\n tickLower: position.tickLower,\n tickUpper: position.tickUpper,\n });\n\n return result;\n }\n\n /**\n * Estimates the token amounts that would be received from removing liquidity from a position.\n * @param args - Parameters for estimating liquidity removal.\n * @param args.ownerAddress - The wallet address that owns the position.\n * @param args.positionId - The position identifier.\n * @param args.token0 - The first token in the pair.\n * @param args.token1 - The second token in the pair.\n * @param args.fee - The pool fee tier.\n * @param args.tickLower - The lower tick of the position range.\n * @param args.tickUpper - The upper tick of the position range.\n * @param args.amount - The amount of liquidity to remove.\n * @returns Estimated token amounts that would be received.\n * @example\n * ```typescript\n * const estimation = await gSwap.positions.estimateRemoveLiquidity({\n * ownerAddress: 'client|635f048ab243d7eb7f5ba044',\n * positionId: '210f8e4dd1bbe1b4af4b977330ee7e4b68bc716f66e39c87a60fff0976ded3ea',\n * token0: 'GALA|Unit|none|none',\n * token1: 'GUSDT|Unit|none|none',\n * fee: 3000,\n * tickLower: -41100,\n * tickUpper: -40080,\n * amount: '1491.973332758921980256'\n * });\n * console.log('Estimated tokens:', estimation);\n * ```\n */\n async estimateRemoveLiquidity(args: {\n ownerAddress: string;\n positionId: string;\n token0: GalaChainTokenClassKey | string;\n token1: GalaChainTokenClassKey | string;\n fee: number;\n tickLower: number;\n tickUpper: number;\n amount: NumericAmount;\n }) {\n validateWalletAddress(args.ownerAddress);\n validateFee(args.fee);\n validateTickRange(args.tickLower, args.tickUpper);\n validateNumericAmount(args.amount, 'amount');\n\n const token0TokenClassKey = parseTokenClassKey(args.token0);\n const token1TokenClassKey = parseTokenClassKey(args.token1);\n\n const ordering = getTokenOrdering(token0TokenClassKey, token1TokenClassKey, false);\n\n const responseBody = await this.httpClient.sendPostRequest<{\n Status: number;\n Data: {\n amount0: string;\n amount1: string;\n };\n }>(this.gatewayBaseUrl, this.dexContractBasePath, '/GetRemoveLiquidityEstimation', {\n tickLower: args.tickLower,\n tickUpper: args.tickUpper,\n amount: BigNumber(args.amount).toFixed(),\n token0: ordering.token0,\n token1: ordering.token1,\n fee: args.fee,\n owner: args.ownerAddress,\n positionId: args.positionId,\n });\n\n return {\n amount0: BigNumber(responseBody.Data.amount0),\n amount1: BigNumber(responseBody.Data.amount1),\n };\n }\n\n /**\n * Gets detailed information about a liquidity position by its ID.\n * @param ownerAddress - The wallet address that owns the position.\n * @param positionId - The unique identifier of the position.\n * @returns Detailed position information, or undefined if not found.\n * @example\n * ```typescript\n * const position = await gSwap.positions.getPositionById('eth|123...abc', 'position-uuid-123');\n * if (position) {\n * console.log('Position found:', position);\n * } else {\n * console.log('Position not found');\n * }\n * ```\n */\n async getPositionById(ownerAddress: string, positionId: string) {\n const userPositions = await this.getUserPositions(ownerAddress);\n const position = userPositions.positions.find((pos) => pos.positionId === positionId);\n if (!position) {\n return undefined;\n }\n\n return this.getPosition(ownerAddress, position);\n }\n\n /**\n * Creates a new position or adds liquidity to a position, using a specific tick range. Consider using `addLiquidityByPrice()` instead unless you want to use ticks directly.\n * @param args - Parameters for adding liquidity.\n * @param args.walletAddress - The wallet address adding liquidity.\n * @param args.positionId - The position identifier. If you're creating a new position, this should be an empty string.\n * @param args.token0 - The first token in the pair.\n * @param args.token1 - The second token in the pair.\n * @param args.fee - The pool fee tier.\n * @param args.tickLower - The lower tick of the position range.\n * @param args.tickUpper - The upper tick of the position range.\n * @param args.amount0Desired - Desired (also maximum) amount of token0 to add.\n * @param args.amount1Desired - Desired (also maximum) amount of token1 to add.\n * @param args.amount0Min - Minimum amount of token0 to add (slippage protection).\n * @param args.amount1Min - Minimum amount of token1 to add (slippage protection).\n * @returns Pending transaction.\n * @example\n * ```typescript\n * const result = await gSwap.positions.addLiquidityByTicks({\n * walletAddress: 'eth|123...abc',\n * positionId: '',\n * token0: 'GALA|Unit|none|none',\n * token1: 'GUSDC|Unit|none|none',\n * fee: 500,\n * tickSpacing: 10,\n * tickLower: -6000,\n * tickUpper: 6000,\n * amount0Desired: '100',\n * amount1Desired: '50',\n * amount0Min: '95',\n * amount1Min: '47.5'\n * });\n * console.log('Liquidity added:', result);\n * ```\n */\n async addLiquidityByTicks(args: {\n walletAddress?: string;\n positionId: string;\n token0: GalaChainTokenClassKey | string;\n token1: GalaChainTokenClassKey | string;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n amount0Desired: NumericAmount;\n amount1Desired: NumericAmount;\n amount0Min: NumericAmount;\n amount1Min: NumericAmount;\n }) {\n const walletAddress = args.walletAddress ?? this.options?.walletAddress;\n\n validateWalletAddress(walletAddress);\n validateFee(args.fee);\n validateTickRange(args.tickLower, args.tickUpper);\n validateNumericAmount(args.amount0Desired, 'amount0Desired', true);\n validateNumericAmount(args.amount1Desired, 'amount1Desired', true);\n validateNumericAmount(args.amount0Min, 'amount0Min', true);\n validateNumericAmount(args.amount1Min, 'amount1Min', true);\n\n const token0TokenClassKey = parseTokenClassKey(args.token0);\n const token1TokenClassKey = parseTokenClassKey(args.token1);\n\n const ordering = getTokenOrdering(\n token0TokenClassKey,\n token1TokenClassKey,\n true,\n [args.amount0Desired, args.amount0Min],\n [args.amount1Desired, args.amount1Min],\n );\n\n const toSign = {\n token0: ordering.token0,\n token1: ordering.token1,\n fee: args.fee,\n owner: args.walletAddress,\n tickLower: args.tickLower,\n tickUpper: args.tickUpper,\n amount0Desired: BigNumber(ordering!.token0Attributes![0]!).toFixed(),\n amount1Desired: BigNumber(ordering!.token1Attributes![0]!).toFixed(),\n amount0Min: BigNumber(ordering!.token0Attributes![1]!).toFixed(),\n amount1Min: BigNumber(ordering!.token1Attributes![1]!).toFixed(),\n positionId: args.positionId,\n liquidityProvider: args.walletAddress,\n };\n\n const token0StringKey = stringifyTokenClassKey(ordering.token0, '$');\n const token1StringKey = stringifyTokenClassKey(ordering.token1, '$');\n\n const poolString = `$pool$${token0StringKey}$${token1StringKey}$${args.fee}`;\n const userPositionString = `$userPosition$${args.walletAddress}`;\n const tokenBalance0 = `$tokenBalance$${token0StringKey}$${args.walletAddress}`;\n const tokenBalance1 = `$tokenBalance$${token1StringKey}$${args.walletAddress}`;\n const tokenBalance0Pool = `$tokenBalance$${token0StringKey}$${poolString}`;\n const tokenBalance1Pool = `$tokenBalance$${token1StringKey}$${poolString}`;\n\n const stringsInstructions = [\n poolString,\n userPositionString,\n tokenBalance0,\n tokenBalance1,\n tokenBalance0Pool,\n tokenBalance1Pool,\n ];\n\n return this.bundlerService.sendBundlerRequest('AddLiquidity', toSign, stringsInstructions);\n }\n\n /**\n * Creates a new position or adds liquidity to a position, using a specified price range. Note that this method automatically converts your minPrice and maxPrice to ticks, rounding down if necessary.\n * @param args - Parameters for adding liquidity.\n * @param args.walletAddress - The wallet address adding liquidity.\n * @param args.positionId - The position identifier. This should be an empty string if you are creating a new position.\n * @param args.token0 - The first token in the pair.\n * @param args.token1 - The second token in the pair.\n * @param args.fee - The pool fee tier.\n * @param args.tickSpacing - The tick spacing for the pool.\n * @param args.minPrice - The minimum price for the position range.\n * @param args.maxPrice - The maximum price for the position range.\n * @param args.amount0Desired - Desired (also maximum) amount of token0 to add.\n * @param args.amount1Desired - Desired (also maximum) amount of token1 to add.\n * @param args.amount0Min - Minimum amount of token0 to add (slippage protection).\n * @param args.amount1Min - Minimum amount of token1 to add (slippage protection).\n * @returns Pending transaction.\n * @example\n * ```typescript\n * const result = await gSwap.positions.addLiquidityByPrice({\n * walletAddress: 'eth|123...abc',\n * positionId: '',\n * token0: 'GALA|Unit|none|none',\n * token1: 'GUSDC|Unit|none|none',\n * fee: 500,\n * tickSpacing: 10,\n * minPrice: '0.45',\n * maxPrice: '0.55',\n * amount0Desired: '100',\n * amount1Desired: '50',\n * amount0Min: '95',\n * amount1Min: '47.5'\n * });\n * console.log('Liquidity added with price range:', result);\n * ```\n */\n async addLiquidityByPrice(args: {\n walletAddress?: string;\n positionId: string;\n token0: GalaChainTokenClassKey | string;\n token1: GalaChainTokenClassKey | string;\n fee: number;\n tickSpacing: number;\n minPrice: PriceIn;\n maxPrice: PriceIn;\n amount0Desired: NumericAmount;\n amount1Desired: NumericAmount;\n amount0Min: NumericAmount;\n amount1Min: NumericAmount;\n }) {\n const walletAddress = args.walletAddress ?? this.options?.walletAddress;\n\n validateWalletAddress(walletAddress);\n validateFee(args.fee);\n validateTickSpacing(args.tickSpacing);\n validateNumericAmount(args.minPrice, 'minPrice', true);\n validateNumericAmount(args.maxPrice, 'maxPrice');\n validateNumericAmount(args.amount0Desired, 'amount0Desired', true);\n validateNumericAmount(args.amount1Desired, 'amount1Desired', true);\n validateNumericAmount(args.amount0Min, 'amount0Min', true);\n validateNumericAmount(args.amount1Min, 'amount1Min', true);\n\n if (BigNumber(args.minPrice).isGreaterThan(BigNumber(args.maxPrice))) {\n throw new Error('Invalid price range: minPrice must be less than or equal to maxPrice');\n }\n\n const token0TokenClassKey = parseTokenClassKey(args.token0);\n const token1TokenClassKey = parseTokenClassKey(args.token1);\n\n const ordering = getTokenOrdering(\n token0TokenClassKey,\n token1TokenClassKey,\n true,\n [args.amount0Desired, args.amount0Min],\n [args.amount1Desired, args.amount1Min],\n );\n\n const minPriceTicks = this.poolService.calculateTicksForPrice(args.minPrice, args.tickSpacing);\n const maxPriceTicks = this.poolService.calculateTicksForPrice(args.maxPrice, args.tickSpacing);\n\n const tickLower = ordering.zeroForOne ? minPriceTicks : maxPriceTicks * -1;\n const tickUpper = ordering.zeroForOne ? maxPriceTicks : minPriceTicks * -1;\n\n const toSign = {\n token0: ordering.token0,\n token1: ordering.token1,\n fee: args.fee,\n owner: args.walletAddress,\n tickLower,\n tickUpper,\n amount0Desired: ordering?.token0Attributes?.[0],\n amount1Desired: ordering?.token1Attributes?.[0],\n amount0Min: ordering?.token0Attributes?.[1],\n amount1Min: ordering?.token1Attributes?.[1],\n positionId: args.positionId,\n };\n\n const token0StringKey = stringifyTokenClassKey(ordering.token0, '$');\n const token1StringKey = stringifyTokenClassKey(ordering.token1, '$');\n\n const poolString = `$pool$${token0StringKey}$${token1StringKey}$${args.fee}`;\n const userPositionString = `$userPosition$${args.walletAddress}`;\n const tokenBalance0 = `$tokenBalance$${token0StringKey}$${args.walletAddress}`;\n const tokenBalance1 = `$tokenBalance$${token1StringKey}$${args.walletAddress}`;\n const tokenBalance0Pool = `$tokenBalance$${token0StringKey}$${poolString}`;\n const tokenBalance1Pool = `$tokenBalance$${token1StringKey}$${poolString}`;\n\n const stringsInstructions = [\n poolString,\n userPositionString,\n tokenBalance0,\n tokenBalance1,\n tokenBalance0Pool,\n tokenBalance1Pool,\n ];\n\n return this.bundlerService.sendBundlerRequest('AddLiquidity', toSign, stringsInstructions);\n }\n\n /**\n * Removes liquidity from a position.\n * @param args - Parameters for removing liquidity.\n * @param args.walletAddress - The wallet address removing liquidity.\n * @param args.positionId - The position identifier.\n * @param args.token0 - The first token in the pair.\n * @param args.token1 - The second token in the pair.\n * @param args.fee - The pool fee tier.\n * @param args.tickLower - The lower tick of the position range.\n * @param args.tickUpper - The upper tick of the position range.\n * @param args.amount - The amount of liquidity to remove.\n * @param args.amount0Min - Minimum amount of token0 to receive (slippage protection, optional).\n * @param args.amount1Min - Minimum amount of token1 to receive (slippage protection, optional).\n * @returns Pending transaction.\n * @example\n * ```typescript\n * // Remove 50% of liquidity from a position\n * const result = await gSwap.positions.removeLiquidity({\n * walletAddress: 'eth|123...abc',\n * positionId: 'position-123',\n * token0: 'GALA|Unit|none|none',\n * token1: 'GUSDC|Unit|none|none',\n * fee: 500,\n * tickLower: -6000,\n * tickUpper: 6000,\n * amount: '50000000000000000000', // 50% of position liquidity\n * amount0Min: '45',\n * amount1Min: '22'\n * });\n * console.log('Liquidity removed:', result);\n * ```\n */\n async removeLiquidity(args: {\n walletAddress?: string;\n positionId: string;\n token0: GalaChainTokenClassKey | string;\n token1: GalaChainTokenClassKey | string;\n fee: number;\n tickLower: number;\n tickUpper: number;\n amount: NumericAmount;\n amount0Min?: NumericAmount;\n amount1Min?: NumericAmount;\n }) {\n const walletAddress = args.walletAddress ?? this.options?.walletAddress;\n\n validateWalletAddress(walletAddress);\n validateFee(args.fee);\n validateTickRange(args.tickLower, args.tickUpper);\n validateNumericAmount(args.amount, 'amount');\n\n if (args.amount0Min !== undefined) {\n validateNumericAmount(args.amount0Min, 'amount0Min', true);\n }\n if (args.amount1Min !== undefined) {\n validateNumericAmount(args.amount1Min, 'amount1Min', true);\n }\n\n const token0TokenClassKey = parseTokenClassKey(args.token0);\n const token1TokenClassKey = parseTokenClassKey(args.token1);\n\n const ordering = getTokenOrdering(\n token0TokenClassKey,\n token1TokenClassKey,\n true,\n [args.amount0Min ?? 0],\n [args.amount1Min ?? 0],\n );\n\n const toSign = {\n token0: ordering.token0,\n token1: ordering.token1,\n fee: args.fee,\n tickLower: args.tickLower,\n tickUpper: args.tickUpper,\n amount: BigNumber(args.amount).toFixed(),\n amount0Min: ordering?.token0Attributes?.[0] || '0',\n amount1Min: ordering?.token1Attributes?.[0] || '0',\n positionId: args.positionId,\n recipient: args.walletAddress,\n };\n\n const token0StringKey = stringifyTokenClassKey(ordering.token0, '$');\n const token1StringKey = stringifyTokenClassKey(ordering.token1, '$');\n\n const poolString = `$pool$${token0StringKey}$${token1StringKey}$${args.fee}`;\n const userPositionString = `$userPosition$${args.walletAddress}`;\n const tokenBalance0 = `$tokenBalance$${token0StringKey}$${args.walletAddress}`;\n const tokenBalance1 = `$tokenBalance$${token1StringKey}$${args.walletAddress}`;\n const tokenBalance0Pool = `$tokenBalance$${token0StringKey}$${poolString}`;\n const tokenBalance1Pool = `$tokenBalance$${token1StringKey}$${poolString}`;\n\n const stringsInstructions = [\n poolString,\n userPositionString,\n tokenBalance0,\n tokenBalance1,\n tokenBalance0Pool,\n tokenBalance1Pool,\n ];\n\n return this.bundlerService.sendBundlerRequest('RemoveLiquidity', toSign, stringsInstructions);\n }\n\n /**\n * Collects accumulated fees from a liquidity position.\n * @param args - Parameters for collecting fees.\n * @param args.walletAddress - The wallet address collecting fees.\n * @param args.positionId - The position identifier.\n * @param args.token0 - The first token in the pair.\n * @param args.token1 - The second token in the pair.\n * @param args.fee - The pool fee tier.\n * @param args.tickLower - The lower tick of the position range.\n * @param args.tickUpper - The upper tick of the position range.\n * @param args.amount0Requested - Desired amount of token0 fees to collect.\n * @param args.amount1Requested - Desired amount of token1 fees to collect.\n * @returns Pending transaction.\n * @example\n * ```typescript\n * // Collect all accumulated fees from a position\n * const result = await gSwap.positions.collectPositionFees({\n * walletAddress: 'eth|123...abc',\n * positionId: 'position-123',\n * token0: 'GALA|Unit|none|none',\n * token1: 'GUSDC|Unit|none|none',\n * fee: 500,\n * tickLower: -6000,\n * tickUpper: 6000,\n * amount0Requested: '1000000000000000000', // Max fees available\n * amount1Requested: '500000000' // Max fees available\n * });\n * console.log('Fees collected:', result);\n * ```\n */\n async collectPositionFees(args: {\n walletAddress?: string;\n positionId: string;\n token0: GalaChainTokenClassKey | string;\n token1: GalaChainTokenClassKey | string;\n fee: number;\n tickLower: number;\n tickUpper: number;\n amount0Requested: NumericAmount;\n amount1Requested: NumericAmount;\n }) {\n const walletAddress = args.walletAddress ?? this.options?.walletAddress;\n\n validateWalletAddress(walletAddress);\n validateFee(args.fee);\n validateTickRange(args.tickLower, args.tickUpper);\n validateNumericAmount(args.amount0Requested, 'amount0Requested', true);\n validateNumericAmount(args.amount1Requested, 'amount1Requested', true);\n\n const token0TokenClassKey = parseTokenClassKey(args.token0);\n const token1TokenClassKey = parseTokenClassKey(args.token1);\n\n const ordering = getTokenOrdering(\n token0TokenClassKey,\n token1TokenClassKey,\n true,\n [args.amount0Requested],\n [args.amount1Requested],\n );\n\n const toSign = {\n token0: ordering.token0,\n token1: ordering.token1,\n fee: args.fee,\n amount0Requested: BigNumber(ordering!.token0Attributes![0]!).toFixed(),\n amount1Requested: BigNumber(ordering!.token1Attributes![0]!).toFixed(),\n tickLower: args.tickLower,\n tickUpper: args.tickUpper,\n positionId: args.positionId,\n recipient: args.walletAddress,\n };\n\n const token0StringKey = stringifyTokenClassKey(ordering.token0, '$');\n const token1StringKey = stringifyTokenClassKey(ordering.token1, '$');\n\n const poolString = `$pool$${token0StringKey}$${token1StringKey}$${args.fee}`;\n const userPositionString = `$userPosition$${args.walletAddress}`;\n const tokenBalance0 = `$tokenBalance$${token0StringKey}$${args.walletAddress}`;\n const tokenBalance1 = `$tokenBalance$${token1StringKey}$${args.walletAddress}`;\n const tokenBalance0Pool = `$tokenBalance$${token0StringKey}$${poolString}`;\n const tokenBalance1Pool = `$tokenBalance$${token1StringKey}$${poolString}`;\n\n const stringsInstructions = [\n poolString,\n userPositionString,\n tokenBalance0,\n tokenBalance1,\n tokenBalance0Pool,\n tokenBalance1Pool,\n ];\n\n return this.bundlerService.sendBundlerRequest(\n 'CollectPositionFees',\n toSign,\n stringsInstructions,\n );\n }\n\n public calculateOptimalPositionSize(\n tokenAmount: NumericAmount,\n spotPrice: NumericAmount,\n lowerPrice: NumericAmount,\n upperPrice: NumericAmount,\n tokenDecimals: number,\n otherTokenDecimals: number,\n ) {\n validateNumericAmount(tokenAmount, 'tokenAmount');\n validatePriceValues(spotPrice, lowerPrice, upperPrice);\n validateTokenDecimals(tokenDecimals, 'tokenDecimals');\n validateTokenDecimals(otherTokenDecimals, 'otherTokenDecimals');\n\n const bnTokenAmount = BigNumber(tokenAmount);\n const bnSpotPrice = BigNumber(spotPrice);\n const bnLowerPrice = BigNumber(lowerPrice);\n let bnUpperPrice = BigNumber(upperPrice);\n\n bnUpperPrice = bnUpperPrice.isFinite() ? bnUpperPrice : BigNumber(1e18);\n\n const liquidityAmount = bnTokenAmount\n .times(10 ** (tokenDecimals - otherTokenDecimals))\n .times(bnSpotPrice.sqrt())\n .times(bnUpperPrice.sqrt())\n .div(bnUpperPrice.sqrt().minus(bnSpotPrice.sqrt()));\n\n const yAmount = BigNumber(liquidityAmount).times(bnSpotPrice.sqrt().minus(bnLowerPrice.sqrt()));\n const untruncated = yAmount.div(BigNumber(10).pow(tokenDecimals - otherTokenDecimals));\n\n return BigNumber.max(\n BigNumber(untruncated.toFixed(otherTokenDecimals, BigNumber.ROUND_DOWN)),\n 0,\n );\n }\n\n private async sendUserPositionsRequest(\n endpoint: string,\n body: unknown,\n ): Promise<{\n nextBookMark: string;\n positions: GetUserPositionsResult[];\n }> {\n const responseBody = await this.httpClient.sendPostRequest<{\n Status: number;\n Data: {\n nextBookMark: string;\n positions: Array<{\n poolHash: string;\n positionId: string;\n token0ClassKey: {\n additionalKey: string;\n category: string;\n collection: string;\n type: string;\n };\n token1ClassKey: {\n additionalKey: string;\n category: string;\n collection: string;\n type: string;\n };\n token0Img: string;\n token1Img: string;\n token0Symbol: string;\n token1Symbol: string;\n fee: number;\n liquidity: string;\n tickLower: number;\n tickUpper: number;\n createdAt: string;\n }>;\n };\n }>(this.gatewayBaseUrl, this.dexContractBasePath, endpoint, body);\n\n // Convert string fields to BigNumber\n return {\n nextBookMark: responseBody.Data.nextBookMark,\n positions: responseBody.Data.positions.map((position) => ({\n ...position,\n liquidity: BigNumber(position.liquidity),\n })),\n };\n }\n\n private async sendPositionRequest(endpoint: string, body: unknown): Promise<GetPositionResult> {\n const responseBody = await this.httpClient.sendPostRequest<{\n Status: number;\n Data: {\n fee: number;\n feeGrowthInside0Last: string;\n feeGrowthInside1Last: string;\n liquidity: string;\n poolHash: string;\n positionId: string;\n tickLower: number;\n tickUpper: number;\n token0ClassKey: {\n additionalKey: string;\n category: string;\n collection: string;\n type: string;\n };\n token1ClassKey: {\n additionalKey: string;\n category: string;\n collection: string;\n type: string;\n };\n tokensOwed0: string;\n tokensOwed1: string;\n };\n }>(this.gatewayBaseUrl, this.dexContractBasePath, endpoint, body);\n\n // Convert string fields to BigNumber\n return {\n ...responseBody.Data,\n feeGrowthInside0Last: BigNumber(responseBody.Data.feeGrowthInside0Last),\n feeGrowthInside1Last: BigNumber(responseBody.Data.feeGrowthInside1Last),\n liquidity: BigNumber(responseBody.Data.liquidity),\n tokensOwed0: BigNumber(responseBody.Data.tokensOwed0),\n tokensOwed1: BigNumber(responseBody.Data.tokensOwed1),\n };\n }\n}\n","import BigNumber from 'bignumber.js';\nimport { NumericAmount, Price, SqrtPrice } from '../types/amounts.js';\nimport type {\n QuoteExactAmountRawResponse,\n QuoteExactAmountResponse,\n} from '../types/api_responses.js';\nimport { FEE_TIER } from '../types/fees.js';\nimport type { GetQuoteResult } from '../types/sdk_results.js';\nimport type { GalaChainTokenClassKey } from '../types/token.js';\nimport { getTokenOrdering, parseTokenClassKey } from '../utils/token.js';\nimport { validateNumericAmount } from '../utils/validation.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport { HttpClient } from './http_client.js';\n\n/**\n * Handles quote operations for token swaps.\n */\nexport class Quoting {\n private readonly httpClient: HttpClient;\n\n constructor(\n private readonly gatewayBaseUrl: string,\n private readonly dexContractBasePath: string,\n httpClient?: HttpClient,\n ) {\n this.httpClient = httpClient ?? new HttpClient();\n }\n\n /**\n * Gets a quote for an exact amount of token being sold.\n * @param tokenIn - The input token to sell.\n * @param tokenOut - The output token to buy.\n * @param amountIn - The exact amount of input tokens you want to sell.\n * @param fee - The pool fee tier. If not specified, will check all available fee tiers and return the best quote.\n * @returns The expected number of tokens you will receive (buy) when/if you execute the swap.\n */\n async quoteExactInput(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n amountIn: NumericAmount,\n fee?: FEE_TIER,\n ): Promise<GetQuoteResult> {\n validateNumericAmount(amountIn, 'amountIn');\n\n if (fee !== undefined) {\n // Get quote from specific fee tier\n const result = await this.getSingleQuoteExactInput(tokenIn, tokenOut, fee, amountIn);\n return result;\n }\n\n // Get quotes from all fee tiers and return the best one\n const allFees = [FEE_TIER.PERCENT_00_05, FEE_TIER.PERCENT_00_30, FEE_TIER.PERCENT_01_00];\n\n const quotePromises = allFees.map(async (feeTier) => {\n try {\n return await this.getSingleQuoteExactInput(tokenIn, tokenOut, feeTier, amountIn);\n } catch (err) {\n if (\n err instanceof GSwapSDKError &&\n (err.code === 'CONFLICT' || err.code === 'OBJECT_NOT_FOUND')\n ) {\n // Ignore this error, it means no pool was found for this fee tier, or there's not enough liquidity\n return undefined;\n }\n\n throw err;\n }\n });\n\n const results = await Promise.all(quotePromises);\n const quotes = results.filter((quote): quote is GetQuoteResult => quote !== undefined);\n\n if (quotes.length === 0) {\n throw GSwapSDKError.noPoolAvailableError(tokenIn, tokenOut);\n }\n\n // Return the quote with the highest output amount\n return quotes.reduce((best, current) =>\n current.outTokenAmount.isGreaterThan(best.outTokenAmount) ? current : best,\n );\n }\n\n /**\n * Gets a quote for an exact amount of tokens being bought.\n * @param tokenIn - The input token sell.\n * @param tokenOut - The output token to buy.\n * @param amountOut - The exact amount of output tokens you want to buy.\n * @param fee - The pool fee tier. If not specified, will check all available fee tiers and return the best quote.\n * @returns The expected number of tokens you will need to sell (input) to receive the specified amount of output tokens.\n */\n async quoteExactOutput(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n amountOut: string | number | BigNumber,\n fee?: FEE_TIER,\n ): Promise<GetQuoteResult> {\n validateNumericAmount(amountOut, 'amountOut');\n\n if (fee !== undefined) {\n // Get quote from specific fee tier\n const result = await this.getSingleQuoteExactOutput(tokenIn, tokenOut, amountOut, fee);\n return result;\n }\n\n // Get quotes from all fee tiers and return the best one\n const allFees = [FEE_TIER.PERCENT_00_05, FEE_TIER.PERCENT_00_30, FEE_TIER.PERCENT_01_00];\n\n const quotePromises = allFees.map(async (feeTier) => {\n try {\n return await this.getSingleQuoteExactOutput(tokenIn, tokenOut, amountOut, feeTier);\n } catch (err) {\n if (\n err instanceof GSwapSDKError &&\n (err.code === 'CONFLICT' || err.code === 'OBJECT_NOT_FOUND')\n ) {\n // Ignore this error, it means no pool was found for this fee tier, or there's not enough liquidity\n return undefined;\n }\n\n throw err;\n }\n });\n\n const results = await Promise.all(quotePromises);\n const quotes = results.filter((quote): quote is GetQuoteResult => quote !== undefined);\n\n if (quotes.length === 0) {\n throw GSwapSDKError.noPoolAvailableError(tokenIn, tokenOut);\n }\n\n // Return the quote with the lowest input amount (least tokens needed to sell)\n return quotes.reduce((best, current) =>\n current.inTokenAmount.isLessThan(best.inTokenAmount) ? current : best,\n );\n }\n\n private async getSingleQuote(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n fee: FEE_TIER,\n amount: NumericAmount,\n isExactInput: boolean,\n ): Promise<GetQuoteResult> {\n const tokenInClass = parseTokenClassKey(tokenIn);\n const tokenOutClass = parseTokenClassKey(tokenOut);\n const ordering = getTokenOrdering(tokenInClass, tokenOutClass, false);\n\n // Format amount based on quote type\n const formattedAmount = isExactInput\n ? BigNumber(amount).toFixed()\n : BigNumber(amount).multipliedBy(-1).toFixed();\n\n const response = await this.sendQuoteRequest('/QuoteExactAmount', {\n ...ordering,\n fee: fee,\n amount: formattedAmount,\n });\n\n const tokenInAmount = ordering.zeroForOne ? response.amount0 : response.amount1;\n const tokenOutAmount = ordering.zeroForOne ? response.amount1 : response.amount0;\n\n let currentPrice = response.currentSqrtPrice.pow(2) as Price;\n let newPrice = response.newSqrtPrice.pow(2) as Price;\n\n if (!ordering.zeroForOne) {\n currentPrice = BigNumber(1).dividedBy(currentPrice) as Price;\n newPrice = BigNumber(1).dividedBy(newPrice) as Price;\n }\n\n const priceImpact = newPrice.minus(currentPrice).dividedBy(currentPrice);\n\n return {\n amount0: response.amount0,\n amount1: response.amount1,\n currentPoolSqrtPrice: response.currentSqrtPrice,\n newPoolSqrtPrice: response.newSqrtPrice,\n currentPrice,\n newPrice,\n inTokenAmount: tokenInAmount.abs(),\n outTokenAmount: tokenOutAmount.abs(),\n priceImpact,\n feeTier: fee,\n };\n }\n\n private async getSingleQuoteExactInput(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n fee: FEE_TIER,\n amountIn: NumericAmount,\n ): Promise<GetQuoteResult> {\n return this.getSingleQuote(tokenIn, tokenOut, fee, amountIn, true);\n }\n\n private async getSingleQuoteExactOutput(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n amountOut: string | number | BigNumber,\n fee: FEE_TIER,\n ): Promise<GetQuoteResult> {\n return this.getSingleQuote(tokenIn, tokenOut, fee, amountOut, false);\n }\n\n private async sendQuoteRequest(\n endpoint: string,\n body: unknown,\n ): Promise<QuoteExactAmountResponse> {\n const response = await this.httpClient.sendPostRequest(\n this.gatewayBaseUrl,\n this.dexContractBasePath,\n endpoint,\n body,\n );\n\n const responseBody = response as {\n Status: number;\n Data: QuoteExactAmountRawResponse;\n error?: {\n Status: number;\n Message: string;\n ErrorCode: number;\n ErrorKey: string;\n };\n };\n\n // Convert string fields to BigNumber\n return {\n amount0: BigNumber(responseBody.Data.amount0),\n amount1: BigNumber(responseBody.Data.amount1),\n currentSqrtPrice: BigNumber(responseBody.Data.currentSqrtPrice) as SqrtPrice,\n newSqrtPrice: BigNumber(responseBody.Data.newSqrtPrice) as SqrtPrice,\n };\n }\n}\n","/**\n * Fee tiers for pools.\n */\nexport enum FEE_TIER {\n /** 0.05% fee tier */\n PERCENT_00_05 = 500,\n /** 0.3% fee tier */\n PERCENT_00_30 = 3000,\n /** 1.0% fee tier */\n PERCENT_01_00 = 10000,\n}\n","import BigNumber from 'bignumber.js';\nimport { NumericAmount } from '../types/amounts.js';\nimport { GalaChainTokenClassKey } from '../types/token.js';\nimport { getTokenOrdering, parseTokenClassKey, stringifyTokenClassKey } from '../utils/token.js';\nimport { validateFee, validateNumericAmount, validateWalletAddress } from '../utils/validation.js';\nimport { Bundler } from './bundler.js';\n\nconst MIN_SQRT_PRICE_LIMIT = '0.000000000000000000094212147';\nconst MAX_SQRT_PRICE_LIMIT = '18446050999999999999';\n\n/**\n * Service for handling token swap operations.\n */\nexport class Swaps {\n constructor(\n private readonly bundlerService: Bundler,\n private readonly options?: {\n walletAddress?: string | undefined;\n },\n ) {}\n\n /**\n * Executes a token swap transaction.\n * @param walletAddress - The wallet address executing the swap.\n * @param tokenIn - The input token to sell.\n * @param tokenOut - The output token to buy.\n * @param fee - The pool fee tier.\n * @param amount - Swap parameters specifying either exact input or exact output.\n * @param amount.exactIn - For exact input swaps, the exact amount of input tokens to sell.\n * @param amount.amountOutMinimum - For exact input swaps, the minimum amount of output tokens to buy (slippage protection).\n * @param amount.exactOut - For exact output swaps, the exact amount of output tokens to buy.\n * @param amount.amountInMaximum - For exact output swaps, the maximum amount of input tokens to sell (slippage protection).\n * @returns Pending transaction.\n * @example\n * ```typescript\n * // Exact input swap: sell 100 GALA for USDC\n * const result = await swapsService.swap(\n * 'GALA|Unit|none|none',\n * 'GUSDC|Unit|none|none',\n * 500,\n * { exactIn: '100', amountOutMinimum: '45' },\n * 'eth|123...abc', // your wallet address\n * );\n * console.log('Swap successful:', result);\n * ```\n */\n async swap(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n fee: number,\n amount:\n | {\n exactIn: NumericAmount;\n amountOutMinimum?: NumericAmount;\n }\n | {\n exactOut: NumericAmount;\n amountInMaximum?: NumericAmount;\n },\n walletAddress?: string,\n ) {\n walletAddress = walletAddress ?? this.options?.walletAddress;\n\n validateWalletAddress(walletAddress);\n validateFee(fee);\n\n if ('exactIn' in amount) {\n validateNumericAmount(amount.exactIn, 'exactIn');\n if (amount.amountOutMinimum !== undefined) {\n validateNumericAmount(amount.amountOutMinimum, 'amountOutMinimum', true);\n }\n } else {\n validateNumericAmount(amount.exactOut, 'exactOut');\n if (amount.amountInMaximum !== undefined) {\n validateNumericAmount(amount.amountInMaximum, 'amountInMaximum');\n }\n }\n\n const ordering = getTokenOrdering(tokenIn, tokenOut, false);\n const zeroForOne = stringifyTokenClassKey(tokenIn) === stringifyTokenClassKey(ordering.token0);\n\n const rawAmount =\n 'exactIn' in amount\n ? BigNumber(amount.exactIn).toFixed()\n : BigNumber(amount.exactOut).multipliedBy(-1).toFixed();\n const rawAmountOutMinimum =\n 'exactIn' in amount\n ? amount.amountOutMinimum?.toString()\n ? BigNumber(amount.amountOutMinimum).multipliedBy(-1).toFixed()\n : undefined\n : BigNumber(amount.exactOut ?? 0)\n .multipliedBy(-1)\n .toFixed();\n const rawAmountInMaximum =\n 'exactIn' in amount\n ? BigNumber(amount.exactIn).toFixed()\n : amount.amountInMaximum\n ? BigNumber(amount.amountInMaximum).toFixed()\n : undefined;\n\n const toSign = {\n token0: parseTokenClassKey(ordering.token0),\n token1: parseTokenClassKey(ordering.token1),\n fee: fee,\n amount: rawAmount,\n zeroForOne,\n sqrtPriceLimit: ordering.zeroForOne ? MIN_SQRT_PRICE_LIMIT : MAX_SQRT_PRICE_LIMIT,\n recipient: walletAddress,\n amountOutMinimum: rawAmountOutMinimum,\n amountInMaximum: rawAmountInMaximum,\n };\n\n const token0StringKey = stringifyTokenClassKey(ordering.token0, '$');\n const token1StringKey = stringifyTokenClassKey(ordering.token1, '$');\n\n const poolString = `$pool$${token0StringKey}$${token1StringKey}$${fee}`;\n const tokenBalance0 = `$tokenBalance$${token0StringKey}$${walletAddress}`;\n const tokenBalance1 = `$tokenBalance$${token1StringKey}$${walletAddress}`;\n const tokenBalance0Pool = `$tokenBalance$${token0StringKey}$${poolString}`;\n const tokenBalance1Pool = `$tokenBalance$${token1StringKey}$${poolString}`;\n\n const stringsInstructions = [\n poolString,\n tokenBalance0,\n tokenBalance1,\n tokenBalance0Pool,\n tokenBalance1Pool,\n ];\n\n return this.bundlerService.sendBundlerRequest('Swap', toSign, stringsInstructions);\n }\n}\n","import { HttpRequestor } from '../types/http_requestor.js';\nimport { Assets } from './assets.js';\nimport { Bundler } from './bundler.js';\nimport { Events } from './events.js';\nimport { HttpClient } from './http_client.js';\nimport { Pools } from './pools.js';\nimport { Positions } from './positions.js';\nimport { Quoting } from './quoting.js';\nimport { GalaChainSigner } from './signers.js';\nimport { Swaps } from './swaps.js';\n\n/**\n * Main class for interacting with the gSwap decentralized exchange.\n * Provides methods for trading, liquidity management, and position handling.\n */\nexport class GSwap {\n public readonly gatewayBaseUrl: string;\n public readonly dexContractBasePath: string;\n public readonly tokenContractBasePath: string;\n public readonly bundlerBaseUrl: string;\n public readonly bundlingAPIBasePath: string;\n public readonly dexBackendBaseUrl: string;\n public readonly transactionWaitTimeoutMs: number;\n public readonly signer?: GalaChainSigner | undefined;\n\n /**\n * Quoting functionality for price discovery and trade estimation.\n * Use this to get quotes for token swaps without executing transactions.\n *\n * @example\n * ```typescript\n * // Get the best quote across all fee tiers\n * const quote = await gSwap.quoting.quoteExactInput(tokenA, tokenB, amount);\n * ```\n */\n public readonly quoting: Quoting;\n\n /**\n * Position management operations for liquidity positions.\n * Use this to manage liquidity positions including creation, modification, and fee collection.\n *\n * @example\n * ```typescript\n * // Get all user positions\n * const positions = await gSwap.positions.getUserPositions('eth|123...abc');\n *\n * // Add liquidity to a position using price range\n * const result = await gSwap.positions.addLiquidityByPrice({\n * walletAddress: 'eth|123...abc',\n * positionId: '',\n * token0: 'GALA|Unit|none|none',\n * token1: 'GUSDC|Unit|none|none',\n * fee: 500,\n * tickSpacing: 10,\n * minPrice: '0.45',\n * maxPrice: '0.55',\n * amount0Desired: '100',\n * amount1Desired: '50',\n * amount0Min: '95',\n * amount1Min: '47.5'\n * });\n * ```\n */\n public readonly positions: Positions;\n\n /**\n * Token swap operations for trading tokens.\n * Use this to execute token swaps on the DEX.\n *\n * @example\n * ```typescript\n * // Execute an exact input swap: sell 100 GALA for USDC\n * const result = await gSwap.swaps.swap(\n * 'GALA|Unit|none|none',\n * 'GUSDC|Unit|none|none',\n * 500,\n * { exactIn: '100', amountOutMinimum: '45' },\n * 'eth|123...abc', // your wallet address\n * );\n * ```\n */\n public readonly swaps: Swaps;\n\n /**\n * User asset management operations.\n * Use this to retrieve user token balances and asset information.\n *\n * @example\n * ```typescript\n * // Get user assets with pagination\n * const assets = await gSwap.assets.getUserAssets('eth|123...abc', 1, 20);\n * console.log(`User has ${assets.count} different tokens`);\n * ```\n */\n public readonly assets: Assets;\n\n /**\n * Event management operations for real-time socket connections.\n * Use this to manage event streaming and transaction status updates.\n *\n * @example\n * ```typescript\n * // Connect to event socket for transaction updates\n * await GSwap.events.connectEventSocket();\n *\n * // Check if socket is connected\n * const isConnected = GSwap.events.eventSocketConnected();\n * ```\n */\n public static readonly events = Events.instance;\n\n private readonly httpClient: HttpClient;\n private readonly httpRequestor: HttpRequestor;\n private readonly bundler: Bundler;\n public readonly pools: Pools;\n\n /**\n * Creates a new SDK instance.\n * @param options - Customization options.\n * @param options.signer - The signer to use for authenticated operations. Required if you use any functionality that creates transactions (such as swapping). Not required for readonly operations.\n * @param options.gatewayBaseUrl - Base URL for the GalaChain Gateway API.\n * @param options.dexContractBasePath - Base path for DEX contract API endpoints, within the GalaChain Gateway API.\n * @param options.tokenContractBasePath - Base path for token contract API endpoints, within the GalaChain Gateway API.\n * @param options.bundlerBaseUrl - Base URL for the DEX transaction bundling API.\n * @param options.bundlingAPIBasePath - Base path for transaction bundling API endpoints.\n * @param options.dexBackendBaseUrl - Base URL for the DEX backend API (for user assets and other data).\n * @param options.httpRequestor - Custom HTTP requestor to use for API calls. Defaults to the global `fetch` function.\n * @param options.transactionWaitTimeoutMs - Timeout in milliseconds for waiting for transactions to complete. Defaults to 300,000 milliseconds (five minutes).\n * @param options.walletAddress - Optional default wallet address for operations that require a wallet address (e.x. swapping). If not provided, you must specify the wallet address in each method call.\n */\n constructor(options?: {\n signer?: GalaChainSigner | undefined;\n gatewayBaseUrl?: string | undefined;\n dexContractBasePath?: string | undefined;\n tokenContractBasePath?: string | undefined;\n bundlerBaseUrl?: string | undefined;\n bundlingAPIBasePath?: string | undefined;\n dexBackendBaseUrl?: string | undefined;\n transactionWaitTimeoutMs?: number | undefined;\n walletAddress?: string | undefined;\n httpRequestor?: HttpRequestor | undefined;\n }) {\n this.gatewayBaseUrl =\n options?.gatewayBaseUrl?.replace(/\\/$/, '') ?? 'https://gateway-mainnet.galachain.com';\n this.dexContractBasePath = options?.dexContractBasePath ?? '/api/asset/dexv3-contract';\n this.tokenContractBasePath = options?.tokenContractBasePath ?? '/api/asset/token-contract';\n this.bundlerBaseUrl = options?.bundlerBaseUrl ?? 'https://bundle-backend-prod1.defi.gala.com';\n this.bundlingAPIBasePath = options?.bundlingAPIBasePath ?? '/bundle';\n this.dexBackendBaseUrl =\n options?.dexBackendBaseUrl ?? 'https://dex-backend-prod1.defi.gala.com';\n this.signer = options?.signer;\n this.transactionWaitTimeoutMs = options?.transactionWaitTimeoutMs ?? 300_000; // 5 minutes\n this.httpRequestor = options?.httpRequestor ?? fetch.bind(globalThis);\n\n this.httpClient = new HttpClient(this.httpRequestor);\n\n this.bundler = new Bundler(\n this.bundlerBaseUrl,\n this.bundlingAPIBasePath,\n this.transactionWaitTimeoutMs,\n this.signer,\n this.httpClient,\n );\n\n this.pools = new Pools(this.gatewayBaseUrl, this.dexContractBasePath, this.httpClient);\n\n this.quoting = new Quoting(this.gatewayBaseUrl, this.dexContractBasePath, this.httpClient);\n\n this.positions = new Positions(\n this.gatewayBaseUrl,\n this.dexContractBasePath,\n this.bundler,\n this.pools,\n this.httpClient,\n { walletAddress: options?.walletAddress },\n );\n\n this.swaps = new Swaps(this.bundler, { walletAddress: options?.walletAddress });\n\n this.assets = new Assets(this.dexBackendBaseUrl, this.httpClient);\n }\n}\n","import { signatures } from '@gala-chain/api';\nimport { calculatePersonalSignPrefix } from '@gala-chain/connect';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\n\ntype EIP712Types = Record<string, Array<{ name: string; type: string }>>;\n\n/**\n * A transaction signing interface. See {@link PrivateKeySigner} and {@link GalaWalletSigner} for implementations.\n */\nexport interface GalaChainSigner {\n signObject: <TObjectType extends Record<string, unknown>>(\n methodName: string,\n object: TObjectType,\n ) => Promise<TObjectType & { signature: string }>;\n}\n\n/**\n * A signing implementation that uses a private key string to sign requests.\n */\nexport class PrivateKeySigner implements GalaChainSigner {\n private readonly keyBuffer: Buffer;\n\n constructor(privateKey: string) {\n this.keyBuffer = signatures.normalizePrivateKey(privateKey);\n }\n\n public async signObject<TObjectType extends Record<string, unknown>>(\n _methodName: string,\n obj: TObjectType,\n ): Promise<TObjectType & { signature: string }> {\n const signature = signatures.getSignature(obj, this.keyBuffer);\n return { ...obj, signature };\n }\n}\n\n/**\n * A signing implementation that uses Gala Wallet to sign requests.\n */\nexport class GalaWalletSigner implements GalaChainSigner {\n constructor(public readonly walletAddress: string) {}\n\n public async signObject<TObjectType extends Record<string, unknown>>(\n methodName: string,\n obj: TObjectType,\n ): Promise<TObjectType & { signature: string }> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const globalGala = (global as any).gala;\n\n if (!globalGala) {\n throw new GSwapSDKError(\n 'Gala wallet is not available. Please ensure the Gala wallet is connected.',\n 'GALA_WALLET_NOT_AVAILABLE',\n );\n }\n\n const domain = { name: 'ethereum', chainId: 1 };\n const types = GalaWalletSigner.generateEIP712Types(methodName, obj);\n\n const signRequest = {\n domain,\n types,\n Primary_type: methodName,\n message: {\n ...obj,\n prefix: calculatePersonalSignPrefix(obj),\n },\n };\n\n await globalGala.setAddress(this.walletAddress);\n const signature = await globalGala.request({\n method: 'eth_signTypedData',\n params: [JSON.stringify(signRequest), this.walletAddress],\n });\n\n return { ...obj, domain, types, signature } as unknown as TObjectType & {\n signature: string;\n };\n }\n\n private static generateEIP712Types<T>(typeName: string, params: T): EIP712Types {\n const types: EIP712Types = {};\n types[typeName] = [];\n\n function addField(\n name: string,\n fieldValue: unknown,\n parentTypeName: string,\n onlyGetType = false,\n ) {\n if (fieldValue === undefined) {\n // NOOP\n } else if (Array.isArray(fieldValue)) {\n //Take the type of the first element\n const type = addField(name, fieldValue[0], parentTypeName, true);\n if (!onlyGetType) types[parentTypeName]!.push({ name, type: (type ?? name) + '[]' });\n } else if (typeof fieldValue === 'object' && fieldValue !== null) {\n if (types[name]) {\n throw new GSwapSDKError(\n 'Name collisions not yet supported in EIP712 type generation',\n 'EIP712_NAME_COLLISION',\n { name },\n );\n }\n types[name] = [];\n Object.entries(fieldValue).forEach(([key, value]) => {\n addField(key, value, name);\n });\n if (!onlyGetType) types[parentTypeName]!.push({ name, type: name });\n } else {\n let eipType: string;\n switch (typeof fieldValue) {\n case 'string':\n eipType = 'string';\n break;\n case 'number':\n eipType = 'int256';\n break;\n case 'boolean':\n eipType = 'bool';\n break;\n default:\n throw new GSwapSDKError(\n `Unsupported type for EIP712 signing: ${typeof fieldValue}`,\n 'EIP712_UNSUPPORTED_TYPE',\n { type: typeof fieldValue, value: fieldValue },\n );\n }\n if (onlyGetType) {\n return eipType;\n } else {\n types[parentTypeName]!.push({ name, type: eipType });\n }\n }\n }\n\n Object.entries(params as Record<string, unknown>).forEach(([key, value]) => {\n addField(key, value, typeName);\n });\n\n return types;\n }\n}\n"],"mappings":"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","names":["BigNumber","debug","_a","crypto","import_bignumber","BigNumber","import_bignumber","BigNumber","import_bignumber","FEE_TIER","BigNumber","import_bignumber","BigNumber"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/validation.ts","../src/classes/gswap_sdk_error.ts","../src/types/fees.ts","../src/utils/ticks.ts","../src/classes/assets.ts","../src/utils/transport.ts","../src/classes/submitted_transaction.ts","../src/classes/gateway.ts","../src/utils/debug.ts","../src/version.ts","../src/classes/http_client.ts","../src/utils/ordering.ts","../src/classes/pools.ts","../src/classes/positions.ts","../src/classes/quoting.ts","../src/classes/symbols.ts","../src/classes/swaps.ts","../src/types/env.ts","../src/classes/gswap.ts","../src/classes/signers.ts","../src/utils/eip712.ts"],"sourcesContent":["export * from './classes/assets.js';\nexport * from './classes/gateway.js';\nexport * from './classes/gswap.js';\nexport * from './classes/gswap_sdk_error.js';\nexport * from './classes/pools.js';\nexport * from './classes/positions.js';\nexport * from './classes/quoting.js';\nexport * from './classes/signers.js';\nexport * from './classes/submitted_transaction.js';\nexport * from './classes/swaps.js';\nexport * from './classes/symbols.js';\nexport * from './types/amounts.js';\nexport * from './types/env.js';\nexport * from './types/fees.js';\nexport * from './types/token.js';\nexport * from './types/v2_dtos.js';\nexport * from './types/v2_results.js';\nexport * from './utils/ordering.js';\nexport * from './utils/ticks.js';\nexport * from './utils/validation.js';\n","import BigNumber from 'bignumber.js';\nimport { GSwapSDKError } from '../classes/gswap_sdk_error.js';\nimport type { NumericAmount } from '../types/amounts.js';\nimport { ALL_FEE_TIERS } from '../types/fees.js';\nimport type { FEE_TIER } from '../types/fees.js';\nimport { GC_MAX_TICK, GC_MIN_TICK } from './ticks.js';\n\nexport function validateNumericAmount(\n amount: NumericAmount,\n parameterName: string,\n allowZero = false,\n): void {\n if (typeof amount === 'number') {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: use a decimal string or BigNumber, not a JavaScript number`,\n 'VALIDATION_ERROR',\n { type: 'INVALID_NUMERIC_AMOUNT', parameterName, value: amount, reason: 'number_input' },\n );\n }\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — substitute an explicit NaN so the isFinite() check below still catches\n // it and raises the same typed error, instead of a raw exception escaping.\n let bnAmount: BigNumber;\n try {\n bnAmount = BigNumber(amount);\n } catch {\n bnAmount = BigNumber(NaN);\n }\n\n if (!bnAmount.isFinite()) {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: must be a finite number`,\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_NUMERIC_AMOUNT',\n parameterName,\n value: amount,\n reason: 'not_finite',\n },\n );\n }\n\n if (!allowZero && bnAmount.isZero()) {\n throw new GSwapSDKError(`Invalid ${parameterName}: must be positive`, 'VALIDATION_ERROR', {\n type: 'INVALID_NUMERIC_AMOUNT',\n parameterName,\n value: amount,\n reason: 'zero_not_allowed',\n });\n }\n\n if (bnAmount.isNegative()) {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: must be ${allowZero ? 'non-negative' : 'positive'}`,\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_NUMERIC_AMOUNT',\n parameterName,\n value: amount,\n reason: 'negative',\n },\n );\n }\n}\n\nexport function validatePriceValues(\n spotPrice: NumericAmount,\n lowerPrice: NumericAmount,\n upperPrice: NumericAmount,\n): void {\n if ([spotPrice, lowerPrice, upperPrice].some((value) => typeof value === 'number')) {\n throw new GSwapSDKError(\n 'Invalid price values: use decimal strings or BigNumber values, not JavaScript numbers',\n 'VALIDATION_ERROR',\n { type: 'INVALID_NUMERIC_AMOUNT', reason: 'number_input' },\n );\n }\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — substitute an explicit NaN so the isFinite()/isPositive() checks below\n // still catch it and raise the same typed error, instead of a raw exception escaping.\n const parse = (value: NumericAmount): BigNumber => {\n try {\n return BigNumber(value);\n } catch {\n return BigNumber(NaN);\n }\n };\n const bnSpotPrice = parse(spotPrice);\n const bnLowerPrice = parse(lowerPrice);\n let bnUpperPrice = parse(upperPrice);\n\n bnUpperPrice = bnUpperPrice.isFinite() ? bnUpperPrice : BigNumber(1e18);\n\n if (\n !bnSpotPrice.isFinite() ||\n !bnLowerPrice.isFinite() ||\n !bnUpperPrice.isFinite() ||\n !bnSpotPrice.isPositive() ||\n !bnLowerPrice.isPositive() ||\n !bnUpperPrice.isPositive()\n ) {\n throw new GSwapSDKError(\n 'Invalid price values: all prices must be finite and positive',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_PRICE_VALUES',\n spotPrice,\n lowerPrice,\n upperPrice,\n },\n );\n }\n\n if (bnLowerPrice.isGreaterThan(bnUpperPrice)) {\n throw new GSwapSDKError(\n 'Invalid price range: lower price must be less than or equal to upper price',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_PRICE_RANGE',\n lowerPrice,\n upperPrice,\n },\n );\n }\n}\n\nexport function validateTokenDecimals(decimals: number, parameterName: string): void {\n if (decimals < 0 || !Number.isInteger(decimals)) {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: must be a non-negative integer`,\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TOKEN_DECIMALS',\n parameterName,\n value: decimals,\n },\n );\n }\n}\n\nexport function validateTickRange(tickLower: number, tickUpper: number): void {\n if (!Number.isInteger(tickLower) || !Number.isInteger(tickUpper)) {\n throw new GSwapSDKError('Invalid tick values: ticks must be integers', 'VALIDATION_ERROR', {\n type: 'INVALID_TICK_VALUES',\n tickLower,\n tickUpper,\n });\n }\n\n if (tickLower >= tickUpper) {\n throw new GSwapSDKError(\n 'Invalid tick range: tickLower must be less than tickUpper',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TICK_RANGE',\n tickLower,\n tickUpper,\n },\n );\n }\n\n if (tickLower < GC_MIN_TICK || tickUpper > GC_MAX_TICK) {\n throw new GSwapSDKError(\n `Invalid tick range: ticks must be between ${GC_MIN_TICK} and ${GC_MAX_TICK}`,\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TICK_BOUNDS',\n tickLower,\n tickUpper,\n minTick: GC_MIN_TICK,\n maxTick: GC_MAX_TICK,\n },\n );\n }\n}\n\nexport function validateFee(fee: number): asserts fee is FEE_TIER {\n if (!ALL_FEE_TIERS.some((tier) => Number(tier) === fee)) {\n throw new GSwapSDKError(\n 'Invalid fee tier: must be one of 0, 500, 3000, or 10000',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_FEE',\n value: fee,\n },\n );\n }\n}\n\nexport function validateTickSpacing(tickSpacing: number): void {\n if (!Number.isInteger(tickSpacing) || tickSpacing <= 0) {\n throw new GSwapSDKError(\n 'Invalid tick spacing: must be a positive integer',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_TICK_SPACING',\n value: tickSpacing,\n },\n );\n }\n}\n\nexport function validateWalletAddress(address?: string): asserts address is string {\n if (address === undefined) {\n throw new GSwapSDKError(\n 'Invalid wallet address: No wallet address provided',\n 'VALIDATION_ERROR',\n {\n type: 'MISSING_WALLET_ADDRESS',\n hint: 'Either provide a wallet address to the function you are calling, or set one when instantiating GSwapSDK',\n },\n );\n }\n\n if (!address || typeof address !== 'string' || address.trim().length === 0) {\n throw new GSwapSDKError(\n 'Invalid wallet address: must be a non-empty string',\n 'VALIDATION_ERROR',\n {\n type: 'INVALID_WALLET_ADDRESS',\n value: address,\n },\n );\n }\n}\n","import type { GalaChainTokenClassKey } from '../types/token.js';\nimport type { HTTPResponse } from '../types/http_requestor.js';\n\n/** Error raised by the SDK for validation, gateway, chain, or transaction failures. */\nexport class GSwapSDKError extends Error {\n public readonly chainMessage: string | undefined;\n public readonly retryAfterMs: number | undefined;\n\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, unknown>,\n chainMessage?: string,\n retryAfterMs?: number,\n ) {\n super(message);\n this.name = 'GSwapSDKError';\n this.chainMessage = chainMessage;\n this.retryAfterMs = retryAfterMs;\n }\n\n /** Create the standard missing-signer error. */\n public static noSignerError(): GSwapSDKError {\n return new GSwapSDKError(\n 'This method requires a signer. Please provide a signer to the GSwap constructor.',\n 'NO_SIGNER',\n );\n }\n\n /** Create the error used when confirming a position write without a configured wallet address. */\n public static noWalletAddressError(): GSwapSDKError {\n return new GSwapSDKError(\n 'Cannot confirm this write: no walletAddress was provided to the GSwap constructor, so ' +\n 'the resulting position cannot be looked up to confirm it landed on chain.',\n 'NO_WALLET_ADDRESS',\n );\n }\n\n /** Create the error used when no pool can quote the requested pair. */\n public static noPoolAvailableError(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n fee?: number,\n ): GSwapSDKError {\n return new GSwapSDKError('No pool is available for the requested pair.', 'NO_POOL_AVAILABLE', {\n tokenIn,\n tokenOut,\n ...(fee === undefined ? {} : { fee }),\n });\n }\n\n /** Create the error used when a pool lacks liquidity for a quote. */\n public static insufficientLiquidityError(\n tokenIn: GalaChainTokenClassKey | string,\n tokenOut: GalaChainTokenClassKey | string,\n fee?: number,\n ): GSwapSDKError {\n return new GSwapSDKError(\n 'The selected pool has insufficient liquidity for the requested quote.',\n 'INSUFFICIENT_LIQUIDITY',\n { tokenIn, tokenOut, ...(fee === undefined ? {} : { fee }) },\n );\n }\n\n /** Convert a chain-gateway bounce into a typed SDK error. */\n public static fromGatewayBounce(\n code: string,\n message: string,\n status: number,\n retryAfterMs?: number,\n ): GSwapSDKError {\n const details: Record<string, unknown> = { status, chainMessage: message };\n if (retryAfterMs !== undefined) details['retryAfterMs'] = retryAfterMs;\n const sdkMessage =\n code === 'CHAIN_DISPATCH_FAILED' ? message : `Gateway rejected ${code}: ${message}`;\n return new GSwapSDKError(sdkMessage, code, details, message, retryAfterMs);\n }\n\n /** Convert a GalaChain `Status: 0` response into a typed SDK error. */\n public static fromChainError(\n errorKey: string,\n message: string,\n details?: Record<string, unknown>,\n ): GSwapSDKError {\n return new GSwapSDKError(\n `GalaChain error ${errorKey}: ${message}`,\n errorKey,\n { ...details, errorKey, message },\n message,\n );\n }\n\n /** Create the error used when a token is not registered by the current DEX contract. */\n public static unknownTokenError(token: GalaChainTokenClassKey | string): GSwapSDKError {\n const tokenText = typeof token === 'string' ? token : JSON.stringify(token);\n return new GSwapSDKError(\n `Token ${tokenText} has no trading symbol on the new DEX contract (no gcdex pool includes it yet).`,\n 'UNKNOWN_TOKEN',\n { token },\n );\n }\n\n /** Create the error used when apply-results confirmation does not arrive in time. */\n public static confirmationTimeoutError(uniqueKey: string, cause?: unknown): GSwapSDKError {\n return new GSwapSDKError(\n 'Transaction confirmation timed out; the trade may still apply. Confirm the same uniqueKey again later instead of resubmitting.',\n 'CONFIRMATION_TIMEOUT',\n { uniqueKey, ...(cause === undefined ? {} : { cause }) },\n );\n }\n\n /** Convert an unexpected HTTP response into an SDK error. */\n public static async fromErrorResponse(\n url: string,\n response: HTTPResponse,\n ): Promise<GSwapSDKError> {\n const bodyText = await response.text();\n const bodyJson: unknown = parseJson(bodyText);\n const errorObject = getObjectProperty(bodyJson, 'error');\n const errorKey = getStringProperty(errorObject, 'ErrorKey');\n const message = getStringProperty(errorObject, 'Message');\n\n if (errorKey !== undefined && message !== undefined) {\n return new GSwapSDKError(\n `GalaChain Error ${errorKey} from ${url}: ${message}`,\n errorKey,\n { message, errorKey, status: response.status, body: bodyJson, url },\n message,\n );\n }\n\n return new GSwapSDKError(`Unexpected HTTP Error ${response.status} from ${url}`, 'HTTP_ERROR', {\n status: response.status,\n body: bodyJson ?? bodyText,\n url,\n });\n }\n}\n\n/** Narrow an object property without trusting a cast at a network boundary. */\nexport function getObjectProperty(\n value: unknown,\n property: string,\n): Record<string, unknown> | undefined {\n if (typeof value !== 'object' || value === null || !(property in value)) return undefined;\n const propertyValue = (value as Record<string, unknown>)[property];\n return typeof propertyValue === 'object' && propertyValue !== null\n ? (propertyValue as Record<string, unknown>)\n : undefined;\n}\n\n/** Read a string property from an unknown object. */\nexport function getStringProperty(value: unknown, property: string): string | undefined {\n if (typeof value !== 'object' || value === null || !(property in value)) return undefined;\n const propertyValue = (value as Record<string, unknown>)[property];\n return typeof propertyValue === 'string' ? propertyValue : undefined;\n}\n\n/** Parse a response body, preserving non-JSON text for error reporting. */\nexport function parseJson(text: string): unknown {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return undefined;\n }\n}\n","/**\n * Fee tiers for pools.\n */\nexport enum FEE_TIER {\n /** No trading fee. */\n PERCENT_00_00 = 0,\n /** 0.05% fee tier */\n PERCENT_00_05 = 500,\n /** 0.3% fee tier */\n PERCENT_00_30 = 3000,\n /** 1.0% fee tier */\n PERCENT_01_00 = 10000,\n}\n\n/** Tick spacing required by the current GalaChainDex contract for each fee tier. */\nexport const TICK_SPACING_BY_FEE: Readonly<Record<FEE_TIER, number>> = {\n [FEE_TIER.PERCENT_00_00]: 200,\n [FEE_TIER.PERCENT_00_05]: 10,\n [FEE_TIER.PERCENT_00_30]: 60,\n [FEE_TIER.PERCENT_01_00]: 200,\n};\n\n/** All fee tiers supported by the current GalaChainDex contract. */\nexport const ALL_FEE_TIERS: readonly FEE_TIER[] = [\n FEE_TIER.PERCENT_00_00,\n FEE_TIER.PERCENT_00_05,\n FEE_TIER.PERCENT_00_30,\n FEE_TIER.PERCENT_01_00,\n];\n","import BigNumber from 'bignumber.js';\nimport { Decimal } from 'decimal.js';\nimport type { FEE_TIER } from '../types/fees.js';\nimport { TICK_SPACING_BY_FEE } from '../types/fees.js';\n\n/** Minimum tick supported by GalaChainDex. */\nexport const GC_MIN_TICK = -887272;\n/** Maximum tick supported by GalaChainDex. */\nexport const GC_MAX_TICK = 887272;\n\nconst DexMath = BigNumber.clone({\n DECIMAL_PLACES: 60,\n ROUNDING_MODE: BigNumber.ROUND_DOWN,\n});\nconst DexDecimal = Decimal.clone({ precision: 60 });\n\n/** Convert a tick to the corresponding square-root price. */\nexport function tickToSqrtPrice(tick: number): BigNumber {\n return new BigNumber(new DexDecimal(1.0001).pow(tick / 2).toString());\n}\n\n/** Return the greatest tick whose square-root price is no greater than the input. */\nexport function sqrtPriceToTick(sqrtPrice: BigNumber.Value): number {\n let value: BigNumber;\n try {\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — this function's contract is to signal an invalid input via NaN, not\n // to throw, so an unparseable value is just another case for the guard below.\n value = new DexMath(sqrtPrice);\n } catch {\n return Number.NaN;\n }\n if (!value.isFinite() || value.isLessThanOrEqualTo(0)) return Number.NaN;\n\n const approximate = Math.log(value.toNumber() ** 2) / Math.log(1.0001);\n if (!Number.isFinite(approximate)) return Number.NaN;\n // Clamp the seed before the correction loops below — an unclamped seed derived from an\n // out-of-range sqrtPrice (extreme but finite, e.g. 1e20) leaves the loops running past\n // GC_MIN_TICK/GC_MAX_TICK for a long time; an infinite (overflowed) seed would never\n // enter the increasing loop and never terminate the decreasing one.\n let tick = Math.min(GC_MAX_TICK, Math.max(GC_MIN_TICK, Math.floor(approximate)));\n while (tick < GC_MAX_TICK && tickToSqrtPrice(tick + 1).isLessThanOrEqualTo(value)) tick += 1;\n while (tick > GC_MIN_TICK && tickToSqrtPrice(tick).isGreaterThan(value)) tick -= 1;\n return tick;\n}\n\n/** Return the greatest integer tick whose token1/token0 price is no greater than `price`. */\nexport function tickFromPrice(price: BigNumber.Value): number {\n const priceText =\n typeof price === 'string'\n ? price\n : typeof price === 'number'\n ? price.toString()\n : BigNumber.isBigNumber(price)\n ? price.toString()\n : 'NaN';\n const value = new DexDecimal(priceText);\n if (!value.isFinite() || value.lessThanOrEqualTo(0)) return Number.NaN;\n if (!Number.isFinite(value.toNumber())) return Number.NaN;\n const tick = value.ln().dividedBy(new DexDecimal(1.0001).ln()).floor().toNumber();\n return Number.isFinite(tick) ? tick : Number.NaN;\n}\n\n/** Align a tick down to the nearest multiple of a positive spacing. */\nexport function alignTickDown(tick: number, spacing: number): number {\n assertSpacing(spacing);\n return Math.floor(tick / spacing) * spacing;\n}\n\n/** Align a tick up to the nearest multiple of a positive spacing. */\nexport function alignTickUp(tick: number, spacing: number): number {\n assertSpacing(spacing);\n return Math.ceil(tick / spacing) * spacing;\n}\n\n/** Validate a position range against the global tick bounds and fee-tier spacing. */\nexport function assertTickRange(lower: number, upper: number, fee: FEE_TIER): void {\n const spacing = TICK_SPACING_BY_FEE[fee];\n if (spacing === undefined) throw new RangeError(`Unsupported fee tier: ${fee}`);\n if (!Number.isInteger(lower) || !Number.isInteger(upper)) {\n throw new RangeError('Ticks must be integers');\n }\n if (lower < GC_MIN_TICK || upper > GC_MAX_TICK || lower >= upper) {\n throw new RangeError(\n `Tick range must satisfy ${GC_MIN_TICK} <= lower < upper <= ${GC_MAX_TICK}`,\n );\n }\n if (lower % spacing !== 0 || upper % spacing !== 0) {\n throw new RangeError(`Ticks must be aligned to spacing ${spacing}`);\n }\n}\n\nfunction assertSpacing(spacing: number): void {\n if (!Number.isInteger(spacing) || spacing <= 0)\n throw new RangeError('Tick spacing must be positive');\n}\n","import type { UserAsset, UserAssetsResult } from '../types/v2_results.js';\nimport { validateWalletAddress } from '../utils/validation.js';\nimport { getObjectProperty, GSwapSDKError } from './gswap_sdk_error.js';\nimport type { HttpClient } from './http_client.js';\n\n/**\n * Service for handling user asset operations.\n * Provides functionality to retrieve user token balances and asset information.\n */\nexport class Assets {\n constructor(\n private readonly dexBackendBaseUrl: string,\n private readonly httpClient: HttpClient,\n ) {}\n\n /**\n * Gets all token assets owned by a user with their balances.\n * @param ownerAddress - The wallet address to get assets for.\n * @param page - Page number for pagination (default: 1).\n * @param limit - Maximum number of assets to return per page (default: 10).\n * @returns User assets including token information and balances.\n * @example\n * ```typescript\n * const assets = await assetsService.getUserAssets('eth|123...abc', 1, 20);\n * console.log(`User has ${assets.count} different tokens`);\n * assets.tokens.forEach(token => {\n * console.log(`${token.symbol}: ${token.quantity}`);\n * });\n * ```\n */\n async getUserAssets(\n ownerAddress: string,\n page: number = 1,\n limit: number = 10,\n ): Promise<UserAssetsResult> {\n validateWalletAddress(ownerAddress);\n\n if (!Number.isInteger(page) || page < 1) {\n throw new GSwapSDKError('Invalid page: must be a positive integer', 'VALIDATION_ERROR', {\n page,\n });\n }\n\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new GSwapSDKError(\n 'Invalid limit: must be an integer between 1 and 100',\n 'VALIDATION_ERROR',\n { limit },\n );\n }\n\n const json: unknown = await this.httpClient.sendGetRequest(\n this.dexBackendBaseUrl,\n '/user/assets',\n '',\n { address: ownerAddress, page: page.toString(), limit: limit.toString() },\n );\n return parseUserAssets(json);\n }\n}\n\nfunction parseUserAssets(value: unknown): UserAssetsResult {\n const data = getObjectProperty(value, 'data');\n // Not getObjectProperty — that's typed for object properties, and Array.isArray on its\n // Record<string, unknown> return type narrows to any[] instead of a real array type.\n const tokens: unknown = data?.['token'];\n if (!Array.isArray(tokens) || !tokens.every(isRawUserAsset)) {\n throw new GSwapSDKError(\n 'Backend returned an invalid user assets response.',\n 'INVALID_CHAIN_RESPONSE',\n {\n data: value,\n },\n );\n }\n const count = data?.['count'];\n return {\n tokens: tokens.map((token) => ({ ...token, decimals: parseInt(token.decimals, 10) })),\n count: typeof count === 'number' ? count : 0,\n };\n}\n\ntype RawUserAsset = Omit<UserAsset, 'decimals'> & { decimals: string };\n\nfunction isRawUserAsset(value: unknown): value is RawUserAsset {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Record<string, unknown>;\n return (\n typeof entry['image'] === 'string' &&\n typeof entry['name'] === 'string' &&\n typeof entry['decimals'] === 'string' &&\n /^\\d+$/u.test(entry['decimals']) &&\n typeof entry['verify'] === 'boolean' &&\n typeof entry['symbol'] === 'string' &&\n typeof entry['quantity'] === 'string'\n );\n}\n","import type { HTTPResponse, HttpRequestor } from '../types/http_requestor.js';\nimport { GSwapSDKError, parseJson } from '../classes/gswap_sdk_error.js';\n\nexport async function requestWithTimeout(\n requestor: HttpRequestor,\n url: string,\n options: RequestInit,\n timeoutMs: number,\n): Promise<HTTPResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const externalSignal = options.signal;\n const abortFromCaller = (): void => controller.abort();\n externalSignal?.addEventListener('abort', abortFromCaller, { once: true });\n try {\n return await requestor(url, { ...options, signal: controller.signal });\n } catch (error: unknown) {\n if (controller.signal.aborted) {\n throw new GSwapSDKError(`Request timed out after ${timeoutMs} ms.`, 'REQUEST_TIMEOUT', {\n url,\n timeoutMs,\n cause: error,\n });\n }\n throw error;\n } finally {\n clearTimeout(timer);\n externalSignal?.removeEventListener('abort', abortFromCaller);\n }\n}\n\nexport async function readResponseBody(response: HTTPResponse): Promise<unknown> {\n const text = await response.text();\n return parseJson(text) ?? text;\n}\n\n/** Read a case-insensitive response header from either supported header shape. */\nexport function readHeader(response: HTTPResponse, name: string): string | undefined {\n const headers = response.headers;\n if (headers === undefined) return undefined;\n if (hasHeaderGetter(headers)) {\n const value = headers.get(name);\n return value === null || value === '' ? undefined : value;\n }\n const value = Object.entries(headers).find(([key]) => key.toLowerCase() === name.toLowerCase())?.[1];\n return value === undefined || value === '' ? undefined : value;\n}\n\n/** Read a non-negative Retry-After header as milliseconds. */\nexport function readRetryAfter(response: HTTPResponse): number | undefined {\n const raw = readHeader(response, 'retry-after');\n if (raw === undefined) return undefined;\n const seconds = Number(raw);\n return Number.isFinite(seconds) && seconds >= 0 ? seconds * 1000 : undefined;\n}\n\n/** Read a non-negative integer block number header. */\nexport function readBlockNumberHeader(\n response: HTTPResponse,\n headerName = 'x-block-number',\n): number | undefined {\n const raw = readHeader(response, headerName);\n if (raw === undefined) return undefined;\n const blockNumber = Number(raw);\n return Number.isInteger(blockNumber) && blockNumber >= 0 ? blockNumber : undefined;\n}\n\nfunction hasHeaderGetter(\n headers: NonNullable<HTTPResponse['headers']>,\n): headers is { get(name: string): string | null } {\n return 'get' in headers && typeof headers.get === 'function';\n}\n","import type { HttpRequestor, HTTPResponse } from '../types/http_requestor.js';\nimport type { AppliedTrade, Position, TradeExecution } from '../types/v2_results.js';\nimport { GSwapSDKError, getObjectProperty, getStringProperty } from './gswap_sdk_error.js';\nimport {\n readBlockNumberHeader,\n readHeader,\n readResponseBody,\n readRetryAfter,\n requestWithTimeout,\n} from '../utils/transport.js';\n\n/** Result of one position-confirmation poll. */\nexport type PositionConfirmationResult =\n | { confirmed: true; position: Position | null }\n | { confirmed: false; position?: Position | null };\n\n/** A submitted v2 transaction whose confirmation mode is explicit in the gateway response. */\nexport class SubmittedTransaction<TConfirmation = AppliedTrade | Position | null> {\n public readonly method: string;\n public readonly uniqueKey: string;\n public readonly transactionId: string | null;\n public readonly blockNumber: number | null;\n public readonly mode: 'sync' | 'queued';\n /** The synchronous gateway result, or `undefined` when `mode === 'queued'`. */\n public readonly result: unknown;\n private readonly backendBaseUrl: string;\n private readonly requestor: HttpRequestor;\n private readonly requestTimeoutMs: number;\n private readonly positionConfirmation:\n ((signal: AbortSignal) => Promise<PositionConfirmationResult>) | undefined;\n\n /** Construct a submitted transaction from a successful gateway response.\n *\n * @example\n * ```ts\n * const transaction = new SubmittedTransaction({\n * method: 'RequestTrade', mode: 'queued', uniqueKey: 'swap-1',\n * transactionId: 'request-tx', result: undefined,\n * dexBackendBaseUrl: 'https://dex.example', httpRequestor,\n * });\n * ```\n */\n constructor(options: {\n method: string;\n uniqueKey: string;\n transactionId: string | null;\n mode: 'sync' | 'queued';\n result: unknown;\n dexBackendBaseUrl: string;\n httpRequestor: HttpRequestor;\n blockNumber?: number | null | undefined;\n requestTimeoutMs?: number | undefined;\n positionConfirmation?:\n ((signal: AbortSignal) => Promise<PositionConfirmationResult>) | undefined;\n }) {\n this.method = options.method;\n this.uniqueKey = options.uniqueKey;\n this.transactionId = options.transactionId;\n this.blockNumber = options.blockNumber ?? null;\n this.mode = options.mode;\n this.result = options.result;\n this.backendBaseUrl = options.dexBackendBaseUrl.replace(/\\/$/u, '');\n this.requestor = options.httpRequestor;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;\n this.positionConfirmation = options.positionConfirmation;\n }\n\n /** Confirm a queued RequestTrade or prove the affected position for a liquidity write.\n *\n * For RequestTrade, calling this method is required to learn the outcome: the queued\n * acknowledgement proves acceptance, not execution.\n *\n * @example\n * ```ts\n * const applied = await submitted.confirm({ initialDelayMs: 3_000 });\n * ```\n */\n public async confirm(options?: ConfirmOptions): Promise<TConfirmation> {\n if (this.method === 'RequestTrade') {\n return this.confirmApplied(options) as Promise<TConfirmation>;\n }\n return this.confirmPosition(options) as Promise<TConfirmation>;\n }\n\n private async confirmApplied(options?: ConfirmOptions): Promise<AppliedTrade> {\n // The AutoApplier waits at least 2 s before applying and the apply lands ~6-8 s after the\n // acknowledgement, so a read at t=0 is a guaranteed 404.\n const schedule = createConfirmationSchedule(options, 3_000);\n await schedule.waitForRead();\n const url = `${this.backendBaseUrl}/v1/chain/apply-results/${encodeURIComponent(this.uniqueKey)}?channel=asset&contract=dex-contract`;\n let lastError: unknown;\n\n while (true) {\n let response: HTTPResponse;\n let body: unknown;\n try {\n response = await requestWithTimeout(\n this.requestor,\n url,\n { method: 'GET' },\n this.requestTimeoutMs,\n );\n body = await readResponseBody(response);\n } catch (error: unknown) {\n lastError = error;\n if (!(await schedule.waitForRead())) break;\n continue;\n }\n if (response.status === 200) {\n return this.readAppliedResult(response, body, url);\n }\n if (response.status === 404 || response.status === 429 || isTransient(response.status)) {\n if (response.status === 429) {\n const retryAfter = readRetryAfter(response);\n if (retryAfter !== undefined) {\n if (!(await schedule.waitForRead(retryAfter))) break;\n continue;\n }\n }\n } else {\n throw new GSwapSDKError(bodyMessage(body), 'CONFIRMATION_FAILED', {\n status: response.status,\n body,\n url,\n });\n }\n if (!(await schedule.waitForRead())) break;\n }\n throw GSwapSDKError.confirmationTimeoutError(this.uniqueKey, lastError);\n }\n\n private readAppliedResult(response: HTTPResponse, body: unknown, url: string): AppliedTrade {\n const record = asRecord(body);\n const status = record?.['Status'];\n const applyTransactionId = readHeader(response, 'x-apply-transaction-id') ?? null;\n const blockNumber = readBlockNumberHeader(response, 'x-apply-block-number') ?? null;\n if (status === 0) {\n throw GSwapSDKError.fromChainError(\n getStringProperty(record, 'ErrorKey') ?? 'CHAIN_ERROR',\n getStringProperty(record, 'Message') ?? 'The chain rejected this trade.',\n {\n uniqueKey: this.uniqueKey,\n applyTransactionId,\n blockNumber,\n status: response.status,\n body,\n url,\n },\n );\n }\n if (status !== 1) throw malformedConfirmation(response, body, url);\n const result = parseTradeExecution(record?.['Data']);\n if (result === undefined) throw malformedConfirmation(response, body, url);\n return {\n uniqueKey: this.uniqueKey,\n transactionId: applyTransactionId,\n blockNumber,\n requestTransactionId: this.transactionId,\n result,\n };\n }\n\n /** Confirm a liquidity write against the position's observable effect.\n *\n * @returns The position after the write, or `null` for a confirmed full close.\n * @example\n * ```ts\n * const position = await submitted.confirm({ timeoutMs: 60_000 });\n * ```\n */\n private async confirmPosition(options?: ConfirmOptions): Promise<Position | null> {\n if (this.positionConfirmation === undefined) throw GSwapSDKError.noWalletAddressError();\n // A liquidity write has already executed when the gateway answers, so the first re-read\n // happens immediately unless the caller asks for a delay.\n const schedule = createConfirmationSchedule(options, 0);\n await schedule.waitForRead();\n while (true) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n try {\n const result = await this.positionConfirmation(controller.signal);\n if (result.confirmed) return result.position;\n } finally {\n clearTimeout(timer);\n }\n if (!(await schedule.waitForRead())) break;\n }\n throw GSwapSDKError.confirmationTimeoutError(this.uniqueKey);\n }\n}\n\n/**\n * Controls timeout and polling behavior for confirmation.\n *\n * - `timeoutMs` (default 60 000): overall deadline, counted from the `confirm()` call and\n * including `initialDelayMs`. At least one read is always made.\n * - `pollIntervalMs` (default 2 000, minimum 500): base interval, doubled with jitter up to 8 s.\n * - `initialDelayMs`: wait before the first read. Defaults to 3 000 for a queued RequestTrade\n * (the AutoApplier needs a few seconds) and 0 for liquidity writes (already executed).\n */\nexport interface ConfirmOptions {\n timeoutMs?: number | undefined;\n pollIntervalMs?: number | undefined;\n initialDelayMs?: number | undefined;\n}\n\ninterface ConfirmationSchedule {\n waitForRead(retryAfterMs?: number): Promise<boolean>;\n}\n\nfunction createConfirmationSchedule(\n options: ConfirmOptions | undefined,\n defaultInitialDelayMs: number,\n): ConfirmationSchedule {\n const timeoutMs = Math.max(0, options?.timeoutMs ?? 60_000);\n const pollIntervalMs = Math.max(500, options?.pollIntervalMs ?? 2_000);\n const initialDelayMs = Math.max(0, options?.initialDelayMs ?? defaultInitialDelayMs);\n const deadline = Date.now() + timeoutMs;\n let firstRead = true;\n let attempt = 0;\n return {\n async waitForRead(retryAfterMs?: number): Promise<boolean> {\n if (firstRead) {\n firstRead = false;\n const remaining = Math.max(0, deadline - Date.now());\n await delay(Math.min(initialDelayMs, remaining));\n return true;\n }\n const backoff = Math.min(8_000, pollIntervalMs * 2 ** Math.min(attempt, 5));\n attempt += 1;\n const waitMs = retryAfterMs === undefined ? jitter(backoff) : retryAfterMs;\n if (Date.now() + waitMs > deadline) return false;\n await delay(waitMs);\n return true;\n },\n };\n}\n\nfunction parseTradeExecution(value: unknown): TradeExecution | undefined {\n const record = asRecord(value);\n if (\n record === undefined ||\n typeof record['token0'] !== 'string' ||\n typeof record['token1'] !== 'string' ||\n typeof record['fee'] !== 'number'\n ) {\n return undefined;\n }\n const optionalFields = [\n 'sell0Qty',\n 'sell1Qty',\n 'buy0Qty',\n 'buy1Qty',\n 'tradingFees',\n 'protocolFees',\n 'totalFees',\n ] as const;\n for (const field of optionalFields) {\n if (field in record && typeof record[field] !== 'string') return undefined;\n }\n return {\n token0: record['token0'],\n token1: record['token1'],\n fee: record['fee'],\n ...Object.fromEntries(\n optionalFields.flatMap((field) =>\n typeof record[field] === 'string' ? [[field, record[field]]] : [],\n ),\n ),\n };\n}\n\nfunction malformedConfirmation(response: HTTPResponse, body: unknown, url: string): GSwapSDKError {\n return new GSwapSDKError(\n 'Transaction confirmation returned a malformed body',\n 'CONFIRMATION_FAILED',\n { status: response.status, body, url },\n );\n}\n\nfunction isTransient(status: number): boolean {\n return status === 500 || status === 502 || status === 503 || status === 504;\n}\n\nfunction bodyMessage(body: unknown): string {\n return (\n getStringProperty(body, 'message') ??\n getStringProperty(body, 'Message') ??\n getStringProperty(getObjectProperty(body, 'error'), 'message') ??\n getStringProperty(getObjectProperty(body, 'error'), 'Message') ??\n (typeof body === 'string' ? body : 'Transaction confirmation failed')\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction delay(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\nfunction jitter(milliseconds: number): number {\n return Math.max(0, Math.round(milliseconds * (0.9 + Math.random() * 0.2)));\n}\n","import type { HttpRequestor, HTTPResponse } from '../types/http_requestor.js';\nimport { getObjectProperty, getStringProperty, GSwapSDKError } from './gswap_sdk_error.js';\nimport { SubmittedTransaction, type PositionConfirmationResult } from './submitted_transaction.js';\nimport {\n readBlockNumberHeader,\n readHeader,\n readResponseBody,\n readRetryAfter,\n requestWithTimeout,\n} from '../utils/transport.js';\nimport type { AppliedTrade, Position } from '../types/v2_results.js';\n\n/** Options for a chain-gateway client. */\nexport interface ChainGatewayOptions {\n dexBackendBaseUrl: string;\n httpRequestor?: HttpRequestor | undefined;\n walletAddress?: string | undefined;\n chainCallTimeoutMs?: number | undefined;\n}\n\n/** Optional attribution and operation-specific confirmation hooks for a write. */\nexport interface ChainSubmitOptions {\n walletAddress?: string | undefined;\n positionConfirmation?: ((signal: AbortSignal) => Promise<PositionConfirmationResult>) | undefined;\n}\n\n/** Thin client for backend-routed v2 writes: synchronous liquidity writes and queued RequestTrade. */\nexport class ChainGateway {\n private readonly requestor: HttpRequestor;\n private readonly walletAddress: string | undefined;\n private readonly chainCallTimeoutMs: number;\n public readonly requestTimeoutMs: number;\n public readonly dexBackendBaseUrl: string;\n\n /** Create a chain gateway client. */\n constructor(options: ChainGatewayOptions) {\n this.dexBackendBaseUrl = trimTrailingSlash(options.dexBackendBaseUrl);\n this.requestor = options.httpRequestor ?? fetch.bind(globalThis);\n this.walletAddress = options.walletAddress;\n this.chainCallTimeoutMs = options.chainCallTimeoutMs ?? 30_000;\n this.requestTimeoutMs = this.chainCallTimeoutMs;\n }\n\n /** Submit a signed v2 DTO through the chain gateway. */\n public async submit(\n method: 'RequestTrade',\n signedBody: Record<string, unknown>,\n options?: ChainSubmitOptions,\n ): Promise<SubmittedTransaction<AppliedTrade>>;\n public async submit(\n method: string,\n signedBody: Record<string, unknown>,\n options?: ChainSubmitOptions,\n ): Promise<SubmittedTransaction<Position | null>>;\n public async submit(\n method: string,\n signedBody: Record<string, unknown>,\n options?: ChainSubmitOptions,\n ): Promise<SubmittedTransaction> {\n // The synchronous swap was removed from the contract and from this SDK. This is the only\n // place the retired name may appear in the write path; the class guard in\n // tests/foundation.test.ts pins that nothing signs or submits it.\n if (method === 'Trade') {\n throw new GSwapSDKError(\n 'The synchronous Trade method was removed; swaps are queued through RequestTrade.',\n 'METHOD_NOT_SUPPORTED',\n { method },\n );\n }\n const url = `${this.dexBackendBaseUrl}/v1/chain/asset/dex-contract/${method}`;\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n const walletAddress = options?.walletAddress ?? this.walletAddress;\n if (walletAddress !== undefined) headers['X-Wallet-Address'] = walletAddress;\n let response: HTTPResponse;\n try {\n response = await requestWithTimeout(\n this.requestor,\n url,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(signedBody),\n },\n this.chainCallTimeoutMs,\n );\n } catch (error: unknown) {\n if (error instanceof GSwapSDKError && error.code === 'REQUEST_TIMEOUT') {\n throw new GSwapSDKError(\n 'The submission outcome is unknown because the gateway request timed out. Confirm before retrying.',\n 'SUBMISSION_OUTCOME_UNKNOWN',\n { uniqueKey: getStringProperty(signedBody, 'uniqueKey') ?? '', cause: error },\n );\n }\n throw error;\n }\n const body = await readResponseBody(response);\n\n if (!response.ok) {\n throw gatewayError(response, body, url);\n }\n\n const envelope = asRecord(body);\n const data = asRecord(envelope?.['data'] ?? envelope?.['Data']);\n if (data === undefined) {\n throw invalidGatewayResponse(response, body, url, 'Expected a data object.');\n }\n\n const transactionId = getStringProperty(data, 'transactionId');\n const mode = getStringProperty(data, 'mode');\n const rawTransactionId = data['transactionId'];\n const bodyBlockNumber = data['blockNumber'];\n const invalidModeMessage =\n 'Gateway response must contain data.mode=\"sync\" with data.result, or data.mode=\"queued\".';\n if (mode !== 'sync' && mode !== 'queued') {\n throw invalidGatewayResponse(response, body, url, invalidModeMessage);\n }\n if (\n ('transactionId' in data && typeof rawTransactionId !== 'string') ||\n (bodyBlockNumber !== undefined && bodyBlockNumber !== null && !isBlockNumber(bodyBlockNumber))\n ) {\n throw invalidGatewayResponse(response, body, url, invalidModeMessage);\n }\n if (method === 'RequestTrade' && mode === 'sync') {\n throw invalidGatewayResponse(\n response,\n body,\n url,\n 'The gateway executed RequestTrade synchronously, which this SDK refuses; RequestTrade must be queued.',\n );\n }\n if (method === 'RequestTrade' && mode === 'queued') {\n const signedUniqueKey = getStringProperty(signedBody, 'uniqueKey');\n if (\n 'uniqueKey' in data &&\n (typeof data['uniqueKey'] !== 'string' || data['uniqueKey'] !== signedUniqueKey)\n ) {\n throw invalidGatewayResponse(\n response,\n body,\n url,\n 'Gateway response data.uniqueKey must match the signed RequestTrade uniqueKey.',\n );\n }\n } else if (mode === 'queued' || !('result' in data)) {\n throw invalidGatewayResponse(response, body, url, invalidModeMessage);\n }\n\n // Only synchronous writes carry an executed chain result in the gateway response.\n if (mode === 'sync') {\n const embeddedResult = asRecord(data['result']);\n if (embeddedResult !== undefined) {\n const resultStatus = embeddedResult['Status'];\n if (resultStatus !== undefined && resultStatus !== 1) {\n throw GSwapSDKError.fromChainError(\n getStringProperty(embeddedResult, 'ErrorKey') ?? 'CHAIN_ERROR',\n getStringProperty(embeddedResult, 'Message') ?? 'The chain rejected this write.',\n { status: response.status, body, url },\n );\n }\n }\n }\n\n const uniqueKey = getStringProperty(signedBody, 'uniqueKey') ?? '';\n const headerTransactionId = readHeader(response, 'x-transaction-id');\n const resolvedTransactionId =\n transactionId === undefined || transactionId === '' ? headerTransactionId : transactionId;\n const blockNumber: number | undefined =\n bodyBlockNumber === null || bodyBlockNumber === undefined\n ? readBlockNumberHeader(response)\n : isBlockNumber(bodyBlockNumber)\n ? bodyBlockNumber\n : undefined;\n return new SubmittedTransaction({\n method,\n uniqueKey,\n transactionId:\n resolvedTransactionId === undefined || resolvedTransactionId === ''\n ? null\n : resolvedTransactionId,\n blockNumber: blockNumber ?? null,\n mode,\n result: mode === 'queued' ? undefined : data['result'],\n dexBackendBaseUrl: this.dexBackendBaseUrl,\n httpRequestor: this.requestor,\n requestTimeoutMs: this.chainCallTimeoutMs,\n ...(options?.positionConfirmation === undefined\n ? {}\n : { positionConfirmation: options.positionConfirmation }),\n });\n }\n\n /** Expose the requestor for sibling read services that share this gateway transport. */\n public get httpRequestor(): HttpRequestor {\n return this.requestor;\n }\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/$/u, '');\n}\n\nfunction invalidGatewayResponse(\n response: HTTPResponse,\n body: unknown,\n url: string,\n message: string,\n): GSwapSDKError {\n return new GSwapSDKError(message, 'INVALID_GATEWAY_RESPONSE', {\n status: response.status,\n body,\n url,\n });\n}\n\nfunction gatewayError(response: HTTPResponse, body: unknown, url: string): GSwapSDKError {\n const object = asRecord(body);\n const nested = getObjectProperty(body, 'error');\n const code =\n getStringProperty(object, 'code') ??\n getStringProperty(nested, 'code') ??\n getStringProperty(nested, 'ErrorKey') ??\n 'HTTP_ERROR';\n const message =\n getStringProperty(object, 'message') ??\n getStringProperty(nested, 'message') ??\n getStringProperty(nested, 'Message') ??\n (typeof body === 'string' ? body : `Gateway request failed with HTTP ${response.status}`);\n const retryAfterMs = response.status === 429 ? readRetryAfter(response) : undefined;\n if (code === 'HTTP_ERROR') {\n return new GSwapSDKError(message, code, { status: response.status, body, url });\n }\n return GSwapSDKError.fromGatewayBounce(code, message, response.status, retryAfterMs);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction isBlockNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0;\n}\n","import debug from 'debug';\n\nexport const debugLog = debug('GSWAP_SDK');\n","declare const __GSWAP_SDK_VERSION__: string | undefined;\n\n/** Package version embedded by tsup, with a source-test fallback. */\nexport const SDK_VERSION =\n typeof __GSWAP_SDK_VERSION__ === 'string' ? __GSWAP_SDK_VERSION__ : '1.0.0-rc.3';\n","import type { HttpRequestor } from '../types/http_requestor.js';\nimport { debugLog } from '../utils/debug.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport { readResponseBody, requestWithTimeout } from '../utils/transport.js';\nimport { SDK_VERSION } from '../version.js';\n\nexport class HttpClient {\n /** Create an HTTP client around fetch or an injected requestor. */\n constructor(\n private readonly httpRequestor: HttpRequestor = fetch,\n private readonly timeoutMs = 30_000,\n ) {}\n\n private async sendRequest<TReturnType>(\n method: 'POST' | 'GET',\n baseUrl: string,\n basePath: string,\n endpoint: string,\n body?: unknown,\n options?: Pick<RequestInit, 'signal'>,\n ): Promise<TReturnType> {\n const url = `${baseUrl}${basePath}${endpoint}`;\n debugLog(`Sending request to ${url} with body:`, body);\n\n const response = await requestWithTimeout(\n this.httpRequestor,\n url,\n {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': `GalaChain-SDK/${SDK_VERSION}`,\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n ...(options?.signal === undefined ? {} : { signal: options.signal }),\n },\n this.timeoutMs,\n );\n\n if (!response.ok) {\n throw await GSwapSDKError.fromErrorResponse(url, response);\n }\n\n const json = await readResponseBody(response);\n debugLog(`Response from ${baseUrl}${basePath}${endpoint}:`, json);\n\n return json as TReturnType;\n }\n\n /** Send a JSON POST request and decode its response. */\n async sendPostRequest<TReturnType>(\n baseUrl: string,\n basePath: string,\n endpoint: string,\n body: unknown,\n ): Promise<TReturnType> {\n return this.sendRequest('POST', baseUrl, basePath, endpoint, body);\n }\n\n /** Send a GET request with URL-encoded query parameters and decode its response. */\n async sendGetRequest<TReturnType>(\n baseUrl: string,\n basePath: string,\n endpoint: string,\n params?: Record<string, string>,\n options?: Pick<RequestInit, 'signal'>,\n ): Promise<TReturnType> {\n const searchParams = params ? new URLSearchParams(params) : undefined;\n const endpointWithParams = searchParams ? `${endpoint}?${searchParams.toString()}` : endpoint;\n\n return this.sendRequest('GET', baseUrl, basePath, endpointWithParams, undefined, options);\n }\n}\n","import { GSwapSDKError } from '../classes/gswap_sdk_error.js';\nimport type { GalaChainTokenClassKey } from '../types/token.js';\n\n/** A symbol or a GalaChain token class key accepted by v2 operations. */\nexport type TokenRef = string | GalaChainTokenClassKey;\n\n/** Return two trading symbols in the contract's plain-string order. */\nexport function orderSymbols(a: string, b: string): [string, string] {\n return a < b ? [a, b] : [b, a];\n}\n\n/** Read an ordered symbol pair from a tuple or object returned by a boundary helper.\n *\n * @example\n * ```ts\n * const pair = readOrderedSymbols(['GALA', 'GUSDC']);\n * console.log(pair.token0);\n * ```\n */\nexport function readOrderedSymbols(value: unknown): { token0: string; token1: string } {\n if (Array.isArray(value) && value.length >= 2) {\n const token0 = (value as unknown[])[0];\n const token1 = (value as unknown[])[1];\n if (typeof token0 === 'string' && typeof token1 === 'string') return { token0, token1 };\n }\n if (typeof value === 'object' && value !== null) {\n const record = value as Record<string, unknown>;\n const token0 = record['token0'];\n const token1 = record['token1'];\n if (typeof token0 === 'string' && typeof token1 === 'string') return { token0, token1 };\n }\n throw new GSwapSDKError('Unable to order trading symbols.', 'VALIDATION_ERROR', { value });\n}\n\n/** Return the `$`-joined composite key used by GalaChain object identities. */\nexport function compositeKeyOf(token: GalaChainTokenClassKey): string {\n return [token.collection, token.category, token.type, token.additionalKey].join('$');\n}\n\n/** Parse a pipe- or dollar-separated token class key. */\nexport function parseTokenClassKey(tokenClassKey: TokenRef): GalaChainTokenClassKey {\n if (typeof tokenClassKey === 'object') {\n return {\n collection: tokenClassKey.collection,\n category: tokenClassKey.category,\n type: tokenClassKey.type,\n additionalKey: tokenClassKey.additionalKey,\n };\n }\n\n const parts = tokenClassKey.includes('|') ? tokenClassKey.split('|') : tokenClassKey.split('$');\n if (parts.length !== 4 || parts.some((part) => part.length === 0)) {\n throw new GSwapSDKError(\n 'Invalid token class key: expected four non-empty parts',\n 'VALIDATION_ERROR',\n {\n tokenClassKey,\n },\n );\n }\n\n const [collection, category, type, additionalKey] = parts;\n return {\n collection: collection as string,\n category: category as string,\n type: type as string,\n additionalKey: additionalKey as string,\n };\n}\n","import type { FEE_TIER } from '../types/fees.js';\nimport type { CompositePool, PoolInfo, PoolListInfo, Slot0 } from '../types/v2_results.js';\nimport { orderSymbols, readOrderedSymbols, type TokenRef } from '../utils/ordering.js';\nimport type { ChainGateway } from './gateway.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport { HttpClient } from './http_client.js';\nimport type { Symbols } from './symbols.js';\nimport { validateFee } from '../utils/validation.js';\n\ninterface BackendEnvelope<T> {\n data: T;\n}\n\ntype PoolGateway = Pick<ChainGateway, 'httpRequestor' | 'dexBackendBaseUrl'> & {\n requestTimeoutMs?: number | undefined;\n};\ntype PoolSymbols = Pick<Symbols, 'resolve'>;\n\n/** Read-only pool and current-price access for the current GalaChainDex contract. */\nexport class Pools {\n /**\n * Creates a pool service.\n *\n * @example\n * ```ts\n * const pools = new Pools(gateway, symbols);\n * ```\n */\n constructor(\n private readonly gateway: PoolGateway,\n private readonly symbols: PoolSymbols,\n ) {\n this.http = new HttpClient(gateway.httpRequestor, gateway.requestTimeoutMs ?? 30_000);\n }\n\n private readonly http: HttpClient;\n\n /**\n * Fetches every current-contract pool from the swap backend.\n *\n * @example\n * ```ts\n * const pools = await service.getPools();\n * console.log(pools.length);\n * ```\n */\n public async getPools(options?: { signal?: AbortSignal | undefined }): Promise<PoolListInfo[]> {\n const response = await this.http.sendGetRequest<BackendEnvelope<unknown>>(\n this.gateway.dexBackendBaseUrl,\n '/v2/trade',\n '/pools',\n undefined,\n options?.signal === undefined ? undefined : { signal: options.signal },\n );\n if (!Array.isArray(response.data) || !response.data.every(isPoolListInfo)) {\n throw new GSwapSDKError('Backend returned an invalid pool list.', 'INVALID_CHAIN_RESPONSE', {\n data: response.data,\n });\n }\n return response.data;\n }\n\n /**\n * Fetches one pool from the backend, preserving whether the request order was flipped.\n *\n * @example\n * ```ts\n * const pool = await service.getPool('GUSDC', 'GALA', 3000);\n * console.log(pool.flippedFromRequest);\n * ```\n */\n public async getPool(token0: TokenRef, token1: TokenRef, fee: FEE_TIER): Promise<PoolInfo> {\n validateFee(fee);\n return this.getBackend<PoolInfo>('/pool', await this.backendParams(token0, token1, fee));\n }\n\n /**\n * Fetches the current sqrt price, price, and tick for one pool.\n *\n * @example\n * ```ts\n * const slot0 = await service.getSlot0('GALA', 'GUSDC', 3000);\n * console.log(slot0.tick);\n * ```\n */\n public async getSlot0(token0: TokenRef, token1: TokenRef, fee: FEE_TIER): Promise<Slot0> {\n validateFee(fee);\n return this.getBackend<Slot0>('/slot0', await this.backendParams(token0, token1, fee));\n }\n\n /**\n * Fetches the complete chain composite pool snapshot, in canonical symbol order.\n *\n * @example\n * ```ts\n * const composite = await service.getCompositePool('GALA', 'GUSDC', 3000);\n * console.log(composite.positions?.length ?? 0);\n * ```\n */\n public async getCompositePool(\n token0: TokenRef,\n token1: TokenRef,\n fee: FEE_TIER,\n ): Promise<CompositePool> {\n validateFee(fee);\n const first = await resolveSymbol(this.symbols, token0);\n const second = await resolveSymbol(this.symbols, token1);\n const ordered = readOrderedSymbols(orderSymbols(first, second));\n return this.getBackend<CompositePool>('/composite-pool', {\n token0: ordered.token0,\n token1: ordered.token1,\n fee: String(fee),\n });\n }\n\n private async backendParams(\n token0: TokenRef,\n token1: TokenRef,\n fee: FEE_TIER,\n ): Promise<Record<string, string>> {\n return {\n token0: await resolveSymbol(this.symbols, token0),\n token1: await resolveSymbol(this.symbols, token1),\n fee: String(fee),\n };\n }\n\n private async getBackend<T>(endpoint: string, params: Record<string, string>): Promise<T> {\n try {\n const response = await this.http.sendGetRequest<BackendEnvelope<T>>(\n this.gateway.dexBackendBaseUrl,\n '/v2/trade',\n endpoint,\n params,\n );\n return response.data;\n } catch (error: unknown) {\n if (error instanceof GSwapSDKError) throw error;\n throw new GSwapSDKError('Pool request failed.', 'HTTP_ERROR', { cause: error });\n }\n }\n}\n\nasync function resolveSymbol(symbols: PoolSymbols, token: TokenRef): Promise<string> {\n const resolved = await symbols.resolve(token);\n if (resolved.symbol.length > 0) return resolved.symbol;\n throw new GSwapSDKError('Token could not be resolved to a trading symbol.', 'SYMBOL_NOT_FOUND', {\n token,\n });\n}\n\nfunction isPoolListInfo(value: unknown): value is PoolListInfo {\n if (typeof value !== 'object' || value === null) return false;\n const row = value as Record<string, unknown>;\n const requiredNumbers = ['fee', 'tickSpacing', 'protocolFees', 'tradingFees'];\n const optionalStrings = [\n 'token0CompositeKey',\n 'token1CompositeKey',\n 'creator',\n 'price',\n 'sqrtPrice',\n 'token0Tvl',\n 'token1Tvl',\n ];\n const optionalNumbers = [\n 'tick',\n 'tvlUsd',\n 'volume1d',\n 'volume7d',\n 'volume30d',\n 'trades1d',\n 'fee24h',\n 'apr1d',\n 'token0Price',\n 'token1Price',\n ];\n return (\n row['contractVersion'] === 'v2' &&\n typeof row['token0'] === 'string' &&\n typeof row['token1'] === 'string' &&\n typeof row['poolName'] === 'string' &&\n typeof row['poolRef'] === 'string' &&\n requiredNumbers.every((key) => isFiniteNumber(row[key])) &&\n optionalStrings.every((key) => isOptionalString(row[key])) &&\n optionalNumbers.every((key) => isOptionalNumber(row[key]))\n );\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isOptionalString(value: unknown): value is string | undefined {\n return value === undefined || typeof value === 'string';\n}\n\nfunction isOptionalNumber(value: unknown): value is number | undefined {\n return value === undefined || isFiniteNumber(value);\n}\n","import BigNumber from 'bignumber.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport type { ChainGateway, ChainSubmitOptions } from './gateway.js';\nimport type { PositionConfirmationResult, SubmittedTransaction } from './submitted_transaction.js';\nimport { HttpClient } from './http_client.js';\nimport type { GalaChainSigner } from './signers.js';\nimport type { Symbols } from './symbols.js';\nimport type { NumericAmount, PriceIn } from '../types/amounts.js';\nimport type { FEE_TIER } from '../types/fees.js';\nimport { TICK_SPACING_BY_FEE } from '../types/fees.js';\nimport type {\n AddLiquidityDTO,\n CollectPositionFeesDTO,\n CreatePoolDTO,\n RemoveLiquidityDTO,\n} from '../types/v2_dtos.js';\nimport type {\n AddLiquidityEstimate,\n Position,\n RemoveLiquidityEstimate,\n} from '../types/v2_results.js';\nimport { type TokenRef, compositeKeyOf, parseTokenClassKey } from '../utils/ordering.js';\nimport { validateFee, validateNumericAmount } from '../utils/validation.js';\nimport { alignTickDown, alignTickUp, assertTickRange, tickFromPrice } from '../utils/ticks.js';\n\ntype PositionGateway = Pick<ChainGateway, 'httpRequestor' | 'dexBackendBaseUrl'> & {\n submit: (\n method: string,\n signedBody: Record<string, unknown>,\n options?: ChainSubmitOptions,\n ) => Promise<SubmittedTransaction<Position | null>>;\n requestTimeoutMs?: number | undefined;\n};\ntype PositionSymbols = Pick<Symbols, 'resolve' | 'orderPair'> & { invalidate?: () => void };\n\ninterface BackendEnvelope<TData> {\n data: TData;\n}\n\ninterface PositionWire {\n token0CompositeKey?: string;\n token1CompositeKey?: string;\n token0Symbol: string;\n token1Symbol: string;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n liquidity: string;\n amount0: string;\n amount1: string;\n inRange: boolean;\n owner: string;\n currentTick?: number;\n sqrtPrice?: string;\n pool?: string;\n poolRef?: string;\n fees0?: string;\n fees1?: string;\n}\n\ninterface AddLiquidityEstimateWire {\n amount0: string;\n amount1: string;\n liquidity: string;\n token0Symbol: string;\n token1Symbol: string;\n tickLower: number;\n tickUpper: number;\n amountIsCanonicalToken0: boolean;\n}\n\ninterface RemoveLiquidityEstimateWire {\n amount0: string;\n amount1: string;\n}\n\ninterface ResolvedCreateToken {\n symbol: string;\n classKey: ReturnType<typeof parseTokenClassKey>;\n}\n\ninterface PositionIdentity {\n token0: string;\n token1: string;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n}\n\n/** Tells `submit()` how to prove a write's own effect for `SubmittedTransaction.confirm()`. */\ntype PositionSubmitConfirmation =\n | { kind: 'add' | 'removePartial' | 'removeFull' | 'collect'; identity: PositionIdentity }\n | { kind: 'createPool'; token0: string; token1: string; fee: FEE_TIER };\n\n/**\n * Manages current-contract concentrated-liquidity positions.\n *\n * @example\n * ```typescript\n * const positions = gSwap.positions;\n * const mine = await positions.getUserPositions('client|012345678901234567890123');\n * console.log(mine.length);\n * ```\n */\nexport class Positions {\n constructor(\n private readonly gateway: PositionGateway,\n private readonly symbols: PositionSymbols,\n private readonly signer?: GalaChainSigner,\n private readonly walletAddress?: string,\n ) {\n this.http = new HttpClient(gateway.httpRequestor, gateway.requestTimeoutMs ?? 30_000);\n }\n\n private readonly http: HttpClient;\n\n /**\n * Gets all current-contract positions owned by an address.\n *\n * @param owner - GalaChain owner identity.\n * @returns Enriched positions from the v2 trade backend.\n * @example\n * ```typescript\n * const positions = await gSwap.positions.getUserPositions('client|012345678901234567890123');\n * ```\n */\n async getUserPositions(owner: string): Promise<Position[]> {\n const response = await this.get<PositionWire[]>('/positions', { user: owner });\n return response.data.map((position) => this.mapPosition(position));\n }\n\n /**\n * Gets one position, normalizing a caller-supplied reversed pair to canonical symbol order.\n * Reversed pairs also invert the price axis, so `[lower, upper]` becomes `[-upper, -lower]`.\n *\n * @param args - Pair, owner, fee, and position tick range.\n * @returns The position, or `null` when the backend returns 404.\n * @example\n * ```typescript\n * const position = await gSwap.positions.getPosition({\n * token0: 'GALA', token1: 'GUSDC', owner: 'client|012345678901234567890123',\n * fee: 3000, tickLower: -19200, tickUpper: 12000,\n * });\n * ```\n */\n async getPosition(\n args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n owner: string;\n tickLower: number;\n tickUpper: number;\n },\n signal?: AbortSignal,\n ): Promise<Position | null> {\n const pair = await this.symbols.orderPair(args.token0, args.token1);\n const ticks = this.canonicalTicks(args.tickLower, args.tickUpper, pair.flipped);\n const response = await this.getNullable<PositionWire>(\n '/position',\n {\n token0: pair.token0.symbol,\n token1: pair.token1.symbol,\n fee: `${args.fee}`,\n owner: args.owner,\n tickLower: `${ticks.tickLower}`,\n tickUpper: `${ticks.tickUpper}`,\n },\n signal,\n );\n return response === null ? null : this.mapPosition(response.data);\n }\n\n /**\n * Estimates the other token amount and resulting liquidity for a deposit.\n *\n * @param args - Pair, tick range, deposit amount, and the amount's caller-side token index.\n * @returns Backend liquidity estimate.\n * @example\n * ```typescript\n * const estimate = await gSwap.positions.estimateAddLiquidity({\n * token0: 'GALA', token1: 'GUSDC', fee: 3000,\n * tickLower: -19200, tickUpper: 12000, amount: '100', amountIsToken0: true,\n * });\n * ```\n */\n async estimateAddLiquidity(args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n amount: NumericAmount;\n amountIsToken0: boolean;\n }): Promise<AddLiquidityEstimate> {\n validateNumericAmount(args.amount, 'amount');\n const response = await this.get<AddLiquidityEstimateWire>('/add-liq-estimate', {\n token0: this.requestToken(args.token0),\n token1: this.requestToken(args.token1),\n fee: `${args.fee}`,\n tickLower: `${args.tickLower}`,\n tickUpper: `${args.tickUpper}`,\n amount: new BigNumber(args.amount).toFixed(),\n amountIsToken0: String(args.amountIsToken0),\n });\n return response.data;\n }\n\n /**\n * Estimates token amounts released by burning liquidity.\n *\n * @param args - Pair, tick range, fee tier, and liquidity quantity.\n * @returns Estimated token0 and token1 quantities.\n * @example\n * ```typescript\n * const estimate = await gSwap.positions.estimateRemoveLiquidity({\n * token0: 'GALA', token1: 'GUSDC', fee: 3000,\n * tickLower: -19200, tickUpper: 12000, liquidity: '1000',\n * });\n * ```\n */\n async estimateRemoveLiquidity(args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n liquidity: NumericAmount;\n }): Promise<RemoveLiquidityEstimate> {\n validateNumericAmount(args.liquidity, 'liquidity');\n const response = await this.get<RemoveLiquidityEstimateWire>('/remove-liq-estimate', {\n token0: this.requestToken(args.token0),\n token1: this.requestToken(args.token1),\n fee: `${args.fee}`,\n tickLower: `${args.tickLower}`,\n tickUpper: `${args.tickUpper}`,\n liquidity: new BigNumber(args.liquidity).toFixed(),\n });\n return response.data;\n }\n\n /**\n * Adds liquidity using an explicit tick range. Exactly one canonical deposit field is emitted.\n *\n * @param args - Pair, fee, range, deposit amount, and caller-side token index.\n * @returns The synchronously submitted transaction.\n * @example\n * ```typescript\n * const tx = await gSwap.positions.addLiquidityByTicks({\n * token0: 'GALA', token1: 'GUSDC', fee: 3000,\n * tickLower: -19200, tickUpper: 12000, amount: '100', amountIsToken0: true,\n * });\n * await tx.confirm();\n * ```\n */\n async addLiquidityByTicks(args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n amount: NumericAmount;\n amountIsToken0: boolean;\n }) {\n validateFee(args.fee);\n const pair = await this.symbols.orderPair(args.token0, args.token1);\n const ticks = this.canonicalTicks(args.tickLower, args.tickUpper, pair.flipped);\n assertTickRange(ticks.tickLower, ticks.tickUpper, args.fee);\n validateNumericAmount(args.amount, 'amount');\n const amount = new BigNumber(args.amount).toFixed();\n const dto: AddLiquidityDTO = {\n token0: pair.token0.symbol,\n token1: pair.token1.symbol,\n fee: args.fee,\n tickLower: ticks.tickLower,\n tickUpper: ticks.tickUpper,\n uniqueKey: this.uniqueKey(),\n ...(pair.flipped !== args.amountIsToken0\n ? { depositQuantityToken0: amount }\n : { depositQuantityToken1: amount }),\n };\n return this.submit('AddLiquidity', dto as unknown as Record<string, unknown>, {\n kind: 'add',\n identity: {\n token0: pair.token0.symbol,\n token1: pair.token1.symbol,\n fee: args.fee,\n tickLower: ticks.tickLower,\n tickUpper: ticks.tickUpper,\n },\n });\n }\n\n /**\n * Adds liquidity from prices, flooring the lower tick and ceiling the upper tick to fee spacing.\n * The resulting range is therefore no narrower than the requested price interval.\n *\n * @param args - Pair, fee, price range, deposit amount, and caller-side token index.\n * @returns The synchronously submitted transaction.\n * @example\n * ```typescript\n * const tx = await gSwap.positions.addLiquidityByPrice({\n * token0: 'GALA', token1: 'GUSDC', fee: 3000,\n * minPrice: '0.14', maxPrice: '0.16', amount: '100', amountIsToken0: true,\n * });\n * ```\n */\n async addLiquidityByPrice(args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n minPrice: PriceIn;\n maxPrice: PriceIn;\n amount: NumericAmount;\n amountIsToken0: boolean;\n }) {\n validateFee(args.fee);\n this.rejectNumber(args.minPrice, 'minPrice');\n this.rejectNumber(args.maxPrice, 'maxPrice');\n const minPrice = new BigNumber(args.minPrice);\n const maxPrice = new BigNumber(args.maxPrice);\n if (\n !minPrice.isFinite() ||\n !maxPrice.isFinite() ||\n minPrice.isLessThanOrEqualTo(0) ||\n maxPrice.isLessThanOrEqualTo(0)\n ) {\n throw new GSwapSDKError('Price bounds must be finite and positive.', 'VALIDATION_ERROR');\n }\n if (minPrice.isGreaterThan(maxPrice)) {\n throw new GSwapSDKError(\n 'minPrice must be less than or equal to maxPrice.',\n 'VALIDATION_ERROR',\n );\n }\n const spacing = this.tickSpacing(args.fee);\n const tickLower = alignTickDown(tickFromPrice(minPrice), spacing);\n const tickUpper = alignTickUp(tickFromPrice(maxPrice), spacing);\n return this.addLiquidityByTicks({\n token0: args.token0,\n token1: args.token1,\n fee: args.fee,\n tickLower,\n tickUpper,\n amount: args.amount,\n amountIsToken0: args.amountIsToken0,\n });\n }\n\n /**\n * Removes liquidity by withdrawing at most one canonical token quantity.\n * Omitting both amounts closes the position and sweeps all accrued fees.\n *\n * @param args - Pair, fee, range, and optional caller-side withdrawal amount.\n * @returns The synchronously submitted transaction.\n * @example\n * ```typescript\n * const tx = await gSwap.positions.removeLiquidity({\n * token0: 'GALA', token1: 'GUSDC', fee: 3000,\n * tickLower: -19200, tickUpper: 12000,\n * });\n * ```\n */\n async removeLiquidity(args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n amount0?: NumericAmount | undefined;\n amount1?: NumericAmount | undefined;\n }) {\n validateFee(args.fee);\n const pair = await this.symbols.orderPair(args.token0, args.token1);\n const ticks = this.canonicalTicks(args.tickLower, args.tickUpper, pair.flipped);\n assertTickRange(ticks.tickLower, ticks.tickUpper, args.fee);\n if (args.amount0 !== undefined && args.amount1 !== undefined) {\n throw new GSwapSDKError('Provide at most one of amount0 or amount1.', 'VALIDATION_ERROR');\n }\n if (args.amount0 !== undefined) validateNumericAmount(args.amount0, 'amount0');\n if (args.amount1 !== undefined) validateNumericAmount(args.amount1, 'amount1');\n const withdrawal =\n args.amount0 !== undefined\n ? pair.flipped\n ? { withdrawalQuantityToken1: new BigNumber(args.amount0).toFixed() }\n : { withdrawalQuantityToken0: new BigNumber(args.amount0).toFixed() }\n : args.amount1 !== undefined\n ? pair.flipped\n ? { withdrawalQuantityToken0: new BigNumber(args.amount1).toFixed() }\n : { withdrawalQuantityToken1: new BigNumber(args.amount1).toFixed() }\n : {};\n const dto: RemoveLiquidityDTO = {\n token0: pair.token0.symbol,\n token1: pair.token1.symbol,\n fee: args.fee,\n tickLower: ticks.tickLower,\n tickUpper: ticks.tickUpper,\n uniqueKey: this.uniqueKey(),\n ...withdrawal,\n };\n const isFullClose = args.amount0 === undefined && args.amount1 === undefined;\n return this.submit('RemoveLiquidity', dto as unknown as Record<string, unknown>, {\n kind: isFullClose ? 'removeFull' : 'removePartial',\n identity: {\n token0: pair.token0.symbol,\n token1: pair.token1.symbol,\n fee: args.fee,\n tickLower: ticks.tickLower,\n tickUpper: ticks.tickUpper,\n },\n });\n }\n\n /**\n * Collects all accrued fees for a position; the contract does not support partial collection.\n *\n * @param args - Pair, fee, and tick range identifying the position.\n * @returns The synchronously submitted transaction.\n * @example\n * ```typescript\n * const tx = await gSwap.positions.collectPositionFees({\n * token0: 'GALA', token1: 'GUSDC', fee: 3000,\n * tickLower: -19200, tickUpper: 12000,\n * });\n * ```\n */\n async collectPositionFees(args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n tickLower: number;\n tickUpper: number;\n }) {\n validateFee(args.fee);\n const pair = await this.symbols.orderPair(args.token0, args.token1);\n const ticks = this.canonicalTicks(args.tickLower, args.tickUpper, pair.flipped);\n assertTickRange(ticks.tickLower, ticks.tickUpper, args.fee);\n const dto: CollectPositionFeesDTO = {\n token0: pair.token0.symbol,\n token1: pair.token1.symbol,\n fee: args.fee,\n tickLower: ticks.tickLower,\n tickUpper: ticks.tickUpper,\n uniqueKey: this.uniqueKey(),\n };\n return this.submit('CollectPositionFees', dto as unknown as Record<string, unknown>, {\n kind: 'collect',\n identity: {\n token0: pair.token0.symbol,\n token1: pair.token1.symbol,\n fee: args.fee,\n tickLower: ticks.tickLower,\n tickUpper: ticks.tickUpper,\n },\n });\n }\n\n /**\n * Creates a pool, resolving registered trading symbols and falling back to class collections.\n * Reversed symbol order inverts the supplied starting price or square-root price.\n *\n * @param args - Token class keys or references, fee, exactly one starting price field, and privacy options.\n * @returns The synchronously submitted transaction.\n * @example\n * ```typescript\n * const tx = await gSwap.positions.createPool({\n * token0: 'GALA|Unit|none|none', token1: 'GUSDC|Unit|none|none', fee: 3000,\n * startingPrice: '0.15',\n * });\n * ```\n */\n async createPool(args: {\n token0: TokenRef;\n token1: TokenRef;\n fee: FEE_TIER;\n startingPrice?: NumericAmount | undefined;\n startingSqrtPrice?: NumericAmount | undefined;\n isPrivate?: boolean | undefined;\n privateAccess?: string[] | undefined;\n }) {\n const hasPrice = args.startingPrice !== undefined;\n const hasSqrtPrice = args.startingSqrtPrice !== undefined;\n if (hasPrice === hasSqrtPrice) {\n throw new GSwapSDKError(\n 'Provide exactly one of startingPrice or startingSqrtPrice.',\n 'VALIDATION_ERROR',\n );\n }\n validateFee(args.fee);\n const [tokenA, tokenB] = await Promise.all([\n this.resolveCreateToken(args.token0),\n this.resolveCreateToken(args.token1),\n ]);\n const flipped = tokenA.symbol > tokenB.symbol;\n const [token0, token1] = flipped ? [tokenB, tokenA] : [tokenA, tokenB];\n const sourcePriceInput = hasPrice\n ? (args.startingPrice as NumericAmount)\n : (args.startingSqrtPrice as NumericAmount);\n this.rejectNumber(sourcePriceInput, hasPrice ? 'startingPrice' : 'startingSqrtPrice');\n const sourcePrice = new BigNumber(sourcePriceInput);\n if (!sourcePrice.isFinite() || sourcePrice.isLessThanOrEqualTo(0)) {\n throw new GSwapSDKError('Starting price must be finite and positive.', 'VALIDATION_ERROR');\n }\n const canonicalPrice = flipped ? new BigNumber(1).dividedBy(sourcePrice) : sourcePrice;\n const dto: CreatePoolDTO = {\n token0Key: token0.classKey,\n token1Key: token1.classKey,\n token0Symbol: token0.symbol,\n token1Symbol: token1.symbol,\n fee: args.fee,\n uniqueKey: this.uniqueKey(),\n ...(hasPrice\n ? { startingPrice: canonicalPrice.toFixed() }\n : { startingSqrtPrice: canonicalPrice.toFixed() }),\n ...(args.isPrivate === undefined ? {} : { isPrivate: args.isPrivate }),\n ...(args.privateAccess === undefined ? {} : { privateAccess: args.privateAccess }),\n };\n const transaction = await this.submit('CreatePool', dto, {\n kind: 'createPool',\n token0: token0.symbol,\n token1: token1.symbol,\n fee: args.fee,\n });\n this.symbols.invalidate?.();\n return transaction;\n }\n\n private async submit(\n method: string,\n dto: Record<string, unknown>,\n confirmation?: PositionSubmitConfirmation,\n ) {\n if (this.signer === undefined) throw GSwapSDKError.noSignerError();\n const signed = await this.signer.signObject(method, dto);\n const submitOptions =\n this.walletAddress === undefined ? {} : { walletAddress: this.walletAddress };\n const owner = this.walletAddress;\n const positionConfirmation = this.buildPositionConfirmation(confirmation, owner);\n const options: ChainSubmitOptions = {\n ...submitOptions,\n ...(positionConfirmation === undefined ? {} : { positionConfirmation }),\n };\n return this.gateway.submit(method, signed, options);\n }\n\n /**\n * Builds a confirmation closure that proves the write's own effect, not just that a\n * position row exists (true before most of these writes run too, for any operation on a\n * pre-existing position — existence alone would false-confirm before the write executes,\n * and would never confirm a full close, whose whole point is that the position stops\n * existing).\n *\n * The \"before\" state is captured lazily, on the confirmation closure's own first poll —\n * not eagerly here in `submit()` — so confirming a write never adds an extra round-trip to\n * the write itself; the cost of establishing the baseline is paid by `confirm()`, only if\n * and when the caller actually asks to confirm.\n */\n private buildPositionConfirmation(\n confirmation: PositionSubmitConfirmation | undefined,\n owner: string | undefined,\n ): ((signal: AbortSignal) => Promise<PositionConfirmationResult>) | undefined {\n if (confirmation === undefined) return undefined;\n\n if (confirmation.kind === 'createPool') {\n const { token0, token1, fee } = confirmation;\n return async (signal) => {\n const pool = await this.getNullable<unknown>(\n '/pool',\n { token0, token1, fee: `${fee}` },\n signal,\n );\n return pool === null ? { confirmed: false } : { confirmed: true, position: null };\n };\n }\n\n if (owner === undefined) return undefined;\n const { kind, identity } = confirmation;\n let baseline: { liquidity: BigNumber; fees: BigNumber } | undefined;\n\n return async (signal) => {\n const current = await this.getPosition({ ...identity, owner }, signal);\n\n if (baseline === undefined) {\n // First poll only establishes the baseline to compare future polls against — it can\n // never itself be the confirmed outcome (nothing has been observed to change yet).\n baseline = {\n liquidity: new BigNumber(current?.liquidity ?? 0),\n fees: new BigNumber(current?.fees0 ?? 0).plus(new BigNumber(current?.fees1 ?? 0)),\n };\n // A full close starting from \"already gone\" (e.g. a retried confirm after the position\n // was already swept) is confirmed immediately rather than waiting for a change that\n // already happened.\n return kind === 'removeFull' && current === null\n ? { confirmed: true, position: null }\n : { confirmed: false };\n }\n\n switch (kind) {\n case 'add':\n return current !== null &&\n new BigNumber(current.liquidity).isGreaterThan(baseline.liquidity)\n ? { confirmed: true, position: current }\n : { confirmed: false };\n case 'removePartial':\n return current !== null && new BigNumber(current.liquidity).isLessThan(baseline.liquidity)\n ? { confirmed: true, position: current }\n : { confirmed: false };\n case 'removeFull':\n return current === null ? { confirmed: true, position: null } : { confirmed: false };\n case 'collect': {\n if (current === null) return { confirmed: false };\n const currentFees = new BigNumber(current.fees0 ?? 0).plus(\n new BigNumber(current.fees1 ?? 0),\n );\n if (currentFees.isLessThan(baseline.fees)) return { confirmed: true, position: current };\n // Nothing to sweep in the first place — a legitimate no-op collect never moves\n // fees, so \"still zero\" is the confirmed outcome, not an unconfirmed one.\n if (baseline.fees.isZero() && currentFees.isZero())\n return { confirmed: true, position: current };\n return { confirmed: false };\n }\n }\n };\n }\n\n private async get<TData>(\n endpoint: string,\n params: Record<string, string>,\n signal?: AbortSignal,\n ): Promise<BackendEnvelope<TData>> {\n return this.http.sendGetRequest<BackendEnvelope<TData>>(\n this.gateway.dexBackendBaseUrl,\n '/v2/trade',\n endpoint,\n params,\n signal === undefined ? undefined : { signal },\n );\n }\n\n private async getNullable<TData>(\n endpoint: string,\n params: Record<string, string>,\n signal?: AbortSignal,\n ): Promise<BackendEnvelope<TData> | null> {\n try {\n return await this.get<TData>(endpoint, params, signal);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n private isNotFound(error: unknown): boolean {\n if (!(error instanceof GSwapSDKError) || error.details === undefined) return false;\n return error.details['status'] === 404;\n }\n\n private mapPosition(position: PositionWire): Position {\n return {\n token0Symbol: position.token0Symbol,\n token1Symbol: position.token1Symbol,\n ...(position.token0CompositeKey === undefined\n ? {}\n : { token0CompositeKey: position.token0CompositeKey }),\n ...(position.token1CompositeKey === undefined\n ? {}\n : { token1CompositeKey: position.token1CompositeKey }),\n fee: position.fee,\n tickLower: position.tickLower,\n tickUpper: position.tickUpper,\n liquidity: position.liquidity,\n amount0: position.amount0,\n amount1: position.amount1,\n inRange: position.inRange,\n ...(position.currentTick === undefined ? {} : { currentTick: position.currentTick }),\n ...(position.sqrtPrice === undefined ? {} : { sqrtPrice: position.sqrtPrice }),\n pool: position.poolRef ?? position.pool ?? '',\n owner: position.owner,\n ...(position.fees0 === undefined ? {} : { fees0: position.fees0 }),\n ...(position.fees1 === undefined ? {} : { fees1: position.fees1 }),\n };\n }\n\n private requestToken(ref: TokenRef): string {\n return typeof ref === 'string' ? ref : compositeKeyOf(ref);\n }\n\n private canonicalTicks(tickLower: number, tickUpper: number, flipped: boolean) {\n return flipped ? { tickLower: -tickUpper, tickUpper: -tickLower } : { tickLower, tickUpper };\n }\n\n private tickSpacing(fee: number): number {\n const spacing = (TICK_SPACING_BY_FEE as Record<number, number>)[fee];\n if (spacing === undefined) {\n throw new GSwapSDKError(`Unsupported fee tier: ${fee}.`, 'VALIDATION_ERROR');\n }\n return spacing;\n }\n\n private rejectNumber(value: unknown, parameterName: string): void {\n if (typeof value === 'number') {\n throw new GSwapSDKError(\n `Invalid ${parameterName}: use a decimal string or BigNumber, not a JavaScript number`,\n 'VALIDATION_ERROR',\n );\n }\n }\n\n private uniqueKey(): string {\n return `gswap-sdk-${globalThis.crypto.randomUUID()}`;\n }\n\n private async resolveCreateToken(ref: TokenRef): Promise<ResolvedCreateToken> {\n try {\n const lookupRef = typeof ref === 'object' ? compositeKeyOf(ref) : ref;\n const resolved = await this.symbols.resolve(lookupRef);\n const suppliedClassKey = this.tryParseClassKey(ref);\n return {\n symbol: resolved.symbol,\n classKey:\n suppliedClassKey ??\n parseTokenClassKey({\n collection: resolved.collection,\n category: resolved.category,\n type: resolved.type,\n additionalKey: resolved.additionalKey,\n }),\n };\n } catch (error: unknown) {\n if (!(error instanceof GSwapSDKError) || error.code !== 'UNKNOWN_TOKEN') {\n throw error;\n }\n let classKey: ReturnType<typeof parseTokenClassKey>;\n try {\n classKey = parseTokenClassKey(ref);\n } catch {\n throw error;\n }\n return { symbol: classKey.collection, classKey };\n }\n }\n\n private tryParseClassKey(ref: TokenRef): ReturnType<typeof parseTokenClassKey> | undefined {\n try {\n return parseTokenClassKey(ref);\n } catch {\n return undefined;\n }\n }\n}\n","import BigNumber from 'bignumber.js';\nimport type { NumericAmount } from '../types/amounts.js';\nimport { ALL_FEE_TIERS } from '../types/fees.js';\nimport type { FEE_TIER } from '../types/fees.js';\nimport type { QuoteResult } from '../types/v2_results.js';\nimport type { TokenRef } from '../utils/ordering.js';\nimport { validateNumericAmount } from '../utils/validation.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport type { HttpClient } from './http_client.js';\nimport type { Symbols } from './symbols.js';\n\ninterface QuoteWire {\n contractVersion: 'v2';\n fee: number;\n amountIn: string;\n amountOut: string;\n currentSqrtPrice?: string;\n newSqrtPrice?: string;\n currentPrice?: string;\n newPrice?: string;\n newTick: number;\n tradingFees: string;\n protocolFees: string;\n totalFees: string;\n feeTokenSymbol: string;\n token0Symbol: string;\n token1Symbol: string;\n tokenInIsToken0: boolean;\n}\n\ninterface BackendEnvelope<T> {\n data: T;\n}\n\ntype QuoteSymbols = Pick<Symbols, 'resolve'>;\n\n/** Read-only quote service backed by the v2 offline quote engine. */\nexport class Quoting {\n /**\n * Creates a quote service.\n *\n * @example\n * ```ts\n * const quoting = new Quoting('https://swap-backend.stage.defi.ovh.gala.com', http, symbols);\n * ```\n */\n constructor(\n private readonly dexBackendBaseUrl: string,\n private readonly http: HttpClient,\n private readonly symbols: QuoteSymbols,\n ) {}\n\n /**\n * Quotes the output for a positive exact-input amount.\n *\n * @example\n * ```ts\n * const quote = await quoting.quoteExactInput('GALA', 'GUSDC', '100');\n * console.log(quote.amountOut);\n * ```\n */\n public async quoteExactInput(\n tokenIn: TokenRef,\n tokenOut: TokenRef,\n amountIn: NumericAmount,\n fee?: FEE_TIER,\n ): Promise<QuoteResult> {\n validateNumericAmount(amountIn, 'amountIn');\n return this.quote(tokenIn, tokenOut, { amountIn: toDecimalString(amountIn) }, fee);\n }\n\n /**\n * Quotes the input for a positive exact-output amount.\n *\n * @example\n * ```ts\n * const quote = await quoting.quoteExactOutput('GALA', 'GUSDC', '10', 3000);\n * console.log(quote.amountIn);\n * ```\n */\n public async quoteExactOutput(\n tokenIn: TokenRef,\n tokenOut: TokenRef,\n amountOut: NumericAmount,\n fee?: FEE_TIER,\n ): Promise<QuoteResult> {\n validateNumericAmount(amountOut, 'amountOut');\n return this.quote(tokenIn, tokenOut, { amountOut: toDecimalString(amountOut) }, fee);\n }\n\n private async quote(\n tokenIn: TokenRef,\n tokenOut: TokenRef,\n amount: { amountIn: string } | { amountOut: string },\n fee?: FEE_TIER,\n ): Promise<QuoteResult> {\n validateOptionalFee(fee);\n\n const tokenInSymbol = await resolveSymbol(this.symbols, tokenIn);\n const tokenOutSymbol = await resolveSymbol(this.symbols, tokenOut);\n const params: Record<string, string> = {\n tokenIn: tokenInSymbol,\n tokenOut: tokenOutSymbol,\n ...amount,\n };\n if (fee !== undefined) params['fee'] = String(fee);\n\n try {\n const response = await this.http.sendGetRequest<BackendEnvelope<QuoteWire>>(\n this.dexBackendBaseUrl,\n '/v2/trade',\n '/quote',\n params,\n );\n return mapQuote(response.data);\n } catch (error: unknown) {\n throw mapQuoteError(error, tokenIn, tokenOut, fee);\n }\n }\n}\n\nfunction mapQuote(value: unknown): QuoteResult {\n if (!isQuoteWire(value)) {\n throw new GSwapSDKError('Backend returned an invalid quote.', 'INVALID_CHAIN_RESPONSE', {\n data: value,\n });\n }\n const wire = value;\n const currentPrice =\n wire.currentPrice !== undefined\n ? new BigNumber(wire.currentPrice)\n : orientPrice(wire.currentSqrtPrice!, wire.tokenInIsToken0);\n const newPrice =\n wire.newPrice !== undefined\n ? new BigNumber(wire.newPrice)\n : orientPrice(wire.newSqrtPrice!, wire.tokenInIsToken0);\n const priceImpact = newPrice.minus(currentPrice).dividedBy(currentPrice);\n\n return {\n contractVersion: wire.contractVersion,\n fee: wire.fee,\n amountIn: wire.amountIn,\n amountOut: wire.amountOut,\n ...(wire.currentSqrtPrice === undefined ? {} : { currentSqrtPrice: wire.currentSqrtPrice }),\n ...(wire.newSqrtPrice === undefined ? {} : { newSqrtPrice: wire.newSqrtPrice }),\n feeTier: wire.fee,\n newTick: wire.newTick,\n tradingFees: wire.tradingFees,\n protocolFees: wire.protocolFees,\n totalFees: wire.totalFees,\n feeTokenSymbol: wire.feeTokenSymbol,\n token0Symbol: wire.token0Symbol,\n token1Symbol: wire.token1Symbol,\n tokenInIsToken0: wire.tokenInIsToken0,\n currentPrice,\n newPrice,\n priceImpact,\n };\n}\n\n// The default BigNumber.DECIMAL_PLACES (20) underflows 1/poolPrice to exactly 0 for a\n// pool price above ~1e20 (a real, in-range price for a low-unit-value token quoted\n// against a high-value one) — 60dp matches the precision ticks.ts's DexMath already\n// uses for this same class of division.\nconst HighPrecision = BigNumber.clone({ DECIMAL_PLACES: 60 });\n\nfunction orientPrice(sqrtPrice: string, tokenInIsToken0: boolean): BigNumber {\n const poolPrice = new HighPrecision(sqrtPrice).pow(2);\n return tokenInIsToken0 ? poolPrice : new HighPrecision(1).dividedBy(poolPrice);\n}\n\nfunction isQuoteWire(value: unknown): value is QuoteWire {\n if (typeof value !== 'object' || value === null) return false;\n const wire = value as Record<string, unknown>;\n const requiredStrings = [\n 'amountIn',\n 'amountOut',\n 'tradingFees',\n 'protocolFees',\n 'totalFees',\n 'feeTokenSymbol',\n 'token0Symbol',\n 'token1Symbol',\n ];\n return (\n wire['contractVersion'] === 'v2' &&\n typeof wire['fee'] === 'number' &&\n Number.isFinite(wire['fee']) &&\n requiredStrings.every((key) => typeof wire[key] === 'string') &&\n typeof wire['newTick'] === 'number' &&\n Number.isInteger(wire['newTick']) &&\n typeof wire['tokenInIsToken0'] === 'boolean' &&\n optionalPositiveDecimal(wire['currentSqrtPrice']) &&\n optionalPositiveDecimal(wire['newSqrtPrice']) &&\n optionalPositiveDecimal(wire['currentPrice']) &&\n optionalPositiveDecimal(wire['newPrice']) &&\n (wire['currentSqrtPrice'] !== undefined || wire['currentPrice'] !== undefined) &&\n (wire['newSqrtPrice'] !== undefined || wire['newPrice'] !== undefined)\n );\n}\n\nfunction optionalPositiveDecimal(value: unknown): boolean {\n if (value === undefined) return true;\n if (typeof value !== 'string') return false;\n try {\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — this validates an untrusted backend field, so an unparseable value\n // must fail validation cleanly (INVALID_CHAIN_RESPONSE), not throw raw.\n const decimal = new BigNumber(value);\n return decimal.isFinite() && decimal.isGreaterThan(0);\n } catch {\n return false;\n }\n}\n\nfunction mapQuoteError(\n error: unknown,\n tokenIn: TokenRef,\n tokenOut: TokenRef,\n fee: FEE_TIER | undefined,\n): GSwapSDKError {\n if (error instanceof GSwapSDKError) {\n const status = readStatus(error.details);\n const message = readMessage(error.details) ?? error.message;\n if (status === 404 || /no pool|no pools|pool does not exist/iu.test(message)) {\n return GSwapSDKError.noPoolAvailableError(tokenIn, tokenOut, fee);\n }\n if (status === 400 && /insufficient liquidity/iu.test(message)) {\n return GSwapSDKError.insufficientLiquidityError(tokenIn, tokenOut, fee);\n }\n return error;\n }\n return new GSwapSDKError('Quote request failed.', 'HTTP_ERROR', {\n cause: error,\n tokenIn,\n tokenOut,\n fee,\n });\n}\n\nfunction readStatus(details: Record<string, unknown> | undefined): number | undefined {\n const status = details?.['status'];\n return typeof status === 'number' ? status : undefined;\n}\n\nfunction readMessage(details: Record<string, unknown> | undefined): string | undefined {\n const direct = details?.['message'];\n if (typeof direct === 'string') return direct;\n const body = details?.['body'];\n if (typeof body !== 'object' || body === null || Array.isArray(body)) return undefined;\n const message = (body as Record<string, unknown>)['message'];\n return typeof message === 'string' ? message : undefined;\n}\n\nfunction validateOptionalFee(fee: FEE_TIER | undefined): void {\n if (fee !== undefined && !ALL_FEE_TIERS.some((tier) => Number(tier) === Number(fee))) {\n throw new GSwapSDKError(`Invalid fee tier: ${fee}`, 'VALIDATION_ERROR', { fee });\n }\n}\n\nfunction toDecimalString(amount: NumericAmount): string {\n return new BigNumber(amount).toFixed();\n}\n\nasync function resolveSymbol(symbols: QuoteSymbols, token: TokenRef): Promise<string> {\n const resolved = await symbols.resolve(token);\n if (resolved.symbol.length > 0) return resolved.symbol;\n throw new GSwapSDKError('Token could not be resolved to a trading symbol.', 'SYMBOL_NOT_FOUND', {\n token,\n });\n}\n","import type { GalaChainTokenClassKey } from '../types/token.js';\nimport type { TradingSymbol } from '../types/v2_results.js';\nimport type { TokenRef } from '../utils/ordering.js';\nimport { compositeKeyOf, orderSymbols, parseTokenClassKey } from '../utils/ordering.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport type { ChainGateway } from './gateway.js';\nimport { HttpClient } from './http_client.js';\n\nconst SYMBOL_CACHE_TTL_MS = 60_000;\n\n/** Symbol registry client for the current GalaChainDex contract. */\nexport class Symbols {\n private cachedSymbols: TradingSymbol[] | undefined;\n private cachedAt = 0;\n private refreshInFlight: Promise<TradingSymbol[]> | undefined;\n\n private readonly http: HttpClient;\n\n /** Create a symbol service backed by the swap backend. */\n constructor(\n private readonly gateway: Pick<ChainGateway, 'httpRequestor' | 'dexBackendBaseUrl'> & {\n requestTimeoutMs?: number | undefined;\n },\n ) {\n this.http = new HttpClient(gateway.httpRequestor, gateway.requestTimeoutMs);\n }\n\n /** List all registered GalaChainDex trading symbols, cached for 60 seconds. */\n public async list(): Promise<TradingSymbol[]> {\n if (this.cachedSymbols !== undefined && Date.now() - this.cachedAt < SYMBOL_CACHE_TTL_MS) {\n return this.cachedSymbols;\n }\n if (this.refreshInFlight !== undefined) return this.refreshInFlight;\n this.refreshInFlight = this.http\n .sendGetRequest<{ data: unknown }>(this.gateway.dexBackendBaseUrl, '/v2/trade', '/symbols')\n .then((response) => parseSymbols(response.data))\n .then((symbols) => {\n this.cachedSymbols = symbols;\n this.cachedAt = Date.now();\n return symbols;\n })\n .finally(() => {\n this.refreshInFlight = undefined;\n });\n return this.refreshInFlight;\n }\n\n /** Invalidate the cached symbol registry after a write changes registration state.\n *\n * @example\n * ```ts\n * gSwap.symbols.invalidate();\n * ```\n */\n public invalidate(): void {\n this.cachedSymbols = undefined;\n this.cachedAt = 0;\n }\n\n /** Force one registry refresh, bypassing the cache.\n *\n * @example\n * ```ts\n * const symbols = await gSwap.symbols.refresh();\n * ```\n */\n public async refresh(): Promise<TradingSymbol[]> {\n this.invalidate();\n // list() would otherwise return an ALREADY in-flight refresh that started before this\n // call (built from pre-invalidation state) — bypassing it too is what makes this\n // actually force a fresh fetch, not just satisfy the cache-freshness check.\n this.refreshInFlight = undefined;\n return this.list();\n }\n\n /** Resolve a symbol or token class key to its registered symbol metadata. */\n public async resolve(ref: TokenRef): Promise<TradingSymbol> {\n let symbols = await this.list();\n const composite =\n typeof ref === 'string'\n ? isCompositeKey(ref)\n ? compositeKeyOf(parseTokenClassKey(ref))\n : undefined\n : compositeKeyOf(ref);\n const resolved = symbols.find(\n (entry) =>\n entry.symbol === ref || (composite !== undefined && compositeKeyOf(entry) === composite),\n );\n if (resolved === undefined) {\n symbols = await this.refresh();\n const refreshed = symbols.find(\n (entry) =>\n entry.symbol === ref || (composite !== undefined && compositeKeyOf(entry) === composite),\n );\n if (refreshed === undefined) throw GSwapSDKError.unknownTokenError(ref);\n return refreshed;\n }\n return resolved;\n }\n\n /** Resolve and put two token references in canonical trading-symbol order. */\n public async orderPair(\n a: TokenRef,\n b: TokenRef,\n ): Promise<{\n token0: TradingSymbol;\n token1: TradingSymbol;\n flipped: boolean;\n }> {\n const [resolvedA, resolvedB] = await Promise.all([this.resolve(a), this.resolve(b)]);\n const [token0Symbol, token1Symbol] = orderSymbols(resolvedA.symbol, resolvedB.symbol);\n return {\n token0: token0Symbol === resolvedA.symbol ? resolvedA : resolvedB,\n token1: token1Symbol === resolvedB.symbol ? resolvedB : resolvedA,\n flipped: token0Symbol !== resolvedA.symbol,\n };\n }\n}\n\nfunction parseSymbols(value: unknown): TradingSymbol[] {\n if (!Array.isArray(value) || !value.every(isTradingSymbol)) {\n throw new GSwapSDKError('Backend returned an invalid symbol list.', 'INVALID_CHAIN_RESPONSE', {\n data: value,\n });\n }\n return value;\n}\n\nfunction isTradingSymbol(value: unknown): value is TradingSymbol {\n if (typeof value !== 'object' || value === null) return false;\n const entry = value as Record<string, unknown>;\n return (\n typeof entry['symbol'] === 'string' &&\n typeof entry['collection'] === 'string' &&\n typeof entry['category'] === 'string' &&\n typeof entry['type'] === 'string' &&\n typeof entry['additionalKey'] === 'string' &&\n typeof entry['decimals'] === 'number' &&\n Number.isInteger(entry['decimals']) &&\n entry['decimals'] >= 0\n );\n}\n\nfunction isCompositeKey(ref: string): boolean {\n return ref.includes('|') || ref.includes('$');\n}\n\n/** Alias exported for callers that use the contract's shorter type name. */\nexport type TokenClassKey = GalaChainTokenClassKey;\n","import BigNumber from 'bignumber.js';\nimport type { NumericAmount } from '../types/amounts.js';\nimport type { FEE_TIER } from '../types/fees.js';\nimport { orderSymbols, readOrderedSymbols, type TokenRef } from '../utils/ordering.js';\nimport { validateFee, validateNumericAmount } from '../utils/validation.js';\nimport type { ChainSubmitOptions } from './gateway.js';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport type { GalaChainSigner } from './signers.js';\nimport { SubmittedTransaction, type ConfirmOptions } from './submitted_transaction.js';\nimport type { AppliedTrade } from '../types/v2_results.js';\nimport type { HttpRequestor } from '../types/http_requestor.js';\nimport type { Symbols } from './symbols.js';\n\n/** The swap backend's apply-results key constraint (`apply-results.dto.ts`). */\nconst UNIQUE_KEY_PATTERN = /^[A-Za-z0-9._:-]{1,128}$/u;\n\nexport type SwapAmount =\n | {\n exactIn: NumericAmount;\n exactOut?: undefined;\n amountOutMinimum?: NumericAmount | undefined;\n amountInMaximum?: undefined;\n }\n | {\n exactIn?: undefined;\n exactOut: NumericAmount;\n amountOutMinimum?: undefined;\n amountInMaximum?: NumericAmount | undefined;\n };\ninterface SwapGateway {\n submit: (\n method: 'RequestTrade',\n signedBody: Record<string, unknown>,\n options?: ChainSubmitOptions,\n ) => Promise<SubmittedTransaction<AppliedTrade>>;\n readonly dexBackendBaseUrl: string;\n readonly httpRequestor: HttpRequestor;\n readonly requestTimeoutMs: number;\n}\ntype SwapSymbols = Pick<Symbols, 'resolve'>;\n\n/** Executes queued current-contract RequestTrade operations through the Chain Gateway. */\nexport class Swaps {\n /**\n * Creates a swap service.\n *\n * @example\n * ```ts\n * const swaps = new Swaps(gateway, symbols, signer, 'client|alice');\n * ```\n */\n constructor(\n private readonly gateway: SwapGateway,\n private readonly symbols: SwapSymbols,\n private readonly signer?: GalaChainSigner,\n private readonly walletAddress?: string,\n ) {}\n\n /**\n * Signs and submits an exact-input or exact-output RequestTrade DTO. The returned transaction\n * is QUEUED; call `await tx.confirm()` to obtain the executed trade or chain rejection.\n *\n * @example\n * ```ts\n * const submitted = await swaps.swap('GALA', 'GUSDC', 3000, {\n * exactIn: '100',\n * amountOutMinimum: '14',\n * });\n * ```\n */\n public async swap(\n tokenIn: TokenRef,\n tokenOut: TokenRef,\n fee: FEE_TIER,\n amount: SwapAmount,\n ): Promise<SubmittedTransaction<AppliedTrade>> {\n validateFee(fee);\n\n const dto = await this.buildRequestTradeDto(tokenIn, tokenOut, fee, amount);\n if (this.signer === undefined) throw GSwapSDKError.noSignerError();\n const signedDto = await this.signer.signObject('RequestTrade', dto);\n const submitOptions =\n this.walletAddress === undefined ? {} : { walletAddress: this.walletAddress };\n return this.gateway.submit('RequestTrade', signedDto, submitOptions);\n }\n\n /**\n * Confirm a swap by its durable `uniqueKey` without resubmitting it. This is the recovery\n * path after a `CONFIRMATION_TIMEOUT`, a `SUBMISSION_OUTCOME_UNKNOWN`, a `409` replay\n * conflict, or a process restart: it reads the same apply-results record that\n * `SubmittedTransaction.confirm()` reads (retained for 7 days) and resolves the applied trade\n * or throws the chain's rejection. The first read happens immediately unless\n * `initialDelayMs` is given.\n *\n * @example\n * ```ts\n * const applied = await swaps.confirmSwap('gswap-sdk-2f1c…');\n * ```\n */\n public async confirmSwap(uniqueKey: string, options?: ConfirmOptions): Promise<AppliedTrade> {\n if (!UNIQUE_KEY_PATTERN.test(uniqueKey)) {\n throw new GSwapSDKError(\n 'uniqueKey must be 1-128 characters of A-Z, a-z, 0-9, \".\", \"_\", \":\" or \"-\".',\n 'VALIDATION_ERROR',\n { uniqueKey },\n );\n }\n const transaction = new SubmittedTransaction<AppliedTrade>({\n method: 'RequestTrade',\n uniqueKey,\n transactionId: null,\n mode: 'queued',\n result: undefined,\n dexBackendBaseUrl: this.gateway.dexBackendBaseUrl,\n httpRequestor: this.gateway.httpRequestor,\n requestTimeoutMs: this.gateway.requestTimeoutMs,\n });\n return transaction.confirm({ initialDelayMs: 0, ...options });\n }\n\n private async buildRequestTradeDto(\n tokenIn: TokenRef,\n tokenOut: TokenRef,\n fee: FEE_TIER,\n amount: SwapAmount,\n ): Promise<Record<string, unknown>> {\n const tokenInSymbol = await resolveSymbol(this.symbols, tokenIn);\n const tokenOutSymbol = await resolveSymbol(this.symbols, tokenOut);\n const ordered = readOrderedSymbols(orderSymbols(tokenInSymbol, tokenOutSymbol));\n const tokenInIsToken0 = tokenInSymbol === ordered.token0;\n\n const dto: Record<string, unknown> = {\n token0: ordered.token0,\n token1: ordered.token1,\n fee,\n uniqueKey: `gswap-sdk-${globalThis.crypto.randomUUID()}`,\n };\n\n if ('exactIn' in amount) {\n const exactIn = amount.exactIn;\n if (exactIn === undefined) {\n throw new GSwapSDKError('exactIn is required for an exact-input swap.', 'VALIDATION_ERROR');\n }\n validateNumericAmount(exactIn, 'exactIn');\n dto[tokenInIsToken0 ? 'sell0Qty' : 'sell1Qty'] = toDecimalString(exactIn);\n if (amount.amountOutMinimum !== undefined) {\n validateNumericAmount(amount.amountOutMinimum, 'amountOutMinimum', true);\n dto['amountOutMinimum'] = toDecimalString(amount.amountOutMinimum);\n }\n } else {\n const exactOut = amount.exactOut;\n if (exactOut === undefined) {\n throw new GSwapSDKError(\n 'exactOut is required for an exact-output swap.',\n 'VALIDATION_ERROR',\n );\n }\n validateNumericAmount(exactOut, 'exactOut');\n dto[tokenInIsToken0 ? 'buy1Qty' : 'buy0Qty'] = toDecimalString(exactOut);\n if (amount.amountInMaximum !== undefined) {\n validateNumericAmount(amount.amountInMaximum, 'amountInMaximum', true);\n dto['amountInMaximum'] = toDecimalString(amount.amountInMaximum);\n }\n }\n return dto;\n }\n}\n\nfunction toDecimalString(amount: NumericAmount): string {\n return new BigNumber(amount).toFixed();\n}\n\nasync function resolveSymbol(symbols: SwapSymbols, token: TokenRef): Promise<string> {\n const resolved = await symbols.resolve(token);\n if (resolved.symbol.length > 0) return resolved.symbol;\n throw new GSwapSDKError('Token could not be resolved to a trading symbol.', 'SYMBOL_NOT_FOUND', {\n token,\n });\n}\n","/** SDK deployment environment. */\nexport type GSwapEnv = 'prod' | 'stage';\n\n/** Backend URL used by one SDK deployment environment. */\nexport interface GSwapEnvironmentConfig {\n dexBackendBaseUrl: string;\n}\n\n/** Built-in GalaSwap deployment environments. */\nexport const GSWAP_ENVIRONMENTS: Readonly<Record<GSwapEnv, GSwapEnvironmentConfig>> = {\n prod: {\n dexBackendBaseUrl: 'https://dex-backend-prod1.defi.gala.com',\n },\n stage: {\n dexBackendBaseUrl: 'https://swap-backend.stage.defi.ovh.gala.com',\n },\n};\n","import { Assets } from './assets.js';\nimport { ChainGateway } from './gateway.js';\nimport { HttpClient } from './http_client.js';\nimport { Pools } from './pools.js';\nimport { Positions } from './positions.js';\nimport { Quoting } from './quoting.js';\nimport type { GalaChainSigner } from './signers.js';\nimport { Symbols } from './symbols.js';\nimport { Swaps } from './swaps.js';\nimport type { HttpRequestor } from '../types/http_requestor.js';\nimport type { GSwapEnv } from '../types/env.js';\nimport { GSWAP_ENVIRONMENTS } from '../types/env.js';\n\n/** Options for constructing a backend-routed SDK client. */\nexport interface GSwapOptions {\n signer?: GalaChainSigner | undefined;\n walletAddress?: string | undefined;\n env?: GSwapEnv | undefined;\n dexBackendBaseUrl?: string | undefined;\n httpRequestor?: HttpRequestor | undefined;\n chainCallTimeoutMs?: number | undefined;\n}\n\n/** Main entry point for the current GalaChainDex SDK. */\nexport class GSwap {\n public readonly dexBackendBaseUrl: string;\n public readonly chainCallTimeoutMs: number;\n public readonly signer: GalaChainSigner | undefined;\n public readonly walletAddress: string | undefined;\n public readonly gateway: ChainGateway;\n public readonly symbols: Symbols;\n public readonly quoting: Quoting;\n public readonly pools: Pools;\n public readonly positions: Positions;\n public readonly swaps: Swaps;\n public readonly assets: Assets;\n\n /**\n * Create an SDK client for prod or stage.\n *\n * @example\n * ```typescript\n * const gSwap = new GSwap({ env: 'stage' });\n * const symbols = await gSwap.symbols.list();\n * ```\n */\n constructor(options?: GSwapOptions) {\n const environment = GSWAP_ENVIRONMENTS[options?.env ?? 'prod'];\n this.dexBackendBaseUrl = trimTrailingSlash(\n options?.dexBackendBaseUrl ?? environment.dexBackendBaseUrl,\n );\n this.chainCallTimeoutMs = options?.chainCallTimeoutMs ?? 30_000;\n this.signer = options?.signer;\n this.walletAddress = options?.walletAddress;\n\n const httpClient = new HttpClient(options?.httpRequestor, this.chainCallTimeoutMs);\n this.gateway = new ChainGateway({\n dexBackendBaseUrl: this.dexBackendBaseUrl,\n chainCallTimeoutMs: this.chainCallTimeoutMs,\n ...(options?.httpRequestor === undefined ? {} : { httpRequestor: options.httpRequestor }),\n ...(this.walletAddress === undefined ? {} : { walletAddress: this.walletAddress }),\n });\n this.symbols = new Symbols(this.gateway);\n this.quoting = new Quoting(this.dexBackendBaseUrl, httpClient, this.symbols);\n this.pools = new Pools(this.gateway, this.symbols);\n this.positions = new Positions(this.gateway, this.symbols, this.signer, this.walletAddress);\n this.swaps = new Swaps(this.gateway, this.symbols, this.signer, this.walletAddress);\n this.assets = new Assets(this.dexBackendBaseUrl, httpClient);\n }\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/$/u, '');\n}\n","import { serialize, signatures } from '@gala-chain/api';\nimport { GSwapSDKError } from './gswap_sdk_error.js';\nimport {\n buildEIP712Payload,\n EIP712_CAPABLE_METHODS,\n EIP712_DOMAIN,\n type EIP712Types,\n} from '../utils/eip712.js';\n\n// Personal-sign prefix, computed the way THE CHAIN verifies it.\n//\n// GalaChain (SDK 3.x) recovers a personal-signed DTO from\n// keccak256(<prefix field> + <canonical JSON of the DTO WITHOUT the prefix field>)\n// and a browser wallet's `personal_sign` (EIP-191) hashes\n// \"\\u0019Ethereum Signed Message:\\n\" + <byte length of message> + <message>.\n// They agree exactly when the wallet signs the bare canonical DTO and `prefix` is the EIP-191\n// header for that message's UTF-8 BYTE length. Any other message still yields a valid-looking\n// signature — it just recovers to an address nobody holds. This SDK used to embed `prefix` in\n// the signed message (the SDK 1.10 client recipe): observed on stage 2026-09-23, such a\n// MetaMask-signed CreatePool executed on chain under a phantom creator, and defi-backend's\n// bouncer now rejects that shape outright.\n//\n// `@gala-chain/connect`'s prefix helper must NOT be used for wallet `personal_sign`: its\n// fixpoint counts the prefix itself and targets the SDK's raw-payload signer. The same header\n// is also what Gala Wallet's `gala_signChainDto` (personal-sign scheme) prepends before hashing,\n// so one value serves both paths.\n//\n// Built via String.fromCharCode rather than a literal escape ON PURPOSE: the EIP-191 control\n// byte is invisible either way once it's a real character in the string, but a literal escape\n// in source is itself a raw control byte sitting in the file the moment any tool decodes it\n// (an editor save, a diff, a copy-paste) — this keeps the source text itself ordinary and\n// constructs the byte at runtime instead.\nconst ETHEREUM_SIGNED_MESSAGE = String.fromCharCode(0x19) + 'Ethereum Signed Message:\\n';\n\n/** The EIP-191 header for `dto`'s canonical JSON (UTF-8 byte length; any `prefix` on it is ignored). */\nfunction personalSignPrefixFor(dto: Record<string, unknown>): string {\n const withoutPrefix: Record<string, unknown> = { ...dto };\n delete withoutPrefix['prefix'];\n const message = serialize(withoutPrefix);\n return ETHEREUM_SIGNED_MESSAGE + String(new TextEncoder().encode(message).length);\n}\n\n/** The signing schemes supported by the Gala Wallet signer. */\nexport type GalaWalletScheme = 'native' | 'personal-sign';\n\n/** The request surface used by an EIP-1193 browser wallet. */\nexport interface BrowserWalletProvider {\n request(args: { method: string; params?: unknown[] }): Promise<unknown>;\n}\n\ninterface GalaWalletProvider {\n request(args: { method: string; params?: unknown[] }): Promise<unknown>;\n}\n\ninterface WindowWithGala {\n gala?: GalaWalletProvider;\n}\n\ninterface GlobalWithWindow {\n window?: WindowWithGala;\n}\n\ntype SignedDto<T extends Record<string, unknown>> = T & { signature: string };\n\n/**\n * A signer for complete GalaChain write bodies.\n *\n * Implementations return the DTO fields together with the signature that belongs in the\n * gateway request body. Signer identity is recovered from that signature; implementations do\n * not add signer hints, typed-data metadata, or a domain.\n */\nexport interface GalaChainSigner {\n /**\n * Signs a DTO for a named GalaChain contract method.\n *\n * @example\n * ```typescript\n * const signed = await signer.signObject('RequestTrade', { token0: 'GALA', token1: 'GUSDC' });\n * ```\n */\n signObject<T extends Record<string, unknown>>(methodName: string, dto: T): Promise<SignedDto<T>>;\n}\n\nfunction getWalletProvider(): GalaWalletProvider {\n const globalObject = globalThis as GlobalWithWindow;\n const wallet = globalObject.window?.gala;\n if (!wallet) {\n throw new GSwapSDKError(\n 'Gala wallet is not available. Please ensure the Gala wallet is connected.',\n 'GALA_WALLET_NOT_AVAILABLE',\n );\n }\n return wallet;\n}\n\nfunction getNativeSignature(value: unknown): string {\n if (typeof value !== 'string') {\n throw new GSwapSDKError('Wallet returned an invalid signature.', 'INVALID_SIGNATURE');\n }\n if (!/^[0-9a-fA-F]{130}$/u.test(value)) {\n throw new GSwapSDKError('Wallet returned an invalid native signature.', 'INVALID_SIGNATURE');\n }\n return value;\n}\n\nfunction getPersonalSignature(value: unknown): string {\n if (typeof value !== 'string' || !/^(?:0x)?[0-9a-fA-F]{130}$/u.test(value)) {\n throw new GSwapSDKError(\n 'Wallet returned an invalid personal-sign signature.',\n 'INVALID_SIGNATURE',\n );\n }\n return value;\n}\n\nfunction normalizeEthereumAccount(address: string, allowGalaPrefix: boolean): string {\n const normalized = allowGalaPrefix && address.startsWith('eth|') ? address.slice(4) : address;\n if (!/^0x[0-9a-fA-F]{40}$/u.test(normalized)) {\n throw new GSwapSDKError(\n 'Wallet address must be the selected Ethereum account in 0x-prefixed form.',\n 'VALIDATION_ERROR',\n { type: 'INVALID_WALLET_ADDRESS', value: address },\n );\n }\n return `0x${normalized.slice(2).toLowerCase()}`;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (typeof error === 'object' && error !== null && 'message' in error) {\n const message = error.message;\n return typeof message === 'string' ? message : '';\n }\n return '';\n}\n\n// Deliberately does NOT match a generic \"invalid params\" (JSON-RPC -32602) — that code fires\n// for many validation failures unrelated to scheme support (e.g. a malformed DTO), and a false\n// match here would permanently latch effectiveScheme to 'personal-sign' for every future call\n// on this signer, even though native signing was never actually unsupported.\nfunction isUnsupportedNativeSchemeError(error: unknown): boolean {\n return /unsupported|unknown scheme/i.test(getErrorMessage(error));\n}\n\nfunction personalSign<T extends Record<string, unknown>>(\n provider: GalaWalletProvider | BrowserWalletProvider,\n dto: T,\n walletAddress: string,\n methodName?: string,\n): Promise<T & { prefix: string; signature: string }> {\n const prefix = personalSignPrefixFor(dto);\n const payload = { ...dto, prefix };\n // A browser wallet's `personal_sign` applies the EIP-191 header ITSELF, so it must sign the\n // bare DTO; Gala Wallet's `gala_signChainDto` (personal-sign scheme) instead extracts the\n // `prefix` field from what it is handed and prepends it before hashing, so it is handed the\n // prefixed payload. Both submit `{ ...dto, prefix, signature }`.\n const params =\n methodName !== undefined\n ? [serialize(payload), walletAddress, methodName]\n : [serialize(dto), walletAddress];\n\n return provider\n .request({ method: methodName !== undefined ? 'gala_signChainDto' : 'personal_sign', params })\n .then((value) => ({ ...payload, signature: getPersonalSignature(value) }));\n}\n\n/**\n * Signs a DTO via genuine EIP-712 (`eth_signTypedData_v4`) — correctly resolves the `client|`\n * identity, unlike `personal_sign`, for the operations in `EIP712_CAPABLE_METHODS`.\n *\n * Constructs the raw JSON-RPC payload by hand (`{domain, types: {...types, EIP712Domain},\n * primaryType, message}`) rather than depending on ethers.js, matching exactly what\n * `ethers.TypedDataEncoder.getPayload`/`Wallet.signTypedData` produce internally — verified\n * byte-for-byte equivalent (same recovered address from the same signature against both\n * constructions) before this shipped, since gswap-sdk deliberately has no ethers dependency.\n */\nfunction signEIP712<T extends Record<string, unknown>>(\n provider: BrowserWalletProvider,\n methodName: string,\n dto: T,\n walletAddress: string,\n): Promise<T & { types: EIP712Types; domain: typeof EIP712_DOMAIN; signature: string }> {\n const { completedDto, types } = buildEIP712Payload(methodName, dto);\n const prefix = personalSignPrefixFor(completedDto);\n const message = { ...completedDto, prefix };\n const eip712Domain = [\n { name: 'name', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n ];\n const payload = {\n domain: EIP712_DOMAIN,\n types: { ...types, EIP712Domain: eip712Domain },\n primaryType: methodName,\n message,\n };\n\n return provider\n .request({\n method: 'eth_signTypedData_v4',\n params: [walletAddress, JSON.stringify(payload)],\n })\n .then((value) => ({\n ...(message as T & { prefix: string }),\n types,\n domain: EIP712_DOMAIN,\n signature: getPersonalSignature(value),\n }));\n}\n\n/**\n * A GalaChain native signer backed by a secp256k1 private key.\n *\n * Native signing produces the bare GalaChain signature format, without a personal-sign prefix\n * or EIP-712 metadata. The private-key identity is recovered by the chain.\n */\nexport class PrivateKeySigner implements GalaChainSigner {\n private readonly keyBuffer: Buffer;\n\n /**\n * Creates a native signer from a hex or base64 secp256k1 private key.\n *\n * @example\n * ```typescript\n * const signer = new PrivateKeySigner('1'.padStart(64, '0'));\n * const signed = await signer.signObject('RequestTrade', { token0: 'GALA', token1: 'GUSDC' });\n * ```\n */\n constructor(privateKey: string) {\n this.keyBuffer = signatures.normalizePrivateKey(privateKey);\n }\n\n /**\n * Signs the DTO with GalaChain native signing.\n *\n * @example\n * ```typescript\n * const signed = await signer.signObject('RequestTrade', {\n * token0: 'GALA',\n * token1: 'GUSDC',\n * fee: 3000,\n * });\n * ```\n */\n public signObject<T extends Record<string, unknown>>(\n _methodName: string,\n dto: T,\n ): Promise<SignedDto<T>> {\n const signature = signatures.getSignature(dto, this.keyBuffer);\n return Promise.resolve({ ...dto, signature });\n }\n}\n\n/**\n * A Gala Wallet signer using native GalaChain signing, with an opt-in personal-sign mode and\n * automatic fallback for older wallets.\n *\n * The selected Ethereum account is passed to Gala Wallet. Personal-sign resolves the bare\n * `eth|` identity; the legacy EIP-712 `eth_signTypedData` path is not used. The fallback calls\n * `gala_signChainDto([serialize({ ...dto, prefix }), walletAddress, methodName])`.\n */\nexport class GalaWalletSigner implements GalaChainSigner {\n /** The wallet address supplied to Gala Wallet for each signing request. */\n public readonly walletAddress: string;\n\n /** The scheme currently used, including any automatic native-to-personal fallback. */\n public effectiveScheme: GalaWalletScheme;\n\n /**\n * Creates a Gala Wallet signer.\n *\n * @example\n * ```typescript\n * const signer = new GalaWalletSigner('0x0123456789012345678901234567890123456789');\n * const signed = await signer.signObject('RequestTrade', { token0: 'GALA', token1: 'GUSDC' });\n * ```\n *\n * @param walletAddress - The selected Ethereum account (`0x` plus 40 hex digits); Gala Wallet's\n * `eth|0x...` form is also accepted and normalized.\n * @param options - Select native signing or personal-sign explicitly.\n */\n constructor(walletAddress: string, options: { scheme?: GalaWalletScheme | undefined } = {}) {\n this.walletAddress = normalizeEthereumAccount(walletAddress, true);\n this.effectiveScheme = options.scheme ?? 'native';\n }\n\n /**\n * Signs a DTO through `gala_signChainDto`.\n *\n * @example\n * ```typescript\n * const signed = await signer.signObject('AddLiquidity', {\n * token0: 'GALA',\n * token1: 'GUSDC',\n * tickLower: -60,\n * tickUpper: 60,\n * });\n * ```\n */\n public async signObject<T extends Record<string, unknown>>(\n methodName: string,\n dto: T,\n ): Promise<SignedDto<T>> {\n const wallet = getWalletProvider();\n\n if (this.effectiveScheme === 'personal-sign') {\n return personalSign(wallet, dto, this.walletAddress, methodName);\n }\n\n try {\n const signature = await wallet.request({\n method: 'gala_signChainDto',\n params: [serialize(dto), this.walletAddress, methodName, 'native'],\n });\n return { ...dto, signature: getNativeSignature(signature) };\n } catch (error: unknown) {\n if (!isUnsupportedNativeSchemeError(error)) {\n throw error;\n }\n this.effectiveScheme = 'personal-sign';\n return personalSign(wallet, dto, this.walletAddress, methodName);\n }\n }\n}\n\n/**\n * A personal-sign signer for MetaMask and other EIP-1193 browser wallets.\n *\n * The chain recovers this signature using the EIP-191 wrap applied by the wallet to\n * `personal_sign`. This is the browser-wallet path used by the v2 frontend and resolves the\n * bare `eth|` identity.\n */\nexport class BrowserWalletSigner implements GalaChainSigner {\n /**\n * Creates a browser-wallet signer.\n *\n * Defaults to `personal_sign` — unchanged from every existing integration, since it only ever\n * resolves the bare `eth|` identity and changing that silently would be a real behavior\n * break for anyone already depending on it. Pass `{ scheme: 'eip712' }` to correctly resolve\n * a registered `client|` alias instead, for `RequestTrade`/`AddLiquidity`/`RemoveLiquidity`/\n * `CollectPositionFees` (`EIP712_CAPABLE_METHODS`) — `CreatePool` and any other method still\n * falls back to `personal_sign` even in `'eip712'` mode, since its EIP-712 signing is a\n * separate, unsolved chain-side problem.\n *\n * @example\n * ```typescript\n * const signer = new BrowserWalletSigner(window.ethereum, '0x0123456789012345678901234567890123456789');\n * const signed = await signer.signObject('RequestTrade', { token0: 'GALA', token1: 'GUSDC' });\n * ```\n * @example\n * ```typescript\n * // Correctly resolves a registered client| alias instead of the bare eth| address.\n * const signer = new BrowserWalletSigner(window.ethereum, walletAddress, { scheme: 'eip712' });\n * ```\n */\n constructor(\n private readonly provider: BrowserWalletProvider,\n walletAddress: string,\n options: { scheme?: 'personal-sign' | 'eip712' } = {},\n ) {\n this.walletAddress = normalizeEthereumAccount(walletAddress, false);\n this.scheme = options.scheme ?? 'personal-sign';\n }\n\n public readonly walletAddress: string;\n private readonly scheme: 'personal-sign' | 'eip712';\n\n /**\n * Signs the DTO with `eth_signTypedData_v4` (when constructed with `{ scheme: 'eip712' }` and\n * `methodName` is in `EIP712_CAPABLE_METHODS`) or the EIP-1193 `personal_sign` method\n * (otherwise — the default).\n *\n * @example\n * ```typescript\n * const signed = await signer.signObject('RequestTrade', {\n * token0: 'GALA',\n * token1: 'GUSDC',\n * fee: 3000,\n * });\n * ```\n */\n public signObject<T extends Record<string, unknown>>(\n methodName: string,\n dto: T,\n ): Promise<SignedDto<T>> {\n if (this.scheme === 'eip712' && EIP712_CAPABLE_METHODS.has(methodName)) {\n return signEIP712(this.provider, methodName, dto, this.walletAddress);\n }\n return personalSign(this.provider, dto, this.walletAddress);\n }\n}\n","/**\n * Genuine EIP-712 typed-data signing for the four v2 dex-contract operations proven (2026-09-16,\n * live bisection against stage — see defi-backend's `chain-findings-artifact` memory /\n * https://claude.ai/artifact/3N9MevSjoQdU7gqnVB3dfU) to recover the `client|` identity correctly\n * via `eth_signTypedData_v4`, unlike `personal_sign` (which only ever resolves the bare `eth|`\n * form — see `BrowserWalletSigner`'s own doc comment). Mirrors frontend_v2's\n * `src/Services/eip712Types.ts` + `readWriteUtilsV2.ts`'s `EIP712_FIELD_COMPLETERS` exactly —\n * ported here rather than shared as a package because gswap-sdk has no frontend_v2 dependency\n * and should not gain one for four small functions.\n */\n\nexport type EIP712Types = Record<string, Array<{ name: string; type: string }>>;\n\n/**\n * Derives the EIP-712 `types` for a DTO from its runtime shape.\n *\n * The generated `types` travel with the signed payload and are what BOTH sides hash, so they\n * must enumerate EVERY field the chain-side DTO will carry. GalaChain refuses any signature\n * whose `types` leave a DTO field uncovered (`assertNoUnsignedFields`, the fix for the\n * 2026-08-18 unsigned-field-injection drain); when that happens signature recovery fails\n * outright and the chain reports \"Missing signerPublicKey or signerAddress field in dto\".\n */\nexport function generateEIP712Types(\n typeName: string,\n params: Record<string, unknown>,\n): EIP712Types {\n const types: EIP712Types = {};\n types[typeName] = [];\n\n // Every `name` this is ever called with (the top-level `typeName`, or a nested struct's own\n // name) is unconditionally assigned `types[name] = []` on the line immediately before any\n // recursive call that could reach here; TypeScript still types `types[name]` as\n // possibly-undefined (index-signature access), so the guard below stays for real type safety\n // even though no current call path can actually trigger it.\n function fieldsFor(name: string): Array<{ name: string; type: string }> {\n const fields = types[name];\n /* c8 ignore next */\n if (!fields) throw new Error(`Missing EIP-712 type definition for ${name}`);\n return fields;\n }\n\n function addField(\n name: string,\n fieldValue: unknown,\n parentTypeName: string,\n onlyGetType = false,\n ): string | undefined {\n if (Array.isArray(fieldValue)) {\n const type =\n fieldValue.length > 0 ? addField(name, fieldValue[0], parentTypeName, true) : 'string';\n if (!onlyGetType) fieldsFor(parentTypeName).push({ name, type: (type ?? name) + '[]' });\n } else if (typeof fieldValue === 'object' && fieldValue !== null) {\n if (types[name]) {\n throw new Error('Name collisions not yet supported');\n }\n types[name] = [];\n Object.entries(fieldValue).forEach(([key, value]) => {\n addField(key, value, name);\n });\n if (!onlyGetType) fieldsFor(parentTypeName).push({ name, type: name });\n } else {\n let eipType: string;\n switch (typeof fieldValue) {\n case 'string':\n eipType = 'string';\n break;\n case 'number':\n eipType = 'int256';\n break;\n case 'boolean':\n eipType = 'bool';\n break;\n case 'bigint':\n case 'symbol':\n case 'undefined':\n case 'function':\n case 'object':\n throw new Error(\n `Unsupported type, ${typeof fieldValue}, value: ${Object.prototype.toString.call(fieldValue)}`,\n );\n }\n if (onlyGetType) {\n return eipType;\n }\n fieldsFor(parentTypeName).push({ name, type: eipType });\n }\n return undefined;\n }\n\n Object.entries(params).forEach(([key, value]) => {\n addField(key, value, typeName);\n });\n\n return types;\n}\n\n/** Matches every genuine-EIP-712 probe that has actually recovered `client|` on stage. */\nexport const EIP712_DOMAIN: { name: string; chainId: number } = { name: 'ethereum', chainId: 1 };\n\n/**\n * The four v2 operations proven to recover the signer correctly via genuine EIP-712: `RequestTrade`\n * never had the problem (one numeric field). `AddLiquidity`/`RemoveLiquidity`/\n * `CollectPositionFees` each need their `types` completed with a handful of fields their real\n * server-side DTO always carries — see the `complete*Fields` functions below. `CreatePool` is a\n * genuinely different, unsolved problem (nested `TokenClassKey` structs, not a flat\n * missing-field gap) and is NOT in this set — callers must keep using `personal-sign` for it.\n */\nexport const EIP712_CAPABLE_METHODS: ReadonlySet<string> = new Set([\n 'RequestTrade',\n 'AddLiquidity',\n 'RemoveLiquidity',\n 'CollectPositionFees',\n]);\n\n/**\n * Every `complete*Fields` function below shares the same two live-proven rules:\n * 1. Numeric completeness fields MUST be JS `number`, never numeric strings —\n * `generateEIP712Types` infers a field's Solidity type from `typeof`, and declaring one as\n * EIP-712 `string` instead of `int256` breaks recovery identically to omitting the field\n * entirely (verified live on AddLiquidity: `amount0Min: '0'` fails with the exact same\n * \"Missing signerPublicKey\" error as `amount0Min` being absent; `amount0Min: 0` succeeds).\n * 2. `positionId` has no such constraint — an empty string works, and does not target an\n * existing position (`positionId: ''` created a fresh position on AddLiquidity, not an add\n * to position id `''`; on RemoveLiquidity/CollectPositionFees the real position is still\n * resolved from `token0`/`token1`/`fee`/`tickLower`/`tickUpper`, not from this field).\n */\nfunction numericOr0(dto: Record<string, unknown>, field: string): number {\n return typeof dto[field] === 'number' ? dto[field] : 0;\n}\n\n/**\n * `AddLiquidity`'s real server-side DTO always carries `amount0Desired`/`amount0Min`/\n * `amount1Desired`/`amount1Min`/`positionId` once reconstructed, regardless of which deposit\n * convention the caller used (`Positions.addLiquidityByTicks` only ever sends\n * `depositQuantityToken0`/`depositQuantityToken1`). Proven empirically by bisection: none of the\n * five alone fixes recovery, all five together does (live 201, tx `407d9b24...`, block\n * `2429022`).\n */\nfunction completeAddLiquidityFields(dto: Record<string, unknown>): Record<string, unknown> {\n return {\n ...dto,\n amount0Desired: numericOr0(dto, 'amount0Desired'),\n amount0Min: numericOr0(dto, 'amount0Min'),\n amount1Desired: numericOr0(dto, 'amount1Desired'),\n amount1Min: numericOr0(dto, 'amount1Min'),\n positionId: dto['positionId'] ?? '',\n };\n}\n\n/**\n * `RemoveLiquidity`'s real server-side DTO always carries `amount`/`amount0Min`/`amount1Min`/\n * `positionId` — `Positions.removeLiquidity` only ever sends a `withdrawalQuantityTokenX` (or\n * neither, for a full close). Proven empirically: every subset of these four fails, all four\n * together succeeds (live, random-signer probe — recovery confirmed by the response moving from\n * \"Missing signerPublicKey\" to a genuine position-not-found 404).\n */\nfunction completeRemoveLiquidityFields(dto: Record<string, unknown>): Record<string, unknown> {\n return {\n ...dto,\n amount: numericOr0(dto, 'amount'),\n amount0Min: numericOr0(dto, 'amount0Min'),\n amount1Min: numericOr0(dto, 'amount1Min'),\n positionId: dto['positionId'] ?? '',\n };\n}\n\n/**\n * `CollectPositionFees`'s real server-side DTO always carries `amount0Requested`/\n * `amount1Requested`/`positionId` — `Positions.collectPositionFees` sends only the five identity\n * fields. Proven empirically the same way as `completeRemoveLiquidityFields`.\n */\nfunction completeCollectPositionFeesFields(dto: Record<string, unknown>): Record<string, unknown> {\n return {\n ...dto,\n amount0Requested: numericOr0(dto, 'amount0Requested'),\n amount1Requested: numericOr0(dto, 'amount1Requested'),\n positionId: dto['positionId'] ?? '',\n };\n}\n\nexport const EIP712_FIELD_COMPLETERS: Readonly<\n Record<string, (dto: Record<string, unknown>) => Record<string, unknown>>\n> = {\n AddLiquidity: completeAddLiquidityFields,\n RemoveLiquidity: completeRemoveLiquidityFields,\n CollectPositionFees: completeCollectPositionFeesFields,\n};\n\n/**\n * Completes a DTO's fields for EIP-712 signing (a no-op for methods with no known gap, e.g.\n * `RequestTrade`) and derives its `types`. Exported separately from the signing call itself so tests\n * can assert on the exact payload without needing a live provider.\n */\nexport function buildEIP712Payload(\n methodName: string,\n dto: Record<string, unknown>,\n): { completedDto: Record<string, unknown>; types: EIP712Types } {\n const completer = EIP712_FIELD_COMPLETERS[methodName];\n const completedDto = completer ? completer(dto) : dto;\n const types = generateEIP712Types(methodName, completedDto);\n return { completedDto, types };\n}\n"],"mappings":"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","names":["import_bignumber","FEE_TIER","BigNumber","BigNumber","value","asRecord","debug","import_bignumber","BigNumber","import_bignumber","resolveSymbol","BigNumber","import_bignumber","resolveSymbol","toDecimalString","BigNumber","trimTrailingSlash"]}
|