@gala-chain/gswap-sdk 1.2.0-rc.8 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +25 -10
  2. package/dist/browser/classes/dex_fees.js.map +1 -1
  3. package/dist/browser/classes/gateway.js.map +1 -1
  4. package/dist/browser/classes/gdex_stream.js.map +1 -1
  5. package/dist/browser/classes/gswap.js.map +1 -1
  6. package/dist/browser/classes/gswap_sdk_error.js.map +1 -1
  7. package/dist/browser/classes/pending_swap_fate.js +2 -0
  8. package/dist/browser/classes/pending_swap_fate.js.map +1 -0
  9. package/dist/browser/classes/pending_swaps.js +1 -1
  10. package/dist/browser/classes/pending_swaps.js.map +1 -1
  11. package/dist/browser/classes/positions.js +1 -1
  12. package/dist/browser/classes/positions.js.map +1 -1
  13. package/dist/browser/classes/shadow_submit.js +1 -1
  14. package/dist/browser/classes/shadow_submit.js.map +1 -1
  15. package/dist/browser/classes/signers.js.map +1 -1
  16. package/dist/browser/classes/storage_adapters.js +2 -0
  17. package/dist/browser/classes/storage_adapters.js.map +1 -0
  18. package/dist/browser/classes/submitted_transaction.js.map +1 -1
  19. package/dist/browser/classes/symbols.js +1 -1
  20. package/dist/browser/classes/symbols.js.map +1 -1
  21. package/dist/browser/index.js +1 -1
  22. package/dist/browser/utils/chain_dto_signing.js.map +1 -1
  23. package/dist/browser/utils/class_key.js +2 -0
  24. package/dist/browser/utils/class_key.js.map +1 -0
  25. package/dist/browser/utils/classification.js +2 -0
  26. package/dist/browser/utils/classification.js.map +1 -0
  27. package/dist/browser/utils/dto_builders.js +1 -1
  28. package/dist/browser/utils/dto_builders.js.map +1 -1
  29. package/dist/browser/utils/eip712.js.map +1 -1
  30. package/dist/browser/utils/failure_classification.js +1 -1
  31. package/dist/browser/utils/failure_classification.js.map +1 -1
  32. package/dist/browser/utils/failure_guards.js +2 -0
  33. package/dist/browser/utils/failure_guards.js.map +1 -0
  34. package/dist/browser/utils/ordering.js +1 -1
  35. package/dist/browser/utils/ordering.js.map +1 -1
  36. package/dist/browser/utils/tick_align.js +2 -0
  37. package/dist/browser/utils/tick_align.js.map +1 -0
  38. package/dist/browser/utils/tick_math.js +2 -0
  39. package/dist/browser/utils/tick_math.js.map +1 -0
  40. package/dist/browser/utils/tick_range.js +2 -0
  41. package/dist/browser/utils/tick_range.js.map +1 -0
  42. package/dist/browser/utils/ticks.js +1 -1
  43. package/dist/browser/utils/ticks.js.map +1 -1
  44. package/dist/browser/utils/transport.js +1 -1
  45. package/dist/browser/utils/transport.js.map +1 -1
  46. package/dist/browser/utils/validation.js +1 -1
  47. package/dist/browser/utils/validation.js.map +1 -1
  48. package/dist/browser/version.js +1 -1
  49. package/dist/browser/version.js.map +1 -1
  50. package/dist/index.cjs +641 -336
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +470 -186
  53. package/dist/index.d.ts +470 -186
  54. package/dist/index.mjs +636 -337
  55. package/dist/index.mjs.map +1 -1
  56. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","names":[],"sources":["../../../src/utils/transport.ts"],"sourcesContent":["import type { HTTPResponse, HttpRequestor } from '../types/http_requestor.js';\nimport type { WireOptions } from '../types/wire.js';\nimport { GSwapSDKError, parseJson } from '../classes/gswap_sdk_error.js';\nimport { SDK_VERSION } from '../version.js';\n\n/**\n * Arms the abort timer for a request. `Infinity` means \"never time out\": `setTimeout` would turn\n * it into 1 ms, so no timer is armed at all. Returns a function that disarms it.\n */\nexport function armTimeout(controller: AbortController, timeoutMs: number): () => void {\n if (timeoutMs === Infinity) return () => undefined;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n return () => clearTimeout(timer);\n}\n\n/**\n * Validates a request timeout in milliseconds: a positive finite number, or `Infinity` for none.\n *\n * @throws GSwapSDKError `INVALID_TIMEOUT` (`params.field` = `name`) otherwise.\n */\nexport function validateTimeoutMs(timeoutMs: number, name: string): number {\n if (timeoutMs === Infinity || (Number.isFinite(timeoutMs) && timeoutMs > 0)) return timeoutMs;\n throw new GSwapSDKError('INVALID_TIMEOUT', { field: name, value: timeoutMs });\n}\n\nconst READABLE_QUERY_SAFE = /[A-Za-z0-9\\-._~!'()*$|:,]/u;\n\nfunction encodeReadable(text: string): string {\n let out = '';\n for (const char of text) {\n if (char === ' ') out += '+';\n else if (READABLE_QUERY_SAFE.test(char)) out += char;\n else out += encodeScalar(char);\n }\n return out;\n}\n\n/** Percent-encodes one code point; a lone surrogate becomes U+FFFD, as `URLSearchParams` does. */\nfunction encodeScalar(char: string): string {\n try {\n return encodeURIComponent(char);\n } catch {\n return '%EF%BF%BD';\n }\n}\n\n/** Serializes GET parameters, in insertion order, in the encoding the wire options select. */\nexport function buildQueryString(\n params: Record<string, string>,\n encoding: WireOptions['queryEncoding'] = 'standard',\n): string {\n if (encoding === 'readable') {\n return Object.entries(params)\n .map(([key, value]) => `${encodeReadable(key)}=${encodeReadable(value)}`)\n .join('&');\n }\n return new URLSearchParams(params).toString();\n}\n\n/** What an SDK request adds to the headers the wire options describe. */\nexport interface RequestHeaderParts {\n /** The request carries a JSON body: `Content-Type: application/json` unless `wire.headers` sets one. */\n json?: boolean | undefined;\n /** Headers the SDK sends unless `wire.headers` replaces them (for example `Accept`). */\n defaults?: Record<string, string> | undefined;\n /**\n * Headers that carry the request's meaning (`X-Wallet-Address`, `X-Shadow`). They come last and\n * replace a same-named `wire.headers` entry, so an app's static headers can never re-attribute\n * or un-shadow a write.\n */\n fixed?: Record<string, string> | undefined;\n}\n\n/**\n * The request headers for ANY SDK request, GET or POST, from one place so the wire options reach\n * every request alike. Order, which is the order the requestor sees them in: `User-Agent`\n * (`wire.userAgent`, default `GalaChain-SDK/<version>`, `false` omits it), `parts.defaults`,\n * `wire.headers`, `Content-Type` (JSON bodies only), `parts.fixed`. A later entry replaces an\n * earlier one of the same name regardless of case, so a header is never sent twice.\n */\nexport function buildRequestHeaders(\n wire: WireOptions | undefined,\n parts: RequestHeaderParts = {},\n): Record<string, string> {\n const entries = new Map<string, [name: string, value: string]>();\n const put = (headers: Record<string, string> | undefined, last = false): void => {\n for (const [name, value] of Object.entries(headers ?? {})) {\n // A fixed header leaves any earlier same-named entry behind, so it also keeps its place at the end.\n if (last) entries.delete(name.toLowerCase());\n entries.set(name.toLowerCase(), [name, value]);\n }\n };\n if (wire?.userAgent !== false) {\n put({ 'User-Agent': wire?.userAgent ?? `GalaChain-SDK/${SDK_VERSION}` });\n }\n put(parts.defaults);\n put(wire?.headers);\n if (parts.json === true && !entries.has('content-type')) {\n put({ 'Content-Type': 'application/json' });\n }\n put(parts.fixed, true);\n return Object.fromEntries(entries.values());\n}\n\n/**\n * The default requestor: the global `fetch`, with a failure before any answer (offline, DNS,\n * CORS) coded as `TRANSPORT_ERROR` and the original error kept as `cause`. An aborted request is\n * left to {@link requestWithTimeout}, which knows whether the timeout or the caller aborted it.\n * A requestor the app supplies is not wrapped: its rejection reaches the caller unchanged.\n */\nexport const fetchRequestor: HttpRequestor = async (url, init) => {\n try {\n return await fetch(url, init);\n } catch (error: unknown) {\n if (init?.signal?.aborted === true) throw error;\n throw new GSwapSDKError('TRANSPORT_ERROR', { url }, { url, cause: error });\n }\n};\n\nexport async function requestWithTimeout(\n requestor: HttpRequestor,\n url: string,\n options: RequestInit,\n timeoutMs: number,\n): Promise<HTTPResponse> {\n const controller = new AbortController();\n const disarm = armTimeout(controller, timeoutMs);\n const externalSignal = options.signal;\n const abortFromCaller = (): void => controller.abort();\n externalSignal?.addEventListener('abort', abortFromCaller, { once: true });\n try {\n return await requestor(url, { ...options, signal: controller.signal });\n } catch (error: unknown) {\n // The caller's own abort is theirs: it passes through as the abort it is, never as a timeout.\n if (externalSignal?.aborted === true) throw error;\n if (controller.signal.aborted) {\n throw new GSwapSDKError('REQUEST_TIMEOUT', { url, timeoutMs }, { url, cause: error });\n }\n // Anything else is the requestor's own rejection (an app's axios interceptor error, say):\n // rethrown as it is, because the app's error handling produced it.\n throw error;\n } finally {\n disarm();\n externalSignal?.removeEventListener('abort', abortFromCaller);\n }\n}\n\nexport async function readResponseBody(response: HTTPResponse): Promise<unknown> {\n const text = await response.text();\n return parseJson(text) ?? text;\n}\n\n/** Read a case-insensitive response header from either supported header shape. */\nexport function readHeader(response: HTTPResponse, name: string): string | undefined {\n const headers = response.headers;\n if (headers === undefined) return undefined;\n if (hasHeaderGetter(headers)) {\n const value = headers.get(name);\n return value === null || value === '' ? undefined : value;\n }\n const value = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === name.toLowerCase(),\n )?.[1];\n return value === undefined || value === '' ? undefined : value;\n}\n\n/** Read a Retry-After header (delta-seconds or an HTTP date) as non-negative milliseconds. */\nexport function readRetryAfter(response: HTTPResponse): number | undefined {\n const raw = readHeader(response, 'retry-after');\n if (raw === undefined) return undefined;\n const seconds = Number(raw);\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n const timestamp = Date.parse(raw);\n return Number.isNaN(timestamp) ? undefined : Math.max(0, timestamp - Date.now());\n}\n\n/** Read a non-negative integer block number header. */\nexport function readBlockNumberHeader(\n response: HTTPResponse,\n headerName = 'x-block-number',\n): number | undefined {\n const raw = readHeader(response, headerName);\n if (raw === undefined) return undefined;\n const blockNumber = Number(raw);\n return Number.isInteger(blockNumber) && blockNumber >= 0 ? blockNumber : undefined;\n}\n\nfunction hasHeaderGetter(\n headers: NonNullable<HTTPResponse['headers']>,\n): headers is { get(name: string): string | null } {\n return 'get' in headers && typeof headers.get === 'function';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","names":[],"sources":["../../../src/utils/transport.ts"],"sourcesContent":["import type { HTTPResponse, HttpRequestor } from '../types/http_requestor.js';\nimport type { WireOptions } from '../types/wire.js';\nimport { GSwapSDKError, parseJson } from '../classes/gswap_sdk_error.js';\nimport { SDK_VERSION } from '../version.js';\n\n/**\n * Arms the abort timer for a request. `Infinity` means \"never time out\": `setTimeout` would turn\n * it into 1 ms, so no timer is armed at all. Returns a function that disarms it.\n */\nexport function armTimeout(controller: AbortController, timeoutMs: number): () => void {\n if (timeoutMs === Infinity) return () => undefined;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n return () => clearTimeout(timer);\n}\n\n/**\n * Validates a request timeout in milliseconds: a positive finite number, or `Infinity` for none.\n *\n * @throws GSwapSDKError `INVALID_TIMEOUT` (`params.field` = `name`) otherwise.\n */\nexport function validateTimeoutMs(timeoutMs: number, name: string): number {\n if (timeoutMs === Infinity || (Number.isFinite(timeoutMs) && timeoutMs > 0)) return timeoutMs;\n throw new GSwapSDKError('INVALID_TIMEOUT', { field: name, value: timeoutMs });\n}\n\nconst READABLE_QUERY_SAFE = /[A-Za-z0-9\\-._~!'()*$|:,]/u;\n\nfunction encodeReadable(text: string): string {\n let out = '';\n for (const char of text) {\n if (char === ' ') out += '+';\n else if (READABLE_QUERY_SAFE.test(char)) out += char;\n else out += encodeScalar(char);\n }\n return out;\n}\n\n/** Percent-encodes one code point; a lone surrogate becomes U+FFFD, as `URLSearchParams` does. */\nfunction encodeScalar(char: string): string {\n try {\n return encodeURIComponent(char);\n } catch {\n return '%EF%BF%BD';\n }\n}\n\n/** Serializes GET parameters, in insertion order, in the encoding the wire options select. */\nexport function buildQueryString(\n params: Record<string, string>,\n encoding: WireOptions['queryEncoding'] = 'standard',\n): string {\n if (encoding === 'readable') {\n return Object.entries(params)\n .map(([key, value]) => `${encodeReadable(key)}=${encodeReadable(value)}`)\n .join('&');\n }\n return new URLSearchParams(params).toString();\n}\n\n/** What an SDK request adds to the headers the wire options describe. */\nexport interface RequestHeaderParts {\n /** The request carries a JSON body: `Content-Type: application/json` unless `wire.headers` sets one. */\n json?: boolean | undefined;\n /** Headers the SDK sends unless `wire.headers` replaces them (for example `Accept`). */\n defaults?: Record<string, string> | undefined;\n /**\n * Headers that carry the request's meaning (`X-Wallet-Address`, `X-Shadow`). They come last and\n * replace a same-named `wire.headers` entry, so an app's static headers can never re-attribute\n * or un-shadow a write.\n */\n fixed?: Record<string, string> | undefined;\n}\n\n/**\n * The request headers for ANY SDK request, GET or POST, from one place so the wire options reach\n * every request alike. Order, which is the order the requestor sees them in: `User-Agent`\n * (`wire.userAgent`, default `GalaChain-SDK/<version>`, `false` omits it), `parts.defaults`,\n * `wire.headers`, `Content-Type` (JSON bodies only), `parts.fixed`. A later entry replaces an\n * earlier one of the same name regardless of case, so a header is never sent twice.\n */\nexport function buildRequestHeaders(\n wire: WireOptions | undefined,\n parts: RequestHeaderParts = {},\n): Record<string, string> {\n const entries = new Map<string, [name: string, value: string]>();\n const put = (headers: Record<string, string> | undefined, last = false): void => {\n for (const [name, value] of Object.entries(headers ?? {})) {\n // A fixed header leaves any earlier same-named entry behind, so it also keeps its place at the end.\n if (last) entries.delete(name.toLowerCase());\n entries.set(name.toLowerCase(), [name, value]);\n }\n };\n if (wire?.userAgent !== false) {\n put({ 'User-Agent': wire?.userAgent ?? `GalaChain-SDK/${SDK_VERSION}` });\n }\n put(parts.defaults);\n put(wire?.headers);\n if (parts.json === true && !entries.has('content-type')) {\n put({ 'Content-Type': 'application/json' });\n }\n put(parts.fixed, true);\n return Object.fromEntries(entries.values());\n}\n\n/**\n * The default requestor: the global `fetch`, with a failure before any answer (offline, DNS,\n * CORS) coded as `TRANSPORT_ERROR` and the original error kept as `cause`. An aborted request is\n * left to {@link requestWithTimeout}, which knows whether the timeout or the caller aborted it.\n * A requestor the app supplies is not wrapped: its rejection reaches the caller unchanged.\n */\nexport const fetchRequestor: HttpRequestor = async (url, init) => {\n try {\n return await fetch(url, init);\n } catch (error: unknown) {\n if (init?.signal?.aborted === true) throw error;\n throw new GSwapSDKError('TRANSPORT_ERROR', { url }, { url, cause: error });\n }\n};\n\nexport async function requestWithTimeout(\n requestor: HttpRequestor,\n url: string,\n options: RequestInit,\n timeoutMs: number,\n): Promise<HTTPResponse> {\n const controller = new AbortController();\n const disarm = armTimeout(controller, timeoutMs);\n const externalSignal = options.signal;\n const abortFromCaller = (): void => controller.abort();\n externalSignal?.addEventListener('abort', abortFromCaller, { once: true });\n try {\n return await requestor(url, { ...options, signal: controller.signal });\n } catch (error: unknown) {\n // The caller's own abort is theirs: it passes through as the abort it is, never as a timeout.\n if (externalSignal?.aborted === true) throw error;\n if (controller.signal.aborted) {\n throw new GSwapSDKError('REQUEST_TIMEOUT', { url, timeoutMs }, { url, cause: error });\n }\n // Anything else is the requestor's own rejection (an app's axios interceptor error, say):\n // rethrown as it is, because the app's error handling produced it.\n throw error;\n } finally {\n disarm();\n externalSignal?.removeEventListener('abort', abortFromCaller);\n }\n}\n\nexport async function readResponseBody(response: HTTPResponse): Promise<unknown> {\n const text = await response.text();\n return parseJson(text) ?? text;\n}\n\n/** Read a case-insensitive response header from either supported header shape. */\nexport function readHeader(response: HTTPResponse, name: string): string | undefined {\n const headers = response.headers;\n if (headers === undefined) return undefined;\n if (hasHeaderGetter(headers)) {\n const value = headers.get(name);\n return value === null || value === '' ? undefined : value;\n }\n const value = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === name.toLowerCase(),\n )?.[1];\n return value === undefined || value === '' ? undefined : value;\n}\n\n/** Read a Retry-After header (delta-seconds or an HTTP date) as non-negative milliseconds. */\nexport function readRetryAfter(response: HTTPResponse): number | undefined {\n const raw = readHeader(response, 'retry-after');\n if (raw === undefined) return undefined;\n const seconds = Number(raw);\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n const timestamp = Date.parse(raw);\n return Number.isNaN(timestamp) ? undefined : Math.max(0, timestamp - Date.now());\n}\n\n/** Read a non-negative integer block number header. */\nexport function readBlockNumberHeader(\n response: HTTPResponse,\n headerName = 'x-block-number',\n): number | undefined {\n const raw = readHeader(response, headerName);\n if (raw === undefined) return undefined;\n const blockNumber = Number(raw);\n return Number.isInteger(blockNumber) && blockNumber >= 0 ? blockNumber : undefined;\n}\n\nfunction hasHeaderGetter(\n headers: NonNullable<HTTPResponse['headers']>,\n): headers is { get(name: string): string | null } {\n return 'get' in headers && typeof headers.get === 'function';\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ALLOWED_FEE_TIERS_TEXT as e}from"../classes/error_catalog.js";import{GSwapSDKError as t}from"../classes/gswap_sdk_error.js";import{ALL_FEE_TIERS as n}from"../types/fees.js";import{GC_MAX_TICK as r,GC_MIN_TICK as i}from"./ticks.js";import a from"bignumber.js";function o(e,n,r=!1){if(typeof e==`number`)throw new t(`AMOUNT_IS_JS_NUMBER`,{field:n});let i;try{i=a(e)}catch{i=a(NaN)}if(!i.isFinite())throw new t(`AMOUNT_NOT_FINITE`,{field:n,value:String(e)});if(!r&&i.isZero())throw new t(`AMOUNT_NOT_POSITIVE`,{field:n,value:String(e)});if(i.isNegative())throw new t(`AMOUNT_NEGATIVE`,{field:n,value:String(e)})}function s(e,n,r){if([e,n,r].some(e=>typeof e==`number`))throw new t(`PRICE_VALUES_IS_JS_NUMBER`,{});let i=e=>{try{return a(e)}catch{return a(NaN)}},o=i(e),s=i(n),c=i(r);if(c=c.isFinite()?c:a(0xde0b6b3a7640000),!o.isFinite()||!s.isFinite()||!c.isFinite()||!o.isPositive()||!s.isPositive()||!c.isPositive())throw new t(`INVALID_PRICE_VALUES`,{spotPrice:String(e),lowerPrice:String(n),upperPrice:String(r)});if(s.isGreaterThan(c))throw new t(`INVALID_PRICE_RANGE`,{lowerPrice:String(n),upperPrice:String(r)})}function c(e,n){if(e<0||!Number.isInteger(e))throw new t(`INVALID_TOKEN_DECIMALS`,{field:n,value:e})}function l(e,n){if(!Number.isInteger(e)||!Number.isInteger(n))throw new t(`TICKS_NOT_INTEGERS`,{tickLower:e,tickUpper:n});if(e>=n)throw new t(`INVALID_TICK_RANGE`,{tickLower:e,tickUpper:n});if(e<-887272||n>887272)throw new t(`TICKS_OUT_OF_BOUNDS`,{tickLower:e,tickUpper:n,minTick:i,maxTick:r})}function u(r){if(!n.some(e=>Number(e)===r))throw new t(`INVALID_FEE`,{field:`fee`,value:r,allowed:e})}function d(e){if(!Number.isInteger(e)||e<=0)throw new t(`INVALID_TICK_SPACING`,{value:e})}function f(e){if(e===void 0)throw new t(`MISSING_WALLET_ADDRESS`,{});if(!e||typeof e!=`string`||e.trim().length===0)throw new t(`INVALID_WALLET_ADDRESS`,{field:`walletAddress`,value:String(e)})}const p=/* @__PURE__ */ new Set([`Token`,`Unit`,`none`]),m=/^[A-Za-z0-9]+$/u;function h(e){return m.test(e)&&e.length<=32&&!p.has(e)}function g(e,n){if(!(e<n))throw new t(`NON_CANONICAL_PAIR`,{token0:e,token1:n})}export{g as assertCanonicalPair,h as isProposableTradingSymbol,u as validateFee,o as validateNumericAmount,s as validatePriceValues,l as validateTickRange,d as validateTickSpacing,c as validateTokenDecimals,f as validateWalletAddress};
1
+ import{ALLOWED_FEE_TIERS_TEXT as e}from"../classes/error_catalog.js";import{GSwapSDKError as t}from"../classes/gswap_sdk_error.js";import{ALL_FEE_TIERS as n}from"../types/fees.js";import{GC_MAX_TICK as r,GC_MIN_TICK as i}from"./tick_math.js";import a from"bignumber.js";function o(e,n,r=!1){if(typeof e==`number`)throw new t(`AMOUNT_IS_JS_NUMBER`,{field:n});let i;try{i=a(e)}catch{i=a(NaN)}if(!i.isFinite())throw new t(`AMOUNT_NOT_FINITE`,{field:n,value:String(e)});if(!r&&i.isZero())throw new t(`AMOUNT_NOT_POSITIVE`,{field:n,value:String(e)});if(i.isNegative())throw new t(`AMOUNT_NEGATIVE`,{field:n,value:String(e)})}function s(e,n,r){if([e,n,r].some(e=>typeof e==`number`))throw new t(`PRICE_VALUES_IS_JS_NUMBER`,{});let i=e=>{try{return a(e)}catch{return a(NaN)}},o=i(e),s=i(n),c=i(r);if(c=c.isFinite()?c:a(0xde0b6b3a7640000),!o.isFinite()||!s.isFinite()||!c.isFinite()||!o.isPositive()||!s.isPositive()||!c.isPositive())throw new t(`INVALID_PRICE_VALUES`,{spotPrice:String(e),lowerPrice:String(n),upperPrice:String(r)});if(s.isGreaterThan(c))throw new t(`INVALID_PRICE_RANGE`,{lowerPrice:String(n),upperPrice:String(r)})}function c(e,n){if(e<0||!Number.isInteger(e))throw new t(`INVALID_TOKEN_DECIMALS`,{field:n,value:e})}function l(e,n){if(!Number.isInteger(e)||!Number.isInteger(n))throw new t(`TICKS_NOT_INTEGERS`,{tickLower:e,tickUpper:n});if(e>=n)throw new t(`INVALID_TICK_RANGE`,{tickLower:e,tickUpper:n});if(e<-887272||n>887272)throw new t(`TICKS_OUT_OF_BOUNDS`,{tickLower:e,tickUpper:n,minTick:i,maxTick:r})}function u(r){if(!n.some(e=>Number(e)===r))throw new t(`INVALID_FEE`,{field:`fee`,value:r,allowed:e})}function d(e){if(!Number.isInteger(e)||e<=0)throw new t(`INVALID_TICK_SPACING`,{value:e})}function f(e){if(e===void 0)throw new t(`MISSING_WALLET_ADDRESS`,{});if(!e||typeof e!=`string`||e.trim().length===0)throw new t(`INVALID_WALLET_ADDRESS`,{field:`walletAddress`,value:String(e)})}const p=/* @__PURE__ */ new Set([`Token`,`Unit`,`none`]),m=/^[A-Za-z0-9]+$/u;function h(e){return m.test(e)&&e.length<=32&&!p.has(e)}function g(e,n){if(!(e<n))throw new t(`NON_CANONICAL_PAIR`,{token0:e,token1:n})}export{g as assertCanonicalPair,h as isProposableTradingSymbol,u as validateFee,o as validateNumericAmount,s as validatePriceValues,l as validateTickRange,d as validateTickSpacing,c as validateTokenDecimals,f as validateWalletAddress};
2
2
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":[],"sources":["../../../src/utils/validation.ts"],"sourcesContent":["import BigNumber from 'bignumber.js';\nimport { ALLOWED_FEE_TIERS_TEXT } from '../classes/error_catalog.js';\nimport { GSwapSDKError } from '../classes/gswap_sdk_error.js';\nimport type { NumericAmount } from '../types/amounts.js';\nimport { ALL_FEE_TIERS } from '../types/fees.js';\nimport type { FEE_TIER } from '../types/fees.js';\nimport { GC_MAX_TICK, GC_MIN_TICK } from './ticks.js';\n\nexport function validateNumericAmount(\n amount: NumericAmount,\n parameterName: string,\n allowZero = false,\n): void {\n if (typeof amount === 'number') {\n throw new GSwapSDKError('AMOUNT_IS_JS_NUMBER', { field: parameterName });\n }\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — substitute an explicit NaN so the isFinite() check below still catches\n // it and raises the same typed error, instead of a raw exception escaping.\n let bnAmount: BigNumber;\n try {\n bnAmount = BigNumber(amount);\n } catch {\n bnAmount = BigNumber(NaN);\n }\n\n if (!bnAmount.isFinite()) {\n throw new GSwapSDKError('AMOUNT_NOT_FINITE', {\n field: parameterName,\n value: String(amount),\n });\n }\n\n if (!allowZero && bnAmount.isZero()) {\n throw new GSwapSDKError('AMOUNT_NOT_POSITIVE', {\n field: parameterName,\n value: String(amount),\n });\n }\n\n if (bnAmount.isNegative()) {\n throw new GSwapSDKError('AMOUNT_NEGATIVE', { field: parameterName, value: String(amount) });\n }\n}\n\nexport function validatePriceValues(\n spotPrice: NumericAmount,\n lowerPrice: NumericAmount,\n upperPrice: NumericAmount,\n): void {\n if ([spotPrice, lowerPrice, upperPrice].some((value) => typeof value === 'number')) {\n throw new GSwapSDKError('PRICE_VALUES_IS_JS_NUMBER', {});\n }\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — substitute an explicit NaN so the isFinite()/isPositive() checks below\n // still catch it and raise the same typed error, instead of a raw exception escaping.\n const parse = (value: NumericAmount): BigNumber => {\n try {\n return BigNumber(value);\n } catch {\n return BigNumber(NaN);\n }\n };\n const bnSpotPrice = parse(spotPrice);\n const bnLowerPrice = parse(lowerPrice);\n let bnUpperPrice = parse(upperPrice);\n\n bnUpperPrice = bnUpperPrice.isFinite() ? bnUpperPrice : BigNumber(1e18);\n\n if (\n !bnSpotPrice.isFinite() ||\n !bnLowerPrice.isFinite() ||\n !bnUpperPrice.isFinite() ||\n !bnSpotPrice.isPositive() ||\n !bnLowerPrice.isPositive() ||\n !bnUpperPrice.isPositive()\n ) {\n throw new GSwapSDKError('INVALID_PRICE_VALUES', {\n spotPrice: String(spotPrice),\n lowerPrice: String(lowerPrice),\n upperPrice: String(upperPrice),\n });\n }\n\n if (bnLowerPrice.isGreaterThan(bnUpperPrice)) {\n throw new GSwapSDKError('INVALID_PRICE_RANGE', {\n lowerPrice: String(lowerPrice),\n upperPrice: String(upperPrice),\n });\n }\n}\n\nexport function validateTokenDecimals(decimals: number, parameterName: string): void {\n if (decimals < 0 || !Number.isInteger(decimals)) {\n throw new GSwapSDKError('INVALID_TOKEN_DECIMALS', { field: parameterName, value: decimals });\n }\n}\n\nexport function validateTickRange(tickLower: number, tickUpper: number): void {\n if (!Number.isInteger(tickLower) || !Number.isInteger(tickUpper)) {\n throw new GSwapSDKError('TICKS_NOT_INTEGERS', { tickLower, tickUpper });\n }\n\n if (tickLower >= tickUpper) {\n throw new GSwapSDKError('INVALID_TICK_RANGE', { tickLower, tickUpper });\n }\n\n if (tickLower < GC_MIN_TICK || tickUpper > GC_MAX_TICK) {\n throw new GSwapSDKError('TICKS_OUT_OF_BOUNDS', {\n tickLower,\n tickUpper,\n minTick: GC_MIN_TICK,\n maxTick: GC_MAX_TICK,\n });\n }\n}\n\nexport function validateFee(fee: number): asserts fee is FEE_TIER {\n if (!ALL_FEE_TIERS.some((tier) => Number(tier) === fee)) {\n throw new GSwapSDKError('INVALID_FEE', {\n field: 'fee',\n value: fee,\n allowed: ALLOWED_FEE_TIERS_TEXT,\n });\n }\n}\n\nexport function validateTickSpacing(tickSpacing: number): void {\n if (!Number.isInteger(tickSpacing) || tickSpacing <= 0) {\n throw new GSwapSDKError('INVALID_TICK_SPACING', { value: tickSpacing });\n }\n}\n\nexport function validateWalletAddress(address?: string): asserts address is string {\n if (address === undefined) {\n throw new GSwapSDKError('MISSING_WALLET_ADDRESS', {});\n }\n\n if (!address || typeof address !== 'string' || address.trim().length === 0) {\n throw new GSwapSDKError('INVALID_WALLET_ADDRESS', {\n field: 'walletAddress',\n value: String(address),\n });\n }\n}\n\n/** Words the chain gateway refuses as a trading symbol. */\nconst RESERVED_TRADING_SYMBOLS = new Set(['Token', 'Unit', 'none']);\nconst TRADING_SYMBOL_PATTERN = /^[A-Za-z0-9]+$/u;\nconst MAX_TRADING_SYMBOL_LENGTH = 32;\n\n/**\n * True when `symbol` is acceptable to propose into the trading-symbol registry: ASCII letters and\n * digits only, 1 to 32 characters, and not a reserved word (`Token`, `Unit`, `none`) — the rules\n * the chain gateway enforces on a CreatePool symbol.\n */\nexport function isProposableTradingSymbol(symbol: string): boolean {\n return (\n TRADING_SYMBOL_PATTERN.test(symbol) &&\n symbol.length <= MAX_TRADING_SYMBOL_LENGTH &&\n !RESERVED_TRADING_SYMBOLS.has(symbol)\n );\n}\n\n/**\n * Asserts that a pair is in the contract's canonical order (`token0 < token1` by plain string\n * comparison), which every write DTO requires. A pair a caller took from a stale quote or\n * position can be reversed; signing it would sign something other than what was priced.\n *\n * @throws GSwapSDKError `NON_CANONICAL_PAIR` (`params.token0`, `params.token1`) otherwise.\n */\nexport function assertCanonicalPair(token0: string, token1: string): void {\n if (!(token0 < token1)) {\n throw new GSwapSDKError('NON_CANONICAL_PAIR', { token0, token1 });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","names":[],"sources":["../../../src/utils/validation.ts"],"sourcesContent":["import BigNumber from 'bignumber.js';\nimport { ALLOWED_FEE_TIERS_TEXT } from '../classes/error_catalog.js';\nimport { GSwapSDKError } from '../classes/gswap_sdk_error.js';\nimport type { NumericAmount } from '../types/amounts.js';\nimport { ALL_FEE_TIERS } from '../types/fees.js';\nimport type { FEE_TIER } from '../types/fees.js';\nimport { GC_MAX_TICK, GC_MIN_TICK } from './tick_math.js';\n\n/**\n * Validates a decimal amount: a string or `BigNumber`, never a JavaScript number.\n *\n * @param amount - The amount to check.\n * @param parameterName - The field name reported in the error's `params.field`.\n * @param allowZero - Accept zero (default `false`).\n * @throws GSwapSDKError `AMOUNT_IS_JS_NUMBER`, `AMOUNT_NOT_FINITE`, `AMOUNT_NOT_POSITIVE` (zero\n * when `allowZero` is false) or `AMOUNT_NEGATIVE`.\n */\nexport function validateNumericAmount(\n amount: NumericAmount,\n parameterName: string,\n allowZero = false,\n): void {\n if (typeof amount === 'number') {\n throw new GSwapSDKError('AMOUNT_IS_JS_NUMBER', { field: parameterName });\n }\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — substitute an explicit NaN so the isFinite() check below still catches\n // it and raises the same typed error, instead of a raw exception escaping.\n let bnAmount: BigNumber;\n try {\n bnAmount = BigNumber(amount);\n } catch {\n bnAmount = BigNumber(NaN);\n }\n\n if (!bnAmount.isFinite()) {\n throw new GSwapSDKError('AMOUNT_NOT_FINITE', {\n field: parameterName,\n value: String(amount),\n });\n }\n\n if (!allowZero && bnAmount.isZero()) {\n throw new GSwapSDKError('AMOUNT_NOT_POSITIVE', {\n field: parameterName,\n value: String(amount),\n });\n }\n\n if (bnAmount.isNegative()) {\n throw new GSwapSDKError('AMOUNT_NEGATIVE', { field: parameterName, value: String(amount) });\n }\n}\n\n/**\n * Validates a spot price and a lower/upper price range: none a JavaScript number, all positive and\n * finite (a non-finite upper bound counts as an unbounded `1e18`), and `lowerPrice <= upperPrice`.\n *\n * @throws GSwapSDKError `PRICE_VALUES_IS_JS_NUMBER`, `INVALID_PRICE_VALUES` or `INVALID_PRICE_RANGE`.\n */\nexport function validatePriceValues(\n spotPrice: NumericAmount,\n lowerPrice: NumericAmount,\n upperPrice: NumericAmount,\n): void {\n if ([spotPrice, lowerPrice, upperPrice].some((value) => typeof value === 'number')) {\n throw new GSwapSDKError('PRICE_VALUES_IS_JS_NUMBER', {});\n }\n // bignumber.js 11+ throws on an unparseable value instead of constructing a NaN\n // instance — substitute an explicit NaN so the isFinite()/isPositive() checks below\n // still catch it and raise the same typed error, instead of a raw exception escaping.\n const parse = (value: NumericAmount): BigNumber => {\n try {\n return BigNumber(value);\n } catch {\n return BigNumber(NaN);\n }\n };\n const bnSpotPrice = parse(spotPrice);\n const bnLowerPrice = parse(lowerPrice);\n let bnUpperPrice = parse(upperPrice);\n\n bnUpperPrice = bnUpperPrice.isFinite() ? bnUpperPrice : BigNumber(1e18);\n\n if (\n !bnSpotPrice.isFinite() ||\n !bnLowerPrice.isFinite() ||\n !bnUpperPrice.isFinite() ||\n !bnSpotPrice.isPositive() ||\n !bnLowerPrice.isPositive() ||\n !bnUpperPrice.isPositive()\n ) {\n throw new GSwapSDKError('INVALID_PRICE_VALUES', {\n spotPrice: String(spotPrice),\n lowerPrice: String(lowerPrice),\n upperPrice: String(upperPrice),\n });\n }\n\n if (bnLowerPrice.isGreaterThan(bnUpperPrice)) {\n throw new GSwapSDKError('INVALID_PRICE_RANGE', {\n lowerPrice: String(lowerPrice),\n upperPrice: String(upperPrice),\n });\n }\n}\n\n/**\n * Validates a token's decimals: a non-negative integer.\n *\n * @throws GSwapSDKError `INVALID_TOKEN_DECIMALS` (`params.field` is `parameterName`).\n */\nexport function validateTokenDecimals(decimals: number, parameterName: string): void {\n if (decimals < 0 || !Number.isInteger(decimals)) {\n throw new GSwapSDKError('INVALID_TOKEN_DECIMALS', { field: parameterName, value: decimals });\n }\n}\n\n/**\n * Validates a position's tick range: two integers with `tickLower < tickUpper`, both within\n * `GC_MIN_TICK`..`GC_MAX_TICK`. It does not check alignment to a fee tier's spacing (see\n * `assertTickRange`).\n *\n * @throws GSwapSDKError `TICKS_NOT_INTEGERS`, `INVALID_TICK_RANGE` or `TICKS_OUT_OF_BOUNDS`.\n */\nexport function validateTickRange(tickLower: number, tickUpper: number): void {\n if (!Number.isInteger(tickLower) || !Number.isInteger(tickUpper)) {\n throw new GSwapSDKError('TICKS_NOT_INTEGERS', { tickLower, tickUpper });\n }\n\n if (tickLower >= tickUpper) {\n throw new GSwapSDKError('INVALID_TICK_RANGE', { tickLower, tickUpper });\n }\n\n if (tickLower < GC_MIN_TICK || tickUpper > GC_MAX_TICK) {\n throw new GSwapSDKError('TICKS_OUT_OF_BOUNDS', {\n tickLower,\n tickUpper,\n minTick: GC_MIN_TICK,\n maxTick: GC_MAX_TICK,\n });\n }\n}\n\n/**\n * Asserts that `fee` is one of the fee tiers in `ALL_FEE_TIERS` (`0`, `500`, `3000`, `10000`).\n *\n * @throws GSwapSDKError `INVALID_FEE` (`params.field` `'fee'`, `params.allowed` the tiers).\n */\nexport function validateFee(fee: number): asserts fee is FEE_TIER {\n if (!ALL_FEE_TIERS.some((tier) => Number(tier) === fee)) {\n throw new GSwapSDKError('INVALID_FEE', {\n field: 'fee',\n value: fee,\n allowed: ALLOWED_FEE_TIERS_TEXT,\n });\n }\n}\n\n/**\n * Validates a tick spacing: a positive integer.\n *\n * @throws GSwapSDKError `INVALID_TICK_SPACING`.\n */\nexport function validateTickSpacing(tickSpacing: number): void {\n if (!Number.isInteger(tickSpacing) || tickSpacing <= 0) {\n throw new GSwapSDKError('INVALID_TICK_SPACING', { value: tickSpacing });\n }\n}\n\n/**\n * Asserts that a wallet address was given and is a non-blank string. It does not check the address\n * format.\n *\n * @throws GSwapSDKError `MISSING_WALLET_ADDRESS` (undefined) or `INVALID_WALLET_ADDRESS` (blank).\n */\nexport function validateWalletAddress(address?: string): asserts address is string {\n if (address === undefined) {\n throw new GSwapSDKError('MISSING_WALLET_ADDRESS', {});\n }\n\n if (!address || typeof address !== 'string' || address.trim().length === 0) {\n throw new GSwapSDKError('INVALID_WALLET_ADDRESS', {\n field: 'walletAddress',\n value: String(address),\n });\n }\n}\n\n/** Words the chain gateway refuses as a trading symbol. */\nconst RESERVED_TRADING_SYMBOLS = new Set(['Token', 'Unit', 'none']);\nconst TRADING_SYMBOL_PATTERN = /^[A-Za-z0-9]+$/u;\nconst MAX_TRADING_SYMBOL_LENGTH = 32;\n\n/**\n * True when `symbol` is acceptable to propose into the trading-symbol registry: ASCII letters and\n * digits only, 1 to 32 characters, and not a reserved word (`Token`, `Unit`, `none`) — the rules\n * the chain gateway enforces on a CreatePool symbol.\n */\nexport function isProposableTradingSymbol(symbol: string): boolean {\n return (\n TRADING_SYMBOL_PATTERN.test(symbol) &&\n symbol.length <= MAX_TRADING_SYMBOL_LENGTH &&\n !RESERVED_TRADING_SYMBOLS.has(symbol)\n );\n}\n\n/**\n * Asserts that a pair is in the contract's canonical order (`token0 < token1` by plain string\n * comparison), which every write DTO requires. A pair a caller took from a stale quote or\n * position can be reversed; signing it would sign something other than what was priced.\n *\n * @throws GSwapSDKError `NON_CANONICAL_PAIR` (`params.token0`, `params.token1`) otherwise.\n */\nexport function assertCanonicalPair(token0: string, token1: string): void {\n if (!(token0 < token1)) {\n throw new GSwapSDKError('NON_CANONICAL_PAIR', { token0, token1 });\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=`1.2.0-rc.8`;export{e as SDK_VERSION};
1
+ const e=`1.2.0`;export{e as SDK_VERSION};
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["declare const __GSWAP_SDK_VERSION__: string | undefined;\n\n/** Package version embedded by the bundler, with a source-test fallback. */\nexport const SDK_VERSION =\n typeof __GSWAP_SDK_VERSION__ === 'string' ? __GSWAP_SDK_VERSION__ : '1.2.0-rc.8';\n"],"mappings":"AAGA,MAAa,EAAA"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["declare const __GSWAP_SDK_VERSION__: string | undefined;\n\n/** Package version embedded by the bundler, with a source-test fallback. */\nexport const SDK_VERSION =\n typeof __GSWAP_SDK_VERSION__ === 'string' ? __GSWAP_SDK_VERSION__ : '1.2.0';\n"],"mappings":"AAGA,MAAa,EAAA"}