@gala-chain/gswap-sdk 0.0.3 → 0.0.4
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/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/index.cjs +4 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +4 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["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 return new GSwapSDKError('Transaction wait failed.', 'TRANSACTION_WAIT_FAILED', {\n txId,\n ...detail,\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\nexport interface BundlerResponse {\n status: 'PROCESSED' | 'FAILED' | 'PENDING';\n data?: string;\n error?: string;\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 [BundlerResponse];\n this.emit('transaction', eventName, responseData);\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<void>;\n resolve: () => 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: () => void;\n let reject: () => void;\n\n const promise = new Promise<void>((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();\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(txId: string): void {\n const promiseInfo = this.promiseInfoForTxId.get(txId);\n if (!promiseInfo) {\n return;\n }\n\n clearTimeout(promiseInfo.timeoutId);\n\n promiseInfo.resolve();\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();\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-test1.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(txId: string): Promise<void> {\n if (!this.eventSocketConnected()) {\n throw GSwapSDKError.socketConnectionRequiredError();\n }\n await 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);\n } else if (response.status === 'FAILED') {\n this.globalWaitHelper.notifyFailure(txId, {\n error: response.error,\n status: response.status,\n data: response.data,\n });\n } else if (response.status === 'PENDING') {\n // No action needed for pending status\n } else {\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<void>,\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 * 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');\n validateNumericAmount(args.amount1Desired, 'amount1Desired');\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 };\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');\n validateNumericAmount(args.amount1Desired, 'amount1Desired');\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 };\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 };\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(untruncated.toFixed(otherTokenDecimals, BigNumber.ROUND_DOWN));\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","BigNumber","BigNumber","BigNumber","BigNumber","FEE_TIER","BigNumber","BigNumber","BigNumber"]}
|
|
1
|
+
{"version":3,"sources":["../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":["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 return new GSwapSDKError('Transaction wait failed.', 'TRANSACTION_WAIT_FAILED', {\n txId,\n ...detail,\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\nexport interface BundlerResponse {\n status: 'PROCESSED' | 'FAILED' | 'PENDING';\n data?: string;\n error?: string;\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 [BundlerResponse];\n this.emit('transaction', eventName, responseData);\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<void>;\n resolve: () => 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: () => void;\n let reject: () => void;\n\n const promise = new Promise<void>((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();\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(txId: string): void {\n const promiseInfo = this.promiseInfoForTxId.get(txId);\n if (!promiseInfo) {\n return;\n }\n\n clearTimeout(promiseInfo.timeoutId);\n\n promiseInfo.resolve();\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();\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-test1.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(txId: string): Promise<void> {\n if (!this.eventSocketConnected()) {\n throw GSwapSDKError.socketConnectionRequiredError();\n }\n await 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);\n } else if (response.status === 'FAILED') {\n this.globalWaitHelper.notifyFailure(txId, {\n error: response.error,\n status: response.status,\n data: response.data,\n });\n } else if (response.status === 'PENDING') {\n // No action needed for pending status\n } else {\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<void>,\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 * 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');\n validateNumericAmount(args.amount1Desired, 'amount1Desired');\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 };\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');\n validateNumericAmount(args.amount1Desired, 'amount1Desired');\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 };\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 };\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","BigNumber","BigNumber","BigNumber","BigNumber","FEE_TIER","BigNumber","BigNumber","BigNumber"]}
|