@minswap/sdk-v2 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/index.cjs +4641 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +8734 -0
- package/dist/index.d.ts +8734 -0
- package/dist/index.js +4558 -0
- package/dist/index.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/errors.ts","../src/client/url.ts","../src/client/aggregator-api-client.ts","../src/client/app-api-client.ts","../src/client/http.ts","../src/client/app-graphql-client.ts","../src/client/config.ts","../src/client/key-app-api-client.ts","../src/client/asset-id.ts","../src/modules/shared-schemas.ts","../src/modules/aggregator-module.ts","../src/client/pagination.ts","../src/client/rpc-provider.ts","../src/modules/wallet-inputs.ts","../src/modules/farm-module.ts","../src/liquidity/config.ts","../src/liquidity/plutus.ts","../src/liquidity/datum/dex-v2.ts","../src/liquidity/datum/dex-v1.ts","../src/liquidity/math/dex-v2.ts","../src/liquidity/math/dex-v1.ts","../src/liquidity/serializer.ts","../src/liquidity/build/assemble.ts","../src/liquidity/build/dex-v1.ts","../src/liquidity/build/dex-v2.ts","../src/liquidity/datum/stableswap.ts","../src/liquidity/math/stableswap.ts","../src/liquidity/build/stableswap.ts","../src/liquidity/config-stableswap.ts","../src/liquidity/pool-state.ts","../src/modules/liquidity-module.ts","../src/modules/order-module.ts","../src/modules/pool-module.ts","../src/modules/portfolio-module.ts","../src/modules/staking-module.ts","../src/modules/token-module.ts","../src/sdk.ts","../src/client/kupo-rpc-provider.ts"],"names":["MinswapErrorCode","z","graphqlEnvelope","asset","inputs","cbor","depositStep","withdrawStep","orderDatum","direction","isAda","unitOf","resolveSender","build","adaSide","tokenAsset","buildAddLiquidity","buildRemoveLiquidity","calculateDeposit","calculateWithdraw","minimumWithSlippage","buildZapOut","assetSchema","INTERNAL_SDK"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error model for the Minswap SDK HTTP layer.\n *\n * Two deliberate choices, both departures from patterns seen elsewhere:\n *\n * 1. Every failure throws. Nothing returns `null` to signal an error, so a\n * caller never has to guess whether a nullish result means \"not found\",\n * \"network died\", or \"the backend changed shape\".\n * 2. `details` is statically tied to `code` via {@link MinswapErrorDetailsMap},\n * so narrowing on the code gives you a fully typed payload.\n */\n\nexport enum MinswapErrorCode {\n /** Transport failed outright — DNS, connection reset, CORS, offline. */\n NETWORK = \"NETWORK\",\n /** The request exceeded the configured timeout and was aborted. */\n TIMEOUT = \"TIMEOUT\",\n /** HTTP 429. Never retried automatically — see the note on the details type. */\n RATE_LIMITED = \"RATE_LIMITED\",\n /** The requested resource does not exist (HTTP 404, or an empty singular response). */\n NOT_FOUND = \"NOT_FOUND\",\n /** Caller passed something the SDK rejected before any request was made. */\n INVALID_PARAMS = \"INVALID_PARAMS\",\n /** The response did not match its schema — almost always backend drift. */\n PARSE_ERROR = \"PARSE_ERROR\",\n /** Any other non-2xx HTTP response. */\n API_ERROR = \"API_ERROR\",\n /** A GraphQL response carried an `errors` array. */\n GRAPHQL_ERROR = \"GRAPHQL_ERROR\",\n}\n\n/** A single schema mismatch, flattened out of Zod so consumers need not depend on it. */\nexport type MinswapParseIssue = {\n /** Dotted path to the offending field, e.g. `data.pools.0.tvl_usd`. */\n path: string;\n message: string;\n};\n\nexport type MinswapGraphQLIssue = {\n message: string;\n path?: (string | number)[];\n};\n\nexport type MinswapErrorDetailsMap = {\n [MinswapErrorCode.NETWORK]: { endpoint: string; cause?: unknown };\n [MinswapErrorCode.TIMEOUT]: { endpoint: string; timeoutMs: number };\n [MinswapErrorCode.RATE_LIMITED]: {\n host: string;\n /**\n * From the `Retry-After` header when present, otherwise `null`.\n *\n * Do not busy-retry on this. The app API host blocks a breaching IP for\n * 60 minutes, so retrying turns a momentary throttle into an hour of\n * downtime. The SDK never retries a 429 for this reason.\n */\n retryAfterMs: number | null;\n };\n [MinswapErrorCode.NOT_FOUND]: { resource: string; id: string };\n [MinswapErrorCode.INVALID_PARAMS]: { param: string; reason: string };\n [MinswapErrorCode.PARSE_ERROR]: {\n endpoint: string;\n issues: MinswapParseIssue[];\n };\n [MinswapErrorCode.API_ERROR]: {\n endpoint: string;\n status: number;\n body: unknown;\n };\n [MinswapErrorCode.GRAPHQL_ERROR]: {\n operation: string;\n errors: MinswapGraphQLIssue[];\n };\n};\n\nexport type MinswapErrorDetails<T extends MinswapErrorCode> = MinswapErrorDetailsMap[T];\n\nexport class MinswapError<T extends MinswapErrorCode = MinswapErrorCode> extends Error {\n override readonly name = \"MinswapError\";\n readonly code: T;\n readonly details: MinswapErrorDetails<T>;\n\n constructor(message: string, code: T, details: MinswapErrorDetails<T>) {\n super(message);\n this.code = code;\n this.details = details;\n // Keeps `instanceof` working when the bundle is transpiled below ES2015.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Type guard for narrowing an unknown error to a specific code.\n *\n * @example\n * try { await sdk.token.getById(id); }\n * catch (e) {\n * if (MinswapError.is(e, MinswapErrorCode.RATE_LIMITED)) {\n * // e.details.retryAfterMs is typed here\n * }\n * }\n */\n static is<C extends MinswapErrorCode>(error: unknown, code: C): error is MinswapError<C> {\n return error instanceof MinswapError && error.code === code;\n }\n}\n","import { MinswapError, MinswapErrorCode } from \"./errors\";\n\nexport type QueryValue = string | number | boolean | (string | number)[] | undefined | null;\n\nexport type Query = Record<string, QueryValue>;\n\n/**\n * Join a base, a path, and a query object into a URL.\n *\n * `undefined` and `null` entries are dropped so callers can spread optional\n * params without guarding each one. Empty arrays are dropped too (they would\n * otherwise emit a bare `key=`). Non-empty arrays are comma-joined, which is the\n * convention every Minswap backend uses for repeated filters.\n */\nexport function buildUrl(base: string, path: string, query: Query = {}): string {\n let url: URL;\n try {\n url = new URL(`${base.replace(/\\/+$/, \"\")}${path}`);\n } catch (cause) {\n throw new MinswapError(\n `Invalid endpoint URL \"${base}${path}\"`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"url\", reason: `could not be parsed: ${String(cause)}` }\n );\n }\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n url.searchParams.set(key, value.join(\",\"));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n\n return url.toString();\n}\n\n/**\n * Normalize a caller-supplied instant to epoch milliseconds.\n *\n * Endpoints disagree on wire format — some want RFC 3339, others epoch\n * seconds — so modules accept `Date | number` and convert at the last moment.\n * A non-finite input (`NaN`, an `Invalid Date`) is rejected with a typed error\n * rather than propagating a raw `RangeError` from downstream conversions.\n */\nexport function toEpochMs(value: Date | number): number {\n const ms = value instanceof Date ? value.getTime() : value;\n if (!Number.isFinite(ms)) {\n throw new MinswapError(\n `Invalid time value: expected a finite epoch or a valid Date`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"time\", reason: \"not a finite epoch or valid Date\" }\n );\n }\n return ms;\n}\n\nexport function toEpochSeconds(value: Date | number): number {\n return Math.floor(toEpochMs(value) / 1000);\n}\n\nexport function toRfc3339(value: Date | number): string {\n return new Date(toEpochMs(value)).toISOString();\n}\n","import { ZodType } from \"zod\";\n\nimport { ResolvedMinswapConfig } from \"./config\";\nimport { HttpCore } from \"./http\";\nimport { buildUrl, Query } from \"./url\";\n\nexport type AggregatorApiGetOptions<T> = {\n path: string;\n query?: Query;\n schema: ZodType<T>;\n notFound?: { resource: string; id: string };\n};\n\nexport type AggregatorApiPostOptions<T> = Omit<AggregatorApiGetOptions<T>, \"query\"> & {\n body?: unknown;\n};\n\n/**\n * Client for the aggregator REST API (`agg-api.minswap.org`).\n *\n * Unlike the app API there is no response envelope — handlers return their\n * payload directly. There is also no authentication; access is limited only by\n * per-IP rate limiting.\n *\n * Note this host's ingress also fronts `/aggregator/cancel-tx`, which is served\n * by a separate key-holding service. That split is invisible here by design:\n * one base URL covers quoting, building, submitting, and cancelling.\n */\nexport class AggregatorApiClient {\n constructor(\n private readonly http: HttpCore,\n private readonly config: ResolvedMinswapConfig\n ) {}\n\n async get<T>(options: AggregatorApiGetOptions<T>): Promise<T> {\n return this.http.request({\n url: buildUrl(this.baseUrl, options.path, options.query),\n method: \"GET\",\n endpoint: `GET ${options.path}`,\n schema: options.schema,\n notFound: options.notFound,\n });\n }\n\n async post<T>(options: AggregatorApiPostOptions<T>): Promise<T> {\n return this.http.request({\n url: buildUrl(this.baseUrl, options.path),\n method: \"POST\",\n body: options.body,\n endpoint: `POST ${options.path}`,\n schema: options.schema,\n notFound: options.notFound,\n });\n }\n\n private get baseUrl(): string {\n return this.config.endpoints.aggregatorApiUrl;\n }\n}\n","import { z, ZodType } from \"zod\";\n\nimport { MinswapCurrency, ResolvedMinswapConfig } from \"./config\";\nimport { HttpCore } from \"./http\";\nimport { buildUrl, Query } from \"./url\";\n\n/**\n * Every app API response is wrapped in this envelope. Callers of this client\n * receive the unwrapped `data`, plus the pagination block when present.\n */\nconst paginationSchema = z.object({\n offset: z.number().nullish(),\n limit: z.number().nullish(),\n // Cursors are strings on newer endpoints and numeric ids on older ones.\n last_cursor: z.union([z.string(), z.number()]).nullish(),\n});\n\nexport type AppApiPagination = {\n offset?: number | null;\n limit?: number | null;\n lastCursor?: string | null;\n};\n\nfunction envelope<T>(data: ZodType<T>) {\n return z.object({\n code: z.number(),\n message: z.string().nullish(),\n data: data,\n pagination: paginationSchema.nullish(),\n });\n}\n\nexport type AppApiResult<T> = {\n data: T;\n pagination: AppApiPagination | undefined;\n};\n\nexport type AppApiGetOptions<T> = {\n path: string;\n query?: Query;\n schema: ZodType<T>;\n /** Currency for this call only; falls back to the SDK-wide setting. */\n currency?: MinswapCurrency;\n notFound?: { resource: string; id: string };\n};\n\nexport type AppApiPostOptions<T> = Omit<AppApiGetOptions<T>, \"query\"> & {\n body?: unknown;\n};\n\n/**\n * Client for the Minswap app API (`api-internal.minswap.org`).\n *\n * Read-only analytics: tokens, pools, yield pools, MIN staking, portfolio.\n * It builds no transactions — every write path in this SDK goes elsewhere.\n */\nexport class AppApiClient {\n constructor(\n private readonly http: HttpCore,\n private readonly config: ResolvedMinswapConfig\n ) {}\n\n async get<T>(options: AppApiGetOptions<T>): Promise<AppApiResult<T>> {\n return this.send(\n \"GET\",\n options.path,\n options,\n buildUrl(this.baseUrl, options.path, options.query)\n );\n }\n\n async post<T>(options: AppApiPostOptions<T>): Promise<AppApiResult<T>> {\n return this.send(\n \"POST\",\n options.path,\n options,\n buildUrl(this.baseUrl, options.path),\n options.body\n );\n }\n\n private get baseUrl(): string {\n return this.config.endpoints.appApiUrl;\n }\n\n private async send<T>(\n method: \"GET\" | \"POST\",\n path: string,\n options: AppApiGetOptions<T>,\n url: string,\n body?: unknown\n ): Promise<AppApiResult<T>> {\n const response = await this.http.request({\n url,\n method,\n body,\n endpoint: `${method} ${path}`,\n headers: this.headers(options.currency),\n schema: envelope(options.schema),\n notFound: options.notFound,\n });\n\n const pagination = response.pagination\n ? {\n offset: response.pagination.offset,\n limit: response.pagination.limit,\n lastCursor:\n response.pagination.last_cursor === null ||\n response.pagination.last_cursor === undefined\n ? null\n : String(response.pagination.last_cursor),\n }\n : undefined;\n\n return { data: response.data, pagination };\n }\n\n private headers(currency: MinswapCurrency | undefined): Record<string, string> {\n const headers: Record<string, string> = {\n \"x-currency\": currency ?? this.config.currency,\n };\n if (this.config.apiKey) {\n headers[\"x-api-key\"] = this.config.apiKey;\n }\n return headers;\n }\n}\n","import { ZodType } from \"zod\";\n\nimport { MinswapError, MinswapErrorCode, MinswapParseIssue } from \"./errors\";\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport type RetryConfig = {\n /** Number of retries *after* the initial attempt. `0` disables retrying. */\n retries: number;\n /** Base for exponential backoff: attempt N waits `baseDelayMs * 2^N`. */\n baseDelayMs: number;\n};\n\nexport type HttpCoreOptions = {\n fetch: FetchLike;\n timeoutMs: number;\n retry: RetryConfig;\n};\n\nexport type HttpRequest<T> = {\n /** Fully-qualified URL, query string already applied. */\n url: string;\n method: \"GET\" | \"POST\";\n /** Human-readable label used in error details, e.g. `POST /api/v1/coin/list`. */\n endpoint: string;\n headers?: Record<string, string>;\n /** Serialized as JSON when present. */\n body?: unknown;\n /** Validated at the trust boundary; the resolved value is `T`. */\n schema: ZodType<T>;\n /**\n * When provided, a 404 is reported as {@link MinswapErrorCode.NOT_FOUND}\n * carrying this resource/id instead of a generic API error.\n */\n notFound?: { resource: string; id: string };\n /**\n * Override how the response body is turned into a value.\n *\n * Defaults to `JSON.parse`. Kupo returns unbounded integers — token\n * quantities and large lovelace amounts both exceed `Number.MAX_SAFE_INTEGER`\n * — so that transport substitutes a bigint-preserving parser. Parsing those\n * as doubles would silently round the amount and produce transaction bytes\n * that do not match the chain.\n */\n parseJson?: (raw: string) => unknown;\n /**\n * Decode the response body even when the HTTP status is not 2xx.\n *\n * GraphQL returns resolver errors in the body — an `errors` array — often with\n * a 400 or 500 status. Without this, that body is thrown away as an opaque\n * API error and the structured errors are lost. The GraphQL client sets it so\n * those errors surface as {@link MinswapErrorCode.GRAPHQL_ERROR}. A 429 is\n * still reported as a rate limit regardless.\n */\n parseErrorBody?: boolean;\n};\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Decides whether a failure is worth another attempt.\n *\n * Deliberately narrow. Notably absent:\n *\n * - **429** — the app API host blocks a breaching IP for 60 minutes. Retrying a\n * throttle there converts a brief slowdown into an hour of hard failure, so a\n * rate limit always surfaces to the caller immediately.\n * - **Timeouts** — the request already consumed the full timeout budget.\n * Retrying twice at a 30s timeout means the caller waits 90s to learn it\n * failed, which is worse than failing fast.\n * - **4xx** — the request is wrong; sending it again will not fix it.\n */\nfunction isRetryable(error: MinswapError): boolean {\n if (error.code === MinswapErrorCode.NETWORK) {\n return true;\n }\n if (error.code === MinswapErrorCode.API_ERROR) {\n const { status } = (error as MinswapError<MinswapErrorCode.API_ERROR>).details;\n return status >= 500;\n }\n return false;\n}\n\nfunction toParseIssues(error: {\n issues: readonly { path: PropertyKey[]; message: string }[];\n}): MinswapParseIssue[] {\n return error.issues.map((issue) => ({\n path: issue.path.map(String).join(\".\") || \"<root>\",\n message: issue.message,\n }));\n}\n\n/**\n * Validate an already-decoded value at the trust boundary.\n *\n * Shared by the REST path and the GraphQL client, which has to inspect the\n * envelope for an `errors` array before it can validate the payload.\n */\nexport function parseOrThrow<T>(schema: ZodType<T>, value: unknown, endpoint: string): T {\n const result = schema.safeParse(value);\n if (result.success) {\n return result.data;\n }\n const issues = toParseIssues(result.error);\n throw new MinswapError(\n `${endpoint} returned an unexpected shape (${issues.length} issue(s)). This usually means the backend changed; please report it.`,\n MinswapErrorCode.PARSE_ERROR,\n { endpoint, issues }\n );\n}\n\nfunction apiError(endpoint: string, status: number, body: unknown): MinswapError {\n return new MinswapError(`${endpoint} responded ${status}`, MinswapErrorCode.API_ERROR, {\n endpoint,\n status,\n body,\n });\n}\n\nfunction parseRetryAfterMs(header: string | null): number | null {\n if (!header) {\n return null;\n }\n // `Retry-After` is either delta-seconds or an HTTP date.\n const seconds = Number(header);\n if (Number.isFinite(seconds)) {\n return seconds * 1000;\n }\n const at = Date.parse(header);\n return Number.isNaN(at) ? null : Math.max(0, at - Date.now());\n}\n\n/**\n * Shared transport for every Minswap backend: fetch with a timeout, a\n * conservative retry policy, uniform error mapping, and schema validation.\n *\n * Stateless apart from its options, so all three API clients share one instance.\n */\nexport class HttpCore {\n constructor(private readonly options: HttpCoreOptions) {}\n\n async request<T>(request: HttpRequest<T>): Promise<T> {\n const { retries, baseDelayMs } = this.options.retry;\n\n let lastError: MinswapError;\n for (let attempt = 0; ; attempt++) {\n try {\n return await this.attempt(request);\n } catch (error) {\n if (!(error instanceof MinswapError)) {\n throw error;\n }\n lastError = error;\n if (attempt >= retries || !isRetryable(error)) {\n throw lastError;\n }\n await sleep(baseDelayMs * 2 ** attempt);\n }\n }\n }\n\n private async attempt<T>(request: HttpRequest<T>): Promise<T> {\n const { timeoutMs } = this.options;\n const controller = new AbortController();\n // The deadline must cover the body read, not just the connection: a server\n // can send headers then stall mid-body, and `response.text()` would hang\n // forever. Aborting rejects an in-flight read, so one timer spans send +\n // assertOk + decode.\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await this.send(request, controller.signal);\n await this.assertOk(response, request);\n return await this.decode(response, request);\n } catch (cause) {\n if (controller.signal.aborted) {\n throw new MinswapError(\n `Request to ${request.endpoint} timed out after ${timeoutMs}ms`,\n MinswapErrorCode.TIMEOUT,\n { endpoint: request.endpoint, timeoutMs }\n );\n }\n throw cause;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async send<T>(request: HttpRequest<T>, signal: AbortSignal): Promise<Response> {\n const { fetch } = this.options;\n\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...request.headers,\n };\n if (request.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n }\n\n try {\n return await fetch(request.url, {\n method: request.method,\n headers,\n body: request.body === undefined ? undefined : JSON.stringify(request.body),\n signal,\n });\n } catch (cause) {\n // A timeout abort is mapped to TIMEOUT by `attempt`; let it bubble.\n if (signal.aborted) {\n throw cause;\n }\n throw new MinswapError(\n `Network request to ${request.endpoint} failed`,\n MinswapErrorCode.NETWORK,\n { endpoint: request.endpoint, cause }\n );\n }\n }\n\n private async assertOk<T>(response: Response, request: HttpRequest<T>): Promise<void> {\n if (response.ok) {\n return;\n }\n\n if (response.status === 429) {\n throw new MinswapError(\n `Rate limited by ${new URL(request.url).host}. This host blocks breaching clients for an extended period; back off before retrying.`,\n MinswapErrorCode.RATE_LIMITED,\n {\n host: new URL(request.url).host,\n retryAfterMs: parseRetryAfterMs(response.headers.get(\"retry-after\")),\n }\n );\n }\n\n // GraphQL delivers resolver errors in the body with a non-2xx status. When\n // the caller asked to parse the error body, decode it (so the `errors`\n // array survives) rather than discarding it as a generic API error.\n if (request.parseErrorBody) {\n return;\n }\n\n if (response.status === 404 && request.notFound) {\n const { resource, id } = request.notFound;\n throw new MinswapError(`No ${resource} found for \"${id}\"`, MinswapErrorCode.NOT_FOUND, {\n resource,\n id,\n });\n }\n\n throw apiError(request.endpoint, response.status, await readBody(response));\n }\n\n private async decode<T>(response: Response, request: HttpRequest<T>): Promise<T> {\n const raw = await response.text();\n\n let json: unknown;\n try {\n json = raw.length === 0 ? undefined : (request.parseJson ?? JSON.parse)(raw);\n } catch {\n // Only `parseErrorBody` requests (GraphQL) reach decode on a non-2xx. A\n // non-JSON body there — e.g. an ingress 502/503 HTML page — is a transport\n // failure, not schema drift: surface the status as API_ERROR (keeping 5xx\n // retryable) instead of a misleading PARSE_ERROR.\n if (!response.ok) {\n throw apiError(request.endpoint, response.status, truncate(raw));\n }\n throw new MinswapError(\n `${request.endpoint} returned a body that is not valid JSON`,\n MinswapErrorCode.PARSE_ERROR,\n {\n endpoint: request.endpoint,\n issues: [\n {\n path: \"<root>\",\n message: `Expected JSON, received: ${truncate(raw)}`,\n },\n ],\n }\n );\n }\n\n // A non-2xx with an empty body carries no GraphQL envelope to decode; report\n // the status instead of failing schema validation on `undefined`.\n if (!response.ok && json === undefined) {\n throw apiError(request.endpoint, response.status, null);\n }\n\n return parseOrThrow(request.schema, json, request.endpoint);\n }\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n try {\n const text = await response.text();\n try {\n return JSON.parse(text);\n } catch {\n return truncate(text);\n }\n } catch {\n return undefined;\n }\n}\n\nfunction truncate(value: string, max = 300): string {\n return value.length <= max ? value : `${value.slice(0, max)}…`;\n}\n","import { z, ZodType } from \"zod\";\n\nimport { ResolvedMinswapConfig } from \"./config\";\nimport { MinswapError, MinswapErrorCode } from \"./errors\";\nimport { HttpCore, parseOrThrow } from \"./http\";\n\nconst graphqlEnvelope = z.object({\n data: z.unknown().nullish(),\n errors: z\n .array(\n z.object({\n message: z.string(),\n path: z.array(z.union([z.string(), z.number()])).nullish(),\n })\n )\n .nullish(),\n});\n\nexport type AppGraphqlOperation<T> = {\n /** Operation name, used for error reporting only. */\n operation: string;\n /** The GraphQL document to execute. */\n document: string;\n variables?: Record<string, unknown>;\n /** Validates the payload under the operation's field, not the whole envelope. */\n schema: ZodType<T>;\n};\n\n/**\n * Read client for the app-monorepo GraphQL host (`appGraphqlUrl`).\n *\n * Deliberately identical in shape to {@link KeyAppApiClient} — same envelope,\n * same single-root-field unwrap, same `parseErrorBody` so resolver errors\n * carried on a non-2xx status surface as {@link MinswapErrorCode.GRAPHQL_ERROR}\n * — but it runs **queries** (pool state), not mutations, and the results are\n * plain read data, never partially-signed CBOR. It exists as its own class\n * rather than being folded into the key-app client because it targets a\n * different host and a different operation kind.\n */\nexport class AppGraphqlClient {\n constructor(\n private readonly http: HttpCore,\n private readonly config: ResolvedMinswapConfig\n ) {}\n\n async execute<T>(operation: AppGraphqlOperation<T>): Promise<T> {\n const endpoint = `GraphQL ${operation.operation}`;\n\n const response = await this.http.request({\n url: this.config.endpoints.appGraphqlUrl,\n method: \"POST\",\n endpoint,\n body: {\n // No `operationName`: each document defines exactly one operation, so\n // the server runs it without one. Sending the field name would have to\n // match the document's operation name exactly — a needless coupling.\n query: operation.document,\n variables: operation.variables ?? {},\n },\n schema: graphqlEnvelope,\n // Resolver errors can come back with a 400/500 status; decode the body\n // anyway so the GraphQL `errors` array is not lost as an opaque API error.\n parseErrorBody: true,\n });\n\n if (response.errors && response.errors.length > 0) {\n throw new MinswapError(\n `${operation.operation} failed: ${response.errors.map((e) => e.message).join(\"; \")}`,\n MinswapErrorCode.GRAPHQL_ERROR,\n {\n operation: operation.operation,\n errors: response.errors.map((e) => ({\n message: e.message,\n path: e.path ?? undefined,\n })),\n }\n );\n }\n\n const data = response.data;\n if (data === null || data === undefined) {\n throw new MinswapError(\n `${operation.operation} returned no data and no errors`,\n MinswapErrorCode.PARSE_ERROR,\n {\n endpoint,\n issues: [{ path: \"data\", message: \"Expected an object, received null\" }],\n }\n );\n }\n\n // Unwrap the single root field so schemas describe the value the caller\n // cares about. Every document selects exactly one field; anything else means\n // the document and this client disagree, so fail loudly.\n const root = data as Record<string, unknown>;\n const keys = Object.keys(root);\n if (keys.length !== 1) {\n throw new MinswapError(\n `${operation.operation} expected a single root field, got [${keys.join(\", \")}]`,\n MinswapErrorCode.PARSE_ERROR,\n {\n endpoint,\n issues: [\n { path: \"data\", message: `expected exactly one root field, got ${keys.length}` },\n ],\n }\n );\n }\n\n return parseOrThrow(operation.schema, root[keys[0]], endpoint);\n }\n}\n","import { MinswapError, MinswapErrorCode } from \"./errors\";\nimport { FetchLike, RetryConfig } from \"./http\";\nimport { RpcProvider } from \"./rpc-provider\";\n\n/**\n * Only mainnet is currently served. Testnet deployments of the app API and\n * aggregator APIs are not public, so rather than ship an enum member that\n * resolves to a dead host, point {@link MinswapSdkConfig.endpoints} at\n * whatever you are running.\n */\nexport type MinswapNetwork = \"mainnet\";\n\n/** Value of the `X-Currency` header. Drives which fiat denomination prices come back in. */\nexport type MinswapCurrency = \"USD\" | \"ADA\";\n\nexport type MinswapEndpoints = {\n /** Minswap app API — tokens, pools, farms, staking, portfolio. */\n appApiUrl: string;\n /**\n * Aggregator REST API.\n *\n * Defaults to the public `agg-api.minswap.org` ingress rather than the\n * `aggr-monorepo-*` origin. That ingress additionally routes\n * `/aggregator/cancel-tx` through to the key-aggr service, so a single base\n * URL covers the whole aggregator surface including cancellation.\n */\n aggregatorApiUrl: string;\n /** key-app-api GraphQL endpoint — farm and MIN staking transaction building. */\n keyAppApiUrl: string;\n /**\n * app-monorepo GraphQL endpoint — reads a pool's on-chain state (reserves,\n * total liquidity, fee) for quoting liquidity operations.\n *\n * This is a different host from {@link appApiUrl} (the Go read API): it is the\n * TypeScript monorepo's GraphQL server, which serves `appliedPoolsBy*` with the\n * pool UTxO's Plutus datum inline so the SDK can decode reserves without its\n * own chain access.\n */\n appGraphqlUrl: string;\n};\n\nexport const DEFAULT_ENDPOINTS: Record<MinswapNetwork, MinswapEndpoints> = {\n mainnet: {\n appApiUrl: \"https://api-internal.minswap.org\",\n aggregatorApiUrl: \"https://agg-api.minswap.org\",\n keyAppApiUrl: \"https://k-app-monorepo-mainnet-prod.minswap.org/graphql\",\n appGraphqlUrl: \"https://app-monorepo-mainnet-prod.minswap.org/graphql\",\n },\n};\n\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\nexport const DEFAULT_RETRY: RetryConfig = {\n retries: 2,\n baseDelayMs: 300,\n};\n\nexport type MinswapSdkConfig = {\n /** @default \"mainnet\" */\n network?: MinswapNetwork;\n /** @default \"USD\" */\n currency?: MinswapCurrency;\n /**\n * Sent as `X-API-Key` to the app API host, which raises the rate limit above\n * the anonymous per-IP budget. Optional — the API is usable without one.\n */\n apiKey?: string;\n /** Override any subset of the default hosts. Useful for staging or a local backend. */\n endpoints?: Partial<MinswapEndpoints>;\n /**\n * Injected for testing, or for runtimes with a non-global fetch.\n * @default globalThis.fetch\n */\n fetch?: FetchLike;\n /** Per-request timeout in milliseconds. @default 30000 */\n timeoutMs?: number;\n /** Retry policy for transient failures. 429 is never retried. @default {retries: 2, baseDelayMs: 300} */\n retry?: Partial<RetryConfig>;\n /**\n * Chain access, used to resolve a wallet's UTxOs.\n *\n * Only farm and MIN staking actions need this — they take the caller's\n * address and must supply its UTxOs as transaction inputs. Every read\n * (token, pool, portfolio, order) works without it, so it stays optional and\n * the actions that require it fail with a clear message when it is absent.\n */\n rpcProvider?: RpcProvider;\n};\n\n/** {@link MinswapSdkConfig} with every default filled in. */\nexport type ResolvedMinswapConfig = {\n network: MinswapNetwork;\n currency: MinswapCurrency;\n apiKey: string | undefined;\n endpoints: MinswapEndpoints;\n fetch: FetchLike;\n timeoutMs: number;\n retry: RetryConfig;\n rpcProvider: RpcProvider | undefined;\n};\n\nfunction invalid(param: string, reason: string): never {\n throw new MinswapError(`Invalid config: ${param} ${reason}`, MinswapErrorCode.INVALID_PARAMS, {\n param,\n reason,\n });\n}\n\nexport function resolveConfig(config: MinswapSdkConfig = {}): ResolvedMinswapConfig {\n const network = config.network ?? \"mainnet\";\n\n const fetchImpl = config.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n invalid(\n \"fetch\",\n \"is not available on globalThis; pass an implementation via `new MinswapSdk({ fetch })`\"\n );\n }\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n invalid(\"timeoutMs\", \"must be a positive finite number\");\n }\n\n const retries = config.retry?.retries ?? DEFAULT_RETRY.retries;\n if (!Number.isInteger(retries) || retries < 0) {\n invalid(\"retry.retries\", \"must be a non-negative integer\");\n }\n\n const baseDelayMs = config.retry?.baseDelayMs ?? DEFAULT_RETRY.baseDelayMs;\n if (!Number.isFinite(baseDelayMs) || baseDelayMs < 0) {\n invalid(\"retry.baseDelayMs\", \"must be a non-negative finite number\");\n }\n\n return {\n network,\n currency: config.currency ?? \"USD\",\n apiKey: config.apiKey,\n endpoints: {\n ...DEFAULT_ENDPOINTS[network],\n ...config.endpoints,\n },\n fetch: fetchImpl,\n timeoutMs,\n retry: { retries, baseDelayMs },\n rpcProvider: config.rpcProvider,\n };\n}\n","import { z, ZodType } from \"zod\";\n\nimport { ResolvedMinswapConfig } from \"./config\";\nimport { MinswapError, MinswapErrorCode } from \"./errors\";\nimport { HttpCore, parseOrThrow } from \"./http\";\n\nconst graphqlEnvelope = z.object({\n data: z.unknown().nullish(),\n errors: z\n .array(\n z.object({\n message: z.string(),\n path: z.array(z.union([z.string(), z.number()])).nullish(),\n })\n )\n .nullish(),\n});\n\nexport type KeyAppApiOperation<T> = {\n /** Operation name, used for error reporting only. */\n operation: string;\n /** The GraphQL document to execute. */\n document: string;\n variables?: Record<string, unknown>;\n /** Validates the payload under the operation's field, not the whole envelope. */\n schema: ZodType<T>;\n};\n\n/**\n * Client for key-app-api (`k-app-monorepo-mainnet-prod.minswap.org/graphql`).\n *\n * This host builds farm and MIN staking transactions. It exists as a separate\n * transport because those contracts require Minswap-held keys as required\n * signers and the reward math depends on the backend's indexed database — so\n * the transaction cannot be constructed client-side.\n *\n * Everything it returns is CBOR that has already been **partially signed** by\n * the server. Consumers must sign with `partialSign = true` and assemble the\n * witness onto the existing one rather than replacing it.\n */\nexport class KeyAppApiClient {\n constructor(\n private readonly http: HttpCore,\n private readonly config: ResolvedMinswapConfig\n ) {}\n\n async execute<T>(operation: KeyAppApiOperation<T>): Promise<T> {\n const endpoint = `GraphQL ${operation.operation}`;\n\n const response = await this.http.request({\n url: this.config.endpoints.keyAppApiUrl,\n method: \"POST\",\n endpoint,\n body: {\n // No `operationName`: each document defines exactly one operation, so\n // GraphQL runs it without one. Sending the field name here would have\n // to match the document's operation name exactly, which is a needless\n // coupling — `operation.operation` is only a label for errors and the\n // single-field unwrap below.\n query: operation.document,\n variables: operation.variables ?? {},\n },\n schema: graphqlEnvelope,\n // This host returns resolver errors with a 400/500 status; decode the\n // body anyway so the GraphQL `errors` array is not lost.\n parseErrorBody: true,\n });\n\n if (response.errors && response.errors.length > 0) {\n throw new MinswapError(\n `${operation.operation} failed: ${response.errors.map((e) => e.message).join(\"; \")}`,\n MinswapErrorCode.GRAPHQL_ERROR,\n {\n operation: operation.operation,\n errors: response.errors.map((e) => ({\n message: e.message,\n path: e.path ?? undefined,\n })),\n }\n );\n }\n\n const data = response.data;\n if (data === null || data === undefined) {\n throw new MinswapError(\n `${operation.operation} returned no data and no errors`,\n MinswapErrorCode.PARSE_ERROR,\n {\n endpoint,\n issues: [{ path: \"data\", message: \"Expected an object, received null\" }],\n }\n );\n }\n\n // GraphQL nests the payload under the field name; unwrap the single root\n // field so schemas describe the value the caller actually cares about. Every\n // document selects exactly one field — anything else (an empty `data: {}` or\n // multiple roots) means the document and the client disagree, so fail loudly\n // rather than hand the whole envelope to a schema written for the inner value.\n const root = data as Record<string, unknown>;\n const keys = Object.keys(root);\n if (keys.length !== 1) {\n throw new MinswapError(\n `${operation.operation} expected a single root field, got [${keys.join(\", \")}]`,\n MinswapErrorCode.PARSE_ERROR,\n {\n endpoint,\n issues: [\n { path: \"data\", message: `expected exactly one root field, got ${keys.length}` },\n ],\n }\n );\n }\n\n return parseOrThrow(operation.schema, root[keys[0]], endpoint);\n }\n}\n","/**\n * Two token-identifier conventions coexist across Minswap's backends:\n *\n * - The **app API** uses a dotted `coinId`: `policyIdHex.assetNameHex`, a bare\n * `policyIdHex` when the asset name is empty, or `lovelace` for ADA.\n * - The **aggregator** uses a concatenated *unit*: `policyIdHex + assetNameHex`\n * with no separator, or `lovelace`.\n *\n * The SDK speaks the dotted `coinId` everywhere so callers learn one convention.\n * These converters bridge to the aggregator's form at that boundary.\n *\n * A Cardano policy id is always 28 bytes — 56 hex characters — so the split\n * point between policy and asset name is fixed, which makes the round trip\n * unambiguous.\n */\n\nconst POLICY_ID_HEX_LENGTH = 56;\n\n/** Dotted `coinId` (or bare policy / `lovelace`) to the aggregator's concatenated unit. */\nexport function coinIdToAssetUnit(coinId: string): string {\n if (coinId === \"lovelace\") {\n return \"lovelace\";\n }\n // A coinId carries at most one dot, separating policy from asset name.\n return coinId.replace(\".\", \"\");\n}\n\n/** The aggregator's concatenated unit back to a dotted `coinId`. */\nexport function assetUnitToCoinId(unit: string): string {\n if (unit === \"lovelace\" || unit.length <= POLICY_ID_HEX_LENGTH) {\n // `lovelace`, or a bare policy id with no asset name — no dot to add.\n return unit;\n }\n return `${unit.slice(0, POLICY_ID_HEX_LENGTH)}.${unit.slice(POLICY_ID_HEX_LENGTH)}`;\n}\n\n/**\n * A coin's policy id and asset name as separate hex fields.\n *\n * The GraphQL mutations take assets in this split `InputAsset` shape rather than\n * as a single id.\n */\nexport type InputAsset = {\n currencySymbol: string;\n tokenName: string;\n};\n\n/** Split a dotted `coinId` into an `InputAsset`. */\nexport function coinIdToInputAsset(coinId: string): InputAsset {\n if (coinId === \"lovelace\") {\n return { currencySymbol: \"\", tokenName: \"\" };\n }\n const dot = coinId.indexOf(\".\");\n if (dot === -1) {\n // Bare policy id, empty asset name.\n return { currencySymbol: coinId, tokenName: \"\" };\n }\n return {\n currencySymbol: coinId.slice(0, dot),\n tokenName: coinId.slice(dot + 1),\n };\n}\n\n/** Join a split `InputAsset` back into a dotted `coinId`. */\nexport function inputAssetToCoinId(asset: InputAsset): string {\n if (asset.currencySymbol === \"\") {\n return \"lovelace\";\n }\n return asset.tokenName === \"\"\n ? asset.currencySymbol\n : `${asset.currencySymbol}.${asset.tokenName}`;\n}\n","import { z } from \"zod\";\n\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\n\n/**\n * Schemas shared across modules.\n *\n * Two upstream quirks drive most of the defensiveness here:\n *\n * - Go marshals a nil slice as `null`, not `[]`. Every array is therefore\n * `.nullish()` and normalized to an empty array.\n * - `omitempty` on a numeric field drops it when it is zero, so several counts\n * and amounts are absent rather than `0`. Those default to `0`.\n */\n\n/** Nil-slice-tolerant array that always resolves to a real array. */\nexport function arrayOf<T extends z.ZodTypeAny>(schema: T) {\n return z\n .array(schema)\n .nullish()\n .transform((value) => value ?? []);\n}\n\n/** A numeric field the backend drops when it equals zero. */\nexport const zeroableNumber = z\n .number()\n .nullish()\n .transform((value) => value ?? 0);\n\n/** Identity of a coin, as embedded in most responses. */\nexport const coinBasicInfoSchema = z\n .object({\n coin_type: z.string().nullish(),\n symbol: z.string(),\n decimals: z.number(),\n icon_url: z.string(),\n verified: z.boolean(),\n })\n .transform((c) => ({\n coinId: c.coin_type ?? null,\n symbol: c.symbol,\n decimals: c.decimals,\n iconUrl: c.icon_url,\n verified: c.verified,\n }));\n\nexport type CoinBasicInfo = z.infer<typeof coinBasicInfoSchema>;\n\n/** A coin plus how much of it, and what that is worth. */\nexport const coinAmountInfoSchema = z\n .object({\n coin_type: z.string().nullish(),\n symbol: z.string(),\n decimals: z.number(),\n icon_url: z.string(),\n verified: z.boolean(),\n amount: z.number(),\n usd_value: z.number(),\n })\n .transform((c) => ({\n coinId: c.coin_type ?? null,\n symbol: c.symbol,\n decimals: c.decimals,\n iconUrl: c.icon_url,\n verified: c.verified,\n amount: c.amount,\n usdValue: c.usd_value,\n }));\n\nexport type CoinAmountInfo = z.infer<typeof coinAmountInfoSchema>;\n\n/** A coin as it appears inside a pool, carrying a free-form category label. */\nexport const poolCoinSchema = z\n .object({\n coin_type: z.string().nullish(),\n symbol: z.string(),\n decimals: z.number(),\n icon_url: z.string(),\n verified: z.boolean(),\n category: z.string().nullish(),\n })\n .transform((c) => ({\n coinId: c.coin_type ?? null,\n symbol: c.symbol,\n decimals: c.decimals,\n iconUrl: c.icon_url,\n verified: c.verified,\n /** Free-form; not constrained to the `categoryGroup` filter values. */\n category: c.category ?? null,\n }));\n\nexport type PoolCoin = z.infer<typeof poolCoinSchema>;\n\n/** An emission stream attached to a pool or farm. */\nexport const poolRewardSchema = z\n .object({\n coin_type: z.string().nullish(),\n symbol: z.string(),\n decimals: z.number(),\n icon_url: z.string(),\n verified: z.boolean(),\n daily_amount: z.number(),\n daily_amount_usd: z.number(),\n apr: z.number(),\n })\n .transform((r) => ({\n coinId: r.coin_type ?? null,\n symbol: r.symbol,\n decimals: r.decimals,\n iconUrl: r.icon_url,\n verified: r.verified,\n dailyAmount: r.daily_amount,\n dailyAmountUsd: r.daily_amount_usd,\n apr: r.apr,\n }));\n\nexport type PoolReward = z.infer<typeof poolRewardSchema>;\n\nexport const poolFeeSchema = z\n .object({ fee_raw: z.number(), fee_usd: z.number() })\n .transform((f) => ({ feeRaw: f.fee_raw, feeUsd: f.fee_usd }));\n\nexport type PoolFee = z.infer<typeof poolFeeSchema>;\n\n/**\n * One OHLC candle.\n *\n * The two upstream chart endpoints disagree on encoding — the coin chart\n * returns `{t: RFC3339, ohlcv: [...]}` while the pool chart returns a bare\n * `[unixSeconds, o, h, l, c, v]` tuple. Both normalize to this.\n */\nexport type Candle = {\n /** Bucket start, epoch milliseconds. */\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n /** Gap-filled buckets report zero volume rather than being omitted. */\n volume: number;\n};\n\n/** `{t, ohlcv}` form, used by the coin chart. */\nexport const coinCandleSchema = z\n .object({\n t: z.string(),\n ohlcv: z.array(z.number()).nullish(),\n })\n .transform(({ t, ohlcv }): Candle => {\n const [open = 0, high = 0, low = 0, close = 0, volume = 0] = ohlcv ?? [];\n return { timestamp: Date.parse(t), open, high, low, close, volume };\n });\n\n/** Bare tuple form, used by the pool chart. Index 0 is seconds, not millis. */\nexport const poolCandleSchema = z\n .array(z.number())\n .transform(([seconds = 0, open = 0, high = 0, low = 0, close = 0, volume = 0]): Candle => ({\n timestamp: seconds * 1000,\n open,\n high,\n low,\n close,\n volume,\n }));\n\n/**\n * Bucket sizes the Cardano chart endpoints accept, in minutes.\n *\n * Validated client-side so a bad value fails immediately instead of costing a\n * round trip and a 400.\n */\nexport const VALID_BUCKET_MINUTES = [\n 1, 5, 15, 30, 60, 120, 240, 360, 720, 1440, 5760, 10080, 43200,\n] as const;\n\nexport type BucketMinutes = (typeof VALID_BUCKET_MINUTES)[number];\n\nexport function assertBucket(bucketMinutes: number): void {\n if (!(VALID_BUCKET_MINUTES as readonly number[]).includes(bucketMinutes)) {\n throw new MinswapError(\n `bucketMinutes must be one of ${VALID_BUCKET_MINUTES.join(\", \")}; received ${bucketMinutes}`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"bucketMinutes\", reason: \"unsupported bucket size\" }\n );\n }\n}\n","import { z } from \"zod\";\n\nimport { assetUnitToCoinId, coinIdToAssetUnit } from \"../client/asset-id\";\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\nimport { arrayOf } from \"./shared-schemas\";\n\n/**\n * Protocols the aggregator can route through. Wire values, not display names.\n */\nexport const AGGREGATOR_PROTOCOLS = [\n \"MinswapV2\",\n \"Minswap\",\n \"MinswapStable\",\n \"Splash\",\n \"Spectrum\",\n \"SplashStable\",\n \"SundaeSwapV3\",\n \"SundaeSwap\",\n \"SundaeSwapStable\",\n \"WingRidersV2\",\n \"WingRiders\",\n \"WingRidersStableV1\",\n \"WingRidersStableV2\",\n \"OpenDjedV1\",\n \"ChakraBondingCurve\",\n \"CswapV1\",\n \"VyFinance\",\n \"MuesliSwap\",\n \"DanogoCLMMV1\",\n] as const;\n\nexport type AggregatorProtocol = (typeof AGGREGATOR_PROTOCOLS)[number];\n\n/**\n * Protocol accepted when cancelling. The aggregator additionally recognizes\n * `MINSWAP_ADAPTER` here for orders it placed on a user's behalf via its\n * adapter path.\n */\nexport const CANCEL_ADAPTER_PROTOCOL = \"MINSWAP_ADAPTER\";\n\nexport type CancelProtocol = AggregatorProtocol | typeof CANCEL_ADAPTER_PROTOCOL;\n\nconst assetSchema = z\n .object({\n token_id: z.string(),\n logo: z.string().nullish(),\n ticker: z.string().nullish(),\n is_verified: z.boolean().nullish(),\n price_by_ada: z.number().nullish(),\n price_by_usd: z.number().nullish(),\n project_name: z.string().nullish(),\n decimals: z.number().nullish(),\n })\n .transform((a) => ({\n coinId: assetUnitToCoinId(a.token_id),\n logo: a.logo ?? null,\n ticker: a.ticker ?? null,\n isVerified: a.is_verified ?? null,\n priceByAda: a.price_by_ada ?? null,\n priceByUsd: a.price_by_usd ?? null,\n projectName: a.project_name ?? null,\n decimals: a.decimals ?? null,\n }));\n\nexport type AggregatorAsset = z.infer<typeof assetSchema>;\n\nconst pathAtomicSchema = z\n .object({\n pool_id: z.string(),\n protocol: z.string(),\n lp_token: z.string(),\n token_in: z.string(),\n token_out: z.string(),\n amount_in: z.string(),\n amount_out: z.string(),\n min_amount_out: z.string(),\n lp_fee: z.string(),\n dex_fee: z.string(),\n deposits: z.string(),\n price_impact: z.number(),\n pool_out_ref: z.string().nullish(),\n })\n .transform((p) => ({\n poolId: p.pool_id,\n protocol: p.protocol as AggregatorProtocol,\n lpToken: p.lp_token,\n tokenIn: assetUnitToCoinId(p.token_in),\n tokenOut: assetUnitToCoinId(p.token_out),\n amountIn: p.amount_in,\n amountOut: p.amount_out,\n minAmountOut: p.min_amount_out,\n lpFee: p.lp_fee,\n dexFee: p.dex_fee,\n deposits: p.deposits,\n priceImpact: p.price_impact,\n poolOutRef: p.pool_out_ref ?? null,\n }));\n\nconst pathSchema = z\n .object({\n pool_id: z.string(),\n protocol: z.string(),\n lp_token: z.string(),\n token_in: z.string(),\n token_out: z.string(),\n amount_in: z.string(),\n amount_out: z.string(),\n min_amount_out: z.string(),\n lp_fee: z.string(),\n dex_fee: z.string(),\n deposits: z.string(),\n price_impact: z.number(),\n pool_out_ref: z.string().nullish(),\n callback_paths: z.array(z.array(pathAtomicSchema)).nullish(),\n })\n .transform((p) => ({\n poolId: p.pool_id,\n protocol: p.protocol as AggregatorProtocol,\n lpToken: p.lp_token,\n tokenIn: assetUnitToCoinId(p.token_in),\n tokenOut: assetUnitToCoinId(p.token_out),\n amountIn: p.amount_in,\n amountOut: p.amount_out,\n minAmountOut: p.min_amount_out,\n lpFee: p.lp_fee,\n dexFee: p.dex_fee,\n deposits: p.deposits,\n priceImpact: p.price_impact,\n poolOutRef: p.pool_out_ref ?? null,\n callbackPaths: p.callback_paths ?? [],\n }));\n\nexport type AggregatorPath = z.infer<typeof pathSchema>;\n\nconst estimateSchema = z\n .object({\n token_in: z.string(),\n token_out: z.string(),\n amount_in: z.string(),\n amount_out: z.string(),\n min_amount_out: z.string(),\n total_lp_fee: z.string(),\n total_dex_fee: z.string(),\n deposits: z.string(),\n avg_price_impact: z.number(),\n paths: z.array(z.array(pathSchema)),\n aggregator_fee: z.string().nullish(),\n aggregator_fee_percent: z.number().nullish(),\n tokens: z.record(z.string(), assetSchema).nullish(),\n amount_in_decimal: z.boolean().nullish(),\n })\n .transform((e) => ({\n tokenIn: assetUnitToCoinId(e.token_in),\n tokenOut: assetUnitToCoinId(e.token_out),\n amountIn: e.amount_in,\n amountOut: e.amount_out,\n /** Worst acceptable output after slippage — pass to {@link AggregatorModule.buildTx}. */\n minAmountOut: e.min_amount_out,\n totalLpFee: e.total_lp_fee,\n totalDexFee: e.total_dex_fee,\n deposits: e.deposits,\n avgPriceImpact: e.avg_price_impact,\n /**\n * Split routes: the outer array is parallel splits of the input, the inner\n * array is the sequential hops of one split.\n */\n paths: e.paths,\n aggregatorFee: e.aggregator_fee ?? null,\n aggregatorFeePercent: e.aggregator_fee_percent ?? null,\n /** Metadata for every token mentioned, keyed by `coinId`. */\n tokens: e.tokens\n ? Object.fromEntries(\n Object.entries(e.tokens).map(([unit, asset]) => [assetUnitToCoinId(unit), asset])\n )\n : {},\n amountInDecimal: e.amount_in_decimal ?? false,\n }));\n\nexport type AggregatorEstimate = z.infer<typeof estimateSchema>;\n\nconst buildTxResponseSchema = z.object({ cbor: z.string() }).transform((r) => ({ cbor: r.cbor }));\n\nconst submitResponseSchema = z.object({ tx_id: z.string() }).transform((r) => ({ txId: r.tx_id }));\n\nconst pendingOrderSchema = z\n .object({\n owner_address: z.string(),\n protocol: z.string(),\n token_in: assetSchema,\n token_out: assetSchema,\n amount_in: z.string(),\n min_amount_out: z.string(),\n created_at: z.number(),\n tx_in: z.string(),\n dex_fee: z.string(),\n deposit: z.string(),\n })\n .transform((o) => ({\n ownerAddress: o.owner_address,\n protocol: o.protocol as AggregatorProtocol,\n tokenIn: o.token_in,\n tokenOut: o.token_out,\n amountIn: o.amount_in,\n minAmountOut: o.min_amount_out,\n /** Epoch seconds. */\n createdAt: o.created_at,\n /** The order's UTxO reference, `txHash#index` — pass to {@link AggregatorModule.cancelOrders}. */\n txIn: o.tx_in,\n dexFee: o.dex_fee,\n deposit: o.deposit,\n }));\n\nexport type PendingOrder = z.infer<typeof pendingOrderSchema>;\n\nconst pendingOrdersSchema = z\n .object({\n orders: arrayOf(pendingOrderSchema),\n amount_in_decimal: z.boolean(),\n })\n .transform((r) => r.orders);\n\n/** Parameters shared by {@link AggregatorModule.estimate} and the estimate echoed into build-tx. */\nexport type EstimateParams = {\n /**\n * Input amount. Raw base units by default; a decimal figure when\n * {@link EstimateParams.amountInDecimal} is set.\n */\n amount: string;\n /** Input token as a `coinId` (`policyId.assetNameHex`, or `lovelace`). */\n tokenIn: string;\n /** Output token as a `coinId`. */\n tokenOut: string;\n /** Slippage tolerance, in percent. */\n slippage: number;\n includeProtocols?: AggregatorProtocol[];\n excludeProtocols?: AggregatorProtocol[];\n allowMultiHops?: boolean;\n allowNonAtomicMultiHops?: boolean;\n /** Partner code for referral fees, if you have one. */\n partner?: string;\n /** Treat `amount` and returned amounts as decimal figures rather than base units. */\n amountInDecimal?: boolean;\n};\n\nfunction estimateBody(params: EstimateParams): Record<string, unknown> {\n return dropUndefined({\n amount: params.amount,\n token_in: coinIdToAssetUnit(params.tokenIn),\n token_out: coinIdToAssetUnit(params.tokenOut),\n slippage: params.slippage,\n include_protocols: params.includeProtocols,\n exclude_protocols: params.excludeProtocols,\n allow_multi_hops: params.allowMultiHops,\n allow_non_atomic_multi_hops: params.allowNonAtomicMultiHops,\n partner: params.partner,\n amount_in_decimal: params.amountInDecimal,\n });\n}\n\nexport type BuildTxParams = {\n /** Address funding the swap and receiving the output. */\n sender: string;\n /** The same parameters passed to {@link AggregatorModule.estimate}. */\n estimate: EstimateParams;\n /**\n * Minimum acceptable output. Take this from the estimate's `minAmountOut`, or\n * set a stricter value. The server rejects anything below its own recomputed\n * minimum.\n */\n minAmountOut: string;\n /** An additional output, e.g. a wallet's own fee. */\n extraOutput?: { address: string; lovelace: string };\n /**\n * Specific wallet UTxOs to spend, as CBOR hex. Omit to let the server choose\n * from the sender's UTxOs — unlike farm and staking, the aggregator can\n * resolve them itself, so no {@link RpcProvider} is required here.\n */\n inputsToChoose?: string[];\n};\n\nexport type CancelOrderRef = {\n /** The order's UTxO reference, `txHash#index`. */\n txIn: string;\n protocol: CancelProtocol;\n};\n\nexport type GetPendingOrdersOptions = {\n /** Return amounts as decimal figures rather than base units. */\n amountInDecimal?: boolean;\n};\n\n/**\n * The aggregator: quote a swap, build its transaction, submit it, cancel open\n * orders, and list pending ones.\n *\n * The SDK never signs. `buildTx` and `cancelOrders` return unsigned CBOR;\n * `cancelOrders`' CBOR is additionally *partially signed* by the server (for\n * collateral sponsorship and fee refunds), so sign it with `partialSign` and\n * assemble the witness onto the existing one rather than replacing it.\n *\n * Token ids are `coinId`s here as everywhere else in the SDK, converted to the\n * aggregator's concatenated unit form at the request boundary.\n */\nexport class AggregatorModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n /**\n * Quote a swap: the best route, expected output, fees, and price impact.\n *\n * @example\n * const quote = await sdk.aggregator.estimate({\n * amount: \"1000000\",\n * tokenIn: \"lovelace\",\n * tokenOut: \"29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6.4d494e\",\n * slippage: 0.5,\n * });\n */\n async estimate(params: EstimateParams): Promise<AggregatorEstimate> {\n return this.sdk.clients.aggregatorApi.post({\n path: \"/aggregator/estimate\",\n body: estimateBody(params),\n schema: estimateSchema,\n });\n }\n\n /**\n * Build the unsigned swap transaction for a quote.\n *\n * @example\n * const quote = await sdk.aggregator.estimate(params);\n * const { cbor } = await sdk.aggregator.buildTx({\n * sender,\n * estimate: params,\n * minAmountOut: quote.minAmountOut,\n * });\n */\n async buildTx(params: BuildTxParams): Promise<{ cbor: string }> {\n return this.sdk.clients.aggregatorApi.post({\n path: \"/aggregator/build-tx\",\n body: dropUndefined({\n sender: params.sender,\n min_amount_out: params.minAmountOut,\n estimate: estimateBody(params.estimate),\n amount_in_decimal: params.estimate.amountInDecimal,\n extra_output: params.extraOutput,\n inputs_to_choose: params.inputsToChoose,\n }),\n schema: buildTxResponseSchema,\n });\n }\n\n /**\n * Assemble a signed witness onto a built transaction and submit it.\n *\n * @param witnessSet CBOR of the witness set produced by signing the tx.\n */\n async submitTx(params: { cbor: string; witnessSet: string }): Promise<{ txId: string }> {\n return this.sdk.clients.aggregatorApi.post({\n path: \"/aggregator/finalize-and-submit-tx\",\n body: { cbor: params.cbor, witness_set: params.witnessSet },\n schema: submitResponseSchema,\n });\n }\n\n /**\n * Build a transaction that cancels one or more open orders.\n *\n * The returned CBOR is **partially signed** by the server. Between 1 and 6\n * orders per call, the server's own limit.\n */\n async cancelOrders(params: {\n sender: string;\n orders: CancelOrderRef[];\n }): Promise<{ cbor: string }> {\n if (params.orders.length < 1 || params.orders.length > 6) {\n throw new MinswapError(\n `cancelOrders takes between 1 and 6 orders; received ${params.orders.length}`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"orders\", reason: \"must contain 1 to 6 entries\" }\n );\n }\n\n return this.sdk.clients.aggregatorApi.post({\n path: \"/aggregator/cancel-tx\",\n body: {\n sender: params.sender,\n orders: params.orders.map((o) => ({\n tx_in: o.txIn,\n protocol: o.protocol,\n })),\n },\n schema: buildTxResponseSchema,\n });\n }\n\n /**\n * List an address's still-open aggregator orders.\n *\n * Only orders whose UTxO is still unspent are returned, so this is genuinely\n * \"open orders\" rather than history. For full history including filled and\n * cancelled orders, use {@link OrderModule.getHistory}.\n */\n async getPendingOrders(\n ownerAddress: string,\n options: GetPendingOrdersOptions = {}\n ): Promise<PendingOrder[]> {\n return this.sdk.clients.aggregatorApi.get({\n path: \"/aggregator/pending-orders\",\n query: {\n owner_address: ownerAddress,\n amount_in_decimal: options.amountInDecimal,\n },\n schema: pendingOrdersSchema,\n });\n }\n}\n\nfunction dropUndefined(obj: Record<string, unknown>): Record<string, unknown> {\n for (const key of Object.keys(obj)) {\n if (obj[key] === undefined) {\n delete obj[key];\n }\n }\n return obj;\n}\n","import { MinswapError, MinswapErrorCode } from \"./errors\";\n\n/**\n * Uniform pagination input.\n *\n * The backends behind this SDK use three mutually incompatible schemes —\n * offset/limit, a GET cursor keyed on `desc`, and a POST cursor keyed on\n * `before` — and mix them across endpoints that otherwise look alike. Callers\n * see only this shape; each module translates it for the endpoint it wraps.\n */\nexport type PageParams = {\n limit?: number;\n /**\n * Opaque continuation token from a previous {@link Page.nextCursor}.\n * Do not construct or parse these; the encoding differs per endpoint.\n */\n cursor?: string;\n};\n\nexport type Page<T> = {\n items: T[];\n /** Pass to the next call to continue. `null` when the result set is exhausted. */\n nextCursor: string | null;\n hasMore: boolean;\n};\n\nexport function assertLimit(limit: number | undefined, max: number): void {\n if (limit === undefined) {\n return;\n }\n if (!Number.isInteger(limit) || limit <= 0 || limit > max) {\n throw new MinswapError(\n `limit must be an integer between 1 and ${max}, received ${limit}`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"limit\", reason: `must be an integer in 1..${max}` }\n );\n }\n}\n\n/** Offset-paginated endpoints carry the next offset as the opaque cursor. */\nexport function encodeOffsetCursor(offset: number): string {\n return String(offset);\n}\n\nexport function decodeOffsetCursor(cursor: string | undefined): number {\n if (cursor === undefined) {\n return 0;\n }\n const offset = Number(cursor);\n if (!Number.isInteger(offset) || offset < 0) {\n throw new MinswapError(`Malformed cursor \"${cursor}\"`, MinswapErrorCode.INVALID_PARAMS, {\n param: \"cursor\",\n reason: \"must be a cursor returned by a previous call\",\n });\n }\n return offset;\n}\n\n/**\n * Build a page from an offset-based response.\n *\n * These endpoints report no total, so a full page is treated as \"there may be\n * more\" — the final page is detected by it coming back short (or empty).\n */\nexport function offsetPage<T>(items: T[], offset: number, limit: number): Page<T> {\n const hasMore = items.length === limit;\n return {\n items,\n hasMore,\n nextCursor: hasMore ? encodeOffsetCursor(offset + limit) : null,\n };\n}\n\n/**\n * Build a page from a cursor-based response.\n *\n * The backend nulls `last_cursor` on the final page *and* on an empty result\n * set, so a null cursor means end-of-stream rather than an error.\n */\nexport function cursorPage<T>(items: T[], lastCursor: string | null | undefined): Page<T> {\n const nextCursor = lastCursor ?? null;\n return {\n items,\n nextCursor,\n hasMore: nextCursor !== null && items.length > 0,\n };\n}\n\n/**\n * Walk every page of a paginated endpoint, yielding items one at a time.\n *\n * @example\n * for await (const token of paginate((p) => sdk.token.list({ ...filters, ...p }))) {\n * console.log(token.ticker);\n * }\n */\nexport async function* paginate<T>(\n fetchPage: (params: PageParams) => Promise<Page<T>>,\n params: PageParams = {}\n): AsyncGenerator<T, void, undefined> {\n let cursor = params.cursor;\n const seen = new Set<string>();\n\n for (;;) {\n const page = await fetchPage({ ...params, cursor });\n yield* page.items;\n\n if (!page.hasMore || page.nextCursor === null) {\n return;\n }\n\n // A backend that repeats a cursor would otherwise spin forever.\n if (seen.has(page.nextCursor)) {\n throw new MinswapError(\n `Pagination stalled: cursor \"${page.nextCursor}\" was returned twice`,\n MinswapErrorCode.API_ERROR,\n {\n endpoint: \"<paginate>\",\n status: 200,\n body: { repeatedCursor: page.nextCursor },\n }\n );\n }\n seen.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n}\n\n/** Collect a paginated endpoint into an array, capped to avoid unbounded reads. */\nexport async function collect<T>(\n fetchPage: (params: PageParams) => Promise<Page<T>>,\n options: PageParams & { maxItems?: number } = {}\n): Promise<T[]> {\n const { maxItems = 1000, ...params } = options;\n const items: T[] = [];\n for await (const item of paginate(fetchPage, params)) {\n items.push(item);\n if (items.length >= maxItems) {\n break;\n }\n }\n return items;\n}\n","import { MinswapError, MinswapErrorCode } from \"./errors\";\n\n/** A transaction output reference, `txHash#outputIndex`. */\nexport type RpcTxIn = {\n txHash: string;\n outputIndex: number;\n};\n\nexport type RpcUtxo = {\n txHash: string;\n outputIndex: number;\n address: string;\n /**\n * Full CBOR hex of the UTxO.\n *\n * Required, not optional: the farm and MIN staking mutations take wallet\n * inputs as CBOR hex (`inputsToChoose`), so a provider that cannot produce\n * this cannot support those actions.\n */\n cbor: string;\n /** Unit -> quantity. `lovelace` for ADA; other units are `policyId + assetNameHex`. */\n assets: Record<string, bigint>;\n datumHash?: string | null;\n datum?: string | null;\n scriptRef?: string | null;\n};\n\n/**\n * Chain access the SDK needs but does not provide.\n *\n * The SDK never signs or submits transactions, but some actions still need to\n * know what a wallet holds — farm and staking mutations require the caller's\n * UTxOs as inputs. Rather than depend on a specific wallet or indexer, the SDK\n * takes this interface and lets you supply the implementation (Lucid,\n * Blockfrost, Maestro, Kupo, your own node).\n *\n * Optional overall: token, pool, portfolio, and order reads never touch it.\n * Only farm and staking actions do, and they fail with a clear error when it\n * is absent.\n */\nexport interface RpcProvider {\n /** Every UTxO at an address. Used to fund and collateralize actions. */\n getUtxosByAddress(address: string): Promise<RpcUtxo[]>;\n\n /**\n * Resolve specific outputs by reference.\n *\n * Used to confirm a position's UTxO is still unspent before building an\n * action against it. Implementations should omit references they cannot\n * find rather than throwing.\n */\n getUtxosByRefs(refs: RpcTxIn[]): Promise<RpcUtxo[]>;\n}\n\n/** Parse `txHash#index` into a structured reference. */\nexport function parseTxIn(ref: string): RpcTxIn {\n const parts = ref.split(\"#\");\n const [txHash, rawIndex] = parts;\n // Require exactly two parts and a plain non-negative integer index. `Number`\n // alone would accept \"abc#\" (→ 0), \"abc# 1\", and \"abc#1e2\", quietly resolving\n // the wrong output.\n if (parts.length !== 2 || !txHash || !/^\\d+$/.test(rawIndex)) {\n throw new MinswapError(\n `Malformed output reference \"${ref}\", expected \"txHash#index\"`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"ref\", reason: 'must look like \"txHash#index\"' }\n );\n }\n return { txHash, outputIndex: Number(rawIndex) };\n}\n\nexport function formatTxIn(ref: RpcTxIn): string {\n return `${ref.txHash}#${ref.outputIndex}`;\n}\n\n/**\n * Narrow an optional provider to a present one, with an error that says what\n * to do about it.\n */\nexport function requireRpcProvider(provider: RpcProvider | undefined, action: string): RpcProvider {\n if (!provider) {\n throw new MinswapError(\n `${action} needs chain access. Pass an rpcProvider when constructing MinswapSdk: new MinswapSdk({ rpcProvider })`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"rpcProvider\", reason: `is required by ${action}` }\n );\n }\n return provider;\n}\n\n/** Lovelace held by a UTxO. */\nexport function lovelaceOf(utxo: RpcUtxo): bigint {\n return utxo.assets[\"lovelace\"] ?? 0n;\n}\n\n/** True when a UTxO holds only ADA, which is what collateral must be. */\nexport function isPureAda(utxo: RpcUtxo): boolean {\n return Object.keys(utxo.assets).every((unit) => unit === \"lovelace\");\n}\n\n/**\n * Pick UTxOs usable as collateral.\n *\n * Collateral must be pure ADA and is forfeited if a script fails, so the\n * largest holdings are deliberately avoided: this takes the smallest adequate\n * ones. A CIP-30 wallet's designated collateral should be preferred when the\n * caller has it — this is the fallback for providers with no such concept.\n */\nexport function selectCollateral(\n utxos: RpcUtxo[],\n { minLovelace = 5_000_000n, count = 1 }: { minLovelace?: bigint; count?: number } = {}\n): RpcUtxo[] {\n return utxos\n .filter((utxo) => isPureAda(utxo) && lovelaceOf(utxo) >= minLovelace)\n .sort((a, b) => {\n const delta = lovelaceOf(a) - lovelaceOf(b);\n return delta < 0n ? -1 : delta > 0n ? 1 : 0;\n })\n .slice(0, count);\n}\n","import type { MinswapSdkConfig } from \"../client/config\";\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport { requireRpcProvider, type RpcProvider, selectCollateral } from \"../client/rpc-provider\";\nimport type { MinswapSdk } from \"../sdk\";\n\n/**\n * Wallet inputs the farm and staking mutations require.\n *\n * `inputsToChoose` are the wallet's UTxOs as CBOR hex, used to fund and balance\n * the transaction. `collateralUtxos` are pure-ADA UTxOs the server needs when\n * the transaction spends a script (every action except a first deposit).\n */\nexport type ResolvedWalletInputs = {\n inputsToChoose: string[];\n collateralUtxos: string[];\n};\n\nexport type WalletInputParams = {\n /** The wallet address whose UTxOs fund the action. */\n address: string;\n /**\n * Wallet UTxOs as CBOR hex, overriding what the {@link RpcProvider} would\n * fetch. Supply this (with {@link WalletInputParams.collateralUtxos} when the\n * action needs collateral) to skip chain access entirely.\n */\n inputsToChoose?: string[];\n /** Collateral UTxOs as CBOR hex, overriding the provider's selection. */\n collateralUtxos?: string[];\n};\n\n/**\n * Resolve the UTxOs an action needs, from explicit overrides or the configured\n * {@link RpcProvider}.\n *\n * The provider is consulted only when an override is missing, and only farm and\n * staking actions ever reach here — which is why {@link MinswapSdkConfig.rpcProvider}\n * can stay optional. When it is needed and absent, the error names it.\n */\nexport async function resolveWalletInputs(\n sdk: MinswapSdk,\n action: string,\n params: WalletInputParams,\n needCollateral: boolean\n): Promise<ResolvedWalletInputs> {\n const haveInputs = params.inputsToChoose !== undefined;\n const haveCollateral = params.collateralUtxos !== undefined || !needCollateral;\n\n if (haveInputs && haveCollateral) {\n return {\n inputsToChoose: params.inputsToChoose ?? [],\n collateralUtxos: params.collateralUtxos ?? [],\n };\n }\n\n const utxos = await requireRpcProvider(sdk.rpcProvider, action).getUtxosByAddress(params.address);\n\n let collateralUtxos: string[] = [];\n if (needCollateral) {\n if (params.collateralUtxos !== undefined) {\n collateralUtxos = params.collateralUtxos;\n } else {\n const selected = selectCollateral(utxos);\n if (selected.length === 0) {\n // Proceeding with empty collateral only fails later with an opaque\n // server error; name the requirement here instead.\n throw new MinswapError(\n `${action} needs collateral, but no pure-ADA UTxO large enough was found at ${params.address}`,\n MinswapErrorCode.INVALID_PARAMS,\n {\n param: \"collateralUtxos\",\n reason: \"no adequate pure-ADA UTxO; supply collateralUtxos explicitly\",\n }\n );\n }\n collateralUtxos = selected.map((u) => u.cbor);\n }\n }\n\n return {\n inputsToChoose: params.inputsToChoose ?? utxos.map((u) => u.cbor),\n collateralUtxos,\n };\n}\n\n/** GraphQL's `BigInt` scalar travels as a decimal string; accept either form. */\nexport function toBigIntString(value: bigint | number | string): string {\n return typeof value === \"bigint\" ? value.toString() : BigInt(value).toString();\n}\n","import { z } from \"zod\";\n\nimport { coinIdToInputAsset, InputAsset } from \"../client/asset-id\";\nimport { MinswapCurrency } from \"../client/config\";\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport {\n assertLimit,\n decodeOffsetCursor,\n offsetPage,\n Page,\n PageParams,\n} from \"../client/pagination\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\nimport { PortfolioFarmPosition } from \"./portfolio-module\";\nimport { arrayOf, poolCoinSchema, poolRewardSchema } from \"./shared-schemas\";\nimport { resolveWalletInputs, toBigIntString, WalletInputParams } from \"./wallet-inputs\";\n\n/** Yield-farming protocols the app API indexes. */\nexport const FARM_PROTOCOLS = [\n \"minswap-cpmm-v1\",\n \"minswap-cpmm-v2\",\n \"minswap-stable-cpmm-v1\",\n] as const;\n\nexport type FarmProtocol = (typeof FARM_PROTOCOLS)[number];\n\nexport const FARM_LIST_SORT_FIELDS = [\n \"liquidity_locked_usd\",\n \"fee_apr_24h\",\n \"fee_apr_1w\",\n \"reward_apr\",\n \"total_apr_24h\",\n \"total_apr_1w\",\n \"point\",\n] as const;\n\nexport type FarmListSortField = (typeof FARM_LIST_SORT_FIELDS)[number];\n\nconst farmSchema = z\n .object({\n pool_id: z.string().nullish(),\n protocol: z.string(),\n coin_a: poolCoinSchema,\n coin_b: poolCoinSchema,\n amount_a_locked: z.number(),\n amount_b_locked: z.number(),\n amount_a_locked_usd: z.number(),\n amount_b_locked_usd: z.number(),\n price_a: z.number(),\n price_b: z.number(),\n liquidity_locked: z.string().nullish(),\n liquidity_locked_usd: z.number(),\n fee_apr_24h: z.number(),\n fee_apr_1w: z.number(),\n rewards: arrayOf(poolRewardSchema),\n active: z.boolean(),\n pool_type: z.string(),\n point: z.number(),\n is_exclusive: z.boolean(),\n nft_id_allowed: z.string().nullish(),\n })\n .transform((f) => ({\n /** The farm's LP token id. This is the `lpAsset` the action methods need. */\n poolId: f.pool_id ?? null,\n protocol: f.protocol,\n coinA: f.coin_a,\n coinB: f.coin_b,\n amountALocked: f.amount_a_locked,\n amountBLocked: f.amount_b_locked,\n amountALockedUsd: f.amount_a_locked_usd,\n amountBLockedUsd: f.amount_b_locked_usd,\n priceA: f.price_a,\n priceB: f.price_b,\n /** Total staked liquidity, a raw decimal string. */\n liquidityLocked: f.liquidity_locked ?? null,\n liquidityLockedUsd: f.liquidity_locked_usd,\n feeApr24h: f.fee_apr_24h,\n feeApr1w: f.fee_apr_1w,\n rewards: f.rewards,\n active: f.active,\n poolType: f.pool_type,\n point: f.point,\n /** Whether this is a Launch Bowl (exclusive) farm — the `hasLBBonus` flag. */\n isExclusive: f.is_exclusive,\n nftIdAllowed: f.nft_id_allowed ?? null,\n }));\n\nexport type FarmSummary = z.infer<typeof farmSchema>;\n\nexport type FarmListParams = PageParams & {\n poolIds?: string[];\n protocols?: FarmProtocol[];\n /** Filters to farms containing these coins. Upstream accepts at most two. */\n coinIds?: string[];\n /** Only Launch Bowl (exclusive) farms. */\n exclusiveOnly?: boolean;\n active?: boolean;\n search?: string;\n /** @default \"liquidity_locked_usd\" */\n sortBy?: FarmListSortField;\n /** @default \"desc\" */\n order?: \"asc\" | \"desc\";\n currency?: MinswapCurrency;\n};\n\n/** Identifies which farm an action targets. Comes straight from {@link FarmSummary}. */\nexport type FarmRef = {\n /** The farm's LP token id ({@link FarmSummary.poolId}). */\n lpAsset: string;\n /** Whether it is a Launch Bowl farm ({@link FarmSummary.isExclusive}). */\n hasLBBonus: boolean;\n};\n\nexport type FarmDepositParams = WalletInputParams &\n FarmRef & {\n /** LP amount to stake, in raw base units. */\n amount: bigint | number | string;\n /**\n * Skip the position lookup by supplying it.\n *\n * `deposit` first checks whether a position exists to choose between a first\n * deposit and adding to an existing stake. Passing this (or `null` to assert\n * there is none) avoids the extra portfolio round trip.\n */\n position?: PortfolioFarmPosition | null;\n /** Launch Bowl NFT `coinId`s to whitelist, for exclusive farms. */\n lbWhitelistAssets?: string[];\n /** Split change into smaller UTxOs. Mirrors the app's setting. */\n shouldSplitChange?: boolean;\n };\n\nexport type FarmWithdrawParams = WalletInputParams &\n FarmRef & {\n /** LP amount to withdraw, in raw base units. Withdrawing the full stake routes to withdraw-all. */\n amount: bigint | number | string;\n position?: PortfolioFarmPosition | null;\n shouldSplitChange?: boolean;\n };\n\nexport type FarmHarvestParams = WalletInputParams & {\n /** One or more farms to harvest rewards from. */\n farms: FarmRef[];\n shouldSplitChange?: boolean;\n};\n\nexport type FarmEmergencyWithdrawParams = WalletInputParams & FarmRef;\n\nconst cborResultSchema = z.string();\n\nfunction inputAssets(coinIds: string[] | undefined): InputAsset[] | undefined {\n return coinIds?.map(coinIdToInputAsset);\n}\n\n/**\n * Yield farming: browse farms, read positions, and build stake/withdraw/harvest\n * transactions.\n *\n * Reads come from the app API; actions go through the key-app-api GraphQL host,\n * which builds and **partially signs** the transaction with Minswap-held keys —\n * these transactions cannot be built client-side. Every returned `cbor` must be\n * signed with `partialSign` and assembled onto the server's witness.\n *\n * Actions need the wallet's UTxOs. Pass an `address` and the SDK resolves them\n * through the configured {@link RpcProvider}, or pass `inputsToChoose` /\n * `collateralUtxos` directly to avoid chain access.\n */\nexport class FarmModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n /** List farms with filtering and sorting. */\n async list(params: FarmListParams = {}): Promise<Page<FarmSummary>> {\n assertLimit(params.limit, 50);\n const limit = params.limit ?? 20;\n const offset = decodeOffsetCursor(params.cursor);\n\n if (params.coinIds && params.coinIds.length > 2) {\n throw new MinswapError(\n \"coinIds accepts at most 2 entries — it filters for farms containing those coins.\",\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"coinIds\", reason: \"at most 2 entries\" }\n );\n }\n\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/pool/yield-pools\",\n query: {\n offset,\n limit,\n pool_addresses: params.poolIds,\n protocols: params.protocols,\n coin_ids: params.coinIds,\n exclusive_only: params.exclusiveOnly,\n active: params.active,\n keyword: params.search,\n sort_field: params.sortBy ?? \"liquidity_locked_usd\",\n sort_direction: params.order ?? \"desc\",\n },\n schema: arrayOf(farmSchema),\n currency: params.currency,\n });\n\n return offsetPage(data, offset, limit);\n }\n\n /** An address's farm positions. Sourced from the DeFi portfolio. */\n async getPositions(address: string): Promise<PortfolioFarmPosition[]> {\n const { farms } = await this.sdk.portfolio.getDefi(address);\n return farms;\n }\n\n /**\n * Stake LP tokens into a farm.\n *\n * Routes to a first deposit when the address holds no position in the farm,\n * or adds to the existing stake otherwise. The distinction is resolved from\n * the address's positions unless {@link FarmDepositParams.position} is given.\n */\n async deposit(params: FarmDepositParams): Promise<{ cbor: string }> {\n const position =\n params.position !== undefined\n ? params.position\n : await this.findPosition(params.address, params.lpAsset);\n\n const amount = toBigIntString(params.amount);\n\n if (!position) {\n // A first deposit creates the position and spends no script, so it needs\n // no collateral.\n const inputs = await resolveWalletInputs(this.sdk, \"farm.deposit\", params, false);\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation: \"buildFirstDepositV2\",\n document: DOC_FIRST_DEPOSIT,\n variables: {\n options: {\n farmTx: this.farmTx(params, inputs.inputsToChoose),\n amount,\n lbWhitelistAssets: inputAssets(params.lbWhitelistAssets),\n },\n },\n schema: cborResultSchema,\n });\n return { cbor };\n }\n\n const inputs = await resolveWalletInputs(this.sdk, \"farm.deposit\", params, true);\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation: \"buildStakeDepositV2\",\n document: DOC_STAKE_DEPOSIT,\n variables: {\n options: {\n farmTx: this.farmTx(params, inputs.inputsToChoose),\n amount,\n collateralUtxos: inputs.collateralUtxos,\n additionalLbWhitelistAssets: inputAssets(params.lbWhitelistAssets),\n },\n },\n schema: cborResultSchema,\n });\n return { cbor };\n }\n\n /**\n * Withdraw staked LP tokens.\n *\n * Routes to withdraw-all when the amount is the entire stake, or a partial\n * withdrawal otherwise, comparing against the position's staked amount.\n */\n async withdraw(params: FarmWithdrawParams): Promise<{ cbor: string }> {\n const position =\n params.position !== undefined\n ? params.position\n : await this.findPosition(params.address, params.lpAsset);\n\n if (!position) {\n throw new MinswapError(\n `No farm position found for ${params.lpAsset} at this address`,\n MinswapErrorCode.NOT_FOUND,\n { resource: \"farm\", id: params.lpAsset }\n );\n }\n\n const inputs = await resolveWalletInputs(this.sdk, \"farm.withdraw\", params, true);\n const amount = BigInt(toBigIntString(params.amount));\n const staked = stakedLpAmount(position);\n\n if (amount >= staked) {\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation: \"buildStakeWithdrawAllV2\",\n document: DOC_WITHDRAW_ALL,\n variables: {\n options: {\n farmTx: this.farmTx(params, inputs.inputsToChoose),\n collateralUtxos: inputs.collateralUtxos,\n },\n },\n schema: cborResultSchema,\n });\n return { cbor };\n }\n\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation: \"buildStakeWithdrawV2\",\n document: DOC_WITHDRAW,\n variables: {\n options: {\n farmTx: this.farmTx(params, inputs.inputsToChoose),\n amount: amount.toString(),\n collateralUtxos: inputs.collateralUtxos,\n },\n },\n schema: cborResultSchema,\n });\n return { cbor };\n }\n\n /** Harvest pending rewards from one or more farms in a single transaction. */\n async harvest(params: FarmHarvestParams): Promise<{ cbor: string }> {\n if (params.farms.length === 0) {\n throw new MinswapError(\"harvest needs at least one farm\", MinswapErrorCode.INVALID_PARAMS, {\n param: \"farms\",\n reason: \"must not be empty\",\n });\n }\n\n const inputs = await resolveWalletInputs(this.sdk, \"farm.harvest\", params, true);\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation: \"buildMultipleHarvestsV2\",\n document: DOC_MULTIPLE_HARVESTS,\n variables: {\n options: {\n owner: params.address,\n pools: params.farms.map((f) => ({\n lpAsset: f.lpAsset,\n hasLBBonus: f.hasLBBonus,\n })),\n inputsToChoose: inputs.inputsToChoose,\n useCoinSelectionStrategy: true,\n collateralUtxos: inputs.collateralUtxos,\n shouldSplitChange: params.shouldSplitChange,\n },\n },\n schema: cborResultSchema,\n });\n return { cbor };\n }\n\n /**\n * Force-withdraw a stake, forfeiting pending rewards.\n *\n * A safety valve for when a normal withdrawal cannot proceed. Prefer\n * {@link FarmModule.withdraw}.\n */\n async emergencyWithdraw(params: FarmEmergencyWithdrawParams): Promise<{ cbor: string }> {\n const inputs = await resolveWalletInputs(this.sdk, \"farm.emergencyWithdraw\", params, true);\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation: \"buildEmergencyWithdrawV2\",\n document: DOC_EMERGENCY_WITHDRAW,\n variables: {\n options: {\n farmTx: this.farmTx(params, inputs.inputsToChoose),\n collateralUtxos: inputs.collateralUtxos,\n },\n },\n schema: cborResultSchema,\n });\n return { cbor };\n }\n\n private farmTx(\n params: FarmRef & { address: string; shouldSplitChange?: boolean },\n inputsToChoose: string[]\n ): Record<string, unknown> {\n return {\n owner: params.address,\n lpAsset: params.lpAsset,\n hasLBBonus: params.hasLBBonus,\n inputsToChoose,\n useCoinSelectionStrategy: true,\n shouldSplitChange: params.shouldSplitChange,\n };\n }\n\n private async findPosition(\n address: string,\n lpAsset: string\n ): Promise<PortfolioFarmPosition | null> {\n const positions = await this.getPositions(address);\n return positions.find((p) => p.poolId === lpAsset) ?? null;\n }\n}\n\n/**\n * Staked LP amount of a position, as a raw bigint.\n *\n * Farm withdraw operates on LP tokens, so the staked amount is the LP position's\n * raw `lpAmount` (a base-unit string). A position that carries no LP amount is\n * not something this path can withdraw against — throw rather than guess, since\n * a wrong amount here misroutes withdraw-all vs partial.\n */\nfunction stakedLpAmount(position: PortfolioFarmPosition): bigint {\n if (position.lpPosition?.lpAmount) {\n return BigInt(position.lpPosition.lpAmount);\n }\n throw new MinswapError(\n `Farm position ${position.poolId} has no staked LP amount to withdraw against`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"position\", reason: \"position carries no lpPosition.lpAmount\" }\n );\n}\n\nconst DOC_FIRST_DEPOSIT = `mutation BuildFirstDepositV2($options: BuildFirstDepositTxOptions!) {\n buildFirstDepositV2(options: $options)\n}`;\n\nconst DOC_STAKE_DEPOSIT = `mutation BuildStakeDepositV2($options: BuildStakeDepositOptions!) {\n buildStakeDepositV2(options: $options)\n}`;\n\nconst DOC_WITHDRAW = `mutation BuildStakeWithdrawV2($options: BuildStakeWithdrawOptions!) {\n buildStakeWithdrawV2(options: $options)\n}`;\n\nconst DOC_WITHDRAW_ALL = `mutation BuildStakeWithdrawAllV2($options: BuildStakeWithdrawAllOptions!) {\n buildStakeWithdrawAllV2(options: $options)\n}`;\n\nconst DOC_MULTIPLE_HARVESTS = `mutation BuildMultipleHarvestsV2($options: BuildMultipleHarvestsOptions!) {\n buildMultipleHarvestsV2(options: $options)\n}`;\n\nconst DOC_EMERGENCY_WITHDRAW = `mutation BuildEmergencyWithdrawV2($options: BuildEmergencyWithdrawOptions!) {\n buildEmergencyWithdrawV2(options: $options)\n}`;\n","/**\n * Mainnet protocol constants for the liquidity builders, ported from the\n * production `@minswap/sdk`. Values are fixed by the deployed contracts; the SDK\n * targets mainnet only.\n */\n\n/** internal-sdk `NetworkEnvironment.MAINNET`. */\nexport const MAINNET_NETWORK_ENV = 764824073;\n\n/** Batcher fee and order min-ADA locked in every liquidity order, in lovelace. */\nexport const BATCHER_FEE = 2_000_000n;\nexport const DEPOSIT_ADA = 2_000_000n;\n\nexport type DexVersion = \"V2\" | \"STABLESWAP\" | \"V1\";\n\nexport type DexV2Config = {\n /** LP token policy id (also the pool NFT / authen policy). */\n lpPolicyId: string;\n /** Payment script hash of the order address (a base address is formed with the sender's stake credential). */\n orderScriptHash: string;\n tradingFeeDenominator: bigint;\n};\n\nexport const DEX_V2: DexV2Config = {\n lpPolicyId: \"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c\",\n orderScriptHash: \"c3e28c36c3447315ba5a56f33da6a6ddc1770a876a8d9f0cb3a97c4c\",\n tradingFeeDenominator: 10_000n,\n};\n\nexport type DexV1Config = {\n lpPolicyId: string;\n orderScriptHash: string;\n};\n\nexport const DEX_V1: DexV1Config = {\n lpPolicyId: \"e4214b7cce62ac6fbba385d164df48e157eae5863521b4b67ca71d86\",\n orderScriptHash: \"a65ca58a4e9c755fa830173d2a5caed458ac0c73f97db7faae2e7e3b\",\n};\n","/**\n * Plain-object Plutus data, shaped exactly as `@minswap/internal-sdk`'s\n * `PlutusData` union so an encoded value can be handed straight to its\n * `PlutusData.toDataHex` serializer. Keeping the model here — rather than\n * importing the optional peer's types — lets the datum encoders be pure,\n * dependency-free, and unit-testable without the WASM serializer present.\n *\n * The canonical on-chain encoding these produce (constructor tag 121+i for\n * i≤6, 1280+(i-7) for 7..127; indefinite-length arrays for non-empty fields)\n * is fixed by the ledger, so the byte output is stable regardless of who\n * serializes it.\n */\nexport type PlutusData = PlutusConstr | PlutusInt | PlutusBytes | PlutusList;\n\n/** `constructor` is the on-chain alternative index; it shadows Object.prototype.constructor as an own property, which the serializer reads. */\nexport type PlutusConstr = { constructor: number; fields: PlutusData[] };\nexport type PlutusInt = { int: string };\nexport type PlutusBytes = { bytes: string };\nexport type PlutusList = { list: PlutusData[] };\n\nexport function constr(index: number, fields: PlutusData[]): PlutusConstr {\n return { constructor: index, fields };\n}\n\nexport function integer(value: bigint | number | string): PlutusInt {\n return { int: BigInt(value).toString() };\n}\n\nexport function bytes(hex: string): PlutusBytes {\n return { bytes: hex };\n}\n\nexport function list(items: PlutusData[]): PlutusList {\n return { list: items };\n}\n","import { bytes, constr, integer, PlutusConstr, PlutusData } from \"../plutus\";\n\n/**\n * DEX V2 order-step datums for the liquidity operations.\n *\n * Step constructor indices are the on-chain `OrderV2StepType`: DEPOSIT=4,\n * WITHDRAW=5, ZAP_OUT=6. The builder always locks a *specific* amount (the\n * `SPECIFIC_AMOUNT` = Constr 0 variant of the amount option), never `ALL`.\n * A one-sided deposit (one amount = 0) is the zap-in — it reuses the DEPOSIT\n * step; the on-chain batcher performs the internal swap.\n */\n\nexport type Direction = \"A_TO_B\" | \"B_TO_A\";\n\n/** Constr 0 [] = PENDING_ON_FAILED, Constr 1 [] = KILL_ON_FAILED. */\nfunction killable(killOnFailed: boolean): PlutusData {\n return constr(killOnFailed ? 1 : 0, []);\n}\n\n/** Constr 0 [] = B_TO_A, Constr 1 [] = A_TO_B. */\nfunction direction(dir: Direction): PlutusData {\n return constr(dir === \"A_TO_B\" ? 1 : 0, []);\n}\n\nexport function depositStep(params: {\n depositAmountA: bigint;\n depositAmountB: bigint;\n minimumLP: bigint;\n killOnFailed: boolean;\n}): PlutusConstr {\n return constr(4, [\n constr(0, [integer(params.depositAmountA), integer(params.depositAmountB)]),\n integer(params.minimumLP),\n killable(params.killOnFailed),\n ]);\n}\n\nexport function withdrawStep(params: {\n withdrawalLPAmount: bigint;\n minimumAssetA: bigint;\n minimumAssetB: bigint;\n killOnFailed: boolean;\n}): PlutusConstr {\n return constr(5, [\n constr(0, [integer(params.withdrawalLPAmount)]),\n integer(params.minimumAssetA),\n integer(params.minimumAssetB),\n killable(params.killOnFailed),\n ]);\n}\n\nexport function zapOutStep(params: {\n direction: Direction;\n withdrawalLPAmount: bigint;\n minimumReceived: bigint;\n killOnFailed: boolean;\n}): PlutusConstr {\n return constr(6, [\n direction(params.direction),\n constr(0, [integer(params.withdrawalLPAmount)]),\n integer(params.minimumReceived),\n killable(params.killOnFailed),\n ]);\n}\n\n/** A wallet credential: a 28-byte hash, from a payment/stake key (default) or a script. */\nexport type Credential = { hash: string; isScript?: boolean };\n\n/** Credential = Constr 0 [hash] (pubkey) | Constr 1 [hash] (script). */\nfunction credential(c: Credential): PlutusData {\n return constr(c.isScript ? 1 : 0, [bytes(c.hash)]);\n}\n\n/**\n * A Cardano address in Plutus form: `Constr 0 [paymentCredential, Maybe stakingCredential]`.\n * The staking credential, when present, is `Just(StakingHash(credential))` — three\n * nested `Constr 0`s; an enterprise address is `Nothing = Constr 1 []`.\n */\nexport function addressData(payment: Credential, stake: Credential | null): PlutusData {\n const stakeMaybe = stake ? constr(0, [constr(0, [credential(stake)])]) : constr(1, []);\n return constr(0, [credential(payment), stakeMaybe]);\n}\n\n/**\n * The full V2 order datum locked at the order script: `Constr 0` with 9 fields —\n * canceller, refund receiver (+ extra datum), success receiver (+ extra datum),\n * the pool's lpAsset, the step, the max batcher fee, and an optional expiry.\n *\n * For a wallet order the canceller is a `SIGNATURE` method over the sender's\n * payment key hash, both receivers are the sender, both extra datums are\n * `NoDatum`, and expiry is `Nothing`.\n */\nexport function orderDatum(params: {\n /** Sender's payment key hash (hex, 28 bytes) — also the canceller. */\n paymentKeyHash: string;\n /** Sender's stake key hash (hex), or null for an enterprise address. */\n stakeKeyHash: string | null;\n paymentIsScript?: boolean;\n stakeIsScript?: boolean;\n lpAsset: { policyId: string; nameHex: string };\n step: PlutusConstr;\n maxBatcherFee: bigint;\n}): PlutusConstr {\n const sender = addressData(\n { hash: params.paymentKeyHash, isScript: params.paymentIsScript },\n params.stakeKeyHash ? { hash: params.stakeKeyHash, isScript: params.stakeIsScript } : null\n );\n const noDatum = constr(0, []);\n return constr(0, [\n constr(0, [bytes(params.paymentKeyHash)]), // canceller = SIGNATURE [pubKeyHash]\n sender, // refundReceiver\n noDatum, // refundReceiverDatum\n sender, // successReceiver\n noDatum, // successReceiverDatum\n constr(0, [bytes(params.lpAsset.policyId), bytes(params.lpAsset.nameHex)]),\n params.step,\n integer(params.maxBatcherFee),\n constr(1, []), // expiredOptions = Nothing\n ]);\n}\n","import { bytes, constr, integer, PlutusConstr } from \"../plutus\";\nimport { addressData } from \"./dex-v2\";\n\n/**\n * DEX V1 (legacy) order-step datums for the liquidity operations.\n *\n * Step constructor indices are the on-chain `StepType`: DEPOSIT=2, WITHDRAW=3,\n * ONE_SIDE_DEPOSIT=4 (the zap-in). V1 has no zap-out — removing a single side is\n * not a first-class step, so only these three liquidity steps are encoded.\n *\n * Unlike V2, a V1 order attaches its datum to the order UTxO by *hash* (an\n * outline datum), not inline; that is a build-layer concern and does not change\n * the datum bytes, so the encoding here is identical to what the on-chain\n * batcher reads.\n */\n\n/** A native asset: `Constr 0 [bytes policyId, bytes nameHex]` (ADA is policy \"\" / name \"\"). */\nexport type Asset = { policyId: string; nameHex: string };\n\nfunction asset(a: Asset): PlutusConstr {\n return constr(0, [bytes(a.policyId), bytes(a.nameHex)]);\n}\n\n/** Add-liquidity: `Constr 2 [minimumLP]`. */\nexport function depositStep(params: { minimumLP: bigint }): PlutusConstr {\n return constr(2, [integer(params.minimumLP)]);\n}\n\n/** Remove-liquidity: `Constr 3 [minimumAssetA, minimumAssetB]`. */\nexport function withdrawStep(params: {\n minimumAssetA: bigint;\n minimumAssetB: bigint;\n}): PlutusConstr {\n return constr(3, [integer(params.minimumAssetA), integer(params.minimumAssetB)]);\n}\n\n/**\n * Zap-in: `Constr 4 [desiredAsset, minimumLP]`. `desiredAsset` is the pool asset\n * the single deposited side is (partly) swapped into before providing liquidity.\n */\nexport function oneSideDepositStep(params: {\n desiredAsset: Asset;\n minimumLP: bigint;\n}): PlutusConstr {\n return constr(4, [asset(params.desiredAsset), integer(params.minimumLP)]);\n}\n\n/**\n * The full V1 order datum: `Constr 0` with 6 fields — sender, receiver, an\n * optional receiver datum hash (`Maybe bytes32`), the step, the batcher fee, and\n * the min-ADA carried in the output.\n *\n * For a wallet order the sender and receiver are the same address (derived from\n * the wallet's payment + stake key hashes) and the receiver datum hash is\n * `Nothing` (a plain wallet receiver, no attached datum). Deposit/withdraw/zap-in\n * orders must not set a receiver datum hash — the batcher rejects a script\n * receiver for those steps.\n */\nexport function orderDatum(params: {\n /** Sender's payment key hash (hex, 28 bytes). */\n paymentKeyHash: string;\n /** Sender's stake key hash (hex), or null for an enterprise address. */\n stakeKeyHash: string | null;\n paymentIsScript?: boolean;\n stakeIsScript?: boolean;\n step: PlutusConstr;\n batcherFee: bigint;\n outputADA: bigint;\n /** 32-byte datum hash (hex) for a script receiver; omit for a plain wallet receiver. */\n receiverDatumHash?: string | null;\n}): PlutusConstr {\n const address = addressData(\n { hash: params.paymentKeyHash, isScript: params.paymentIsScript },\n params.stakeKeyHash ? { hash: params.stakeKeyHash, isScript: params.stakeIsScript } : null\n );\n const datumHashMaybe = params.receiverDatumHash\n ? constr(0, [bytes(params.receiverDatumHash)]) // Just h\n : constr(1, []); // Nothing\n return constr(0, [\n address, // sender\n address, // receiver\n datumHashMaybe,\n params.step,\n integer(params.batcherFee),\n integer(params.outputADA),\n ]);\n}\n","import { Direction } from \"../datum/dex-v2\";\n\n/**\n * DEX V2 constant-product quote math, ported from the production builder.\n *\n * The trading fee is per-pool (`feeANumerator`/`feeBNumerator`) over a fixed\n * denominator of 10000 — not the flat 0.3% of V1. All amounts are raw base\n * units; division truncates, matching the on-chain integer arithmetic.\n */\nconst FEE_DENOMINATOR = 10_000n;\n\n/** Integer square root (floor), for the deposit swap-balancing quadratic. */\nexport function sqrt(value: bigint): bigint {\n if (value < 0n) {\n throw new Error(\"sqrt of a negative number\");\n }\n if (value < 2n) {\n return value;\n }\n let x = value;\n let y = (x + 1n) / 2n;\n while (y < x) {\n x = y;\n y = (x + value / x) / 2n;\n }\n return x;\n}\n\nexport type PoolReserves = {\n reserveA: bigint;\n reserveB: bigint;\n totalLiquidity: bigint;\n feeANumerator: bigint;\n feeBNumerator: bigint;\n};\n\n/** Output of swapping `amountIn` of the in-token, with the pool's fee applied. */\nexport function calculateAmountOut(params: {\n reserveIn: bigint;\n reserveOut: bigint;\n amountIn: bigint;\n tradingFeeNumerator: bigint;\n}): bigint {\n const diff = FEE_DENOMINATOR - params.tradingFeeNumerator;\n const inWithFee = diff * params.amountIn;\n return (inWithFee * params.reserveOut) / (FEE_DENOMINATOR * params.reserveIn + inWithFee);\n}\n\n/**\n * The part of the larger-ratio side that must be swapped so a two-sided deposit\n * balances. Returns a `[numerator, denominator]` fraction to keep full precision\n * for the LP formula. Solved as a quadratic (hence {@link sqrt}).\n */\nfunction calculateDepositSwapAmount(params: {\n amountIn: bigint;\n amountOut: bigint;\n reserveIn: bigint;\n reserveOut: bigint;\n tradingFeeNumerator: bigint;\n}): [bigint, bigint] {\n const { amountIn, amountOut, reserveIn, reserveOut, tradingFeeNumerator } = params;\n const x = (amountOut + reserveOut) * reserveIn;\n const y =\n 4n *\n (amountOut + reserveOut) *\n (amountOut * reserveIn * reserveIn - amountIn * reserveIn * reserveOut);\n const z = 2n * (amountOut + reserveOut);\n const twoDenomMinusFee = 2n * FEE_DENOMINATOR - tradingFeeNumerator;\n const a =\n x * x * (twoDenomMinusFee * twoDenomMinusFee) -\n y * FEE_DENOMINATOR * (FEE_DENOMINATOR - tradingFeeNumerator);\n const b = twoDenomMinusFee * x;\n return [sqrt(a) - b, z * (FEE_DENOMINATOR - tradingFeeNumerator)];\n}\n\n/**\n * LP tokens minted for a deposit of `amountA` + `amountB`. When the deposit is\n * imbalanced relative to the reserves, the excess side is internally swapped\n * (the batcher does this on-chain); a one-sided deposit (one amount `0`) is the\n * zap-in and flows through the same path.\n */\nexport function calculateDepositAmount(params: {\n amountA: bigint;\n amountB: bigint;\n pool: PoolReserves;\n}): bigint {\n const { amountA, amountB, pool } = params;\n const { reserveA, reserveB, totalLiquidity, feeANumerator, feeBNumerator } = pool;\n const ratioA = (amountA * totalLiquidity) / reserveA;\n const ratioB = (amountB * totalLiquidity) / reserveB;\n if (ratioA > ratioB) {\n const [num, den] = calculateDepositSwapAmount({\n amountIn: amountA,\n amountOut: amountB,\n reserveIn: reserveA,\n reserveOut: reserveB,\n tradingFeeNumerator: feeANumerator,\n });\n return ((amountA * den - num) * totalLiquidity) / (reserveA * den + num);\n }\n if (ratioA < ratioB) {\n const [num, den] = calculateDepositSwapAmount({\n amountIn: amountB,\n amountOut: amountA,\n reserveIn: reserveB,\n reserveOut: reserveA,\n tradingFeeNumerator: feeBNumerator,\n });\n return ((amountB * den - num) * totalLiquidity) / (reserveB * den + num);\n }\n return ratioA;\n}\n\n/** Assets returned for burning `withdrawalLPAmount`, pro-rata to the reserves (no fee). */\nexport function calculateWithdrawAmount(params: {\n withdrawalLPAmount: bigint;\n reserveA: bigint;\n reserveB: bigint;\n totalLiquidity: bigint;\n}): { withdrawalA: bigint; withdrawalB: bigint } {\n const { withdrawalLPAmount, reserveA, reserveB, totalLiquidity } = params;\n return {\n withdrawalA: (withdrawalLPAmount * reserveA) / totalLiquidity,\n withdrawalB: (withdrawalLPAmount * reserveB) / totalLiquidity,\n };\n}\n\n/**\n * Amount of a single asset received for a zap-out: withdraw both sides pro-rata,\n * then swap the unwanted side into the target on the post-withdraw reserves.\n * `direction` names the side being swapped away (A_TO_B receives B).\n */\nexport function calculateZapOutAmount(params: {\n withdrawalLPAmount: bigint;\n direction: Direction;\n pool: PoolReserves;\n}): bigint {\n const { withdrawalLPAmount, direction, pool } = params;\n const { reserveA, reserveB, totalLiquidity, feeANumerator, feeBNumerator } = pool;\n const { withdrawalA, withdrawalB } = calculateWithdrawAmount({\n withdrawalLPAmount,\n reserveA,\n reserveB,\n totalLiquidity,\n });\n const reserveAAfter = reserveA - withdrawalA;\n const reserveBAfter = reserveB - withdrawalB;\n if (direction === \"A_TO_B\") {\n return (\n withdrawalB +\n calculateAmountOut({\n reserveIn: reserveAAfter,\n reserveOut: reserveBAfter,\n amountIn: withdrawalA,\n tradingFeeNumerator: feeANumerator,\n })\n );\n }\n return (\n withdrawalA +\n calculateAmountOut({\n reserveIn: reserveBAfter,\n reserveOut: reserveAAfter,\n amountIn: withdrawalB,\n tradingFeeNumerator: feeBNumerator,\n })\n );\n}\n\n/**\n * Apply a slippage tolerance downward to get a minimum-acceptable amount. The\n * percent is converted to basis points (0.5% → 50 bps) so the arithmetic stays\n * exact in bigint.\n */\nexport function minimumWithSlippage(amount: bigint, slippagePercent: number): bigint {\n if (!(slippagePercent >= 0)) {\n throw new Error(`slippage must be a non-negative percent, received ${slippagePercent}`);\n }\n const bps = BigInt(Math.round(slippagePercent * 100));\n return (amount * (10_000n - bps)) / 10_000n;\n}\n","import { sqrt } from \"./dex-v2\";\n\n/**\n * DEX V1 (legacy) constant-product quote math, ported exactly from the\n * production `@minswap/sdk` (`DexV1Calculation`).\n *\n * V1 charges a flat 0.3% trading fee, encoded as the ratio 997/1000 — unlike\n * V2's per-pool basis-point fee. All amounts are raw base units; every division\n * truncates toward zero, matching the on-chain integer arithmetic, so the\n * results are byte-for-byte the same as the builder the frontend uses.\n *\n * {@link sqrt} is shared with the V2 math (identical Newton floor-sqrt).\n */\n\n/** Output of swapping `amountIn` in, with the flat 0.3% fee applied (997/1000). */\nexport function calculateSwapExactIn(params: {\n amountIn: bigint;\n reserveIn: bigint;\n reserveOut: bigint;\n}): bigint {\n const { amountIn, reserveIn, reserveOut } = params;\n const numerator = amountIn * 997n * reserveOut;\n const denominator = amountIn * 997n + reserveIn * 1000n;\n return numerator / denominator;\n}\n\n/**\n * LP minted for a two-sided deposit. The side whose contribution mints more LP\n * (`deltaLiquidity`) is the constraining one; the mintable LP is the *smaller*\n * of the two, and the necessary amounts are the balanced pair actually consumed.\n */\nexport function calculateDeposit(params: {\n depositedAmountA: bigint;\n depositedAmountB: bigint;\n reserveA: bigint;\n reserveB: bigint;\n totalLiquidity: bigint;\n}): { necessaryAmountA: bigint; necessaryAmountB: bigint; lpAmount: bigint } {\n const { depositedAmountA, depositedAmountB, reserveA, reserveB, totalLiquidity } = params;\n const deltaLiquidityA = (depositedAmountA * totalLiquidity) / reserveA;\n const deltaLiquidityB = (depositedAmountB * totalLiquidity) / reserveB;\n let necessaryAmountA: bigint;\n let necessaryAmountB: bigint;\n let lpAmount: bigint;\n if (deltaLiquidityA > deltaLiquidityB) {\n necessaryAmountA = (depositedAmountB * reserveA) / reserveB;\n necessaryAmountB = depositedAmountB;\n lpAmount = deltaLiquidityB;\n } else if (deltaLiquidityA < deltaLiquidityB) {\n necessaryAmountA = depositedAmountA;\n necessaryAmountB = (depositedAmountA * reserveB) / reserveA;\n lpAmount = deltaLiquidityA;\n } else {\n necessaryAmountA = depositedAmountA;\n necessaryAmountB = depositedAmountB;\n lpAmount = deltaLiquidityA;\n }\n return { necessaryAmountA, necessaryAmountB, lpAmount };\n}\n\n/** Assets returned for burning `withdrawalLPAmount`, pro-rata to the reserves (no fee). */\nexport function calculateWithdraw(params: {\n withdrawalLPAmount: bigint;\n reserveA: bigint;\n reserveB: bigint;\n totalLiquidity: bigint;\n}): { amountAReceive: bigint; amountBReceive: bigint } {\n const { withdrawalLPAmount, reserveA, reserveB, totalLiquidity } = params;\n return {\n amountAReceive: (withdrawalLPAmount * reserveA) / totalLiquidity,\n amountBReceive: (withdrawalLPAmount * reserveB) / totalLiquidity,\n };\n}\n\n/**\n * LP minted for a one-sided deposit (zap-in). The optimal fraction of the input\n * to swap first is the positive root of the constant-product-with-fee quadratic\n * (hence {@link sqrt}); that swap output is then provided as liquidity against\n * the post-swap opposite reserve. Returns the minted LP, the swapped-in amount,\n * and the swap output, exactly as `DexV1Calculation.calculateZapIn`.\n */\nexport function calculateZapIn(params: {\n amountIn: bigint;\n reserveIn: bigint;\n reserveOut: bigint;\n totalLiquidity: bigint;\n}): { minimumLP: bigint; swapAmountIn: bigint; receiveAmountOut: bigint } {\n const { amountIn, reserveIn, reserveOut, totalLiquidity } = params;\n const swapAmountIn =\n (sqrt(1997n ** 2n * reserveIn ** 2n + 4n * 997n * 1000n * amountIn * reserveIn) -\n 1997n * reserveIn) /\n (2n * 997n);\n const receiveAmountOut = calculateSwapExactIn({ amountIn: swapAmountIn, reserveIn, reserveOut });\n const minimumLP = (receiveAmountOut * totalLiquidity) / (reserveOut - receiveAmountOut);\n return { minimumLP, swapAmountIn, receiveAmountOut };\n}\n","import { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport { PlutusData } from \"./plutus\";\n\n/**\n * Byte-level engine for the liquidity builders.\n *\n * All Minswap-specific logic (datum shapes, config, addresses, math) lives in\n * this SDK; `@minswap/internal-sdk` is used only to serialize Plutus data to\n * CBOR and to assemble the transaction (coin selection, fees, collateral). It is\n * an **optional peer dependency**, loaded lazily so the main SDK path never\n * requires it — the same arrangement as {@link KupoRpcProvider}. It ships\n * Node-targeted WebAssembly, so the liquidity builders do not run in a browser.\n */\nconst INTERNAL_SDK = \"@minswap/internal-sdk\";\n\n/**\n * The slice of `@minswap/internal-sdk` the liquidity builders use. Declared\n * structurally (with permissive shapes) so the optional peer stays optional at\n * type-check time — the concrete classes are only touched at runtime, after the\n * package is confirmed present.\n */\ntype DexSerializer = {\n PlutusData: { toDataHex(data: PlutusData): string };\n RustModule: { load(): Promise<void> };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n};\n\nexport type DexBuilder = DexSerializer;\n\nlet cached: Promise<DexSerializer> | undefined;\n\nasync function loadDexSerializer(): Promise<DexSerializer> {\n cached ??= (async () => {\n let mod: DexSerializer;\n try {\n // Indirected through a variable so the specifier is not statically\n // resolved; a missing optional dependency must fail at runtime with the\n // message below, not at compile time for everyone.\n mod = (await import(/* @vite-ignore */ INTERNAL_SDK)) as unknown as DexSerializer;\n } catch (cause) {\n throw new MinswapError(\n `Liquidity operations need ${INTERNAL_SDK} to serialize transactions. Install it: npm install ${INTERNAL_SDK}`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: INTERNAL_SDK, reason: `could not be imported: ${String(cause)}` }\n );\n }\n // CSL-backed steps (transaction assembly, address parsing, hashing) require\n // the WebAssembly module to be initialized first, or they throw. Load it\n // once, centrally, before any builder can reach CSL. Idempotent, so a warm\n // module is free.\n await mod.RustModule.load();\n return mod;\n })();\n return cached;\n}\n\n/** Serialize an order datum to CBOR hex — the on-chain bytes the batcher reads. */\nexport async function toDatumHex(datum: PlutusData): Promise<string> {\n const { PlutusData: plutus } = await loadDexSerializer();\n return plutus.toDataHex(datum);\n}\n\n/**\n * The loaded serializer handle, for the tx-assembly layer. `RustModule.load()`\n * has already run, so every class here is safe to touch.\n */\nexport async function loadDexBuilder(): Promise<DexBuilder> {\n return loadDexSerializer();\n}\n","import { MAINNET_NETWORK_ENV } from \"../config\";\nimport { loadDexBuilder } from \"../serializer\";\n\n/** A single non-ADA asset locked in an order output. `unit` is `policyId + assetNameHex`. */\nexport type OrderAsset = { unit: string; amount: bigint };\n\nexport type OrderAssembly = {\n /** Bech32 of the pool's order script address (with the sender's stake part). */\n orderAddress: string;\n /** CBOR hex of the order datum. */\n orderDatumHex: string;\n /** V2 and Stableswap attach the datum inline; V1 uses a datum hash (outline). */\n datumKind: \"inline\" | \"outline\";\n /** Lovelace locked (order asset ADA + 2 deposit + 2 batcher). */\n lovelace: bigint;\n /** Non-ADA assets locked. */\n assets: OrderAsset[];\n /** Sender's base bech32 address — receives change. */\n sender: string;\n /** Wallet UTxOs to fund the order, as CBOR hex (from an RpcProvider). */\n walletUtxoCbors: string[];\n /** Collateral UTxOs as CBOR hex — omit for orders that spend no script (e.g. a plain deposit). */\n collateralCbors?: string[];\n};\n\n/**\n * Assemble an unsigned order transaction: pay the locked value to the pool's\n * order address with the order datum, funding and balancing from the wallet's\n * UTxOs via Minswap coin selection. Returns the transaction CBOR for the caller\n * to sign — the SDK never signs.\n */\nexport async function assembleOrder(order: OrderAssembly): Promise<string> {\n const b = await loadDexBuilder();\n const { TxBuilderV2, TxOut, Value, Address, Asset, Bytes, DatumSource, Utxo, EmulatorProvider } =\n b;\n const CoinSelectionAlgorithm = b.CoinSelectionAlgorithm as { MINSWAP: unknown };\n\n const valueMap: Record<string, bigint> = { lovelace: order.lovelace };\n for (const a of order.assets) {\n // internal-sdk keys a Value by the dotted `policyId.assetNameHex`.\n valueMap[Asset.fromBlockFrostString(a.unit).toString()] = a.amount;\n }\n\n const datumSource =\n order.datumKind === \"inline\"\n ? DatumSource.newInlineDatum(Bytes.fromHex(order.orderDatumHex))\n : DatumSource.newOutlineDatum(Bytes.fromHex(order.orderDatumHex));\n\n const output = new TxOut(\n Address.fromBech32(order.orderAddress),\n new Value(valueMap),\n datumSource\n );\n\n const txb = new TxBuilderV2(MAINNET_NETWORK_ENV);\n txb.payTo(output);\n\n const txc = await txb.completeUnsafe({\n changeAddress: Address.fromBech32(order.sender),\n provider: new EmulatorProvider(MAINNET_NETWORK_ENV),\n walletUtxos: order.walletUtxoCbors.map((c) => Utxo.fromHex(c)),\n walletCollaterals: order.collateralCbors?.map((c) => Utxo.fromHex(c)),\n coinSelectionAlgorithm: CoinSelectionAlgorithm.MINSWAP,\n });\n\n return txc.complete();\n}\n","import { BATCHER_FEE, DEPOSIT_ADA, DEX_V1, MAINNET_NETWORK_ENV } from \"../config\";\nimport { depositStep, oneSideDepositStep, orderDatum, withdrawStep } from \"../datum/dex-v1\";\nimport { addressData } from \"../datum/dex-v2\";\nimport { calculateDeposit, calculateWithdraw, calculateZapIn } from \"../math/dex-v1\";\nimport { minimumWithSlippage } from \"../math/dex-v2\";\nimport { PlutusConstr } from \"../plutus\";\nimport { loadDexBuilder, toDatumHex } from \"../serializer\";\nimport { assembleOrder, OrderAsset } from \"./assemble\";\n\n/** A pool token as its policy id + asset-name hex; `lovelace` (ADA) has both empty. */\nexport type AssetId = { policyId: string; nameHex: string };\n\nconst isAda = (a: AssetId) => a.policyId === \"\" && a.nameHex === \"\";\nconst unitOf = (a: AssetId) => a.policyId + a.nameHex;\n\ntype SenderInfo = { paymentKeyHash: string; stakeKeyHash: string | null; orderAddress: string };\n\n/**\n * Resolve the sender's credentials and the V1 pool's order address (the V1 order\n * payment script + the sender's stake part, so the order stays under the wallet's\n * control for cancellation).\n */\nasync function resolveSender(sender: string): Promise<SenderInfo> {\n const b = await loadDexBuilder();\n const addr = b.Address.fromBech32(sender);\n const paymentKeyHash: string = addr.toPaymentCredential().payload.hex;\n const stakeAddr = addr.toStakeAddress?.();\n const stakeKeyHash: string | null = stakeAddr\n ? (stakeAddr.toPubKeyHash()?.keyHash.hex ?? null)\n : null;\n const orderAddress: string = b.Address.fromPlutusJson(\n addressData(\n { hash: DEX_V1.orderScriptHash, isScript: true },\n stakeKeyHash ? { hash: stakeKeyHash } : null\n ),\n MAINNET_NETWORK_ENV\n ).toString();\n return { paymentKeyHash, stakeKeyHash, orderAddress };\n}\n\n/**\n * Build the full V1 order datum and hand off to assembly. Unlike V2, the datum is\n * attached to the order output by *hash* (`datumKind: \"outline\"`) — the defining\n * V1 build difference; the batcher looks the datum up by hash rather than reading\n * an inline copy. The V1 datum carries the batcher fee and output min-ADA\n * explicitly (V2 folds these into the locked value only).\n */\nasync function build(\n sender: SenderInfo,\n senderBech32: string,\n step: PlutusConstr,\n lovelace: bigint,\n assets: OrderAsset[],\n walletUtxoCbors: string[]\n): Promise<{ cbor: string }> {\n const datum = orderDatum({\n paymentKeyHash: sender.paymentKeyHash,\n stakeKeyHash: sender.stakeKeyHash,\n step,\n batcherFee: BATCHER_FEE,\n outputADA: DEPOSIT_ADA,\n });\n const cbor = await assembleOrder({\n orderAddress: sender.orderAddress,\n orderDatumHex: await toDatumHex(datum),\n datumKind: \"outline\",\n lovelace,\n assets,\n sender: senderBech32,\n walletUtxoCbors,\n });\n return { cbor };\n}\n\n/** ADA amount folded into the locked lovelace when a side is ADA, else 0. */\nfunction adaSide(asset: AssetId, amount: bigint): bigint {\n return isAda(asset) ? amount : 0n;\n}\n\nfunction tokenAsset(asset: AssetId, amount: bigint): OrderAsset[] {\n return isAda(asset) || amount === 0n ? [] : [{ unit: unitOf(asset), amount }];\n}\n\nexport type V1AddLiquidityParams = {\n sender: string;\n lpAsset: AssetId;\n assetA: AssetId;\n assetB: AssetId;\n amountA: bigint;\n amountB: bigint;\n reserveA: bigint;\n reserveB: bigint;\n totalLiquidity: bigint;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/**\n * Two-sided deposit (add liquidity). V1 has a dedicated zap-in step, so both\n * amounts must be > 0 here — a one-sided deposit routes through {@link buildZapIn}.\n */\nexport async function buildAddLiquidity(params: V1AddLiquidityParams): Promise<{ cbor: string }> {\n if (params.amountA <= 0n || params.amountB <= 0n) {\n throw new Error(\n \"V1 add-liquidity needs both amounts > 0; use buildZapIn for a one-sided deposit\"\n );\n }\n const { lpAmount } = calculateDeposit({\n depositedAmountA: params.amountA,\n depositedAmountB: params.amountB,\n reserveA: params.reserveA,\n reserveB: params.reserveB,\n totalLiquidity: params.totalLiquidity,\n });\n const minimumLP = minimumWithSlippage(lpAmount, params.slippage);\n const step = depositStep({ minimumLP });\n const lovelace =\n DEPOSIT_ADA +\n BATCHER_FEE +\n adaSide(params.assetA, params.amountA) +\n adaSide(params.assetB, params.amountB);\n const assets = [\n ...tokenAsset(params.assetA, params.amountA),\n ...tokenAsset(params.assetB, params.amountB),\n ];\n const sender = await resolveSender(params.sender);\n return build(sender, params.sender, step, lovelace, assets, params.walletUtxoCbors);\n}\n\nexport type V1ZapInParams = {\n sender: string;\n lpAsset: AssetId;\n assetIn: AssetId;\n amountIn: bigint;\n /** The other pool asset — the side `assetIn` is partly swapped into and paired against. */\n desiredAsset: AssetId;\n reserveIn: bigint;\n reserveOut: bigint;\n totalLiquidity: bigint;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/** One-sided deposit (zap-in): deposit a single asset, minted into LP via the batcher swap. */\nexport async function buildZapIn(params: V1ZapInParams): Promise<{ cbor: string }> {\n const { minimumLP: rawLP } = calculateZapIn({\n amountIn: params.amountIn,\n reserveIn: params.reserveIn,\n reserveOut: params.reserveOut,\n totalLiquidity: params.totalLiquidity,\n });\n const minimumLP = minimumWithSlippage(rawLP, params.slippage);\n const step = oneSideDepositStep({\n desiredAsset: { policyId: params.desiredAsset.policyId, nameHex: params.desiredAsset.nameHex },\n minimumLP,\n });\n const lovelace = DEPOSIT_ADA + BATCHER_FEE + adaSide(params.assetIn, params.amountIn);\n const assets = tokenAsset(params.assetIn, params.amountIn);\n const sender = await resolveSender(params.sender);\n return build(sender, params.sender, step, lovelace, assets, params.walletUtxoCbors);\n}\n\nexport type V1RemoveLiquidityParams = {\n sender: string;\n lpAsset: AssetId;\n lpAmount: bigint;\n reserveA: bigint;\n reserveB: bigint;\n totalLiquidity: bigint;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/** Two-sided withdraw (remove liquidity) for the current pool ratio. */\nexport async function buildRemoveLiquidity(\n params: V1RemoveLiquidityParams\n): Promise<{ cbor: string }> {\n const { amountAReceive, amountBReceive } = calculateWithdraw({\n withdrawalLPAmount: params.lpAmount,\n reserveA: params.reserveA,\n reserveB: params.reserveB,\n totalLiquidity: params.totalLiquidity,\n });\n const step = withdrawStep({\n minimumAssetA: minimumWithSlippage(amountAReceive, params.slippage),\n minimumAssetB: minimumWithSlippage(amountBReceive, params.slippage),\n });\n const assets: OrderAsset[] = [{ unit: unitOf(params.lpAsset), amount: params.lpAmount }];\n const sender = await resolveSender(params.sender);\n return build(\n sender,\n params.sender,\n step,\n DEPOSIT_ADA + BATCHER_FEE,\n assets,\n params.walletUtxoCbors\n );\n}\n","import { BATCHER_FEE, DEPOSIT_ADA, DEX_V2, MAINNET_NETWORK_ENV } from \"../config\";\nimport {\n addressData,\n depositStep,\n Direction,\n orderDatum,\n withdrawStep,\n zapOutStep,\n} from \"../datum/dex-v2\";\nimport {\n calculateDepositAmount,\n calculateWithdrawAmount,\n calculateZapOutAmount,\n minimumWithSlippage,\n PoolReserves,\n} from \"../math/dex-v2\";\nimport { PlutusConstr } from \"../plutus\";\nimport { loadDexBuilder, toDatumHex } from \"../serializer\";\nimport { assembleOrder, OrderAsset } from \"./assemble\";\n\n/** A pool token as its policy id + asset-name hex; `lovelace` (ADA) has both empty. */\nexport type AssetId = { policyId: string; nameHex: string };\n\nconst isAda = (a: AssetId) => a.policyId === \"\" && a.nameHex === \"\";\nconst unitOf = (a: AssetId) => a.policyId + a.nameHex;\n\ntype SenderInfo = { paymentKeyHash: string; stakeKeyHash: string | null; orderAddress: string };\n\n/**\n * Resolve the sender's credentials and the pool's order address (the order\n * payment script + the sender's stake part, so the order stays under the\n * wallet's control for cancellation).\n */\nasync function resolveSender(sender: string): Promise<SenderInfo> {\n const b = await loadDexBuilder();\n const addr = b.Address.fromBech32(sender);\n const paymentKeyHash: string = addr.toPaymentCredential().payload.hex;\n const stakeAddr = addr.toStakeAddress?.();\n const stakeKeyHash: string | null = stakeAddr\n ? (stakeAddr.toPubKeyHash()?.keyHash.hex ?? null)\n : null;\n const orderAddress: string = b.Address.fromPlutusJson(\n addressData(\n { hash: DEX_V2.orderScriptHash, isScript: true },\n stakeKeyHash ? { hash: stakeKeyHash } : null\n ),\n MAINNET_NETWORK_ENV\n ).toString();\n return { paymentKeyHash, stakeKeyHash, orderAddress };\n}\n\n/** Build the full order datum and hand off to assembly. */\nasync function build(\n sender: SenderInfo,\n senderBech32: string,\n lpAsset: AssetId,\n step: PlutusConstr,\n lovelace: bigint,\n assets: OrderAsset[],\n walletUtxoCbors: string[]\n): Promise<{ cbor: string }> {\n const datum = orderDatum({\n paymentKeyHash: sender.paymentKeyHash,\n stakeKeyHash: sender.stakeKeyHash,\n lpAsset: { policyId: lpAsset.policyId, nameHex: lpAsset.nameHex },\n step,\n maxBatcherFee: BATCHER_FEE,\n });\n const cbor = await assembleOrder({\n orderAddress: sender.orderAddress,\n orderDatumHex: await toDatumHex(datum),\n datumKind: \"inline\",\n lovelace,\n assets,\n sender: senderBech32,\n walletUtxoCbors,\n });\n return { cbor };\n}\n\n/** ADA amount folded into the locked lovelace when a side is ADA, else 0. */\nfunction adaSide(asset: AssetId, amount: bigint): bigint {\n return isAda(asset) ? amount : 0n;\n}\n\nfunction tokenAsset(asset: AssetId, amount: bigint): OrderAsset[] {\n return isAda(asset) || amount === 0n ? [] : [{ unit: unitOf(asset), amount }];\n}\n\nexport type V2AddLiquidityParams = {\n sender: string;\n lpAsset: AssetId;\n assetA: AssetId;\n assetB: AssetId;\n amountA: bigint;\n amountB: bigint;\n pool: PoolReserves;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/** Two-sided deposit (add liquidity). A one-sided amount (0) is a zap-in — same on-chain step. */\nexport async function buildAddLiquidity(params: V2AddLiquidityParams): Promise<{ cbor: string }> {\n const lp = calculateDepositAmount({\n amountA: params.amountA,\n amountB: params.amountB,\n pool: params.pool,\n });\n const minimumLP = minimumWithSlippage(lp, params.slippage);\n const step = depositStep({\n depositAmountA: params.amountA,\n depositAmountB: params.amountB,\n minimumLP,\n killOnFailed: false,\n });\n const lovelace =\n DEPOSIT_ADA +\n BATCHER_FEE +\n adaSide(params.assetA, params.amountA) +\n adaSide(params.assetB, params.amountB);\n const assets = [\n ...tokenAsset(params.assetA, params.amountA),\n ...tokenAsset(params.assetB, params.amountB),\n ];\n const sender = await resolveSender(params.sender);\n return build(\n sender,\n params.sender,\n params.lpAsset,\n step,\n lovelace,\n assets,\n params.walletUtxoCbors\n );\n}\n\nexport type V2RemoveLiquidityParams = {\n sender: string;\n lpAsset: AssetId;\n lpAmount: bigint;\n pool: PoolReserves;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/** Two-sided withdraw (remove liquidity) for the current pool ratio. */\nexport async function buildRemoveLiquidity(\n params: V2RemoveLiquidityParams\n): Promise<{ cbor: string }> {\n const { withdrawalA, withdrawalB } = calculateWithdrawAmount({\n withdrawalLPAmount: params.lpAmount,\n reserveA: params.pool.reserveA,\n reserveB: params.pool.reserveB,\n totalLiquidity: params.pool.totalLiquidity,\n });\n const step = withdrawStep({\n withdrawalLPAmount: params.lpAmount,\n minimumAssetA: minimumWithSlippage(withdrawalA, params.slippage),\n minimumAssetB: minimumWithSlippage(withdrawalB, params.slippage),\n killOnFailed: false,\n });\n const assets: OrderAsset[] = [{ unit: unitOf(params.lpAsset), amount: params.lpAmount }];\n const sender = await resolveSender(params.sender);\n return build(\n sender,\n params.sender,\n params.lpAsset,\n step,\n DEPOSIT_ADA + BATCHER_FEE,\n assets,\n params.walletUtxoCbors\n );\n}\n\nexport type V2ZapOutParams = {\n sender: string;\n lpAsset: AssetId;\n lpAmount: bigint;\n /** Which pool side to receive: A_TO_B receives B, B_TO_A receives A. */\n direction: Direction;\n pool: PoolReserves;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/** Withdraw entirely into one side (zap-out). */\nexport async function buildZapOut(params: V2ZapOutParams): Promise<{ cbor: string }> {\n const received = calculateZapOutAmount({\n withdrawalLPAmount: params.lpAmount,\n direction: params.direction,\n pool: params.pool,\n });\n const step = zapOutStep({\n direction: params.direction,\n withdrawalLPAmount: params.lpAmount,\n minimumReceived: minimumWithSlippage(received, params.slippage),\n killOnFailed: false,\n });\n const assets: OrderAsset[] = [{ unit: unitOf(params.lpAsset), amount: params.lpAmount }];\n const sender = await resolveSender(params.sender);\n return build(\n sender,\n params.sender,\n params.lpAsset,\n step,\n DEPOSIT_ADA + BATCHER_FEE,\n assets,\n params.walletUtxoCbors\n );\n}\n","import { bytes, constr, integer, PlutusConstr, PlutusData } from \"../plutus\";\nimport { addressData, Credential } from \"./dex-v2\";\n\n/**\n * Stableswap order-step datums for the liquidity operations.\n *\n * Step constructor indices are the on-chain `StableswapStepType`: EXCHANGE=0,\n * DEPOSIT=1, WITHDRAW=2, WITHDRAW_IMBALANCE=3, WITHDRAW_ONE_COIN=4. Only the\n * four liquidity steps are encoded here (a plain EXCHANGE is a swap, not a\n * liquidity op). A one-sided deposit (zap-in) reuses the DEPOSIT step — the\n * value locked simply carries a single non-zero pool asset; the batcher does\n * the internal balancing.\n *\n * Asset indices (`assetOutIndex`, and the positions in the withdraw lists) are\n * indices into the pool config's `assets` array, which is order-significant.\n */\n\n/** Constr 1 [minimumLP] — add liquidity (balanced or zap-in). */\nexport function depositStep(params: { minimumLP: bigint }): PlutusConstr {\n return constr(1, [integer(params.minimumLP)]);\n}\n\n/**\n * Constr 2 [[min0, min1, ...]] — remove liquidity to all pool coins pro-rata.\n * One minimum per pool asset, in the config's asset order; encoded as an\n * indefinite-length list (the on-chain `PlutusList`).\n */\nexport function withdrawStep(params: { minimumAmounts: bigint[] }): PlutusConstr {\n return constr(2, [{ list: params.minimumAmounts.map(integer) }]);\n}\n\n/**\n * Constr 3 [[amt0, amt1, ...]] — withdraw an exact amount of each coin; the LP\n * burned is whatever the invariant requires. Amounts are per pool asset in\n * config order.\n */\nexport function withdrawImbalanceStep(params: { withdrawAmounts: bigint[] }): PlutusConstr {\n return constr(3, [{ list: params.withdrawAmounts.map(integer) }]);\n}\n\n/**\n * Constr 4 [assetOutIndex, minimumAssetOut] — zap-out: burn LP and receive a\n * single pool coin, selected by its index into the config's `assets` array.\n */\nexport function withdrawOneCoinStep(params: {\n assetOutIndex: bigint;\n minimumAssetOut: bigint;\n}): PlutusConstr {\n return constr(4, [integer(params.assetOutIndex), integer(params.minimumAssetOut)]);\n}\n\n/** Maybe: Just = Constr 0 [x], Nothing = Constr 1 []. */\nfunction maybe(value: PlutusData | null): PlutusData {\n return value ? constr(0, [value]) : constr(1, []);\n}\n\n/**\n * The full Stableswap order datum locked at the order script: `Constr 0` with\n * six fields — sender (Address), receiver (Address), an optional\n * receiver-datum-hash (32-byte `Maybe`; always `Nothing` for a wallet LP\n * order), the step, the batcher fee, and the output ADA carried back to the\n * receiver.\n *\n * The Address encoding is shared with DEX V2 ({@link addressData}): a pubkey\n * credential is `Constr 0 [hash]`, a present stake credential nests three\n * `Constr 0`s (`Just (StakingHash (credential))`), and an enterprise address\n * is `Nothing = Constr 1 []`.\n */\nexport function orderDatum(params: {\n /** Sender's payment key hash (hex, 28 bytes). Also the receiver by default. */\n paymentKeyHash: string;\n /** Sender's stake key hash (hex), or null for an enterprise address. */\n stakeKeyHash: string | null;\n paymentIsScript?: boolean;\n stakeIsScript?: boolean;\n /** Optional receiver override; defaults to the sender. */\n receiver?: {\n paymentKeyHash: string;\n stakeKeyHash: string | null;\n paymentIsScript?: boolean;\n stakeIsScript?: boolean;\n };\n /** 32-byte receiver datum hash (hex), or null (Nothing) for a wallet order. */\n receiverDatumHash?: string | null;\n step: PlutusConstr;\n batcherFee: bigint;\n outputADA: bigint;\n}): PlutusConstr {\n const payment: Credential = { hash: params.paymentKeyHash, isScript: params.paymentIsScript };\n const stake: Credential | null = params.stakeKeyHash\n ? { hash: params.stakeKeyHash, isScript: params.stakeIsScript }\n : null;\n const sender = addressData(payment, stake);\n\n const r = params.receiver;\n const receiver = r\n ? addressData(\n { hash: r.paymentKeyHash, isScript: r.paymentIsScript },\n r.stakeKeyHash ? { hash: r.stakeKeyHash, isScript: r.stakeIsScript } : null\n )\n : sender;\n\n return constr(0, [\n sender,\n receiver,\n maybe(params.receiverDatumHash ? bytes(params.receiverDatumHash) : null),\n params.step,\n integer(params.batcherFee),\n integer(params.outputADA),\n ]);\n}\n","/**\n * Stableswap (Curve-style) invariant math, ported verbatim from the production\n * builder's `StableswapCalculation`. Every operation is pure bigint and every\n * division truncates toward zero, matching the on-chain Aiken/Plutus integer\n * arithmetic exactly — the quotes must agree with the validator to the base\n * unit or an order is rejected.\n *\n * Balances are always \"multiplied balances\": each raw pool balance is scaled by\n * its per-asset `multiples[]` entry before entering the invariant, so assets\n * with different decimals are compared on a common scale. `amp` (the\n * amplification coefficient) and the raw `balances[]`/`totalLiquidity` are pool\n * state read from the pool datum on chain — pass them in; this module never\n * fetches. Fees (`fee`/`adminFee`/`feeDenominator`) come from the pool config.\n */\n\nfunction zipWith(a: bigint[], b: bigint[], f: (x: bigint, y: bigint) => bigint): bigint[] {\n const n = Math.min(a.length, b.length);\n const out: bigint[] = [];\n for (let i = 0; i < n; i++) {\n out.push(f(a[i], b[i]));\n }\n return out;\n}\n\nfunction invariant(condition: boolean, message: string): void {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * The Stableswap invariant D for a set of multiplied balances, found by Newton\n * iteration (capped at 255 rounds, converging when successive D differ by ≤1).\n * D is also the LP supply for the very first, empty deposit.\n */\nexport function getD(mulBalances: bigint[], amp: bigint): bigint {\n const sumMulBalances = mulBalances.reduce((sum, balance) => sum + balance, 0n);\n if (sumMulBalances === 0n) {\n return 0n;\n }\n const length = BigInt(mulBalances.length);\n let dPrev = 0n;\n let d = sumMulBalances;\n const ann = amp * length;\n for (let i = 0; i < 255; i++) {\n let dp = d;\n for (const mulBalance of mulBalances) {\n dp = (dp * d) / (mulBalance * length);\n }\n dPrev = d;\n d = ((ann * sumMulBalances + dp * length) * d) / ((ann - 1n) * d + (length + 1n) * dp);\n if (d > dPrev) {\n if (d - dPrev <= 1n) {\n break;\n }\n } else {\n if (dPrev - d <= 1n) {\n break;\n }\n }\n }\n return d;\n}\n\n/**\n * Given the new multiplied balance `x` of coin `i`, the multiplied balance of\n * coin `j` that keeps the invariant D constant (a swap `i → j`). Newton\n * iteration on the single unknown.\n */\nexport function getY(i: number, j: number, x: bigint, xp: bigint[], amp: bigint): bigint {\n if (i === j || i < 0 || j < 0 || i >= xp.length || j >= xp.length) {\n throw new Error(\"getY failed: i and j must be different and less than length of xp\");\n }\n const length = BigInt(xp.length);\n const d = getD(xp, amp);\n let c = d;\n let s = 0n;\n const ann = amp * length;\n let _x = 0n;\n for (let index = 0; index < Number(length); index++) {\n if (index === i) {\n _x = x;\n } else if (index !== j) {\n _x = xp[index];\n } else {\n continue;\n }\n s += _x;\n c = (c * d) / (_x * length);\n }\n c = (c * d) / (ann * length);\n const b = s + d / ann;\n let yPrev = 0n;\n let y = d;\n for (let index = 0; index < 255; index++) {\n yPrev = y;\n y = (y * y + c) / (2n * y + b - d);\n if (y > yPrev) {\n if (y - yPrev <= 1n) {\n break;\n }\n } else {\n if (yPrev - y <= 1n) {\n break;\n }\n }\n }\n return y;\n}\n\n/**\n * The multiplied balance of coin `i` consistent with a *target* invariant `d`\n * (the others held fixed). Used by the single-coin withdraw, where D is first\n * reduced in proportion to the LP burned.\n */\nexport function getYD(i: number, xp: bigint[], amp: bigint, d: bigint): bigint {\n const length = BigInt(xp.length);\n invariant(0 <= i && i < xp.length, \"getYD failed: i must be less than length of xp\");\n let c = d;\n let s = 0n;\n const ann = amp * length;\n let _x = 0n;\n for (let index = 0; index < Number(length); index++) {\n if (index !== i) {\n _x = xp[index];\n } else {\n continue;\n }\n s += _x;\n c = (c * d) / (_x * length);\n }\n c = (c * d) / (ann * length);\n const b = s + d / ann;\n let yPrev = 0n;\n let y = d;\n for (let index = 0; index < 255; index++) {\n yPrev = y;\n y = (y * y + c) / (2n * y + b - d);\n if (y > yPrev) {\n if (y - yPrev <= 1n) {\n break;\n }\n } else {\n if (yPrev - y <= 1n) {\n break;\n }\n }\n }\n return y;\n}\n\n/** D over raw balances, applying the per-asset multiples first. */\nexport function getDMem(balances: bigint[], multiples: bigint[], amp: bigint): bigint {\n const mulBalances = zipWith(balances, multiples, (a, b) => a * b);\n return getD(mulBalances, amp);\n}\n\n/** Pool parameters common to every quote; `datumBalances`/`amp`/`totalLiquidity` are on-chain pool state. */\nexport type StableswapPoolState = {\n amp: bigint;\n multiples: bigint[];\n datumBalances: bigint[];\n fee: bigint;\n adminFee: bigint;\n feeDenominator: bigint;\n};\n\n/**\n * LP minted for depositing `amountIns[i]` of each coin. When the deposit is\n * imbalanced the pool charges the per-asset \"special fee\"\n * (`fee * n / (4(n-1))`) on the imbalance versus the ideal ratio, and the\n * admin takes its cut of that; a one-sided deposit (all-but-one amount 0) is\n * the zap-in and runs the same path.\n */\nexport function calculateDeposit(\n params: StableswapPoolState & { amountIns: bigint[]; totalLiquidity: bigint }\n): bigint {\n const {\n amountIns,\n amp,\n multiples,\n datumBalances,\n totalLiquidity,\n fee,\n adminFee,\n feeDenominator,\n } = params;\n const tempDatumBalances = [...datumBalances];\n const length = multiples.length;\n invariant(\n amountIns.length === length,\n `calculateDeposit error: amountIns's length ${amountIns.length} is invalid, must be ${length}`\n );\n\n let newDatumBalances: bigint[] = [];\n let lpAmount = 0n;\n if (totalLiquidity === 0n) {\n for (let i = 0; i < length; ++i) {\n invariant(amountIns[i] > 0n, `calculateDeposit error: amount index ${i} must be positive`);\n }\n newDatumBalances = zipWith(tempDatumBalances, amountIns, (a, b) => a + b);\n const d1 = getDMem(newDatumBalances, multiples, amp);\n invariant(d1 > 0n, \"calculateDeposit: d1 must be greater than 0\");\n lpAmount = d1;\n } else {\n let sumIns = 0n;\n for (let i = 0; i < length; ++i) {\n if (amountIns[i] < 0n) {\n invariant(\n amountIns[i] > 0n,\n `calculateDeposit error: amountIns index ${i} must be non-negative`\n );\n }\n sumIns += amountIns[i];\n }\n invariant(sumIns > 0n, \"calculateDeposit error: sum of amountIns must be positive\");\n\n const newDatumBalanceWithoutFee = zipWith(tempDatumBalances, amountIns, (a, b) => a + b);\n const d0 = getDMem(tempDatumBalances, multiples, amp);\n const d1 = getDMem(newDatumBalanceWithoutFee, multiples, amp);\n invariant(d1 > d0, `calculateDeposit: d1 must be greater than d0, d1: ${d1}, d0: ${d0}`);\n\n const specialFee = (fee * BigInt(length)) / (4n * (BigInt(length) - 1n));\n const newDatBalancesWithTradingFee: bigint[] = [];\n for (let i = 0; i < tempDatumBalances.length; i++) {\n const oldBalance = tempDatumBalances[i];\n const newBalance = newDatumBalanceWithoutFee[i];\n const idealBalance = (d1 * oldBalance) / d0;\n let different = 0n;\n if (newBalance > idealBalance) {\n different = newBalance - idealBalance;\n } else {\n different = idealBalance - newBalance;\n }\n const tradingFeeAmount = (specialFee * different) / feeDenominator;\n const adminFeeAmount = (tradingFeeAmount * adminFee) / feeDenominator;\n newDatumBalances.push(newBalance - adminFeeAmount);\n newDatBalancesWithTradingFee.push(newBalance - tradingFeeAmount);\n }\n for (let i = 0; i < length; ++i) {\n invariant(\n newDatBalancesWithTradingFee[i] > 0n,\n \"calculateDeposit error: deposit amount is too small\"\n );\n }\n const d2 = getDMem(newDatBalancesWithTradingFee, multiples, amp);\n lpAmount = (totalLiquidity * (d2 - d0)) / d0;\n }\n\n invariant(lpAmount > 0n, `calculateDeposit error: lpAmountOut ${lpAmount} must be positive`);\n return lpAmount;\n}\n\n/**\n * Coins received for burning `withdrawalLPAmount` — a plain pro-rata slice of\n * every pool balance, no fee (a balanced withdrawal does not perturb the\n * invariant). One amount per pool asset, in config order.\n */\nexport function calculateWithdraw(params: {\n withdrawalLPAmount: bigint;\n multiples: bigint[];\n datumBalances: bigint[];\n totalLiquidity: bigint;\n}): bigint[] {\n const { withdrawalLPAmount, multiples, datumBalances, totalLiquidity } = params;\n const tempDatumBalances = [...datumBalances];\n const length = multiples.length;\n invariant(\n withdrawalLPAmount > 0n,\n \"calculateWithdraw error: withdrawalLPAmount must be positive\"\n );\n const amountOuts = tempDatumBalances.map(\n (balance) => (balance * withdrawalLPAmount) / totalLiquidity\n );\n let sumOuts = 0n;\n for (let i = 0; i < length; ++i) {\n invariant(amountOuts[i] >= 0n, \"calculateWithdraw error: amountOuts must be non-negative\");\n sumOuts += amountOuts[i];\n }\n invariant(sumOuts > 0n, \"calculateWithdraw error: sum of amountOuts must be positive\");\n return amountOuts;\n}\n\n/**\n * LP that must be burned to withdraw the exact `withdrawAmounts[i]` of each\n * coin. Imbalance is charged the special fee (admin fee is not applied here in\n * the reference), and the result is bumped by 1 to round the requirement up so\n * the on-chain check never underfunds.\n */\nexport function calculateWithdrawImbalance(\n params: StableswapPoolState & { withdrawAmounts: bigint[]; totalLiquidity: bigint }\n): bigint {\n const { withdrawAmounts, amp, multiples, datumBalances, totalLiquidity, fee, feeDenominator } =\n params;\n const tempDatumBalances = [...datumBalances];\n const length = multiples.length;\n invariant(\n withdrawAmounts.length === length,\n `calculateWithdrawImbalance error: withdrawAmounts's length ${withdrawAmounts.length} is invalid, must be ${length}`\n );\n\n let sumOuts = 0n;\n for (let i = 0; i < length; ++i) {\n invariant(\n withdrawAmounts[i] >= 0n,\n \"calculateWithdrawImbalance error: amounts must be non-negative\"\n );\n sumOuts += withdrawAmounts[i];\n }\n invariant(\n sumOuts > 0n,\n \"calculateWithdrawImbalance error: sum of withdrawAmounts must be positive\"\n );\n\n const specialFee = (fee * BigInt(length)) / (4n * (BigInt(length) - 1n));\n const newDatBalancesWithoutFee = zipWith(tempDatumBalances, withdrawAmounts, (a, b) => a - b);\n for (let i = 0; i < length; ++i) {\n invariant(\n newDatBalancesWithoutFee[i] > 0n,\n `calculateWithdrawImbalance error: not enough asset index ${i}`\n );\n }\n const d0 = getDMem(tempDatumBalances, multiples, amp);\n const d1 = getDMem(newDatBalancesWithoutFee, multiples, amp);\n\n const newDatBalancesWithTradingFee: bigint[] = [];\n for (let i = 0; i < length; ++i) {\n const idealBalance = (d1 * tempDatumBalances[i]) / d0;\n let different = 0n;\n if (newDatBalancesWithoutFee[i] > idealBalance) {\n different = newDatBalancesWithoutFee[i] - idealBalance;\n } else {\n different = idealBalance - newDatBalancesWithoutFee[i];\n }\n const tradingFeeAmount = (specialFee * different) / feeDenominator;\n newDatBalancesWithTradingFee.push(newDatBalancesWithoutFee[i] - tradingFeeAmount);\n }\n for (let i = 0; i < length; ++i) {\n invariant(\n newDatBalancesWithTradingFee[i] > 0n,\n `calculateWithdrawImbalance error: not enough asset index ${i}`\n );\n }\n\n const d2 = getDMem(newDatBalancesWithTradingFee, multiples, amp);\n let lpAmount = ((d0 - d2) * totalLiquidity) / d0;\n invariant(\n lpAmount > 0n,\n `calculateWithdrawImbalance error: required lpAmount ${lpAmount} must be positive`\n );\n\n lpAmount += 1n;\n return lpAmount;\n}\n\n/**\n * Amount of a single coin `outIndex` received for burning `amountLpIn`\n * (WITHDRAW_ONE_COIN / zap-out). D is scaled down by the LP fraction, the new\n * balance of the target coin is solved twice — once fee-free to size the\n * imbalance, once after subtracting the special fee from every coin — and the\n * final `-1` rounds the payout down so the pool is never overdrawn.\n */\nexport function calculateZapOut(\n params: StableswapPoolState & { amountLpIn: bigint; outIndex: number; totalLiquidity: bigint }\n): bigint {\n const {\n amountLpIn,\n outIndex,\n amp,\n multiples,\n datumBalances,\n totalLiquidity,\n fee,\n adminFee,\n feeDenominator,\n } = params;\n const tempDatumBalances = [...datumBalances];\n const length = multiples.length;\n invariant(amountLpIn > 0n, `calculateZapOut error: amountLpIn ${amountLpIn} must be positive`);\n invariant(\n 0 <= outIndex && outIndex < length,\n `calculateZapOut error: outIndex ${outIndex} is not valid`\n );\n\n const mulBalances = zipWith(tempDatumBalances, multiples, (a, b) => a * b);\n const mulOut = multiples[outIndex];\n const d0 = getD(mulBalances, amp);\n const d1 = d0 - (amountLpIn * d0) / totalLiquidity;\n // The reference mutates this array in place; it aliases mulBalances (see below).\n const mulBalancesReduced = mulBalances;\n const newYWithoutFee = getYD(outIndex, mulBalances, amp, d1);\n const specialFee = (fee * BigInt(length)) / (4n * (BigInt(length) - 1n));\n\n const amountOutWithoutFee = (mulBalances[outIndex] - newYWithoutFee) / mulOut;\n for (let i = 0; i < length; ++i) {\n const diff =\n i === outIndex\n ? (mulBalances[i] * d1) / d0 - newYWithoutFee\n : mulBalances[i] - (mulBalances[i] * d1) / d0;\n mulBalancesReduced[i] -= (diff * specialFee) / feeDenominator;\n }\n const newY = getYD(outIndex, mulBalancesReduced, amp, d1);\n const amountOut = (mulBalancesReduced[outIndex] - newY - 1n) / mulOut;\n tempDatumBalances[outIndex] -=\n amountOut + ((amountOutWithoutFee - amountOut) * adminFee) / feeDenominator;\n return amountOut;\n}\n\n/**\n * Apply a slippage tolerance downward to get a minimum-acceptable amount. The\n * percent is converted to basis points (0.5% → 50 bps) so the arithmetic stays\n * exact in bigint. Shares the semantics of the DEX V2 helper.\n */\nexport function minimumWithSlippage(amount: bigint, slippagePercent: number): bigint {\n if (!(slippagePercent >= 0)) {\n throw new Error(`slippage must be a non-negative percent, received ${slippagePercent}`);\n }\n const bps = BigInt(Math.round(slippagePercent * 100));\n return (amount * (10_000n - bps)) / 10_000n;\n}\n","import { coinIdToAssetUnit } from \"../../client/asset-id\";\nimport { BATCHER_FEE, DEPOSIT_ADA } from \"../config\";\nimport { StableswapConfig } from \"../config-stableswap\";\nimport {\n depositStep,\n orderDatum,\n withdrawImbalanceStep,\n withdrawOneCoinStep,\n withdrawStep,\n} from \"../datum/stableswap\";\nimport {\n calculateDeposit,\n calculateWithdraw,\n calculateWithdrawImbalance,\n calculateZapOut,\n minimumWithSlippage,\n} from \"../math/stableswap\";\nimport { PlutusConstr } from \"../plutus\";\nimport { loadDexBuilder, toDatumHex } from \"../serializer\";\nimport { assembleOrder, OrderAsset } from \"./assemble\";\n\n/** A pool token as its policy id + asset-name hex; the LP asset is always native (never ADA). */\nexport type AssetId = { policyId: string; nameHex: string };\n\n/**\n * On-chain pool state read by the caller from the pool datum. Unlike DEX V2,\n * the Stableswap invariant needs the full amplification coefficient, the raw\n * per-asset balances (in config asset order) and the LP total supply; the fee\n * triple and decimal `multiples` come from the pool config, not here.\n */\nexport type StableswapPoolState = {\n amp: bigint;\n /** Raw pool balances, one per asset, in the config's `assets` index order. */\n balances: bigint[];\n totalLiquidity: bigint;\n};\n\nconst unitOfLpAsset = (a: AssetId) => a.policyId + a.nameHex;\n\ntype SenderInfo = { paymentKeyHash: string; stakeKeyHash: string | null };\n\n/**\n * Extract the sender's payment + stake key hashes for the order datum's\n * sender/receiver Address. Unlike DEX V2, the order address is NOT derived from\n * these — Stableswap locks to a static per-pool `config.orderAddress` — so we\n * only need the credentials, never a computed address.\n */\nasync function resolveSender(sender: string): Promise<SenderInfo> {\n const b = await loadDexBuilder();\n const addr = b.Address.fromBech32(sender);\n const paymentKeyHash: string = addr.toPaymentCredential().payload.hex;\n const stakeAddr = addr.toStakeAddress?.();\n const stakeKeyHash: string | null = stakeAddr\n ? (stakeAddr.toPubKeyHash()?.keyHash.hex ?? null)\n : null;\n return { paymentKeyHash, stakeKeyHash };\n}\n\n/** Build the full order datum and hand off to assembly at the pool's static order address. */\nasync function build(\n sender: SenderInfo,\n senderBech32: string,\n config: StableswapConfig,\n step: PlutusConstr,\n lovelace: bigint,\n assets: OrderAsset[],\n walletUtxoCbors: string[]\n): Promise<{ cbor: string }> {\n const datum = orderDatum({\n paymentKeyHash: sender.paymentKeyHash,\n stakeKeyHash: sender.stakeKeyHash,\n step,\n batcherFee: BATCHER_FEE,\n outputADA: DEPOSIT_ADA,\n });\n const cbor = await assembleOrder({\n orderAddress: config.orderAddress,\n orderDatumHex: await toDatumHex(datum),\n datumKind: \"inline\",\n lovelace,\n assets,\n sender: senderBech32,\n walletUtxoCbors,\n });\n return { cbor };\n}\n\nconst isAda = (coinId: string) => coinId === \"lovelace\";\n\n/**\n * Split an array of per-asset input amounts (config order) into the locked\n * non-ADA `assets` list and the ADA amount to fold into `lovelace`. A zero\n * amount contributes nothing; an ADA-typed pool asset (`config.assets[i] ===\n * \"lovelace\"`) never appears in the assets list, mirroring the DEX V2 builder.\n */\nfunction splitAmounts(\n config: StableswapConfig,\n amounts: bigint[]\n): { assets: OrderAsset[]; ada: bigint } {\n const assets: OrderAsset[] = [];\n let ada = 0n;\n for (let i = 0; i < config.assets.length; i++) {\n const amount = amounts[i] ?? 0n;\n if (amount === 0n) {\n continue;\n }\n if (isAda(config.assets[i])) {\n ada += amount;\n } else {\n assets.push({ unit: coinIdToAssetUnit(config.assets[i]), amount });\n }\n }\n return { assets, ada };\n}\n\nexport type StableAddLiquidityParams = {\n sender: string;\n lpAsset: AssetId;\n config: StableswapConfig;\n /** Deposit amount per pool asset, in config index order; 0 for an asset not supplied. */\n amounts: bigint[];\n poolState: StableswapPoolState;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/**\n * Add liquidity (DEPOSIT). Balanced or one-sided — a single non-zero entry in\n * `amounts` is the zap-in and rides the same DEPOSIT step; the batcher does the\n * internal balancing. Locks each supplied asset plus the deposit ADA + batcher\n * fee (and any ADA-typed pool asset folded in).\n */\nexport async function buildAddLiquidity(\n params: StableAddLiquidityParams\n): Promise<{ cbor: string }> {\n const { config, poolState } = params;\n const lp = calculateDeposit({\n amp: poolState.amp,\n multiples: config.multiples,\n datumBalances: poolState.balances,\n fee: config.fee,\n adminFee: config.adminFee,\n feeDenominator: config.feeDenominator,\n amountIns: params.amounts,\n totalLiquidity: poolState.totalLiquidity,\n });\n const step = depositStep({ minimumLP: minimumWithSlippage(lp, params.slippage) });\n\n const { assets, ada } = splitAmounts(config, params.amounts);\n const lovelace = DEPOSIT_ADA + BATCHER_FEE + ada;\n\n const sender = await resolveSender(params.sender);\n return build(sender, params.sender, config, step, lovelace, assets, params.walletUtxoCbors);\n}\n\nexport type StableRemoveLiquidityParams = {\n sender: string;\n lpAsset: AssetId;\n config: StableswapConfig;\n lpAmount: bigint;\n poolState: StableswapPoolState;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/**\n * Remove liquidity (WITHDRAW) pro-rata into every pool coin. The per-asset\n * minimums (config order) are the quoted slice with slippage applied. Locks the\n * burned LP plus deposit ADA + batcher fee.\n */\nexport async function buildRemoveLiquidity(\n params: StableRemoveLiquidityParams\n): Promise<{ cbor: string }> {\n const { config, poolState } = params;\n const amountOuts = calculateWithdraw({\n withdrawalLPAmount: params.lpAmount,\n multiples: config.multiples,\n datumBalances: poolState.balances,\n totalLiquidity: poolState.totalLiquidity,\n });\n const step = withdrawStep({\n minimumAmounts: amountOuts.map((a) => minimumWithSlippage(a, params.slippage)),\n });\n const assets: OrderAsset[] = [{ unit: unitOfLpAsset(params.lpAsset), amount: params.lpAmount }];\n\n const sender = await resolveSender(params.sender);\n return build(\n sender,\n params.sender,\n config,\n step,\n DEPOSIT_ADA + BATCHER_FEE,\n assets,\n params.walletUtxoCbors\n );\n}\n\nexport type StableZapOutParams = {\n sender: string;\n lpAsset: AssetId;\n config: StableswapConfig;\n lpAmount: bigint;\n /** Index into `config.assets` of the single coin to receive. */\n assetOutIndex: number;\n poolState: StableswapPoolState;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/**\n * Withdraw entirely into one coin (WITHDRAW_ONE_COIN / zap-out), selected by its\n * index into `config.assets`. Locks the burned LP plus deposit ADA + batcher fee.\n */\nexport async function buildZapOut(params: StableZapOutParams): Promise<{ cbor: string }> {\n const { config, poolState } = params;\n const received = calculateZapOut({\n amp: poolState.amp,\n multiples: config.multiples,\n datumBalances: poolState.balances,\n fee: config.fee,\n adminFee: config.adminFee,\n feeDenominator: config.feeDenominator,\n amountLpIn: params.lpAmount,\n outIndex: params.assetOutIndex,\n totalLiquidity: poolState.totalLiquidity,\n });\n const step = withdrawOneCoinStep({\n assetOutIndex: BigInt(params.assetOutIndex),\n minimumAssetOut: minimumWithSlippage(received, params.slippage),\n });\n const assets: OrderAsset[] = [{ unit: unitOfLpAsset(params.lpAsset), amount: params.lpAmount }];\n\n const sender = await resolveSender(params.sender);\n return build(\n sender,\n params.sender,\n config,\n step,\n DEPOSIT_ADA + BATCHER_FEE,\n assets,\n params.walletUtxoCbors\n );\n}\n\nexport type StableWithdrawImbalanceParams = {\n sender: string;\n lpAsset: AssetId;\n config: StableswapConfig;\n /** Exact amount to receive of each pool coin, in config index order; 0 for none. */\n withdrawAmounts: bigint[];\n poolState: StableswapPoolState;\n slippage: number;\n walletUtxoCbors: string[];\n};\n\n/**\n * Withdraw exact amounts of each coin (WITHDRAW_IMBALANCE); the LP burned is\n * whatever the invariant requires. The caller escrows `lpAmount` LP (the\n * quoted requirement plus slippage headroom, since more LP than the nominal is\n * burned when the pool moves against the order) and the batcher refunds the\n * unused LP. Locks that LP plus deposit ADA + batcher fee.\n */\nexport async function buildWithdrawImbalance(\n params: StableWithdrawImbalanceParams\n): Promise<{ cbor: string }> {\n const { config, poolState } = params;\n const requiredLp = calculateWithdrawImbalance({\n amp: poolState.amp,\n multiples: config.multiples,\n datumBalances: poolState.balances,\n fee: config.fee,\n adminFee: config.adminFee,\n feeDenominator: config.feeDenominator,\n withdrawAmounts: params.withdrawAmounts,\n totalLiquidity: poolState.totalLiquidity,\n });\n // Slippage widens the LP the order is willing to spend, so a small adverse\n // pool move still clears; the on-chain step carries the exact amounts.\n const lpAmount = requiredLp + (requiredLp * BigInt(Math.round(params.slippage * 100))) / 10_000n;\n const step = withdrawImbalanceStep({ withdrawAmounts: params.withdrawAmounts });\n const assets: OrderAsset[] = [{ unit: unitOfLpAsset(params.lpAsset), amount: lpAmount }];\n\n const sender = await resolveSender(params.sender);\n return build(\n sender,\n params.sender,\n config,\n step,\n DEPOSIT_ADA + BATCHER_FEE,\n assets,\n params.walletUtxoCbors\n );\n}\n","/**\n * Mainnet Stableswap pool configs, mirrored from the production builder\n * (`packages/sdk/src/stableswap/scripts/mainnet/stableswap-script.json`).\n *\n * Only the fields the SDK's datum + quote path needs are kept: the LP asset,\n * the per-pool order address, the ordered `assets` array (index order is\n * load-bearing — step asset indices and the withdraw lists are positional),\n * the `multiples` used to normalize decimals inside the invariant, and the fee\n * triple. Script hex, reference UTxOs, admin/NFT assets and addresses are\n * omitted; this SDK never builds the on-chain script witnesses.\n *\n * `lpAsset` and each `assets` entry are dotted coin ids (`policyId.assetNameHex`).\n */\nexport type StableswapConfig = {\n /** Human-readable pool key, as upstream. */\n key: string;\n /** LP token coin id (`policyId.assetNameHex`). */\n lpAsset: string;\n /** The pool's order script address (bech32); orders lock here. */\n orderAddress: string;\n /** Pool coin ids, in the invariant's canonical index order. */\n assets: string[];\n /** Per-asset decimal-normalizing multipliers, aligned with `assets`. */\n multiples: bigint[];\n fee: bigint;\n adminFee: bigint;\n feeDenominator: bigint;\n};\n\nexport const STABLESWAP_CONFIGS: StableswapConfig[] = [\n {\n key: \"djed-iusd\",\n lpAsset: \"2c07095028169d7ab4376611abef750623c8f955597a38cd15248640.444a45442d695553442d534c50\",\n orderAddress: \"addr1w9xy6edqv9hkptwzewns75ehq53nk8t73je7np5vmj3emps698n9g\",\n assets: [\n \"8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61.446a65644d6963726f555344\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69555344\",\n ],\n multiples: [1n, 1n],\n fee: 1_000_000n,\n adminFee: 5_000_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"usdc-djed\",\n lpAsset: \"ac49e0969d76ed5aa9e9861a77be65f4fc29e9a979dc4c37a99eb8f4.555344432d444a45442d534c50\",\n orderAddress: \"addr1w93d8cuht3hvqt2qqfjqgyek3gk5d6ss2j93e5sh505m0ng8cmze2\",\n assets: [\n \"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935.55534443\",\n \"8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61.446a65644d6963726f555344\",\n ],\n multiples: [1n, 100n],\n fee: 1_000_000n,\n adminFee: 5_000_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"usdm-iusd\",\n lpAsset: \"31f92531ac9f1af3079701fab7c66ce997eb07988277ee5b9d640301.5553444d2d695553442d534c50\",\n orderAddress: \"addr1wxtv9k2lcum5pmcc4wu44a5tufulszahz84knff87wcawycez9lug\",\n assets: [\n \"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad.0014df105553444d\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69555344\",\n ],\n multiples: [1n, 1n],\n fee: 1_000_000n,\n adminFee: 5_000_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"djed-usdm\",\n lpAsset: \"5b042cf53c0b2ce4f30a9e743b4871ad8c6dcdf1d845133395f55a8e.444a45442d5553444d2d534c50\",\n orderAddress: \"addr1wxr9ppdymqgw6g0hvaaa7wc6j0smwh730ujx6lczgdynehsguav8d\",\n assets: [\n \"8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61.446a65644d6963726f555344\",\n \"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad.0014df105553444d\",\n ],\n multiples: [1n, 1n],\n fee: 1_000_000n,\n adminFee: 5_000_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"djed-myusd\",\n lpAsset:\n \"b69f5d48c91297142c46b764b69ab57844e3e7af9d7ba9bc63c3c517.444a45442d4d795553442d534c50\",\n orderAddress: \"addr1w9ksys0l07s9933kgkn4uxylsss5k6lqvt6e66kfc7am9sgtwqgv0\",\n assets: [\n \"8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61.446a65644d6963726f555344\",\n \"92776616f1f32c65a173392e4410a3d8c39dcf6ef768c73af164779c.4d79555344\",\n ],\n multiples: [1n, 1n],\n fee: 1_000_000n,\n adminFee: 5_000_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"myusd-usdm\",\n lpAsset:\n \"5827249dcaf49ce7ccae2e0577fd9bf9514a4c34adabc7eb57e19259.4d795553442d5553444d2d534c50\",\n orderAddress: \"addr1w8akt26kwj9kc2y56p8x3s9e9lp2qqtcxql0rmnz55u6lks99kkjc\",\n assets: [\n \"92776616f1f32c65a173392e4410a3d8c39dcf6ef768c73af164779c.4d79555344\",\n \"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad.0014df105553444d\",\n ],\n multiples: [1n, 1n],\n fee: 1_000_000n,\n adminFee: 5_000_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"usdc-iusd\",\n lpAsset: \"40b6f8a17ba5d9bab02fc776c9677212b40bfc3df77346f0b1edcba6.555344432d695553442d534c50\",\n orderAddress: \"addr1w86a53qhsmh0qszg486ell6nchy77yq6txksfz8p4z4r39cd4e04m\",\n assets: [\n \"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935.55534443\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69555344\",\n ],\n multiples: [1n, 100n],\n fee: 1_000_000n,\n adminFee: 5_000_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"usdc-iusd-0.1\",\n lpAsset:\n \"48bee898de501ff287165fdfc5be34818f3a41e474ae8f47f8c59f7a.555344432d695553442d302e312d534c50\",\n orderAddress: \"addr1wy42rt3rdptdaa2lwlntkx49ksuqrmqqjlu7pf5l5f8upmgj3gq2m\",\n assets: [\n \"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935.55534443\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69555344\",\n ],\n multiples: [1n, 100n],\n fee: 10_000_000n,\n adminFee: 500_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"usdm-usda\",\n lpAsset: \"5f0d38b3eb8fea72cd3cbdaa9594a74d0db79b5a27e85be5e9015bd6.5553444d2d555344412d534c50\",\n orderAddress: \"addr1w8cafpjmeer4j8t8aseqayhwkf4ezuufue0clvfthxecsacv83rt0\",\n assets: [\n \"c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad.0014df105553444d\",\n \"fe7c786ab321f41c654ef6c1af7b3250a613c24e4213e0425a7ae456.55534441\",\n ],\n multiples: [1n, 1n],\n fee: 5_000_000n,\n adminFee: 500_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"iusd-usda\",\n lpAsset: \"5fd1180269cd5a01f397f37a17981424a3ec3bdab1e743a61f3bb113.695553442d555344412d534c50\",\n orderAddress: \"addr1w83fd654hwp5kzqkae4hqrasprq72tt4ppeghy20706jweqrcqkf3\",\n assets: [\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69555344\",\n \"fe7c786ab321f41c654ef6c1af7b3250a613c24e4213e0425a7ae456.55534441\",\n ],\n multiples: [1n, 1n],\n fee: 10_000_000n,\n adminFee: 500_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"weth-ieth\",\n lpAsset: \"b6b60bf469adb18c21ff3ad06bbdb9e78327b34d4c15db162de53b1c.774554482d694554482d534c50\",\n orderAddress: \"addr1wykr5fpg2qjca5lt75qmh9g459vnwr08wj5xlfcwyleyqagryre2v\",\n assets: [\n \"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935.455448\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69455448\",\n ],\n multiples: [1n, 100n],\n fee: 10_000_000n,\n adminFee: 500_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"wbtc-ibtc\",\n lpAsset: \"d4e0b170fc503735b260b1a0c99223c2b4e6dd6e87ccdcabfba28b8a.774254432d694254432d534c50\",\n orderAddress: \"addr1wx0mfd2vxe6x80fa50fw325n2ufnaaa53xkmrnuukt5d6uqyjjvj4\",\n assets: [\n \"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935.425443\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69425443\",\n ],\n multiples: [1n, 100n],\n fee: 10_000_000n,\n adminFee: 500_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"wsol-isol\",\n lpAsset: \"d3facc199b218a60723500bb80fcfc091f5bd67bdb74df4c099d8174.77534f4c2d69534f4c2d534c50\",\n orderAddress: \"addr1wxaw7dge3st4v7jreug6t5zfhqlkvsjpkddxvm6e3rcgpysxvuf5z\",\n assets: [\n \"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935.534f4c\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69534f4c\",\n ],\n multiples: [1n, 100n],\n fee: 10_000_000n,\n adminFee: 500_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n {\n key: \"usdt-iusd\",\n lpAsset: \"628718ccbdfaec8db0894f3ba25374374de672d487788e6158897070.555344542d695553442d534c50\",\n orderAddress: \"addr1wyqahucg38jpnenl8rw7rnqvyew6q8vrcshcdqfg4pehdds3f3j2h\",\n assets: [\n \"25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935.55534454\",\n \"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880.69555344\",\n ],\n multiples: [1n, 100n],\n fee: 10_000_000n,\n adminFee: 500_000_000n,\n feeDenominator: 10_000_000_000n,\n },\n];\n\nconst BY_LP_ASSET = new Map(STABLESWAP_CONFIGS.map((c) => [c.lpAsset, c]));\n\n/** Look up a Stableswap pool config by its LP asset coin id; throws if unknown. */\nexport function getStableswapConfigByLpAsset(lpAsset: string): StableswapConfig {\n const config = BY_LP_ASSET.get(lpAsset);\n if (!config) {\n throw new Error(`No Stableswap config found for LP asset ${lpAsset}`);\n }\n return config;\n}\n","import { z } from \"zod\";\n\nimport { AppGraphqlClient } from \"../client/app-graphql-client\";\nimport { InputAsset } from \"../client/asset-id\";\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport { PoolReserves } from \"./math/dex-v2\";\nimport { loadDexBuilder } from \"./serializer\";\n\n/**\n * On-chain state of a Minswap pool, read from the app GraphQL `appliedPoolsBy*`\n * queries. Used to quote liquidity operations (deposit/withdraw/zap) against the\n * live reserves without the SDK needing its own chain access — the query returns\n * the pool UTxO's Plutus datum (and value) and this module decodes it per\n * protocol version.\n */\nexport type PoolVersion = \"V1\" | \"V2\" | \"STABLESWAP\";\n\n/** A coin as split policy id + hex asset name (ADA is both empty strings). */\nexport type PoolAsset = { policyId: string; nameHex: string };\n\n/** V2 pool state: reserves + total liquidity + per-side fee numerators (all from the datum). */\nexport type V2PoolState = { kind: \"V2\" } & PoolReserves;\n/** V1 pool state: reserves from the pool value, total liquidity from the datum. */\nexport type V1PoolState = {\n kind: \"V1\";\n reserveA: bigint;\n reserveB: bigint;\n totalLiquidity: bigint;\n};\n/** Stableswap pool state: balances, total liquidity, and amplification — all from the datum. */\nexport type StableswapPoolState = {\n kind: \"STABLESWAP\";\n balances: bigint[];\n totalLiquidity: bigint;\n amp: bigint;\n};\nexport type PoolState = V2PoolState | V1PoolState | StableswapPoolState;\n\nexport type AppliedPool = {\n version: PoolVersion;\n lpAsset: PoolAsset;\n assetA: PoolAsset;\n assetB: PoolAsset;\n /** Decoded pool state, discriminated by `kind` (matches `version`). */\n state: PoolState;\n /** The pool UTxO reference, `txHash#index`. */\n utxoRef: string;\n /** The pool script address the UTxO sits at. */\n poolAddress: string;\n /** The pool datum as CBOR hex, exactly as returned. */\n rawDatum: string;\n /**\n * Decimals per coin, keyed by `coinId` — for converting decimal-normalized\n * token amounts to raw base units. ADA (`lovelace`) is always 6; a token with\n * no on-chain metadata is absent (its decimals are unknown). LP tokens are not\n * included: LP amounts are always raw.\n */\n decimals: Record<string, number>;\n};\n\n/** An unordered pair of coins, the `InputPair` GraphQL input. */\nexport type InputPair = { assetA: InputAsset; assetB: InputAsset };\n\nconst assetSchema = z.object({\n currencySymbol: z.string(),\n tokenName: z.string(),\n metadata: z.object({ decimals: z.number().nullish() }).nullish(),\n});\n\nconst ammPoolSchema = z.object({\n type: z.enum([\"DEX\", \"DEX_V2\", \"STABLESWAP\"]),\n lpAsset: assetSchema,\n poolAssets: z.array(assetSchema),\n utxo: z.object({\n address: z.string(),\n datum: z.string(),\n txIn: z.string(),\n // A JSON blob `{\"$ledgerValue\":{unit: amountString, ...}}`; V1 reserves are\n // read from it (V2/stableswap take reserves from the datum).\n value: z.string(),\n }),\n});\n\nconst poolsSchema = z.array(ammPoolSchema);\n\ntype AmmPool = z.infer<typeof ammPoolSchema>;\n\nconst POOL_FIELDS = `\n type\n lpAsset { currencySymbol tokenName }\n poolAssets { currencySymbol tokenName metadata { decimals } }\n utxo { address datum txIn value }\n`;\n\nconst BY_LP_ASSETS_QUERY = `query AppliedPoolsByLpAssets($lpAssets: [InputAsset!]!) {\n appliedPoolsByLPAssets(lpAssets: $lpAssets) {${POOL_FIELDS}}\n}`;\n\nconst BY_PAIRS_QUERY = `query AppliedPoolsByPairs($pairs: [InputPair!]!) {\n appliedPoolsByPairs(pairs: $pairs) {${POOL_FIELDS}}\n}`;\n\n/** Fetch pool state by LP asset (the pool's LP token identifies it uniquely). */\nexport async function getAppliedPoolsByLpAssets(\n client: AppGraphqlClient,\n lpAssets: InputAsset[]\n): Promise<AppliedPool[]> {\n const pools = await client.execute({\n operation: \"appliedPoolsByLPAssets\",\n document: BY_LP_ASSETS_QUERY,\n variables: { lpAssets },\n schema: poolsSchema,\n });\n return Promise.all(pools.map(toAppliedPool));\n}\n\n/** Fetch pool state by asset pair. `appliedPoolsByPairs` returns the top pool per pair. */\nexport async function getAppliedPoolsByPairs(\n client: AppGraphqlClient,\n pairs: InputPair[]\n): Promise<AppliedPool[]> {\n const pools = await client.execute({\n operation: \"appliedPoolsByPairs\",\n document: BY_PAIRS_QUERY,\n variables: { pairs },\n schema: poolsSchema,\n });\n return Promise.all(pools.map(toAppliedPool));\n}\n\n/** GraphQL `AMMType` -> the SDK's pool version. */\nfunction mapVersion(type: AmmPool[\"type\"]): PoolVersion {\n switch (type) {\n case \"DEX\":\n return \"V1\";\n case \"DEX_V2\":\n return \"V2\";\n case \"STABLESWAP\":\n return \"STABLESWAP\";\n }\n}\n\nfunction toPoolAsset(asset: { currencySymbol: string; tokenName: string }): PoolAsset {\n return { policyId: asset.currencySymbol, nameHex: asset.tokenName };\n}\n\n/** The ledger unit key used in the pool value: `lovelace`, or `policyId.assetNameHex`. */\nfunction unitOf(a: PoolAsset): string {\n return a.policyId === \"\" ? \"lovelace\" : `${a.policyId}.${a.nameHex}`;\n}\n\nasync function toAppliedPool(pool: AmmPool): Promise<AppliedPool> {\n const version = mapVersion(pool.type);\n const [rawA, rawB] = pool.poolAssets;\n if (!rawA || !rawB) {\n throw new MinswapError(\n `Pool ${pool.utxo.txIn} returned ${pool.poolAssets.length} pool assets, expected 2`,\n MinswapErrorCode.PARSE_ERROR,\n {\n endpoint: \"GraphQL appliedPools\",\n issues: [{ path: \"poolAssets\", message: `expected 2, got ${pool.poolAssets.length}` }],\n }\n );\n }\n\n const fields = await decodeDatumFields(pool.utxo.datum);\n\n // assetA/assetB are decoded FROM THE DATUM (not the GraphQL `poolAssets`\n // ordering) so they are guaranteed to align with reserveA/reserveB from the\n // same datum. A mismatch here would send a deposit's amounts to the wrong side.\n let assetA: PoolAsset;\n let assetB: PoolAsset;\n let state: PoolState;\n if (version === \"V2\") {\n assetA = decodeAssetNode(fields[1], \"V2 pool datum\", \"assetA\");\n assetB = decodeAssetNode(fields[2], \"V2 pool datum\", \"assetB\");\n state = decodeV2State(fields);\n } else if (version === \"STABLESWAP\") {\n // Stableswap amounts are addressed by config index, not assetA/assetB; the\n // GraphQL asset order is only informational here.\n assetA = toPoolAsset(rawA);\n assetB = toPoolAsset(rawB);\n state = decodeStableswapState(fields);\n } else {\n assetA = decodeAssetNode(fields[0], \"V1 pool datum\", \"assetA\");\n assetB = decodeAssetNode(fields[1], \"V1 pool datum\", \"assetB\");\n state = decodeV1State(fields, pool.utxo.value, assetA, assetB);\n }\n\n const decimals: Record<string, number> = { lovelace: 6 };\n for (const a of [rawA, rawB]) {\n const d = a.metadata?.decimals;\n if (a.currencySymbol !== \"\" && d != null) {\n decimals[`${a.currencySymbol}.${a.tokenName}`] = d;\n }\n }\n\n return {\n version,\n lpAsset: toPoolAsset(pool.lpAsset),\n assetA,\n assetB,\n state,\n utxoRef: pool.utxo.txIn,\n poolAddress: pool.utxo.address,\n rawDatum: pool.utxo.datum,\n decimals,\n };\n}\n\n/** A decoded node from `@minswap/internal-sdk`'s `PlutusData.fromDataHex`. */\ntype RawPlutus = {\n // `constructor` is an own property the deserializer sets (the alternative\n // index); it shadows Object.prototype.constructor.\n constructor?: number;\n fields?: RawPlutus[];\n int?: string | number | bigint;\n bytes?: string;\n list?: RawPlutus[];\n};\n\ntype PlutusDecoder = { fromDataHex(hex: string): RawPlutus };\n\nasync function decodeDatumFields(datumHex: string): Promise<RawPlutus[]> {\n const builder = await loadDexBuilder();\n // `loadDexBuilder`'s type only declares the encode direction; the deserializer\n // is present at runtime, so reach it through a narrowed local type.\n const decoder = builder.PlutusData as unknown as PlutusDecoder;\n const fields = decoder.fromDataHex(datumHex).fields;\n if (!fields) {\n throw parseError(\"pool datum\", \"fields\", \"datum is not a constructor with fields\");\n }\n return fields;\n}\n\nfunction parseError(endpoint: string, path: string, message: string): MinswapError {\n return new MinswapError(`${endpoint}: ${message}`, MinswapErrorCode.PARSE_ERROR, {\n endpoint,\n issues: [{ path, message }],\n });\n}\n\n/** Decode an on-chain asset `Constr 0 [bytes policyId, bytes assetNameHex]` (ADA = both empty). */\nfunction decodeAssetNode(node: RawPlutus | undefined, endpoint: string, field: string): PoolAsset {\n const f = node?.fields;\n if (!f || f.length < 2 || f[0]?.bytes === undefined || f[1]?.bytes === undefined) {\n throw parseError(endpoint, field, \"expected an asset Constr[policyId, assetNameHex]\");\n }\n return { policyId: f[0].bytes, nameHex: f[1].bytes };\n}\n\nfunction readInt(node: RawPlutus | undefined, endpoint: string, field: string): bigint {\n if (!node || node.int === undefined) {\n throw parseError(endpoint, field, \"expected an integer\");\n }\n return BigInt(node.int);\n}\n\nfunction requireFields(fields: RawPlutus[], min: number, endpoint: string): void {\n if (fields.length < min) {\n throw parseError(endpoint, \"fields\", `expected >=${min}, got ${fields.length}`);\n }\n}\n\n/**\n * V2 datum: `Constr 0 [ f0=poolStakeCredential, f1=assetA, f2=assetB,\n * f3=totalLiquidity, f4=reserveA, f5=reserveB, f6=feeANumerator, f7=feeBNumerator, ... ]`.\n */\nfunction decodeV2State(fields: RawPlutus[]): V2PoolState {\n requireFields(fields, 8, \"V2 pool datum\");\n return {\n kind: \"V2\",\n totalLiquidity: readInt(fields[3], \"V2 pool datum\", \"totalLiquidity\"),\n reserveA: readInt(fields[4], \"V2 pool datum\", \"reserveA\"),\n reserveB: readInt(fields[5], \"V2 pool datum\", \"reserveB\"),\n feeANumerator: readInt(fields[6], \"V2 pool datum\", \"feeANumerator\"),\n feeBNumerator: readInt(fields[7], \"V2 pool datum\", \"feeBNumerator\"),\n };\n}\n\n/**\n * Stableswap datum: `Constr 0 [ f0=balances(list int), f1=totalLiquidity,\n * f2=amplificationCoefficient, f3=orderHash ]`.\n */\nfunction decodeStableswapState(fields: RawPlutus[]): StableswapPoolState {\n requireFields(fields, 3, \"Stableswap pool datum\");\n const balancesList = fields[0]?.list;\n if (!balancesList) {\n throw parseError(\"Stableswap pool datum\", \"balances\", \"expected a list\");\n }\n return {\n kind: \"STABLESWAP\",\n balances: balancesList.map((b, i) => readInt(b, \"Stableswap pool datum\", `balances[${i}]`)),\n totalLiquidity: readInt(fields[1], \"Stableswap pool datum\", \"totalLiquidity\"),\n amp: readInt(fields[2], \"Stableswap pool datum\", \"amp\"),\n };\n}\n\nconst ledgerValueSchema = z.object({ $ledgerValue: z.record(z.string(), z.string()) });\n\n/**\n * V1 datum: `Constr 0 [ f0=assetA, f1=assetB, f2=totalLiquidity, f3=rootKLast, ... ]`.\n * Reserves are NOT in the datum — they are the pool's holdings of each coin,\n * read from the UTxO `value` (a `{\"$ledgerValue\":{unit: amount}}` blob).\n */\nfunction decodeV1State(\n fields: RawPlutus[],\n valueJson: string,\n assetA: PoolAsset,\n assetB: PoolAsset\n): V1PoolState {\n requireFields(fields, 3, \"V1 pool datum\");\n const totalLiquidity = readInt(fields[2], \"V1 pool datum\", \"totalLiquidity\");\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(valueJson);\n } catch {\n throw parseError(\"V1 pool value\", \"value\", \"not valid JSON\");\n }\n const ledger = ledgerValueSchema.safeParse(parsed);\n if (!ledger.success) {\n throw parseError(\"V1 pool value\", \"$ledgerValue\", \"missing ledger value map\");\n }\n const amounts = ledger.data.$ledgerValue;\n return {\n kind: \"V1\",\n reserveA: BigInt(amounts[unitOf(assetA)] ?? \"0\"),\n reserveB: BigInt(amounts[unitOf(assetB)] ?? \"0\"),\n totalLiquidity,\n };\n}\n","import { coinIdToInputAsset } from \"../client/asset-id\";\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport { requireRpcProvider } from \"../client/rpc-provider\";\nimport * as v1 from \"../liquidity/build/dex-v1\";\nimport { AssetId } from \"../liquidity/build/dex-v2\";\nimport * as v2 from \"../liquidity/build/dex-v2\";\nimport * as stable from \"../liquidity/build/stableswap\";\nimport { getStableswapConfigByLpAsset } from \"../liquidity/config-stableswap\";\nimport { Direction } from \"../liquidity/datum/dex-v2\";\nimport {\n AppliedPool,\n getAppliedPoolsByLpAssets,\n getAppliedPoolsByPairs,\n PoolVersion,\n} from \"../liquidity/pool-state\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\n\n/**\n * A pool to operate on, identified either by its LP token `coinId` (always\n * unambiguous), or by its unordered coin pair. A pair can match several pools\n * across versions (e.g. an ADA/MIN V2 pool *and* a V1 pool) — pass `version` to\n * pick one, or use the LP token for exactness.\n */\nexport type LiquidityPoolRef = string | { assetA: string; assetB: string; version?: PoolVersion };\n\ntype WalletInput = {\n /** Base bech32 address funding the order and receiving change. */\n sender: string;\n /** Wallet UTxOs as CBOR hex, overriding the configured `RpcProvider`. */\n walletUtxoCbors?: string[];\n};\n\n/** An amount in raw base units, or — with the matching `*InDecimal` flag — a decimal-normalized figure (e.g. `\"1.5\"`). */\nexport type Amount = bigint | number | string;\n\nexport type AddLiquidityParams = WalletInput & {\n pool: LiquidityPoolRef;\n /** Amount to deposit per coin, keyed by `coinId`. A one-sided entry is a zap-in. */\n amounts: Record<string, Amount>;\n /** Slippage tolerance, percent. */\n slippage: number;\n /** Treat `amounts` as decimal-normalized figures (converted using each coin's decimals) rather than raw base units. */\n amountsInDecimal?: boolean;\n};\n\nexport type ZapInParams = WalletInput & {\n pool: LiquidityPoolRef;\n /** The single coin to deposit, as a `coinId`. */\n assetIn: string;\n amountIn: Amount;\n slippage: number;\n /** Treat `amountIn` as a decimal-normalized figure rather than raw base units. */\n amountInDecimal?: boolean;\n};\n\nexport type RemoveLiquidityParams = WalletInput & {\n pool: LiquidityPoolRef;\n /** LP tokens to burn, always in raw base units (LP tokens are never decimal-normalized). */\n lpAmount: bigint | number | string;\n slippage: number;\n /**\n * Receive a single coin (`coinId`) instead of both sides — a zap-out. Omit for\n * a two-sided withdraw at the pool ratio. (V1 pools do not support zap-out.)\n */\n assetOut?: string;\n};\n\nexport type ZapOutParams = WalletInput & {\n pool: LiquidityPoolRef;\n /** LP tokens to burn, always in raw base units (LP tokens are never decimal-normalized). */\n lpAmount: bigint | number | string;\n /** The single coin to receive, as a `coinId`. */\n assetOut: string;\n slippage: number;\n};\n\nconst assetId = (coinId: string): AssetId => {\n const a = coinIdToInputAsset(coinId);\n return { policyId: a.currencySymbol, nameHex: a.tokenName };\n};\nconst coinIdOf = (a: AssetId): string =>\n a.policyId === \"\" ? \"lovelace\" : `${a.policyId}.${a.nameHex}`;\nconst eqAsset = (x: AssetId, y: AssetId) => x.policyId === y.policyId && x.nameHex === y.nameHex;\n\n/**\n * Liquidity operations — add, remove, zap-in, zap-out — across DEX V2, DEX V1,\n * and Stableswap pools, built client-side and returned as unsigned CBOR (the SDK\n * never signs).\n *\n * The caller supplies only the pool (an LP token or a coin pair), amounts, and\n * slippage: the pool's version and on-chain state (reserves / balances / total\n * liquidity / fee) are fetched and decoded from the app GraphQL, all minimums are\n * computed from it, and the wallet's UTxOs are drawn from the configured\n * `RpcProvider`. Building the transaction requires the optional\n * `@minswap/internal-sdk` peer (Node-only).\n */\nexport class LiquidityModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n async addLiquidity(params: AddLiquidityParams): Promise<{ cbor: string }> {\n const applied = await this.resolvePool(params.pool);\n const walletUtxoCbors = await this.walletUtxos(params);\n const amountA = this.depositAmount(applied, params, coinIdOf(applied.assetA));\n const amountB = this.depositAmount(applied, params, coinIdOf(applied.assetB));\n const state = applied.state;\n const common = { sender: params.sender, slippage: params.slippage, walletUtxoCbors };\n\n if (state.kind === \"V2\") {\n return v2.buildAddLiquidity({\n ...common,\n lpAsset: applied.lpAsset,\n assetA: applied.assetA,\n assetB: applied.assetB,\n amountA,\n amountB,\n pool: state,\n });\n }\n if (state.kind === \"STABLESWAP\") {\n const config = getStableswapConfigByLpAsset(coinIdOf(applied.lpAsset));\n return stable.buildAddLiquidity({\n ...common,\n lpAsset: applied.lpAsset,\n config,\n amounts: config.assets.map((coinId) => this.depositAmount(applied, params, coinId)),\n poolState: state,\n });\n }\n // V1: a two-sided deposit and a one-sided zap-in are distinct on-chain steps.\n if (amountA > 0n && amountB > 0n) {\n return v1.buildAddLiquidity({\n ...common,\n lpAsset: applied.lpAsset,\n assetA: applied.assetA,\n assetB: applied.assetB,\n amountA,\n amountB,\n reserveA: state.reserveA,\n reserveB: state.reserveB,\n totalLiquidity: state.totalLiquidity,\n });\n }\n const inIsA = amountA > 0n;\n return v1.buildZapIn({\n ...common,\n lpAsset: applied.lpAsset,\n assetIn: inIsA ? applied.assetA : applied.assetB,\n amountIn: inIsA ? amountA : amountB,\n desiredAsset: inIsA ? applied.assetB : applied.assetA,\n reserveIn: inIsA ? state.reserveA : state.reserveB,\n reserveOut: inIsA ? state.reserveB : state.reserveA,\n totalLiquidity: state.totalLiquidity,\n });\n }\n\n /** One-sided deposit. Routes through the version's correct on-chain step. */\n async zapIn(params: ZapInParams): Promise<{ cbor: string }> {\n return this.addLiquidity({\n pool: params.pool,\n amounts: { [params.assetIn]: params.amountIn },\n slippage: params.slippage,\n sender: params.sender,\n walletUtxoCbors: params.walletUtxoCbors,\n amountsInDecimal: params.amountInDecimal,\n });\n }\n\n /**\n * Withdraw liquidity. Two-sided by default; pass `assetOut` to receive a single\n * coin instead (a zap-out) — the mirror of a one-sided {@link addLiquidity}.\n */\n async removeLiquidity(params: RemoveLiquidityParams): Promise<{ cbor: string }> {\n const applied = await this.resolvePool(params.pool);\n const walletUtxoCbors = await this.walletUtxos(params);\n const lpAmount = BigInt(params.lpAmount);\n const state = applied.state;\n const common = { sender: params.sender, slippage: params.slippage, walletUtxoCbors };\n\n if (params.assetOut !== undefined) {\n return this.withdrawOneSide(applied, params.assetOut, lpAmount, common);\n }\n\n if (state.kind === \"V2\") {\n return v2.buildRemoveLiquidity({\n ...common,\n lpAsset: applied.lpAsset,\n lpAmount,\n pool: state,\n });\n }\n if (state.kind === \"STABLESWAP\") {\n return stable.buildRemoveLiquidity({\n ...common,\n lpAsset: applied.lpAsset,\n config: getStableswapConfigByLpAsset(coinIdOf(applied.lpAsset)),\n lpAmount,\n poolState: state,\n });\n }\n return v1.buildRemoveLiquidity({\n ...common,\n lpAsset: applied.lpAsset,\n lpAmount,\n reserveA: state.reserveA,\n reserveB: state.reserveB,\n totalLiquidity: state.totalLiquidity,\n });\n }\n\n /** One-sided withdraw. A convenience wrapper over {@link removeLiquidity} with `assetOut`. */\n async zapOut(params: ZapOutParams): Promise<{ cbor: string }> {\n return this.removeLiquidity({\n pool: params.pool,\n lpAmount: params.lpAmount,\n slippage: params.slippage,\n sender: params.sender,\n walletUtxoCbors: params.walletUtxoCbors,\n assetOut: params.assetOut,\n });\n }\n\n private async withdrawOneSide(\n applied: AppliedPool,\n assetOut: string,\n lpAmount: bigint,\n common: { sender: string; slippage: number; walletUtxoCbors: string[] }\n ): Promise<{ cbor: string }> {\n const state = applied.state;\n const out = assetId(assetOut);\n\n if (state.kind === \"STABLESWAP\") {\n const config = getStableswapConfigByLpAsset(coinIdOf(applied.lpAsset));\n const assetOutIndex = config.assets.findIndex((c) => c === coinIdOf(out));\n if (assetOutIndex < 0) {\n throw notAPoolCoin(assetOut);\n }\n return stable.buildZapOut({\n ...common,\n lpAsset: applied.lpAsset,\n config,\n lpAmount,\n assetOutIndex,\n poolState: state,\n });\n }\n if (state.kind === \"V1\") {\n throw new MinswapError(\n \"DEX V1 has no zap-out; call removeLiquidity without assetOut for a two-sided withdraw\",\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"assetOut\", reason: \"V1 pools do not support zap-out\" }\n );\n }\n // V2: A_TO_B receives B, B_TO_A receives A.\n let direction: Direction;\n if (eqAsset(out, applied.assetB)) {\n direction = \"A_TO_B\";\n } else if (eqAsset(out, applied.assetA)) {\n direction = \"B_TO_A\";\n } else {\n throw notAPoolCoin(assetOut);\n }\n return v2.buildZapOut({\n ...common,\n lpAsset: applied.lpAsset,\n lpAmount,\n direction,\n pool: state,\n });\n }\n\n private async resolvePool(ref: LiquidityPoolRef): Promise<AppliedPool> {\n const client = this.sdk.clients.appGraphql;\n\n // An LP token maps to exactly one pool.\n if (typeof ref === \"string\") {\n const [pool] = await getAppliedPoolsByLpAssets(client, [coinIdToInputAsset(ref)]);\n if (!pool) {\n throw poolNotFound(\"LP asset\", ref);\n }\n return pool;\n }\n\n // A pair can match several pools across versions, so it must be disambiguated.\n const pools = await getAppliedPoolsByPairs(client, [\n { assetA: coinIdToInputAsset(ref.assetA), assetB: coinIdToInputAsset(ref.assetB) },\n ]);\n const pairId = `${ref.assetA}/${ref.assetB}`;\n if (pools.length === 0) {\n throw poolNotFound(\"pair\", pairId);\n }\n if (ref.version) {\n const match = pools.find((p) => p.version === ref.version);\n if (!match) {\n throw new MinswapError(\n `No ${ref.version} pool for ${pairId} (available: ${pools.map((p) => p.version).join(\", \")})`,\n MinswapErrorCode.NOT_FOUND,\n { resource: \"pool\", id: `${pairId}@${ref.version}` }\n );\n }\n return match;\n }\n if (pools.length > 1) {\n throw new MinswapError(\n `${pairId} has ${pools.length} pools (${pools.map((p) => p.version).join(\", \")}); pass \\`version\\` or the pool's LP token to choose one`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"pool\", reason: \"ambiguous pair — multiple pools across versions\" }\n );\n }\n return pools[0];\n }\n\n private async walletUtxos(params: WalletInput): Promise<string[]> {\n if (params.walletUtxoCbors !== undefined) {\n return params.walletUtxoCbors;\n }\n const provider = requireRpcProvider(this.sdk.rpcProvider, \"liquidity\");\n const utxos = await provider.getUtxosByAddress(params.sender);\n return utxos.map((u) => u.cbor);\n }\n\n /** The deposit amount for `coinId` in raw base units; `0` when the coin is not supplied. */\n private depositAmount(applied: AppliedPool, params: AddLiquidityParams, coinId: string): bigint {\n const value = params.amounts[coinId];\n if (value === undefined) {\n return 0n;\n }\n return this.toRaw(value, coinId, applied.decimals[coinId], params.amountsInDecimal);\n }\n\n private toRaw(\n value: Amount,\n coinId: string,\n decimals: number | undefined,\n inDecimal?: boolean\n ): bigint {\n if (!inDecimal) {\n return BigInt(value);\n }\n if (decimals === undefined) {\n throw new MinswapError(\n `Cannot convert a decimal amount for ${coinId}: its decimals are unknown`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"amountsInDecimal\", reason: `no decimals metadata for ${coinId}` }\n );\n }\n return decimalToRaw(value, decimals);\n }\n}\n\n/**\n * Convert a decimal-normalized amount to raw base units by shifting the decimal\n * point `decimals` places — done on the string form so no float precision is\n * lost. An integer input (bigint) is a whole number of tokens.\n */\nexport function decimalToRaw(value: Amount, decimals: number): bigint {\n const text = typeof value === \"string\" ? value.trim() : value.toString();\n const negative = text.startsWith(\"-\");\n const parts = (negative ? text.slice(1) : text).split(\".\");\n const [intPart, fracPart = \"\"] = parts;\n if (\n parts.length > 2 ||\n !/^\\d*$/.test(intPart) ||\n !/^\\d*$/.test(fracPart) ||\n intPart + fracPart === \"\"\n ) {\n throw new MinswapError(`Invalid decimal amount \"${text}\"`, MinswapErrorCode.INVALID_PARAMS, {\n param: \"amount\",\n reason: 'not a decimal number (use a string like \"1.5\")',\n });\n }\n if (fracPart.length > decimals) {\n throw new MinswapError(\n `Decimal amount \"${text}\" has more than ${decimals} decimal places`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"amount\", reason: `too many decimal places for a ${decimals}-decimal coin` }\n );\n }\n const raw = BigInt((intPart || \"0\") + fracPart.padEnd(decimals, \"0\"));\n return negative ? -raw : raw;\n}\n\nfunction poolNotFound(kind: \"LP asset\" | \"pair\", id: string): MinswapError {\n return new MinswapError(`No liquidity pool found for ${kind} ${id}`, MinswapErrorCode.NOT_FOUND, {\n resource: \"pool\",\n id,\n });\n}\n\nfunction notAPoolCoin(coinId: string): MinswapError {\n return new MinswapError(`${coinId} is not a coin of this pool`, MinswapErrorCode.INVALID_PARAMS, {\n param: \"assetOut\",\n reason: \"must be one of the pool's coins\",\n });\n}\n","import { z } from \"zod\";\n\nimport { MinswapCurrency } from \"../client/config\";\nimport { assertLimit, cursorPage, Page, PageParams } from \"../client/pagination\";\nimport { toEpochMs } from \"../client/url\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\nimport { arrayOf, coinBasicInfoSchema, zeroableNumber } from \"./shared-schemas\";\n\nexport const ORDER_STATUSES = [\"pending\", \"partially_filled\", \"filled\", \"cancelled\"] as const;\n\nexport type OrderStatus = (typeof ORDER_STATUSES)[number];\n\n/**\n * Marker for orders placed directly rather than through an aggregator.\n *\n * The backend treats this value specially: it matches a null source rather\n * than comparing equality, which is why it is not simply an empty string.\n */\nexport const ORDER_SOURCE_DIRECT = \"direct\";\n\nconst orderExtraSchema = z\n .object({\n expired_at: z.string().nullish(),\n max_cancelling_tip: z.number().nullish(),\n killable: z.boolean().nullish(),\n limit_amount: z.number().nullish(),\n limit_rate: z.string().nullish(),\n stop_amount: z.number().nullish(),\n stop_loss_rate: z.string().nullish(),\n routes: arrayOf(z.string()),\n max_hop_count: z.number().nullish(),\n min_fill_amount: z.number().nullish(),\n lp_asset: z.string().nullish(),\n })\n .transform((e) => ({\n expiredAt: e.expired_at ?? null,\n /** Already normalized to ADA by the backend, despite being a string on-chain. */\n maxCancellingTip: e.max_cancelling_tip ?? null,\n killable: e.killable ?? null,\n limitAmount: e.limit_amount ?? null,\n /** Stays a string upstream; not converted. */\n limitRate: e.limit_rate ?? null,\n stopAmount: e.stop_amount ?? null,\n stopLossRate: e.stop_loss_rate ?? null,\n routes: e.routes,\n maxHopCount: e.max_hop_count ?? null,\n minFillAmount: e.min_fill_amount ?? null,\n lpAsset: e.lp_asset ?? null,\n }));\n\nexport type OrderExtra = z.infer<typeof orderExtraSchema>;\n\nconst orderFillSchema = z\n .object({\n // These are dropped from the payload when zero rather than sent as 0.\n amount_a: zeroableNumber,\n amount_b: zeroableNumber,\n lp_amount: zeroableNumber,\n tx_digest: z.string(),\n block: z.number(),\n filled_at: z.number(),\n })\n .transform((f) => ({\n amountA: f.amount_a,\n amountB: f.amount_b,\n lpAmount: f.lp_amount,\n txHash: f.tx_digest,\n block: f.block,\n /** Epoch milliseconds. */\n filledAt: f.filled_at,\n }));\n\nexport type OrderFill = z.infer<typeof orderFillSchema>;\n\nconst orderHopSchema = z\n .object({\n type: z.string(),\n order_ref: z.string(),\n protocol: z.string().nullish(),\n pool_id: z.string().nullish(),\n coin_a: coinBasicInfoSchema,\n coin_b: coinBasicInfoSchema,\n a_to_b: z.boolean().nullish(),\n amount_a: z.number(),\n amount_b: z.number(),\n lp_amount: zeroableNumber,\n batcher_fee: z.number(),\n deposit_ada: z.number(),\n extra: orderExtraSchema.nullish(),\n fills: arrayOf(orderFillSchema),\n })\n .transform((h) => ({\n type: h.type,\n /**\n * The hop's UTxO reference, `txHash#index`.\n *\n * This is what a cancellation targets, and it is only cancellable while\n * the hop is still pending.\n */\n orderRef: h.order_ref,\n protocol: h.protocol ?? null,\n poolId: h.pool_id ?? null,\n coinA: h.coin_a,\n coinB: h.coin_b,\n aToB: h.a_to_b ?? null,\n amountA: h.amount_a,\n amountB: h.amount_b,\n lpAmount: h.lp_amount,\n batcherFee: h.batcher_fee,\n depositAda: h.deposit_ada,\n extra: h.extra ?? null,\n fills: h.fills,\n }));\n\nexport type OrderHop = z.infer<typeof orderHopSchema>;\n\nconst orderSplitSchema = z\n .object({\n root_id: z.number(),\n status: z.string(),\n executed_at: z.number().nullish(),\n hops: arrayOf(orderHopSchema),\n })\n .transform((s) => ({\n rootId: s.root_id,\n status: s.status as OrderStatus,\n executedAt: s.executed_at ?? null,\n hops: s.hops,\n }));\n\nexport type OrderSplit = z.infer<typeof orderSplitSchema>;\n\nconst orderSchema = z\n .object({\n tx_digest: z.string(),\n order_key: z.string(),\n source: z.string().nullish(),\n status: z.string(),\n created_at: z.number(),\n executed_at: z.number().nullish(),\n splits: arrayOf(orderSplitSchema),\n })\n .transform((o) => ({\n txHash: o.tx_digest,\n orderKey: o.order_key,\n /** `null` means the order was placed directly, not via an aggregator. */\n source: o.source ?? null,\n status: o.status as OrderStatus,\n /** Epoch milliseconds. */\n createdAt: o.created_at,\n executedAt: o.executed_at ?? null,\n /**\n * An order can be split across several routes, each a chain of hops.\n * Cancellable UTxO references live on the hops.\n */\n splits: o.splits,\n }));\n\nexport type Order = z.infer<typeof orderSchema>;\n\nexport type OrderHistoryParams = PageParams & {\n /** A Cardano payment or stake address. */\n address: string;\n statuses?: OrderStatus[];\n /** Uppercase order types, e.g. `DEPOSIT`, `WITHDRAW`, `ZAP_IN`, `ZAP_OUT`. */\n types?: string[];\n protocols?: string[];\n /** Aggregator that originated the order. Use {@link ORDER_SOURCE_DIRECT} for none. */\n sources?: string[];\n poolId?: string;\n timeRange?: { from: Date | number; to: Date | number };\n /** Free text; also accepts a 64-character tx hash or a coin id. */\n search?: string;\n coinIds?: string[];\n txHash?: string;\n currency?: MinswapCurrency;\n};\n\n/**\n * DEX order history across every protocol Minswap indexes.\n *\n * Results are always newest-first — the backend ignores any sort direction the\n * client asks for, so the SDK does not offer one.\n *\n * Each order carries the UTxO references needed to cancel it: walk\n * `splits[].hops[].orderRef` for hops still in a pending state.\n */\nexport class OrderModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n /** Fetch an address's order history, newest first. */\n async getHistory(params: OrderHistoryParams): Promise<Page<Order>> {\n assertLimit(params.limit, 50);\n\n const { data, pagination } = await this.sdk.clients.appApi.post({\n path: \"/api/v1/order/history\",\n body: {\n address: params.address,\n // The cursor is a string because order ids exceed JS-safe integers.\n pagination: { cursor: params.cursor, limit: params.limit ?? 20 },\n filters: {\n statuses: params.statuses,\n types: params.types,\n protocols: params.protocols,\n sources: params.sources,\n pool_id: params.poolId,\n time_range: params.timeRange\n ? [toEpochMs(params.timeRange.from), toEpochMs(params.timeRange.to)]\n : undefined,\n search: params.search ?? \"\",\n coin_ids: params.coinIds,\n tx_digest: params.txHash,\n },\n },\n schema: arrayOf(orderSchema),\n currency: params.currency,\n });\n\n return cursorPage(data, pagination?.lastCursor);\n }\n\n /**\n * Collect the UTxO references that can still be cancelled for an order.\n *\n * Convenience over walking `splits[].hops[]` by hand; the result feeds\n * straight into a cancellation request.\n */\n static cancellableRefs(order: Order): string[] {\n if (order.status === \"filled\" || order.status === \"cancelled\") {\n return [];\n }\n return order.splits\n .filter((split) => split.status === \"pending\" || split.status === \"partially_filled\")\n .flatMap((split) => split.hops.map((hop) => hop.orderRef));\n }\n}\n","import { z } from \"zod\";\n\nimport { MinswapCurrency } from \"../client/config\";\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport {\n assertLimit,\n cursorPage,\n decodeOffsetCursor,\n offsetPage,\n Page,\n PageParams,\n} from \"../client/pagination\";\nimport { toEpochMs, toEpochSeconds } from \"../client/url\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\nimport {\n arrayOf,\n assertBucket,\n BucketMinutes,\n Candle,\n coinBasicInfoSchema,\n poolCandleSchema,\n poolCoinSchema,\n poolFeeSchema,\n poolRewardSchema,\n} from \"./shared-schemas\";\n\n/**\n * Pool types that can appear in a response.\n *\n * `unknown` is response-only — the backend emits it but rejects it as a filter\n * value, so {@link PoolListParams.poolTypes} excludes it.\n */\nexport const POOL_TYPES = [\n \"cpmm\",\n \"clmm\",\n \"dlmm\",\n \"weighted\",\n \"stableswap\",\n \"oracle\",\n \"unknown\",\n] as const;\n\nexport type PoolType = (typeof POOL_TYPES)[number];\n\nexport const POOL_FILTER_TYPES = POOL_TYPES.filter((t) => t !== \"unknown\") as Exclude<\n PoolType,\n \"unknown\"\n>[];\n\nexport const POOL_CATEGORY_GROUPS = [\"stablecoin\", \"correlated\", \"meme\", \"other\"] as const;\n\nexport type PoolCategoryGroup = (typeof POOL_CATEGORY_GROUPS)[number];\n\nexport const POOL_LIST_SORT_FIELDS = [\n \"created_at\",\n \"tvl_usd\",\n \"apr_24h\",\n \"apr_1w\",\n \"apr_30d\",\n \"fee_24h\",\n \"fee_1w\",\n \"fee_30d\",\n \"volume_24h\",\n \"volume_1w\",\n \"volume_30d\",\n \"total_apr_24h\",\n \"total_apr_1w\",\n \"total_apr_30d\",\n] as const;\n\nexport type PoolListSortField = (typeof POOL_LIST_SORT_FIELDS)[number];\n\n/**\n * Pool event kinds.\n *\n * Renamed from the upstream `join`/`exit`, which read as ambiguous next to the\n * `buy`/`sell` swap directions.\n */\nexport const POOL_EVENT_ACTIONS = [\"buy\", \"sell\", \"addLiquidity\", \"removeLiquidity\"] as const;\n\nexport type PoolEventAction = (typeof POOL_EVENT_ACTIONS)[number];\n\nconst ACTION_TO_WIRE: Record<PoolEventAction, string> = {\n buy: \"buy\",\n sell: \"sell\",\n addLiquidity: \"join\",\n removeLiquidity: \"exit\",\n};\n\nconst ACTION_FROM_WIRE: Record<string, PoolEventAction> = {\n buy: \"buy\",\n sell: \"sell\",\n join: \"addLiquidity\",\n exit: \"removeLiquidity\",\n};\n\nconst poolSchema = z\n .object({\n pool_id: z.string().nullish(),\n protocol: z.string(),\n coin_a: poolCoinSchema,\n coin_b: poolCoinSchema,\n amount_a: z.number(),\n amount_b: z.number(),\n amount_a_usd: z.number(),\n amount_b_usd: z.number(),\n price_a: z.number(),\n price_b: z.number(),\n price_ab: z.number(),\n tvl_usd: z.number(),\n tvl_usd_24h_change: z.number(),\n fee_rate: z.number(),\n fee_rate_a: z.number().nullish(),\n fee_rate_b: z.number().nullish(),\n fee_24h: z.number(),\n fee_24h_change: z.number(),\n fee_1w: z.number(),\n fee_30d: z.number().nullish(),\n fee_a_24h: poolFeeSchema,\n fee_b_24h: poolFeeSchema,\n fee_a_1w: poolFeeSchema,\n fee_b_1w: poolFeeSchema,\n fee_a_30d: poolFeeSchema.nullish(),\n fee_b_30d: poolFeeSchema.nullish(),\n volume_24h: z.number(),\n volume_24h_change: z.number(),\n volume_1w: z.number(),\n volume_30d: z.number().nullish(),\n fee_apr_24h: z.number(),\n fee_apr_1w: z.number(),\n fee_apr_30d: z.number().nullish(),\n rewards: arrayOf(poolRewardSchema),\n active: z.boolean(),\n created_at: z.string().nullish(),\n pool_type: z.string(),\n })\n .transform((p) => ({\n poolId: p.pool_id ?? null,\n protocol: p.protocol,\n coinA: p.coin_a,\n coinB: p.coin_b,\n amountA: p.amount_a,\n amountB: p.amount_b,\n amountAUsd: p.amount_a_usd,\n amountBUsd: p.amount_b_usd,\n priceA: p.price_a,\n priceB: p.price_b,\n priceAB: p.price_ab,\n tvlUsd: p.tvl_usd,\n tvlUsd24hChange: p.tvl_usd_24h_change,\n feeRate: p.fee_rate,\n /** Per-side fee rates exist only on protocols that support them. */\n feeRateA: p.fee_rate_a ?? null,\n feeRateB: p.fee_rate_b ?? null,\n fee24h: p.fee_24h,\n fee24hChange: p.fee_24h_change,\n fee1w: p.fee_1w,\n /** 30-day windows are Cardano-only and absent elsewhere. */\n fee30d: p.fee_30d ?? null,\n feeA24h: p.fee_a_24h,\n feeB24h: p.fee_b_24h,\n feeA1w: p.fee_a_1w,\n feeB1w: p.fee_b_1w,\n feeA30d: p.fee_a_30d ?? null,\n feeB30d: p.fee_b_30d ?? null,\n volume24h: p.volume_24h,\n volume24hChange: p.volume_24h_change,\n volume1w: p.volume_1w,\n volume30d: p.volume_30d ?? null,\n feeApr24h: p.fee_apr_24h,\n feeApr1w: p.fee_apr_1w,\n feeApr30d: p.fee_apr_30d ?? null,\n rewards: p.rewards,\n active: p.active,\n createdAt: p.created_at ?? null,\n poolType: p.pool_type as PoolType,\n }));\n\nexport type PoolSummary = z.infer<typeof poolSchema>;\n\nconst poolEventSchema = z\n .object({\n id: z.string(),\n pool_id: z.string().nullish(),\n coin_a: coinBasicInfoSchema,\n coin_b: coinBasicInfoSchema,\n amount_a: z.string(),\n amount_b: z.string(),\n amount_a_usd: z.string(),\n amount_b_usd: z.string(),\n sender: z.string().nullish(),\n tx_digest: z.string(),\n created_at: z.string(),\n action: z.string(),\n })\n .transform((e) => ({\n id: e.id,\n poolId: e.pool_id ?? null,\n coinA: e.coin_a,\n coinB: e.coin_b,\n /** Decimal strings, not numbers — parse with a bignum library. */\n amountA: e.amount_a,\n amountB: e.amount_b,\n amountAUsd: e.amount_a_usd,\n amountBUsd: e.amount_b_usd,\n sender: e.sender ?? null,\n txHash: e.tx_digest,\n createdAt: e.created_at,\n action: ACTION_FROM_WIRE[e.action] ?? (e.action as PoolEventAction),\n }));\n\nexport type PoolEvent = z.infer<typeof poolEventSchema>;\n\nexport type PoolListParams = PageParams & {\n poolIds?: string[];\n protocols?: string[];\n /** Filters to pools containing these coins. Upstream accepts at most two. */\n coinIds?: string[];\n minTvl?: number;\n poolType?: Exclude<PoolType, \"unknown\">;\n categoryGroup?: PoolCategoryGroup;\n isVerified?: boolean;\n search?: string;\n /** @default \"volume_24h\" */\n sortBy?: PoolListSortField;\n /** @default \"desc\" */\n order?: \"asc\" | \"desc\";\n currency?: MinswapCurrency;\n};\n\nexport type PoolOhlcParams = {\n poolId: string;\n from?: Date | number;\n to?: Date | number;\n /** Required here, unlike the token chart which defaults to 1. */\n bucketMinutes: BucketMinutes;\n /** 1..500. @default 500 */\n limit?: number;\n currency?: MinswapCurrency;\n};\n\nexport type PoolEventsParams = PageParams & {\n poolId: string;\n actions?: PoolEventAction[];\n address?: string;\n /** The backend caps the span at two months. */\n timeRange?: { from: Date | number; to: Date | number };\n /** Newest first. @default true */\n descending?: boolean;\n currency?: MinswapCurrency;\n};\n\n/** Upstream caps `pool_addresses` at 20 per request. */\nconst POOL_IDS_CHUNK = 20;\n\n/**\n * Liquidity pool data: listing, lookup, charts, and event history.\n *\n * Note that pool endpoints take query params where the token endpoints take a\n * JSON body, and spell sorting `sort_field`/`sort_direction` rather than\n * `sort_by`/`order`. Both are normalized to `sortBy`/`order` here.\n */\nexport class PoolModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n /** List pools with filtering and sorting. */\n async list(params: PoolListParams = {}): Promise<Page<PoolSummary>> {\n assertLimit(params.limit, 50);\n const limit = params.limit ?? 20;\n const offset = decodeOffsetCursor(params.cursor);\n\n if (params.coinIds && params.coinIds.length > 2) {\n throw new MinswapError(\n \"coinIds accepts at most 2 entries — it filters for pools containing those coins, it is not a bulk lookup. Use getByIds for that.\",\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"coinIds\", reason: \"at most 2 entries\" }\n );\n }\n\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/pool/liquidity-pools\",\n query: {\n offset,\n limit,\n pool_addresses: params.poolIds,\n protocols: params.protocols,\n coin_ids: params.coinIds,\n tvl_min: params.minTvl,\n pool_type: params.poolType,\n category_group: params.categoryGroup,\n is_verified: params.isVerified,\n search: params.search,\n sort_field: params.sortBy ?? \"volume_24h\",\n sort_direction: params.order ?? \"desc\",\n },\n schema: arrayOf(poolSchema),\n currency: params.currency,\n });\n\n return offsetPage(data, offset, limit);\n }\n\n /**\n * Fetch a single pool.\n *\n * @throws {MinswapError} with code `NOT_FOUND` when no such pool exists.\n */\n async getById(\n poolId: string,\n options: { currency?: MinswapCurrency } = {}\n ): Promise<PoolSummary> {\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/pool/detail\",\n query: { pool_id: poolId },\n schema: poolSchema,\n currency: options.currency,\n notFound: { resource: \"pool\", id: poolId },\n });\n return data;\n }\n\n /**\n * Fetch several pools by id.\n *\n * Chunked at 20, the upstream cap on `pool_addresses`. Ids that do not match\n * a pool are absent from the result rather than raising.\n */\n async getByIds(\n poolIds: string[],\n options: { currency?: MinswapCurrency } = {}\n ): Promise<PoolSummary[]> {\n if (poolIds.length === 0) {\n return [];\n }\n\n const chunks: string[][] = [];\n for (let i = 0; i < poolIds.length; i += POOL_IDS_CHUNK) {\n chunks.push(poolIds.slice(i, i + POOL_IDS_CHUNK));\n }\n\n const pages = await Promise.all(\n chunks.map((chunk) =>\n this.sdk.clients.appApi.get({\n path: \"/api/v1/pool/liquidity-pools\",\n query: { pool_addresses: chunk, offset: 0, limit: chunk.length },\n schema: arrayOf(poolSchema),\n currency: options.currency,\n })\n )\n );\n\n return pages.flatMap((page) => page.data);\n }\n\n /** OHLC candles for a pool. */\n async getOhlc(params: PoolOhlcParams): Promise<Candle[]> {\n assertBucket(params.bucketMinutes);\n assertLimit(params.limit, 500);\n\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/pool/ohlcv\",\n query: {\n pool_id: params.poolId,\n // Epoch seconds here; the token chart wants RFC 3339 instead.\n from: params.from ? toEpochSeconds(params.from) : undefined,\n to: params.to ? toEpochSeconds(params.to) : undefined,\n bucket: params.bucketMinutes,\n limit: params.limit,\n },\n schema: arrayOf(poolCandleSchema),\n currency: params.currency,\n });\n\n return data;\n }\n\n /** Swaps and liquidity changes for a pool. */\n async getEvents(params: PoolEventsParams): Promise<Page<PoolEvent>> {\n assertLimit(params.limit, 50);\n\n const { data, pagination } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/pool/events\",\n query: {\n pool_id: params.poolId,\n cursor: params.cursor,\n limit: params.limit ?? 20,\n desc: params.descending ?? true,\n action: params.actions?.map((a) => ACTION_TO_WIRE[a]),\n address: params.address,\n time_range: params.timeRange\n ? [toEpochMs(params.timeRange.from), toEpochMs(params.timeRange.to)]\n : undefined,\n },\n schema: arrayOf(poolEventSchema),\n currency: params.currency,\n });\n\n return cursorPage(data, pagination?.lastCursor);\n }\n}\n","import { z } from \"zod\";\n\nimport { MinswapCurrency } from \"../client/config\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\nimport {\n arrayOf,\n coinAmountInfoSchema,\n coinBasicInfoSchema,\n poolRewardSchema,\n} from \"./shared-schemas\";\n\nconst poolInfoSchema = z\n .object({\n fee_apr_24h: z.number(),\n fee_apr_1w: z.number(),\n rewards: arrayOf(poolRewardSchema),\n })\n .transform((p) => ({\n feeApr24h: p.fee_apr_24h,\n feeApr1w: p.fee_apr_1w,\n rewards: p.rewards,\n }));\n\nconst lpPositionSchema = z\n .object({\n protocol: z.string(),\n coin_a: coinBasicInfoSchema,\n coin_b: coinBasicInfoSchema,\n amount_a: z.number(),\n amount_b: z.number(),\n lp_amount: z.string().nullish(),\n pool_share: z.number(),\n a_usd_value: z.number(),\n b_usd_value: z.number(),\n position_id: z.string(),\n pool_id: z.string().nullish(),\n fee_rate: z.number(),\n fee_rate_a: z.number().nullish(),\n fee_rate_b: z.number().nullish(),\n pool_type: z.string(),\n pool_info: poolInfoSchema,\n total_usd_value: z.number(),\n })\n .transform((p) => ({\n protocol: p.protocol,\n coinA: p.coin_a,\n coinB: p.coin_b,\n amountA: p.amount_a,\n amountB: p.amount_b,\n /** Decimal string, not a number. Empty for Minswap CPMM positions. */\n lpAmount: p.lp_amount ?? null,\n poolShare: p.pool_share,\n aUsdValue: p.a_usd_value,\n bUsdValue: p.b_usd_value,\n positionId: p.position_id,\n poolId: p.pool_id ?? null,\n feeRate: p.fee_rate,\n feeRateA: p.fee_rate_a ?? null,\n feeRateB: p.fee_rate_b ?? null,\n poolType: p.pool_type,\n poolInfo: p.pool_info,\n totalUsdValue: p.total_usd_value,\n }));\n\nexport type PortfolioLpPosition = z.infer<typeof lpPositionSchema>;\n\nconst vaultPairPositionSchema = z\n .object({\n protocol: z.string(),\n coin_a: coinBasicInfoSchema,\n coin_b: coinBasicInfoSchema,\n amount_a: z.number(),\n amount_b: z.number(),\n a_usd_value: z.number(),\n b_usd_value: z.number(),\n pool_id: z.string().nullish(),\n share: z.number(),\n total_usd_value: z.number(),\n })\n .transform((p) => ({\n protocol: p.protocol,\n coinA: p.coin_a,\n coinB: p.coin_b,\n amountA: p.amount_a,\n amountB: p.amount_b,\n aUsdValue: p.a_usd_value,\n bUsdValue: p.b_usd_value,\n poolId: p.pool_id ?? null,\n share: p.share,\n totalUsdValue: p.total_usd_value,\n }));\n\nconst farmExtraSchema = z\n .object({\n script_version: z.string(),\n lb_whitelist_assets: arrayOf(z.string()),\n })\n .transform((e) => ({\n scriptVersion: e.script_version,\n lbWhitelistAssets: e.lb_whitelist_assets,\n }));\n\nconst farmPositionSchema = z\n .object({\n protocol: z.string(),\n staked_coin: coinAmountInfoSchema.nullish(),\n yield_position_id: z.string(),\n yield_pool_id: z.string(),\n yield_pending_rewards: arrayOf(coinAmountInfoSchema),\n cpmm_position: lpPositionSchema.nullish(),\n vault_pair_position: vaultPairPositionSchema.nullish(),\n total_usd_value: z.number(),\n extra: farmExtraSchema.nullish(),\n })\n .transform((p) => ({\n protocol: p.protocol,\n /**\n * The staked principal. Exactly one of `stakedCoin`, `lpPosition`, or\n * `vaultPairPosition` describes it, checked in that precedence order\n * upstream.\n */\n stakedCoin: p.staked_coin ?? null,\n positionId: p.yield_position_id,\n /** Identifies the farm; pass to farm actions. */\n poolId: p.yield_pool_id,\n pendingRewards: p.yield_pending_rewards,\n lpPosition: p.cpmm_position ?? null,\n vaultPairPosition: p.vault_pair_position ?? null,\n totalUsdValue: p.total_usd_value,\n extra: p.extra ?? null,\n }));\n\nexport type PortfolioFarmPosition = z.infer<typeof farmPositionSchema>;\n\nconst stakingExtraSchema = z\n .object({\n script_version: z.string(),\n stake_at: z.string(),\n duration: z.number().nullish(),\n multiplier: z.number().nullish(),\n })\n .transform((e) => ({\n scriptVersion: e.script_version,\n /** ISO-8601 string, not an epoch number. */\n stakeAt: e.stake_at,\n duration: e.duration ?? null,\n multiplier: e.multiplier ?? null,\n }));\n\nconst stakingPositionSchema = z\n .object({\n protocol: z.string(),\n staked_coin: coinAmountInfoSchema.nullish(),\n staking_position_id: z.string(),\n staking_pool_id: z.string(),\n staking_pending_rewards: arrayOf(coinAmountInfoSchema),\n share: z.number(),\n total_usd_value: z.number(),\n extra: stakingExtraSchema.nullish(),\n })\n .transform((p) => ({\n protocol: p.protocol,\n stakedCoin: p.staked_coin ?? null,\n /** The staking UTxO reference; staking actions take this directly. */\n positionId: p.staking_position_id,\n poolId: p.staking_pool_id,\n pendingRewards: p.staking_pending_rewards,\n /**\n * Share of the pool. Note `0` is ambiguous upstream between \"no share\" and\n * \"could not be computed\".\n */\n share: p.share,\n totalUsdValue: p.total_usd_value,\n extra: p.extra ?? null,\n /**\n * Tiered or flexible staking.\n *\n * The backend encodes this two ways and names it neither: flexible pools\n * carry a `-flexible` suffix on the pool id, and only tiered positions\n * carry `duration`/`multiplier`. Both signals are checked here so callers\n * never parse a string suffix.\n */\n kind: (p.staking_pool_id.endsWith(\"-flexible\") ||\n p.extra?.duration === null ||\n p.extra?.duration === undefined\n ? \"flexible\"\n : \"tiered\") as StakingKind,\n }));\n\nexport type StakingKind = \"tiered\" | \"flexible\";\n\nexport type PortfolioStakingPosition = z.infer<typeof stakingPositionSchema>;\n\nconst minswapPortfolioSchema = z\n .object({\n project_code: z.string(),\n project_name: z.string(),\n project_description: z.string(),\n website_url: z.string(),\n icon_url: z.string(),\n cpmm: arrayOf(lpPositionSchema),\n yields: arrayOf(farmPositionSchema),\n stakings: arrayOf(stakingPositionSchema),\n total_usd_value: z.number(),\n })\n .transform((m) => ({\n projectCode: m.project_code,\n projectName: m.project_name,\n projectDescription: m.project_description,\n websiteUrl: m.website_url,\n iconUrl: m.icon_url,\n lp: m.cpmm,\n farms: m.yields,\n stakings: m.stakings,\n totalUsdValue: m.total_usd_value,\n }));\n\nconst portfolioDefiSchema = z\n .object({\n minswap: minswapPortfolioSchema.nullish(),\n total_usd_value: z.number(),\n })\n .transform((d) => ({\n /** Absent upstream when the wallet holds no Minswap position at all. */\n lp: d.minswap?.lp ?? [],\n farms: d.minswap?.farms ?? [],\n stakings: d.minswap?.stakings ?? [],\n project: d.minswap\n ? {\n code: d.minswap.projectCode,\n name: d.minswap.projectName,\n description: d.minswap.projectDescription,\n websiteUrl: d.minswap.websiteUrl,\n iconUrl: d.minswap.iconUrl,\n }\n : null,\n minswapUsdValue: d.minswap?.totalUsdValue ?? 0,\n totalUsdValue: d.total_usd_value,\n }));\n\nexport type PortfolioDefi = z.infer<typeof portfolioDefiSchema>;\n\nexport type PortfolioGetDefiOptions = {\n /** Query the address verbatim rather than resolving its stake key. */\n directAddress?: boolean;\n currency?: MinswapCurrency;\n};\n\n/**\n * A wallet's positions across Minswap: liquidity, farms, and MIN staking.\n *\n * This is the only source of position data — there are no dedicated farm- or\n * staking-position endpoints — so the farm and staking modules read from here\n * too.\n */\nexport class PortfolioModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n /**\n * Fetch every Minswap position held by an address.\n *\n * @param address A Cardano payment or stake address.\n */\n async getDefi(address: string, options: PortfolioGetDefiOptions = {}): Promise<PortfolioDefi> {\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/portfolio/defi\",\n query: {\n address,\n // Required by the backend, and `minswap` is the only value it accepts\n // on Cardano.\n protocols: \"minswap\",\n direct_address: options.directAddress,\n },\n schema: portfolioDefiSchema,\n currency: options.currency,\n });\n return data;\n }\n}\n","import { z } from \"zod\";\n\nimport { coinIdToInputAsset, inputAssetToCoinId } from \"../client/asset-id\";\nimport { MinswapCurrency } from \"../client/config\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\nimport { PortfolioStakingPosition, StakingKind } from \"./portfolio-module\";\nimport { arrayOf, poolCoinSchema, poolRewardSchema } from \"./shared-schemas\";\nimport { resolveWalletInputs, toBigIntString, WalletInputParams } from \"./wallet-inputs\";\n\nconst stakingPoolSchema = z\n .object({\n pool_id: z.string(),\n coin: poolCoinSchema,\n amount_locked: z.number(),\n amount_locked_usd: z.number(),\n active: z.boolean(),\n rewards: arrayOf(poolRewardSchema),\n staked_share: z.number(),\n stakers: z.number(),\n positions: z.number(),\n })\n .transform((p) => ({\n poolId: p.pool_id,\n coin: p.coin,\n amountLocked: p.amount_locked,\n amountLockedUsd: p.amount_locked_usd,\n active: p.active,\n rewards: p.rewards,\n stakedShare: p.staked_share,\n stakers: p.stakers,\n positions: p.positions,\n /**\n * Tiered (locked) or flexible staking.\n *\n * The backend encodes this only as a `-flexible` suffix on the pool id; the\n * SDK surfaces it as an explicit field so `stake`/`unstake` can route\n * without the caller parsing the id.\n */\n kind: (p.pool_id.endsWith(\"-flexible\") ? \"flexible\" : \"tiered\") as StakingKind,\n }));\n\nexport type StakingPool = z.infer<typeof stakingPoolSchema>;\n\nconst stakingListSchema = z\n .object({\n pools: arrayOf(stakingPoolSchema),\n total_amount_locked: z.number(),\n total_amount_locked_usd: z.number(),\n total_rewards: arrayOf(poolRewardSchema),\n total_stakers: z.number(),\n })\n .transform((r) => ({\n pools: r.pools,\n totalAmountLocked: r.total_amount_locked,\n totalAmountLockedUsd: r.total_amount_locked_usd,\n totalRewards: r.total_rewards,\n totalStakers: r.total_stakers,\n }));\n\nexport type StakingOverview = z.infer<typeof stakingListSchema>;\n\n/**\n * Rewards released when unstaking a tiered position.\n *\n * The GraphQL `FarmRewardAmount` carries a split asset and a raw `reward`;\n * normalized here to a `coinId` and a decimal-string amount.\n */\nconst rewardAmountSchema = arrayOf(\n z\n .object({\n asset: z.object({ currencySymbol: z.string(), tokenName: z.string() }),\n reward: z.union([z.string(), z.number()]),\n })\n .transform((r) => ({\n coinId: inputAssetToCoinId(r.asset),\n amount: String(r.reward),\n }))\n);\n\nexport type StakingReward = z.infer<typeof rewardAmountSchema>[number];\n\nexport type StakeParams = WalletInputParams & {\n /** The staked token as a `coinId` — MIN. */\n coinId: string;\n /** Amount to stake, in raw base units. */\n amount: bigint | number | string;\n /** Tiered (locked) or flexible staking. */\n kind: StakingKind;\n};\n\nexport type UnstakeParams = WalletInputParams & {\n /** The staking position's UTxO reference, `txHash#index` ({@link PortfolioStakingPosition.positionId}). */\n positionId: string;\n /** Which contract the position belongs to ({@link PortfolioStakingPosition.kind}). */\n kind: StakingKind;\n};\n\nexport type UnstakeResult = {\n cbor: string;\n /**\n * Rewards released by the unstake. Present only for a tiered position — the\n * flexible contract does not report them here.\n */\n pendingRewards: z.infer<typeof rewardAmountSchema> | null;\n};\n\n/**\n * MIN staking: browse pools, read positions, stake, and unstake.\n *\n * Two contracts exist — tiered (locked) and flexible — distinguished by\n * {@link StakingPool.kind} and {@link PortfolioStakingPosition.kind}. Reads come\n * from the app API; `stake` and `unstake` go through the key-app-api GraphQL\n * host, which builds and partially signs the transaction. As with farming, sign\n * the returned CBOR with `partialSign` and assemble it.\n */\nexport class StakingModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n /**\n * All MIN staking pools, tiered and flexible, with totals.\n *\n * The endpoint takes no parameters — it returns the full set.\n */\n async list(options: { currency?: MinswapCurrency } = {}): Promise<StakingOverview> {\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/pool/ms-staking-pools\",\n schema: stakingListSchema,\n currency: options.currency,\n });\n return data;\n }\n\n /** An address's staking positions. Sourced from the DeFi portfolio. */\n async getPositions(address: string): Promise<PortfolioStakingPosition[]> {\n const { stakings } = await this.sdk.portfolio.getDefi(address);\n return stakings;\n }\n\n /** Stake MIN into the tiered or flexible contract. */\n async stake(params: StakeParams): Promise<{ cbor: string }> {\n // Neither stake path spends a script, so no collateral is needed.\n const inputs = await resolveWalletInputs(this.sdk, \"staking.stake\", params, false);\n const operation =\n params.kind === \"tiered\" ? \"minBarBuildTieredStakeTx\" : \"minBarBuildLiquidStakeTx\";\n const document = params.kind === \"tiered\" ? DOC_TIERED_STAKE : DOC_LIQUID_STAKE;\n\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation,\n document,\n variables: {\n options: {\n owner: params.address,\n asset: coinIdToInputAsset(params.coinId),\n amount: toBigIntString(params.amount),\n inputsToChoose: inputs.inputsToChoose,\n },\n },\n schema: z.string(),\n });\n return { cbor };\n }\n\n /**\n * Unstake a position in full.\n *\n * A tiered unstake additionally reports the rewards it releases. For a partial\n * flexible withdrawal, this is not the method — unstake takes the whole\n * position.\n */\n async unstake(params: UnstakeParams): Promise<UnstakeResult> {\n const inputs = await resolveWalletInputs(this.sdk, \"staking.unstake\", params, false);\n\n if (params.kind === \"tiered\") {\n const result = await this.sdk.clients.keyAppApi.execute({\n operation: \"minBarBuildTieredUnstakeTx\",\n document: DOC_TIERED_UNSTAKE,\n variables: {\n options: {\n unstakeUtxoTxIn: params.positionId,\n inputsToChoose: inputs.inputsToChoose,\n },\n },\n schema: z\n .object({ tx: z.string(), pendingRewards: rewardAmountSchema })\n .transform((r) => ({ cbor: r.tx, pendingRewards: r.pendingRewards })),\n });\n return result;\n }\n\n const cbor = await this.sdk.clients.keyAppApi.execute({\n operation: \"minBarBuildLiquidUnstakeTx\",\n document: DOC_LIQUID_UNSTAKE,\n variables: {\n options: {\n unstakeUtxoTxIn: params.positionId,\n inputsToChoose: inputs.inputsToChoose,\n },\n },\n schema: z.string(),\n });\n return { cbor, pendingRewards: null };\n }\n}\n\nconst DOC_TIERED_STAKE = `mutation MinBarBuildTieredStakeTx($options: MinBarBuildTieredStakeOptions!) {\n minBarBuildTieredStakeTx(options: $options)\n}`;\n\nconst DOC_LIQUID_STAKE = `mutation MinBarBuildLiquidStakeTx($options: MinBarBuildLiquidStakeOptions!) {\n minBarBuildLiquidStakeTx(options: $options)\n}`;\n\nconst DOC_TIERED_UNSTAKE = `mutation MinBarBuildTieredUnstakeTx($options: MinBarBuildTieredUnstakeOptions!) {\n minBarBuildTieredUnstakeTx(options: $options) {\n tx\n pendingRewards {\n asset {\n currencySymbol\n tokenName\n }\n reward\n }\n }\n}`;\n\nconst DOC_LIQUID_UNSTAKE = `mutation MinBarBuildLiquidUnstakeTx($options: MinBarBuildLiquidUnstakeOptions!) {\n minBarBuildLiquidUnstakeTx(options: $options)\n}`;\n","import { z } from \"zod\";\n\nimport { MinswapCurrency } from \"../client/config\";\nimport { MinswapError, MinswapErrorCode } from \"../client/errors\";\nimport {\n assertLimit,\n cursorPage,\n decodeOffsetCursor,\n offsetPage,\n Page,\n PageParams,\n} from \"../client/pagination\";\nimport { toEpochMs, toRfc3339 } from \"../client/url\";\nimport type { MinswapSdk } from \"../sdk\";\nimport { IMinswapModule } from \"./base-module\";\nimport {\n arrayOf,\n assertBucket,\n BucketMinutes,\n Candle,\n coinCandleSchema,\n VALID_BUCKET_MINUTES,\n} from \"./shared-schemas\";\n\n/**\n * Monetary amounts arrive as decimal strings rather than numbers so large\n * supplies survive the round trip without losing precision. They are kept as\n * strings here for the same reason — parse them with a bignum library.\n */\nconst amountString = z.string();\n\nconst coinSchema = z\n .object({\n coin_type: z.string().nullish(),\n symbol: z.string(),\n name: z.string(),\n logo: z.string(),\n description: z.string(),\n liquidity: amountString,\n market_cap: amountString,\n fdv: amountString,\n circulating_supply: amountString,\n total_supply: amountString,\n holders: z.number(),\n creator: z.string(),\n published_at: z.string(),\n first_trade_at: z.string().nullish(),\n verified: z.boolean(),\n decimals: z.number(),\n category: z.string().nullish(),\n scam_label: z.string().nullish(),\n })\n .transform((c) => ({\n coinId: c.coin_type ?? null,\n symbol: c.symbol,\n name: c.name,\n logo: c.logo,\n description: c.description,\n liquidity: c.liquidity,\n marketCap: c.market_cap,\n fdv: c.fdv,\n circulatingSupply: c.circulating_supply,\n totalSupply: c.total_supply,\n holders: c.holders,\n creator: c.creator,\n publishedAt: c.published_at,\n firstTradeAt: c.first_trade_at ?? null,\n verified: c.verified,\n decimals: c.decimals,\n category: c.category ?? null,\n scamLabel: c.scam_label ?? null,\n }));\n\nconst priceSchema = z\n .object({\n price: z.number(),\n price_change_1h: z.number(),\n price_change_6h: z.number(),\n price_change_1d: z.number(),\n price_change_7d: z.number(),\n price_change_30d: z.number(),\n price_24h_low: z.number(),\n price_24h_high: z.number(),\n ath: z.number(),\n atl: z.number(),\n })\n .transform((p) => ({\n price: p.price,\n priceChange1h: p.price_change_1h,\n priceChange6h: p.price_change_6h,\n priceChange1d: p.price_change_1d,\n priceChange7d: p.price_change_7d,\n priceChange30d: p.price_change_30d,\n price24hLow: p.price_24h_low,\n price24hHigh: p.price_24h_high,\n ath: p.ath,\n atl: p.atl,\n }));\n\nconst volumeSchema = z\n .object({\n vol_buy_1h: z.number(),\n vol_sell_1h: z.number(),\n vol_buy_24h: z.number(),\n vol_sell_24h: z.number(),\n vol_buy_1w: z.number(),\n vol_sell_1w: z.number(),\n })\n .transform((v) => ({\n volBuy1h: v.vol_buy_1h,\n volSell1h: v.vol_sell_1h,\n volBuy24h: v.vol_buy_24h,\n volSell24h: v.vol_sell_24h,\n volBuy1w: v.vol_buy_1w,\n volSell1w: v.vol_sell_1w,\n }));\n\nconst socialMediaSchema = z\n .object({\n x: z.string().nullish(),\n telegram: z.string().nullish(),\n website: z.string().nullish(),\n github: z.string().nullish(),\n discord: z.string().nullish(),\n facebook: z.string().nullish(),\n coingecko_url: z.string().nullish(),\n coinmarketcap_url: z.string().nullish(),\n banner_url: z.string().nullish(),\n docs: z.string().nullish(),\n })\n .transform((s) => ({\n x: s.x ?? null,\n telegram: s.telegram ?? null,\n website: s.website ?? null,\n github: s.github ?? null,\n discord: s.discord ?? null,\n facebook: s.facebook ?? null,\n coingeckoUrl: s.coingecko_url ?? null,\n coinmarketcapUrl: s.coinmarketcap_url ?? null,\n bannerUrl: s.banner_url ?? null,\n docs: s.docs ?? null,\n }));\n\nconst securitySchema = z\n .object({\n mintable: z.boolean().nullish(),\n blacklist: z.boolean().nullish(),\n top_10_holders: z.number().nullish(),\n })\n .transform((s) => ({\n mintable: s.mintable ?? null,\n blacklist: s.blacklist ?? null,\n /** Share of supply held by the top 10 holders. */\n top10Holders: s.top_10_holders ?? null,\n }));\n\nconst tagSchema = z.object({ id: z.number(), name: z.string() });\n\nconst tokenDetailSchema = z\n .object({\n coin: coinSchema,\n price_change: priceSchema,\n volume: volumeSchema.nullish(),\n social_media: socialMediaSchema,\n tags: arrayOf(tagSchema),\n rank: z.number().nullish(),\n security: securitySchema.nullish(),\n suspicious_labels: arrayOf(z.string()),\n })\n .transform((d) => ({\n coin: d.coin,\n /** Spot price plus change/high/low windows. Named `price_change` upstream. */\n price: d.price_change,\n volume: d.volume ?? null,\n socialMedia: d.social_media,\n tags: d.tags,\n rank: d.rank ?? null,\n security: d.security ?? null,\n suspiciousLabels: d.suspicious_labels,\n }));\n\nexport type TokenDetail = z.infer<typeof tokenDetailSchema>;\n\n/**\n * Compact token record from `getByIds`.\n *\n * Note the upstream field is `decimal`, singular, unlike every other endpoint;\n * it is normalized to `decimals` here.\n */\nconst tokenSummarySchema = z\n .object({\n coin_type: z.string().nullish(),\n name: z.string(),\n symbol: z.string(),\n icon_url: z.string(),\n website: z.string(),\n description: z.string(),\n decimal: z.number(),\n verified: z.boolean(),\n first_trade_at: z.string().nullish(),\n volume_24h: z.number().nullish(),\n price: z.number().nullish(),\n price_change_1d: z.number().nullish(),\n price_change_7d: z.number().nullish(),\n price_change_30d: z.number().nullish(),\n published_at: z.string(),\n })\n .transform((t) => ({\n coinId: t.coin_type ?? null,\n name: t.name,\n symbol: t.symbol,\n iconUrl: t.icon_url,\n website: t.website,\n description: t.description,\n decimals: t.decimal,\n verified: t.verified,\n firstTradeAt: t.first_trade_at ?? null,\n volume24h: t.volume_24h ?? null,\n price: t.price ?? null,\n priceChange1d: t.price_change_1d ?? null,\n priceChange7d: t.price_change_7d ?? null,\n priceChange30d: t.price_change_30d ?? null,\n publishedAt: t.published_at,\n }));\n\nexport type TokenSummary = z.infer<typeof tokenSummarySchema>;\n\nconst tokenListItemSchema = z\n .object({\n coin_type: z.string().nullish(),\n name: z.string(),\n symbol: z.string(),\n logo: z.string(),\n price: amountString,\n price_change_5m: z.number(),\n price_change_30m: z.number(),\n price_change_1h: z.number(),\n price_change_6h: z.number(),\n price_change_1d: z.number(),\n price_change_7d: z.number(),\n price_change_30d: z.number(),\n vol_change_1d: z.number(),\n liq_change_1d: z.number(),\n tx_change_1d: z.number(),\n tx_24h: z.number(),\n tx_buy_24h: z.number(),\n tx_sell_24h: z.number(),\n volume_1h: amountString,\n volume_24h: amountString,\n volume_1w: amountString,\n vol_buy_24h: amountString,\n vol_sell_24h: amountString,\n maker_24h: z.number(),\n market_cap: amountString,\n liquidity_usd: amountString,\n circulating_supply: amountString,\n total_supply: amountString,\n published_at: z.string(),\n first_trade_at: z.string().nullish(),\n verified: z.boolean(),\n suspicious_labels: arrayOf(z.string()),\n rank: z.number().nullish(),\n decimals: z.number().nullish(),\n category: z.string().nullish(),\n holders: z.number(),\n security: securitySchema.nullish(),\n boosting_point: z.number(),\n scam_label: z.string().nullish(),\n })\n .transform((t) => ({\n coinId: t.coin_type ?? null,\n name: t.name,\n symbol: t.symbol,\n logo: t.logo,\n price: t.price,\n priceChange5m: t.price_change_5m,\n priceChange30m: t.price_change_30m,\n priceChange1h: t.price_change_1h,\n priceChange6h: t.price_change_6h,\n priceChange1d: t.price_change_1d,\n priceChange7d: t.price_change_7d,\n priceChange30d: t.price_change_30d,\n volumeChange1d: t.vol_change_1d,\n liquidityChange1d: t.liq_change_1d,\n txChange1d: t.tx_change_1d,\n tx24h: t.tx_24h,\n txBuy24h: t.tx_buy_24h,\n txSell24h: t.tx_sell_24h,\n volume1h: t.volume_1h,\n volume24h: t.volume_24h,\n volume1w: t.volume_1w,\n volBuy24h: t.vol_buy_24h,\n volSell24h: t.vol_sell_24h,\n maker24h: t.maker_24h,\n marketCap: t.market_cap,\n liquidityUsd: t.liquidity_usd,\n circulatingSupply: t.circulating_supply,\n totalSupply: t.total_supply,\n publishedAt: t.published_at,\n firstTradeAt: t.first_trade_at ?? null,\n verified: t.verified,\n suspiciousLabels: t.suspicious_labels,\n rank: t.rank ?? null,\n decimals: t.decimals ?? null,\n category: t.category ?? null,\n holders: t.holders,\n security: t.security ?? null,\n boostingPoint: t.boosting_point,\n scamLabel: t.scam_label ?? null,\n }));\n\nexport type TokenListItem = z.infer<typeof tokenListItemSchema>;\n\nconst tokenTradeSchema = z\n .object({\n id: z.string(),\n timestamp: z.number(),\n action: z.string(),\n from_coin_ident: z.string().nullish(),\n from_coin_name: z.string(),\n from_coin_symbol: z.string(),\n to_coin_ident: z.string().nullish(),\n to_coin_name: z.string(),\n to_coin_symbol: z.string(),\n price: z.number(),\n amount_in: z.number(),\n amount_out: z.number(),\n usd_value: z.number(),\n tx_digest: z.string(),\n sender: z.string(),\n protocol: z.string(),\n source: z.string().nullish(),\n status: z.string(),\n })\n .transform((t) => ({\n id: t.id,\n /** Epoch milliseconds. */\n timestamp: t.timestamp,\n action: t.action as TokenTradeAction,\n fromCoinId: t.from_coin_ident ?? null,\n fromCoinName: t.from_coin_name,\n fromCoinSymbol: t.from_coin_symbol,\n toCoinId: t.to_coin_ident ?? null,\n toCoinName: t.to_coin_name,\n toCoinSymbol: t.to_coin_symbol,\n price: t.price,\n amountIn: t.amount_in,\n amountOut: t.amount_out,\n usdValue: t.usd_value,\n txHash: t.tx_digest,\n sender: t.sender,\n protocol: t.protocol,\n source: t.source ?? null,\n status: t.status as \"executed\" | \"pending\",\n }));\n\nexport type TokenTrade = z.infer<typeof tokenTradeSchema>;\n\nexport const TOKEN_LIST_SORT_BY = [\n \"MARKETCAP\",\n \"VOLUME_1H\",\n \"VOLUME_1D\",\n \"VOLUME_1W\",\n \"PUBLISHED_AT\",\n \"LIQUIDITY\",\n \"TX_COUNT\",\n \"PRICE_CHANGE\",\n \"PRICE_CHANGE_5MIN\",\n \"PRICE_CHANGE_30MIN\",\n \"PRICE_CHANGE_1H\",\n \"PRICE_CHANGE_4H\",\n \"PRICE_CHANGE_6H\",\n \"PRICE_CHANGE_1D\",\n \"PRICE_CHANGE_1W\",\n] as const;\n\nexport type TokenListSortBy = (typeof TOKEN_LIST_SORT_BY)[number];\n\nexport const TOKEN_TRADE_ACTIONS = [\n \"buy\",\n \"sell\",\n \"join\",\n \"single_join\",\n \"exit\",\n \"single_exit\",\n] as const;\n\nexport type TokenTradeAction = (typeof TOKEN_TRADE_ACTIONS)[number];\n\n/** Every filter the token list supports. All optional; all combine with AND. */\nexport type TokenListFilters = {\n searchTerm?: string;\n coinIds?: string[];\n minMarketCap?: number;\n maxMarketCap?: number;\n minLiquidity?: number;\n maxLiquidity?: number;\n minVolume?: number;\n maxVolume?: number;\n minTop10Holding?: number;\n maxTop10Holding?: number;\n minHolder?: number;\n maxHolder?: number;\n minPrice1hChange?: number;\n maxPrice1hChange?: number;\n minPrice6hChange?: number;\n maxPrice6hChange?: number;\n minPrice24hChange?: number;\n maxPrice24hChange?: number;\n minTxBuy24h?: number;\n maxTxBuy24h?: number;\n minTxSell24h?: number;\n maxTxSell24h?: number;\n minTx24h?: number;\n maxTx24h?: number;\n publishAtFrom?: Date | number;\n publishAtTo?: Date | number;\n hasXSocial?: boolean;\n hasTelegramSocial?: boolean;\n hasDiscordSocial?: boolean;\n hasWebsiteSocial?: boolean;\n hasSocial?: boolean;\n verified?: boolean;\n isBoosted?: boolean;\n};\n\nfunction toWireFilters(filters: TokenListFilters): Record<string, unknown> {\n const wire: Record<string, unknown> = {\n search_term: filters.searchTerm,\n coin_ids: filters.coinIds,\n min_market_cap: filters.minMarketCap,\n max_market_cap: filters.maxMarketCap,\n min_liquidity: filters.minLiquidity,\n max_liquidity: filters.maxLiquidity,\n min_volume: filters.minVolume,\n max_volume: filters.maxVolume,\n min_top_10_holding: filters.minTop10Holding,\n max_top_10_holding: filters.maxTop10Holding,\n min_holder: filters.minHolder,\n max_holder: filters.maxHolder,\n min_price_1h_change: filters.minPrice1hChange,\n max_price_1h_change: filters.maxPrice1hChange,\n min_price_6h_change: filters.minPrice6hChange,\n max_price_6h_change: filters.maxPrice6hChange,\n min_price_24h_change: filters.minPrice24hChange,\n max_price_24h_change: filters.maxPrice24hChange,\n min_tx_buy_24h: filters.minTxBuy24h,\n max_tx_buy_24h: filters.maxTxBuy24h,\n min_tx_sell_24h: filters.minTxSell24h,\n max_tx_sell_24h: filters.maxTxSell24h,\n min_tx_24h: filters.minTx24h,\n max_tx_24h: filters.maxTx24h,\n publish_at_from: filters.publishAtFrom ? toRfc3339(filters.publishAtFrom) : undefined,\n publish_at_to: filters.publishAtTo ? toRfc3339(filters.publishAtTo) : undefined,\n has_x_social: filters.hasXSocial,\n has_telegram_social: filters.hasTelegramSocial,\n has_discord_social: filters.hasDiscordSocial,\n has_website_social: filters.hasWebsiteSocial,\n has_social: filters.hasSocial,\n verified: filters.verified,\n is_boosted: filters.isBoosted,\n };\n\n for (const key of Object.keys(wire)) {\n if (wire[key] === undefined) {\n delete wire[key];\n }\n }\n return wire;\n}\n\nexport type TokenListParams = PageParams & {\n filters?: TokenListFilters;\n /** @default \"VOLUME_1D\" */\n sortBy?: TokenListSortBy;\n /** @default \"DESC\" */\n order?: \"ASC\" | \"DESC\";\n /**\n * Reproduce the app's implicit filtering.\n *\n * The backend quietly applies its own filters when none are supplied — a\n * `min_liquidity` of 1000 for most sorts, a three-month publish window for\n * `PUBLISHED_AT`. That makes an \"unfiltered\" list silently partial. By\n * default the SDK sends an explicit filter to suppress that, so `list()`\n * really does list everything. Set this to reproduce the app's behaviour.\n *\n * @default false\n */\n applyBackendDefaults?: boolean;\n currency?: MinswapCurrency;\n};\n\nexport type TokenOhlcParams = {\n coinId: string;\n from?: Date | number;\n to?: Date | number;\n /** One of {@link VALID_BUCKET_MINUTES}. @default 1 */\n bucketMinutes?: BucketMinutes;\n /** @default 500 */\n limit?: number;\n currency?: MinswapCurrency;\n};\n\nexport type TokenTradeHistoryParams = PageParams & {\n coinId: string;\n /** Inclusive range, epoch-millisecond bounds. The backend caps the span at two months. */\n timeRange?: { from: Date | number; to: Date | number };\n /** @default [\"buy\", \"sell\"] */\n actions?: TokenTradeAction[];\n usdValue?: { from?: number; to?: number };\n protocols?: string[];\n senders?: string[];\n currency?: MinswapCurrency;\n};\n\nexport type TokenGetByIdOptions = {\n /** Overrides the SDK-wide currency for this call only. */\n currency?: MinswapCurrency;\n};\n\n/** Upstream caps `coin_types` at 100 per request; `getByIds` chunks around it. */\nconst INFO_LIST_CHUNK = 100;\n\n/**\n * Token data: lookup, listing, charts, and trade history.\n *\n * A `coinId` is `policyId.assetNameHex`, or the literal `lovelace` for ADA. The\n * upstream API spells this parameter three different ways depending on the\n * endpoint (`ident`, `coin_id`, `coin_type`); the SDK accepts one name and\n * translates.\n */\nexport class TokenModule implements IMinswapModule {\n constructor(readonly sdk: MinswapSdk) {}\n\n /**\n * Fetch full detail for a single token.\n *\n * @param coinId `policyId.assetNameHex`, or `lovelace` for ADA.\n * @throws {MinswapError} with code `NOT_FOUND` when no such token exists.\n */\n async getById(coinId: string, options: TokenGetByIdOptions = {}): Promise<TokenDetail> {\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/coin/detail\",\n query: { ident: coinId },\n schema: tokenDetailSchema,\n currency: options.currency,\n notFound: { resource: \"token\", id: coinId },\n });\n return data;\n }\n\n /**\n * Fetch compact records for many tokens at once.\n *\n * Requests are chunked at 100 ids, the upstream cap. Tokens that do not\n * exist are simply absent from the result, so the output length may be\n * shorter than the input and the order is not guaranteed to match.\n */\n async getByIds(coinIds: string[], options: TokenGetByIdOptions = {}): Promise<TokenSummary[]> {\n if (coinIds.length === 0) {\n return [];\n }\n\n const chunks: string[][] = [];\n for (let i = 0; i < coinIds.length; i += INFO_LIST_CHUNK) {\n chunks.push(coinIds.slice(i, i + INFO_LIST_CHUNK));\n }\n\n const pages = await Promise.all(\n chunks.map((chunk) =>\n this.sdk.clients.appApi.post({\n path: \"/api/v1/coin/info-list\",\n body: {\n search: \"\",\n coin_types: chunk,\n verified: false,\n pagination: { offset: 0, limit: chunk.length },\n },\n schema: arrayOf(tokenSummarySchema),\n currency: options.currency,\n })\n )\n );\n\n return pages.flatMap((page) => page.data);\n }\n\n /** List tokens with filtering and sorting. */\n async list(params: TokenListParams = {}): Promise<Page<TokenListItem>> {\n assertLimit(params.limit, 50);\n const limit = params.limit ?? 20;\n const offset = decodeOffsetCursor(params.cursor);\n\n const filters = toWireFilters(params.filters ?? {});\n // An empty filter object triggers the backend's own defaults; an explicit\n // zero floor suppresses them without excluding anything.\n if (Object.keys(filters).length === 0 && !params.applyBackendDefaults) {\n filters[\"min_liquidity\"] = 0;\n }\n\n const { data } = await this.sdk.clients.appApi.post({\n path: \"/api/v1/coin/list\",\n body: {\n pagination: { offset, limit },\n sort_by: params.sortBy ?? \"VOLUME_1D\",\n order: params.order ?? \"DESC\",\n filters,\n },\n schema: arrayOf(tokenListItemSchema),\n currency: params.currency,\n });\n\n return offsetPage(data, offset, limit);\n }\n\n /** OHLC candles for a token, oldest bucket first. */\n async getOhlc(params: TokenOhlcParams): Promise<Candle[]> {\n const bucketMinutes = params.bucketMinutes ?? 1;\n assertBucket(bucketMinutes);\n // The coin OHLC endpoint accepts any positive limit (no upper cap, unlike\n // the pool chart's 1..500); reject a non-positive one locally.\n if (params.limit !== undefined && (!Number.isInteger(params.limit) || params.limit < 1)) {\n throw new MinswapError(\n `limit must be a positive integer; received ${params.limit}`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"limit\", reason: \"must be a positive integer\" }\n );\n }\n\n const { data } = await this.sdk.clients.appApi.get({\n path: \"/api/v1/coin/ohlc-chart\",\n query: {\n coin_type: params.coinId,\n // This endpoint wants RFC 3339; the pool chart wants epoch seconds.\n from: params.from ? toRfc3339(params.from) : undefined,\n to: params.to ? toRfc3339(params.to) : undefined,\n bucketMinute: bucketMinutes,\n limit: params.limit,\n },\n schema: arrayOf(coinCandleSchema),\n currency: params.currency,\n });\n\n return data;\n }\n\n /** Recent trades for a token, newest first. */\n async getTradeHistory(params: TokenTradeHistoryParams): Promise<Page<TokenTrade>> {\n assertLimit(params.limit, 50);\n\n const { data, pagination } = await this.sdk.clients.appApi.post({\n path: \"/api/v1/coin/trading-history\",\n body: {\n coin_type: params.coinId,\n pagination: { cursor: params.cursor, limit: params.limit ?? 20 },\n filters: {\n time_range: params.timeRange\n ? [toEpochMs(params.timeRange.from), toEpochMs(params.timeRange.to)]\n : undefined,\n actions: params.actions,\n usd_value: params.usdValue,\n protocols: params.protocols,\n senders: params.senders,\n },\n },\n schema: arrayOf(tokenTradeSchema),\n currency: params.currency,\n });\n\n return cursorPage(data, pagination?.lastCursor);\n }\n}\n","import { AggregatorApiClient } from \"./client/aggregator-api-client\";\nimport { AppApiClient } from \"./client/app-api-client\";\nimport { AppGraphqlClient } from \"./client/app-graphql-client\";\nimport { MinswapSdkConfig, resolveConfig, ResolvedMinswapConfig } from \"./client/config\";\nimport { HttpCore } from \"./client/http\";\nimport { KeyAppApiClient } from \"./client/key-app-api-client\";\nimport { RpcProvider } from \"./client/rpc-provider\";\nimport { AggregatorModule } from \"./modules/aggregator-module\";\nimport { FarmModule } from \"./modules/farm-module\";\nimport { LiquidityModule } from \"./modules/liquidity-module\";\nimport { OrderModule } from \"./modules/order-module\";\nimport { PoolModule } from \"./modules/pool-module\";\nimport { PortfolioModule } from \"./modules/portfolio-module\";\nimport { StakingModule } from \"./modules/staking-module\";\nimport { TokenModule } from \"./modules/token-module\";\n\n/**\n * The three backends this SDK speaks to.\n *\n * Exposed for advanced use — calling an endpoint the modules do not wrap yet,\n * or inspecting which host a module used. Prefer the modules for normal work.\n */\nexport type MinswapClients = {\n /** Read API: tokens, pools, farms, staking, portfolio. Read-only. */\n appApi: AppApiClient;\n /** Aggregator REST: quoting, building, submitting, cancelling. */\n aggregatorApi: AggregatorApiClient;\n /** key-app-api GraphQL: farm and MIN staking transaction building. */\n keyAppApi: KeyAppApiClient;\n /** app GraphQL: applied pool state (reserves, liquidity, fee) for liquidity quoting. */\n appGraphql: AppGraphqlClient;\n};\n\n/**\n * Entry point to the Minswap API.\n *\n * Construct once and reach the modules from it:\n *\n * @example\n * const sdk = new MinswapSdk();\n * const token = await sdk.token.getById(\"lovelace\");\n *\n * @example Raising the rate limit and pinning a currency\n * const sdk = new MinswapSdk({ apiKey: process.env.MINSWAP_API_KEY, currency: \"ADA\" });\n *\n * The SDK never signs or submits transactions. Action methods return CBOR for\n * you to sign with your own wallet. Some of that CBOR is already partially\n * signed by the server — sign those with `partialSign = true` and assemble\n * rather than replace the witness set.\n */\nexport class MinswapSdk {\n readonly config: ResolvedMinswapConfig;\n readonly clients: MinswapClients;\n\n readonly token: TokenModule;\n readonly pool: PoolModule;\n readonly portfolio: PortfolioModule;\n readonly order: OrderModule;\n readonly aggregator: AggregatorModule;\n readonly farm: FarmModule;\n readonly staking: StakingModule;\n readonly liquidity: LiquidityModule;\n\n constructor(config: MinswapSdkConfig = {}) {\n this.config = resolveConfig(config);\n\n const http = new HttpCore({\n fetch: this.config.fetch,\n timeoutMs: this.config.timeoutMs,\n retry: this.config.retry,\n });\n\n this.clients = {\n appApi: new AppApiClient(http, this.config),\n aggregatorApi: new AggregatorApiClient(http, this.config),\n keyAppApi: new KeyAppApiClient(http, this.config),\n appGraphql: new AppGraphqlClient(http, this.config),\n };\n\n this.token = new TokenModule(this);\n this.pool = new PoolModule(this);\n this.portfolio = new PortfolioModule(this);\n this.order = new OrderModule(this);\n this.aggregator = new AggregatorModule(this);\n this.farm = new FarmModule(this);\n this.staking = new StakingModule(this);\n this.liquidity = new LiquidityModule(this);\n }\n\n /**\n * Chain access, when configured.\n *\n * Present only if an `rpcProvider` was supplied. Farm and staking actions\n * require it; every read works without it.\n */\n get rpcProvider(): RpcProvider | undefined {\n return this.config.rpcProvider;\n }\n}\n","import JSONBig from \"json-bigint\";\nimport { z } from \"zod\";\n\nimport { DEFAULT_RETRY, DEFAULT_TIMEOUT_MS } from \"./config\";\nimport { MinswapError, MinswapErrorCode } from \"./errors\";\nimport { FetchLike, HttpCore, RetryConfig } from \"./http\";\nimport { RpcProvider, RpcTxIn, RpcUtxo } from \"./rpc-provider\";\nimport { buildUrl } from \"./url\";\n\n/**\n * Kupo reports token quantities and lovelace as unbounded integers, both of\n * which can exceed `Number.MAX_SAFE_INTEGER`. Parsing them as doubles would\n * round silently and yield transaction bytes the chain rejects.\n */\nconst parseBig = JSONBig({ alwaysParseAsBig: true, useNativeBigInt: true }).parse as (\n raw: string\n) => unknown;\n\nconst bigintish = z.union([z.bigint(), z.number(), z.string()]).transform((v) => BigInt(v));\n\nconst kupoMatchSchema = z.object({\n transaction_id: z.string(),\n transaction_index: bigintish,\n output_index: bigintish,\n address: z.string(),\n value: z.object({\n coins: bigintish,\n assets: z.record(z.string(), bigintish).nullish(),\n }),\n datum_hash: z.string().nullish(),\n datum_type: z.enum([\"inline\", \"hash\"]).nullish(),\n script_hash: z.string().nullish(),\n});\n\ntype KupoMatch = z.infer<typeof kupoMatchSchema>;\n\nconst kupoMatchesSchema = z.array(kupoMatchSchema);\nconst kupoDatumSchema = z.object({ datum: z.string() }).nullish();\n\nexport type KupoRpcProviderOptions = {\n /**\n * Base URL of the Kupo instance, e.g. `https://kupo.example.com` or\n * `http://localhost:1442`.\n *\n * A full URL rather than host and port: hosted Kupo providers serve over\n * HTTPS and often behind a path prefix, which a host/port pair cannot express.\n */\n url: string;\n /** Extra headers, for hosted Kupo instances that require an API key. */\n headers?: Record<string, string>;\n /** @default globalThis.fetch */\n fetch?: FetchLike;\n /** @default 30000 */\n timeoutMs?: number;\n retry?: Partial<RetryConfig>;\n /**\n * Maximum simultaneous requests when resolving datums.\n * @default 20\n */\n maxConcurrency?: number;\n /**\n * Turns a Kupo match into UTxO CBOR.\n *\n * Defaults to a lazily-loaded serializer from `@minswap/internal-sdk`, which\n * is Node-only. Supply your own to use a different Cardano library, or to run\n * somewhere that WebAssembly build cannot go.\n */\n serializer?: KupoSerializer;\n};\n\nexport type KupoSerializer = {\n /**\n * @param datum The resolved datum body, when the output has one. Required\n * for an inline datum, since it forms part of the output's bytes.\n * @returns CBOR hex of a full `TransactionUnspentOutput` (input and output).\n */\n toCborHex(utxo: LedgerKupoUtxo, datum?: string): string;\n};\n\n/**\n * {@link RpcProvider} backed by [Kupo](https://github.com/CardanoSolutions/kupo).\n *\n * ## Requirements\n *\n * Producing UTxO CBOR requires a Cardano serializer, which this provider loads\n * from `@minswap/internal-sdk`. That package is an **optional peer dependency**\n * — install it only if you use this provider:\n *\n * ```sh\n * npm install @minswap/internal-sdk\n * ```\n *\n * It ships Node-targeted WebAssembly, so **this provider does not run in a\n * browser**. In a browser, back the SDK with a provider that receives\n * already-serialized UTxOs from a server.\n *\n * ## What this costs\n *\n * Kupo returns JSON, not CBOR, and does not inline datums into a match. A\n * single `getUtxosByAddress` therefore makes one `/matches` request plus one\n * `/datums` request per distinct datum hash found. Datum hashes are deduplicated\n * and fetched concurrently, but an address holding many distinct script outputs\n * will be slower than one holding plain payments.\n *\n * ## Limits\n *\n * Kupo's `/matches` has no server-side pagination, so an address with very many\n * UTxOs returns them all in one response. There is nothing this provider can do\n * about that; be careful pointing it at exchange-scale addresses.\n */\nexport class KupoRpcProvider implements RpcProvider {\n private readonly http: HttpCore;\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private readonly maxConcurrency: number;\n private readonly configuredSerializer: KupoSerializer | undefined;\n private serializer: Promise<KupoSerializer> | undefined;\n\n constructor(options: KupoRpcProviderOptions) {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new MinswapError(\n \"No fetch implementation available; pass one via `new KupoRpcProvider({ fetch })`\",\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"fetch\", reason: \"is not available on globalThis\" }\n );\n }\n\n this.baseUrl = options.url.replace(/\\/+$/, \"\");\n this.headers = options.headers ?? {};\n this.maxConcurrency = options.maxConcurrency ?? 20;\n this.configuredSerializer = options.serializer;\n this.http = new HttpCore({\n fetch: fetchImpl,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n retry: { ...DEFAULT_RETRY, ...options.retry },\n });\n }\n\n async getUtxosByAddress(address: string): Promise<RpcUtxo[]> {\n const matches = await this.matches(`${encodeURIComponent(address)}?unspent`);\n return this.toRpcUtxos(matches);\n }\n\n async getUtxosByRefs(refs: RpcTxIn[]): Promise<RpcUtxo[]> {\n if (refs.length === 0) {\n return [];\n }\n\n // Kupo matches a specific output by `index@txHash`, one pattern per ref.\n const batches = await mapConcurrent(refs, this.maxConcurrency, (ref) =>\n this.matches(`${ref.outputIndex}@${ref.txHash}?unspent`)\n );\n\n return this.toRpcUtxos(batches.flat());\n }\n\n private async matches(pattern: string): Promise<KupoMatch[]> {\n return this.http.request({\n url: `${this.baseUrl}/matches/${pattern}`,\n method: \"GET\",\n endpoint: `GET /matches/${pattern}`,\n headers: this.headers,\n schema: kupoMatchesSchema,\n parseJson: parseBig,\n });\n }\n\n private async getDatum(hash: string): Promise<string | undefined> {\n const result = await this.http.request({\n url: buildUrl(this.baseUrl, `/datums/${hash}`),\n method: \"GET\",\n endpoint: `GET /datums/${hash}`,\n headers: this.headers,\n schema: kupoDatumSchema,\n parseJson: parseBig,\n });\n return result?.datum;\n }\n\n private async toRpcUtxos(matches: KupoMatch[]): Promise<RpcUtxo[]> {\n if (matches.length === 0) {\n return [];\n }\n\n const serializer = await this.loadSerializer();\n\n // Only inline datums are part of the output's bytes, so only they are worth\n // fetching; a hash-type datum contributes just its hash to the CBOR (the body\n // lives off-chain). Distinct hashes are deduped — script addresses commonly\n // share one datum across outputs — against an endpoint with no pagination.\n const hashes = [\n ...new Set(\n matches.filter((m) => m.datum_type === \"inline\" && m.datum_hash).map((m) => m.datum_hash!)\n ),\n ];\n const datums = new Map<string, string | undefined>();\n const resolved = await mapConcurrent(hashes, this.maxConcurrency, (h) => this.getDatum(h));\n for (const [i, h] of hashes.entries()) datums.set(h, resolved[i]);\n\n return matches.map((match) => this.toRpcUtxo(match, datums, serializer));\n }\n\n private toRpcUtxo(\n match: KupoMatch,\n datums: Map<string, string | undefined>,\n serializer: KupoSerializer\n ): RpcUtxo {\n const ref = `${match.transaction_id}#${match.output_index}`;\n\n // The serializer does not yet carry reference scripts through, so an output\n // holding one would serialize without it and produce CBOR that disagrees\n // with the chain. Refuse loudly rather than hand back bytes that will fail\n // at submission for a reason nobody can trace.\n if (match.script_hash) {\n throw new MinswapError(\n `UTxO ${ref} carries a reference script, which this provider cannot serialize faithfully yet. Exclude it from the inputs you pass to Minswap.`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"utxo\", reason: \"reference scripts are not supported\" }\n );\n }\n\n const datum = match.datum_hash ? datums.get(match.datum_hash) : undefined;\n if (match.datum_type === \"inline\" && !datum) {\n // An inline datum is part of the output's bytes; without it the CBOR is wrong.\n throw new MinswapError(\n `UTxO ${ref} has an inline datum that Kupo did not return for hash ${match.datum_hash}`,\n MinswapErrorCode.API_ERROR,\n { endpoint: `GET /datums/${match.datum_hash}`, status: 200, body: null }\n );\n }\n\n const kupoUtxo: LedgerKupoUtxo = {\n transaction_id: match.transaction_id,\n transaction_index: Number(match.transaction_index),\n output_index: Number(match.output_index),\n address: match.address,\n value: {\n coins: match.value.coins,\n assets: match.value.assets ?? undefined,\n },\n datum_hash: match.datum_hash ?? null,\n datum_type: match.datum_type ?? null,\n // Ignored by the conversion, which reads only the input ref and output.\n created_at: { slot_no: 0, header_hash: \"\" },\n };\n\n // The serializer runs CSL/WASM and throws bare `Error`/invariant failures on\n // anything it cannot represent (a malformed address, non-hex datum, a\n // datum_hash with no datum_type, an out-of-range value). Convert those to a\n // typed MinswapError so callers' `MinswapError.is(...)` handling holds at the\n // SDK's most drift-prone step.\n let cbor: string;\n try {\n cbor = serializer.toCborHex(kupoUtxo, datum);\n } catch (cause) {\n throw new MinswapError(\n `UTxO ${ref} could not be serialized to CBOR`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: \"utxo\", reason: `serializer rejected ${ref}: ${String(cause)}` }\n );\n }\n\n return {\n txHash: match.transaction_id,\n outputIndex: Number(match.output_index),\n address: match.address,\n cbor,\n assets: toAssetMap(match.value),\n datumHash: match.datum_hash ?? null,\n datum: datum ?? null,\n scriptRef: null,\n };\n }\n\n /**\n * Resolve the serializer on first use.\n *\n * Deferred rather than imported at module scope so consumers who never touch\n * this provider are not made to load a WebAssembly Cardano library.\n */\n private loadSerializer(): Promise<KupoSerializer> {\n if (this.configuredSerializer) {\n return Promise.resolve(this.configuredSerializer);\n }\n this.serializer ??= importLedger().then((ledger): KupoSerializer => ({\n toCborHex: (utxo, datum) => ledger.Utxo.toHex(ledger.Utxo.fromKupo(utxo, datum)),\n }));\n return this.serializer;\n }\n}\n\n/** Kupo's match shape as the serializer expects it. */\nexport type LedgerKupoUtxo = {\n transaction_id: string;\n transaction_index: number;\n output_index: number;\n address: string;\n value: { coins: bigint; assets?: Record<string, bigint> };\n datum_hash: string | null;\n datum_type: \"inline\" | \"hash\" | null;\n created_at: { slot_no: number; header_hash: string };\n};\n\n/** Opaque handle to a deserialized UTxO; only passed straight back to `toHex`. */\ndeclare const utxoBrand: unique symbol;\ntype LedgerUtxo = { readonly [utxoBrand]: true };\n\n/**\n * The slice of `@minswap/internal-sdk` this provider uses.\n *\n * Declared structurally rather than imported as a type so the optional peer\n * dependency stays genuinely optional — consumers who never construct this\n * provider do not need the package present to typecheck.\n */\ntype KupoLedger = {\n Utxo: {\n fromKupo(utxo: LedgerKupoUtxo, datum?: string): LedgerUtxo;\n toHex(utxo: LedgerUtxo): string;\n };\n RustModule: { load(): Promise<void> };\n};\n\nconst INTERNAL_SDK = \"@minswap/internal-sdk\";\n\nasync function importLedger(): Promise<KupoLedger> {\n let mod: KupoLedger;\n try {\n // Indirected through a variable so the specifier is not statically\n // resolved; a missing optional dependency must fail at runtime with the\n // message below, not at compile time for everyone.\n mod = (await import(/* @vite-ignore */ INTERNAL_SDK)) as KupoLedger;\n } catch (cause) {\n throw new MinswapError(\n `KupoRpcProvider needs ${INTERNAL_SDK} to serialize UTxOs. Install it: npm install ${INTERNAL_SDK}`,\n MinswapErrorCode.INVALID_PARAMS,\n { param: INTERNAL_SDK, reason: `could not be imported: ${String(cause)}` }\n );\n }\n\n // The serializer is WebAssembly and must be initialized before use; the call\n // is idempotent, so repeating it on a warm module is free.\n await mod.RustModule.load();\n\n return mod;\n}\n\n/** Kupo keys assets `policyId.assetNameHex`; the rest of the ecosystem concatenates them. */\nfunction toAssetMap(value: KupoMatch[\"value\"]): Record<string, bigint> {\n const assets: Record<string, bigint> = { lovelace: value.coins };\n for (const [key, amount] of Object.entries(value.assets ?? {})) {\n const [policyId, assetName = \"\"] = key.split(\".\");\n assets[`${policyId}${assetName}`] = amount;\n }\n return assets;\n}\n\n/** Run `fn` over `items` with a ceiling on how many are in flight at once. */\nasync function mapConcurrent<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>\n): Promise<R[]> {\n const results: R[] = new Array(items.length);\n let next = 0;\n\n const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {\n for (;;) {\n const index = next++;\n if (index >= items.length) {\n return;\n }\n results[index] = await fn(items[index]);\n }\n });\n\n await Promise.all(workers);\n return results;\n}\n"]}
|